diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f88a124..fa0536c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -14,10 +14,10 @@ jobs: actions: read steps: - uses: actions/checkout@v6 - - uses: github/codeql-action/init@v3 + - uses: github/codeql-action/init@v4 with: languages: python queries: security-extended,security-and-quality - - uses: github/codeql-action/analyze@v3 + - uses: github/codeql-action/analyze@v4 with: category: "/language:python" diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index f0cdec4..b2f32f4 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -17,6 +17,7 @@ jobs: with: python-version: "3.13" cache: 'pip' + - run: python -m pip install --upgrade pip - run: pip install ruff bandit mypy pip-audit # Fast checks - run: ruff check . @@ -43,6 +44,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: { python-version: "3.13" } + - run: python -m pip install --upgrade pip - run: pip install pip-audit - run: pip-audit --strict diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f56d5a..517636c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ We [keep a changelog.](http://keepachangelog.com/) ## [Unreleased] +## [1.7.0] - 2026-06-10 + ### Security - **Enterprise Runtime Security:** Added opt-in PEP 578 Audit Hooks (`sys.addaudithook`) via `Config.enable_security_audit` to track runtime network events. @@ -38,6 +40,12 @@ We [keep a changelog.](http://keepachangelog.com/) - Legacy compatibility: Restored parity with old exceptions and dynamic routing mechanics to keep integration completely seamless for existing users. +### Pull Requests Merged + +- [PR_129](https://github.com/mailjet/mailjet-apiv3-python/pull/129) - Use hyphen in the package name in readme. +- [PR_130](https://github.com/mailjet/mailjet-apiv3-python/pull/130) - refactor: Modernize SDK architecture, harden security, and enable O(1) routing. +- [PR_131](https://github.com/mailjet/mailjet-apiv3-python/pull/131) - Release 1.7.0. + ## [1.6.0] - 2026-04-27 ### Security @@ -295,4 +303,5 @@ We [keep a changelog.](http://keepachangelog.com/) [1.5.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.5.0 [1.5.1]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.5.1 [1.6.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.6.0 +[1.7.0]: https://github.com/mailjet/mailjet-apiv3-python/releases/tag/v1.7.0 [unreleased]: https://github.com/mailjet/mailjet-apiv3-python/compare/v1.7.0...HEAD diff --git a/MANIFEST.in b/MANIFEST.in index 20b4bfe..7a24c68 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,7 +3,7 @@ include README.md include CHANGELOG.md include PERFORMANCE.md include SECURITY.md -recursive-include mailjet_rest *.py *.pyi py.typed +recursive-include mailjet_rest *.py py.typed prune tests prune samples diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 11a96fe..cfa5196 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -46,7 +46,7 @@ test: - responses commands: - pip check - - pytest tests/unit/ -v -m "not property_heavy" + - pytest tests/unit/ -v about: home: {{ project['urls']['Homepage'] }} diff --git a/mailjet_rest/_version.py b/mailjet_rest/_version.py index d81298f..14d9d2f 100644 --- a/mailjet_rest/_version.py +++ b/mailjet_rest/_version.py @@ -1 +1 @@ -__version__ = "1.6.0.post1.dev23" +__version__ = "1.7.0" diff --git a/mailjet_rest/types.py b/mailjet_rest/types.py index a3710e1..ffc453b 100644 --- a/mailjet_rest/types.py +++ b/mailjet_rest/types.py @@ -13,6 +13,21 @@ from typing_extensions import NotRequired +__all__ = [ + # Constants + "_ALLOWED_TRACE_FIELDS", + "_DEFAULT_TIMEOUT", + "_JSON_HEADERS", + "_TEXT_HEADERS", + "Attachment", + "EmailAddress", + "HttpMethod", + "PayloadType", + "SendV31Message", + "SendV31Payload", + "TimeoutType", +] + # ========================================== # Types & Constants # ========================================== diff --git a/manage.sh b/manage.sh index 35698a1..c9365c6 100755 --- a/manage.sh +++ b/manage.sh @@ -85,7 +85,7 @@ test_integration() { test_cov() { # Example: ./manage.sh test_cov - info "Running tests with Coverage requirements (Fail under 80%)..." + info "Running tests with Coverage requirements (Fail under 80%)...." pytest -n auto --cov="${SRC_DIR}" "${TEST_DIR}" --cov-fail-under=80 --cov-report=term-missing --cov-report=html success "Coverage report generated in htmlcov/index.html" } @@ -108,26 +108,35 @@ test_strict_warnings() { # SECURITY & FUZZING # ============================================================================== fuzz_all() { - # Usage: ./manage.sh fuzz_all [duration_in_seconds] - local duration=${1:-30} + # Usage: ./manage.sh fuzz_all [duration_in_seconds] [extra_libfuzzer_flags...] + local duration=${1:-20} + if [ $# -gt 0 ]; then shift; fi + + local root_dir="$(pwd)" local fuzzer_dir="tests/fuzz" local dictionary="tests/fuzz/fuzzer.dict" local corpus_dir="tests/fuzz/corpus" + local log_dir="logs" if [ ! -d "$fuzzer_dir" ]; then error "Fuzzer directory '$fuzzer_dir' not found." return 1 fi + mkdir -p "$log_dir" + # Ensure the dictionary exists before passing the argument local dict_arg="" if [ -f "$dictionary" ]; then - dict_arg="-dict=$dictionary" + dict_arg="-dict=$root_dir/$dictionary" else - echo "⚠️ Warning: Dictionary '$dictionary' not found. Running without it." + echo -e "${YELLOW}⚠️ Warning: Dictionary '$dictionary' not found. Running without it.${NC}" fi info "🚀 Starting security fuzzing suite (duration: ${duration} seconds per fuzzer)..." + if [ $# -gt 0 ]; then + info "Applying extra LibFuzzer arguments: $@" + fi # Safely gather fuzzer files to prevent errors if none exist shopt -s nullglob @@ -141,27 +150,49 @@ fuzz_all() { for fuzzer in "${fuzzers[@]}"; do local fuzzer_name=$(basename "$fuzzer" .py) - local fuzzer_corpus="$corpus_dir/$fuzzer_name" + + # Create dedicated directories for THIS specific fuzzer + local fuzzer_work_dir="$root_dir/$log_dir/$fuzzer_name" + local fuzzer_corpus="$root_dir/$corpus_dir/$fuzzer_name" + + mkdir -p "$fuzzer_work_dir" mkdir -p "$fuzzer_corpus" - info "🔍 Running fuzzer: $fuzzer (Corpus: $fuzzer_corpus)" - - conda run --name "${CONDA_ENV_NAME}" python "$fuzzer" \ - $dict_arg \ - -max_len=512 \ - -max_total_time="$duration" \ - "$fuzzer_corpus" - - local exit_code=$? - # libFuzzer returns 1 for crash, 70 for OOM, 77 for timeout. - # Catching any non-zero exit ensures we don't miss Python tracebacks. - if [ $exit_code -ne 0 ]; then - error "❌ Fuzzing failed: Crash or error detected in $fuzzer (Exit Code: $exit_code)." - return $exit_code - fi + echo -e "🔍 Running fuzzer: $fuzzer_name (Logs: logs/$fuzzer_name/fuzz_output.log)" + + # Isolate execution: + # 1. Background subshell `(...) &` runs fuzzers in parallel. + # 2. `cd` into log folder ensures LibFuzzer outputs (crash, leak files) are neatly contained. + # 3. Use absolute paths for the execution dependencies to avoid pathing errors. + ( + cd "$fuzzer_work_dir" + + # Prevent Conda's double-stack path bug by checking if we are already activated + if [[ "$CONDA_DEFAULT_ENV" == "${CONDA_ENV_NAME}" ]]; then + EXEC_CMD="python" + else + EXEC_CMD="conda run --name ${CONDA_ENV_NAME} python" + fi + + $EXEC_CMD "$root_dir/$fuzzer" \ + $dict_arg \ + -max_len=512 \ + -max_total_time="$duration" \ + -artifact_prefix="./" \ + "$fuzzer_corpus" \ + "$@" > "fuzz_output.log" 2>&1 + + local exit_code=$? + # libFuzzer returns 1 for crash, 70 for OOM, 77 for timeout. + if [ $exit_code -ne 0 ]; then + echo -e "${RED}❌ Fuzzing failed: Crash or error detected in $fuzzer_name (Exit Code: $exit_code). Check logs/$fuzzer_name/fuzz_output.log${NC}" + fi + ) & done - success "✅ All fuzz tests passed successfully." + echo -e "${CYAN}⏳ All fuzzers launched in isolation. Waiting for completion...${NC}" + wait + success "✅ All fuzz tests finished." } # ============================================================================== @@ -243,6 +274,7 @@ clean() { find . -type f -name '*.egg' -exec rm -f {} + # Temp logs and profilers + rm -rf logs/ rm -f *.prof profile.html profile.json tmp.txt wget-log success "Workspace cleaned!" @@ -270,7 +302,7 @@ help() { echo " test_strict_warnings - Run tests and fail on any DeprecationWarning" echo "" echo -e "${YELLOW}Security & Fuzzing:${NC}" - echo " fuzz_all - Run all fuzz tests" + echo " fuzz_all - Run all fuzz tests (pass duration as first arg, optionally pass fuzzer flags)" echo "" echo -e "${YELLOW}Performance & Security:${NC}" echo " perf_bench - Run pytest-benchmark suite" @@ -286,7 +318,7 @@ help() { echo -e "${GREEN}Examples:${NC}" echo " ./manage.sh test_unit -vvv -s" echo " ./manage.sh test_unit -k \"test_pep578_audit_hooks\"" - echo " ./manage.sh test_no_warnings tests/unit/test_client.py" + echo " ./manage.sh fuzz_all 60 -max_len=16384" } # Check if at least one argument is provided @@ -299,39 +331,11 @@ COMMAND=$1 shift # Remove the command from the arguments list, leaving only extra flags case "$COMMAND" in - env_setup|format|lint|test_all|test_unit|test_integration|test_cov|test_no_warnings|test_strict_warnings|perf_bench|perf_profile|audit_deps|run_hooks|build_pkg|release|clean|help) + env_setup|format|lint|test_all|test_unit|test_integration|test_cov|test_no_warnings|test_strict_warnings|perf_bench|perf_profile|audit_deps|run_hooks|build_pkg|release|clean|fuzz_all) "$COMMAND" "$@" # Execute the function with any remaining arguments ;; - fuzz_all) - # 1. Grab the duration, defaulting to 20 if not provided - DURATION=${1:-20} - - # 2. Shift the duration out of the arguments list (if it was provided) - # This leaves ONLY the extra flags (like -max_len=16384) in "$@" - if [ $# -gt 0 ]; then shift; fi - - info "🚀 Starting security fuzzing suite (duration: ${DURATION} seconds per fuzzer)..." - if [ $# -gt 0 ]; then - info "Applying extra LibFuzzer arguments: $@" - fi - - # Find all fuzzers - FUZZERS=$(find tests/fuzz -maxdepth 1 -name "fuzz_*.py" -type f) - - for fuzzer in $FUZZERS; do - fuzzer_name=$(basename "$fuzzer" .py) - corpus_dir="tests/fuzz/corpus/$fuzzer_name" - - mkdir -p "$corpus_dir" - - info "🔍 Running fuzzer: $fuzzer (Corpus: $corpus_dir)" - - # 3. Append "$@" to the end to forward any extra arguments - python "$fuzzer" "$corpus_dir" -dict=tests/fuzz/fuzzer.dict -max_total_time="$DURATION" "$@" - - echo "" - done - success "✅ All fuzz tests passed successfully." + help) + help ;; *) error "Unknown command: $COMMAND" diff --git a/pyproject.toml b/pyproject.toml index a4a9735..51721e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,9 +16,10 @@ py-modules = ["mailjet_rest._version"] [tool.setuptools.packages.find] include = ["mailjet_rest", "mailjet_rest.*"] +exclude = ["tests*"] [tool.setuptools.package-data] -mailjet_rest = ["py.typed", "*.pyi"] +mailjet_rest = ["py.typed"] [project] name = "mailjet-rest" diff --git a/samples/smoke_readme_runner.py b/samples/smoke_readme_runner.py index fd41e22..fd973fd 100644 --- a/samples/smoke_readme_runner.py +++ b/samples/smoke_readme_runner.py @@ -8,7 +8,6 @@ import os import uuid import logging -import warnings import time from mailjet_rest import Client, MailjetAuthError diff --git a/tests/fuzz/fuzz_state_machine.py b/tests/fuzz/fuzz_state_machine.py index b90b8f6..4e29ea0 100644 --- a/tests/fuzz/fuzz_state_machine.py +++ b/tests/fuzz/fuzz_state_machine.py @@ -32,7 +32,7 @@ def TestOneInput(data: bytes) -> None: builder._msg = {} elif op == 3: payload = builder.build() - client._execute_request("POST", "https://api.mailjet.com/v3/send", data=payload) # type: ignore[call-arg] + client.api_call("POST", "https://api.mailjet.com/v3/send", data=payload) elif op == 4: client.auth = (fdp.ConsumeUnicodeNoSurrogates(5), None) # type: ignore[attr-defined] diff --git a/tests/fuzz/fuzzer.dict b/tests/fuzz/fuzzer.dict index cebc7c3..3431d7d 100644 --- a/tests/fuzz/fuzzer.dict +++ b/tests/fuzz/fuzzer.dict @@ -1,7 +1,7 @@ # ========================================== # 1. Target-Specific API & Domain Context # ========================================== -# Routing terms, versions, and parameters specific to the target API. +# Routing terms, versions, and parameters specific to the Mailjet API. "v1" "v3" "v3.1" @@ -57,6 +57,8 @@ "APIKey" "SecretKey" "Token" + +# Common state flags & analytics "open" "click" "bounce" @@ -66,6 +68,8 @@ "unsubscribed" "statcounters" "statistics_linkClick" + +# Extracted internal routing aliases "parseroute" "campaigndraft" "campaigndraft_schedule" @@ -110,15 +114,20 @@ "TimeoutError" "ValidationError" "DoesNotExistError" +"RequestsConnectionError" +"TypeError" +"ValueError" "IsTextPartGenerationEnabled" "CounterSource" "Date" # ========================================== -# 2. Path Traversal & Filesystem Boundaries +# 2. Path Traversal & Filesystem Boundaries (CWE-22) # ========================================== -# Payloads targeting local file inclusion (LFI) and OS-level file exposure (CWE-22). +# Payloads targeting local file inclusion (LFI) and OS-level file exposure. "//" +"../" +"/.." ".." "///" "/." @@ -134,13 +143,17 @@ "/private/tmp/safe" "/private/tm/.p./\x10" "../../../../../../../../../../../../" +"../../../" +"%2F" +"%2f" +"%2E%2E%2F" "%2e%2e%2f" "%252e%252e%252f" +"1%2E%2E%2F" "%c0%af" "%e0%80%af" "%c0%ae%c0%ae%c0%af" "%5C..%5C..%5C" -"%5C..%5C..%5C" "C:%5C" "c:\\windows\\system32\\config\\sam" "/etc/passwd" @@ -157,12 +170,15 @@ "com1" # ========================================== -# 3. SSRF, Hostnames & Scheme Bypasses +# 3. SSRF, Hostnames & Scheme Bypasses (CWE-918) # ========================================== -# Targets Server-Side Request Forgery (CWE-918) and URL parsing logic. +# Targets Server-Side Request Forgery and URL parsing logic. +"http://" +"https://" "http://127.0.0.1" "https://127.0.0.1" "http://localhost" +"localhost" "http://[::1]" "http://169.254.169.254/latest/meta-data/" "file://" @@ -175,15 +191,13 @@ "0x7f.0x0.0x0.0x1" "::ffff:7f000001" "api.mailjet.com" -"mailjet.com" -"api.mailgun.net" -"api.eu.mailgun.net" "api.mailjet.com.attacker.com" +"mailjet.com" "//mailjet.com" "blob:" # ========================================== -# 4. Protocol Smuggling, HTTP Headers & CRLF +# 4. Protocol Smuggling, HTTP Headers & CRLF (CWE-113, CWE-444) # ========================================== # Targets HTTP/1.x, HTTP/2 framing, cache poisoning, and connection pools. "\x0D\x0A" @@ -219,6 +233,7 @@ "TRACE" "CONNECT" "Authorization" +"Authorization: Basic" "Bearer " "Basic " "Expect: 100-continue" @@ -243,9 +258,13 @@ "{\"Variables\": {\"level1\": {\"level2\": {\"level3\": {\"level4\": 1}}}}}" "[[[[[[[[[[]]]]]]]]]]" "{\"\\u0000\": \"null_key\"}" +"\"members\":\"[{" +"[{\"address\":" +"\"vars\":{" "" "]>" "application/json" +"Content-Type: application/json" "application/xml" "application/pdf" "text/html" @@ -253,6 +272,9 @@ "image/gif" "application/x-www-form-urlencoded" "multipart/form-data" +"Content-Type: multipart/form-data" +"message/rfc2822" +"message/rfc822" "multipart/form-data; boundary=---------------------------" "\x0D\x0A\x0D\x0A--" "data:image/png;base64,iVBORw0KGgo" @@ -261,12 +283,13 @@ "=?utf-8?q?" "=?ISO-8859-1?Q?" "Content-Transfer-Encoding: base64\x0D\x0A\x0D\x0A====" +"Content-Transfer-Encoding: quoted-printable" "Content-Transfer-Encoding: quoted-printable\x0D\x0A\x0D\x0A=ZZ" # ========================================== -# 6. SQL, NoSQL & Data Store Injection +# 6. Code Injection (SQLi, NoSQLi, Command, SSTI, XSS) # ========================================== -# Targets database query builders and NoSQL evaluation engines. +# Targets database query builders, templating logic, and unsafe evaluation. "' OR '1'='1" "\" OR \"1\"=\"1" "admin' --" @@ -275,11 +298,6 @@ "1' WAITFOR DELAY '0:0:10'--" "||" "&&" - -# ========================================== -# 7. Command Injection, Metaprogramming & Deserialization -# ========================================== -# Targets unsafe evaluation, Python introspection, and shell execution. ";id;" "|id" "`id`" @@ -305,11 +323,6 @@ "cos\x0asystem\x0a(S'id'\x0atR." "c__builtin__\x0aeval\x0a(Vprint('XSS')\x0atR." "Z3tfQW5f/////////////////////19pb25fL2FjdG9uYWlkZ1k=" - -# ========================================== -# 8. XSS & Server-Side Template Injection (SSTI) -# ========================================== -# Targets rendering engines, web outputs, and templating logic. "" "" @@ -326,10 +339,20 @@ "#{7*7}" "<%= 7*7 %>" "{{config.items()}}" +"{{config.SECRET}}" +"{{ " "{{ joiner.__init__.__globals__.os.popen('id').read() }}" +"{\"AND\":[{" +"comparator" +"attribute" +"{{#if" +"{{#unless" +"{{#each" +"{{#with" +"{{#equal" # ========================================== -# 9. Format Strings & Regex Denial of Service (ReDoS) +# 7. Format Strings & Regex Denial of Service (ReDoS) # ========================================== "%s" "%n" @@ -348,7 +371,7 @@ "a*?" # ========================================== -# 10. Numeric Boundaries, Integers & Floats +# 8. Numeric Boundaries, Integers & Floats # ========================================== # Targets type coercion, overflows, NaN/Infinity, and math operations. "0" @@ -367,12 +390,25 @@ "NaN" "Infinity" "-Infinity" +"null" +"true" +"false" # ========================================== -# 11. Unicode, Encodings & Control Characters +# 9. Unicode, Encodings & Control Characters # ========================================== -# Targets charset normalizers, BOMs, string allocators, and delimiter limits. +# Targets charset normalizers, string allocators, and parsing bugs. "\x00" +"\x0a" +"\x0b" +"\x0c" +"\x0d" +"\x13" +"\x1b" +"\x1f" +"\x22" +"\x27" +"\x7f" "\\u0000" "%\x00" "a/" @@ -381,6 +417,9 @@ "Gc" "e/" "httpr" +"htt5" +"htt5://" +"httgs" "e4" "m\x1e" "P&" @@ -394,18 +433,18 @@ "9G" "Ce" "/[" +"[$" "X-" -";/" "/T" "TT" "\x7f\x03" "OggS" -"DATA" "Offset" "Value" "w+" "addnoforce" -"application/pdf" +"proxy" +"mailjet,com" "user+tag@example.com" "\"much.more unusual\"@example.com" "admin@[IPv6:2001:db8::1]" @@ -428,41 +467,39 @@ "%EF%BC%8E" "%EF%BC%8F" "%D0%CF%11%E0%A1%B1%1A%E1" +"\xe2\x80\xaa\xe2\x80\xa0\xe1\x85\xa1" +"\xe2\x80\xaa\xe3\x80\xa0\xe2\x80\xa0\xe5\x88\xa0\xe7\x85\x85\xe6\xa5\xad\xe7\xa1\xa3\xeb\xb0\x94" +"\xe0\xa8\xa0\xe2\x84\xa1\xe4\xa8\xa0\xe2\x81\x90\xe2\x80\xb2" +"\xE6\xA9\xAA\xE6\xA9\xAA\xE6\xA9\xAA\xE6\xA9\xAA\xE7\x9D\xB7\xE7\x9D\xB7\xE7\x9C\xA0\xE2\x80\xA3\xE2\x80\xA0\xE7\x9D\xB7\xE7\xB3\xB8\xE9\xBC\xA0" +"\xeb\xa9\xbd\xef\xbf\xbf\xef\xbe\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xef\xbd\xba\xef\xbf\xbf\xe7\xab\xbf\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\xa9\xba\xe7\x85\xba\xe7\xa9\xba\xe7" +"\xe5\xb9\x95\x06\xc4\x80\x00\x00\x00\xe1\xac\x85\xe1\xac\x99\xe1\xac\x9b\xe4\xb8\xb6\xe5\xb5\x9b" +"\xf1\x96\x97\xbf\xf3\x84\x84\xad\xf1\xa0\x98\x86\x06\x00\xe2\xbd\x87" +"\xf1\xbc\x9f\x87\x00\x00THz\xf1\x93\x84\xad\xe3\x80\xb0" +"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\x00\xf4\x80\x80\x80\xc4\xb3\x00" +"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf1\xbc\x9f\x87\x00\x00\xe3\x8e\x94\xf1\x93\x84\xad0" +"\xc4\x80h\x00\x00\x00\xc4\x80\xe7\x91\xa8\xe4\x81\xb4\xe3\xa9\xad\xe7\xbd\xbf\xe2\xbd\x95" +"\xe6\x85\xa5\xea\x90\xb6\xe6\xbd\x83\xef\xbf\xbf\x20\xcc\x84\xe6\xa7\xbf\xc5\xa3\xe6\xac\x80\xe3\x83\x84" +"\xe6\xbd\xb2\xe6\xa9\xa2\x65\xe8\x80\x80\xe7\x88\x80\xef\xbd\xaf" +"\xe6\x84\xaf\x68\x00\xe1\x85\xa3\xe3\x82\xb3" +"\xef\xbc\xb0\xe2\x8d\xb2\xe3\x88\x80\xe6\xb0\xaf" # ========================================== -# 12. Binary, Memory & Synthesized Fuzzer Boundaries +# 10. Binary Alignment, Memory Boundaries & Synthesized Magic Bytes # ========================================== -# Hex sequences, magic bytes, and memory markers synthesized by LibFuzzer. +# Hex sequences, structure delimiters, and memory markers synthesized by LibFuzzer. "0x3fffffff" "PK%03%04" +"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0." "\x00\x00" -"\x00\x00\x00\x00" -"\x00\x00\x00\x00\x00\x00\x00\x00" -"\x00\x00\x00\x00\x00\x00\x00\x01" -"\x00\x00\x00\x00\x00\x00\x00\x05" -"\x00\x00\x00\x00\x00\x00\x00\x0a" -"\x00\x00\x00\x00\x00\x00\x00\x11" -"\x00\x00\x00\x00\x00\x00\x00\x12" -"\x00\x00\x00\x00\x00\x00\x00\x16" -"\x00\x00\x00\x00\x00\x00\x00\x28" -"\x00\x00\x00\x00\x00\x00\x00\xae" -"\x00\x00\x00\x00\x00\x00\x00\xfb" -"\x00\x00\x00\x01\x00\xef\xbf\xbf\xef\xbf\xbf\xef\xbf\xbf\xe1\x8b\xbf\x00\x00\x00\xe4\xb8\x80a/c" -"\x00\x00\x00\xe2\xbf\xbf\xe2\x84\x80" "\x01\x00" +"\x00\x00\x00\x00" "\x01\x00\x00\x00" +"\xff\xff" +"\xff\xff\xff\xff" +"\xff\xff\xff\xff\xff\xff\xff\xff" +"\xfe\xff\xff\xff\xff\xff\xff\xff" +"\x00\x00\x00\x00\x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x00\x00" -"\x01\x00\x00\x00\x00\x00\x00\x0a" -"\x01\x00\x00\x00\x00\x00\x00\x33" -"\x01\x00\x00\x00\x00\x00\x00\x40" -"\x01\x00\x00\x00\x00\x00\x00\x65" -"\x01\x00\x00\x00\x00\x00\x00\x76" -"\x01\x00\x00\x00\x00\x00\x00\x88" -"\x01\x00\x00\x00\x00\x00\x00\x8b" -"\x01\x00\x00\x00\x00\x00\x00\xf7" -"\x01\x00\x00\x00\x00\x00\x00\x98" -"\x01\x00\x00\x00\x00\x00\x01\x52" -"\x01\x00\x00\x00\x00\x00\x02\x17" "\x02\x00\x00\x00\x00\x00\x00\x00" "\x03\x00\x00\x00\x00\x00\x00\x00" "\x04\x00\x00\x00\x00\x00\x00\x00" @@ -483,95 +520,233 @@ "\x13\x00\x00\x00\x00\x00\x00\x00" "\x14\x00\x00\x00\x00\x00\x00\x00" "\x15\x00\x00\x00\x00\x00\x00\x00" -"\x15\x01\x00\x00\x00\x00\x00\x00" +"\x16\x00\x00\x00\x00\x00\x00\x00" +"\x17\x00\x00\x00\x00\x00\x00\x00" +"\x19\x00\x00\x00\x00\x00\x00\x00" +"\x1a\x00\x00\x00\x00\x00\x00\x00" +"\x1b\x00\x00\x00\x00\x00\x00\x00" +"\x1d\x00\x00\x00\x00\x00\x00\x00" "\x1e\x00\x00\x00\x00\x00\x00\x00" "\x1f\x00\x00\x00\x00\x00\x00\x00" "\x20\x00\x00\x00\x00\x00\x00\x00" "\x21\x00\x00\x00\x00\x00\x00\x00" -"\x23\x01\x00\x00\x00\x00\x00\x00" "\x25\x00\x00\x00\x00\x00\x00\x00" "\x2b\x00\x00\x00\x00\x00\x00\x00" -"\x2e\x01\x00\x00\x00\x00\x00\x00" -"\x2f\x2f" "\x31\x00\x00\x00\x00\x00\x00\x00" +"\x32\x00\x00\x00\x00\x00\x00\x00" "\x33\x00\x00\x00\x00\x00\x00\x00" +"\x34\x00\x00\x00\x00\x00\x00\x00" "\x37\x00\x00\x00\x00\x00\x00\x00" +"\x39\x00\x00\x00\x00\x00\x00\x00" "\x3a\x00\x00\x00\x00\x00\x00\x00" "\x3b\x00\x00\x00\x00\x00\x00\x00" "\x3c\x00\x00\x00\x00\x00\x00\x00" "\x3f\x00\x00\x00\x00\x00\x00\x00" "\x40\x00\x00\x00\x00\x00\x00\x00" -"\x41\x23" "\x53\x00\x00\x00\x00\x00\x00\x00" "\x56\x00\x00\x00\x00\x00\x00\x00" -"\x57\x57" -"\x65\x65" "\x67\x00\x00\x00\x00\x00\x00\x00" "\x6a\x00\x00\x00\x00\x00\x00\x00" "\x6c\x00\x00\x00\x00\x00\x00\x00" -"\x79\x4e" "\x7c\x00\x00\x00\x00\x00\x00\x00" -"\x7e\x2f" +"\x7f\x00\x00\x00\x00\x00\x00\x00" "\x88\x00\x00\x00\x00\x00\x00\x00" "\x8b\x00\x00\x00\x00\x00\x00\x00" "\x8d\x00\x00\x00\x00\x00\x00\x00" "\x90\x00\x00\x00\x00\x00\x00\x00" "\x99\x00\x00\x00\x00\x00\x00\x00" +"\xa8\x00\x00\x00\x00\x00\x00\x00" "\xb5\x00\x00\x00\x00\x00\x00\x00" -"\xb5\x01\x00\x00\x00\x00\x00\x00" "\xc3\x00\x00\x00\x00\x00\x00\x00" -"\xc4\x80h\x00\x00\x00\xc4\x80\xe7\x91\xa8\xe4\x81\xb4\xe3\xa9\xad\xe7\xbd\xbf\xe2\xbd\x95" +"\xc5\x00\x00\x00\x00\x00\x00\x00" "\xc8\x00\x00\x00\x00\x00\x00\x00" "\xc9\x00\x00\x00\x00\x00\x00\x00" "\xd8\x00\x00\x00\x00\x00\x00\x00" "\xd9\x00\x00\x00\x00\x00\x00\x00" "\xdc\x00\x00\x00\x00\x00\x00\x00" "\xdf\x00\x00\x00\x00\x00\x00\x00" -"\xe5\xb9\x95\x06\xc4\x80\x00\x00\x00\xe1\xac\x85\xe1\xac\x99\xe1\xac\x9b\xe4\xb8\xb6\xe5\xb5\x9b" "\xe7\x03\x00\x00\x00\x00\x00\x00" "\xee\x00\x00\x00\x00\x00\x00\x00" "\xef\x00\x00\x00\x00\x00\x00\x00" -"\xf1\x96\x97\xbf\xf3\x84\x84\xad\xf1\xa0\x98\x86\x06\x00\xe2\xbd\x87" -"\xf1\xbc\x9f\x87\x00\x00THz\xf1\x93\x84\xad\xe3\x80\xb0" -"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\x00\xf4\x80\x80\x80\xc4\xb3\x00" -"\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbf\xf1\xbc\x9f\x87\x00\x00\xe3\x8e\x94\xf1\x93\x84\xad0" "\xfb\x00\x00\x00\x00\x00\x00\x00" "\xfc\x00\x00\x00\x00\x00\x00\x00" "\xfd\x00\x00\x00\x00\x00\x00\x00" "\xfe\x00\x00\x00\x00\x00\x00\x00" -"\xff\xff" -"\xff\xff\xff\xff" +"\x00\x00\x00\x00\x00\x00\x00\x01" +"\x00\x00\x00\x00\x00\x00\x00\x03" +"\x00\x00\x00\x00\x00\x00\x00\x04" +"\x00\x00\x00\x00\x00\x00\x00\x05" +"\x00\x00\x00\x00\x00\x00\x00\x07" +"\x00\x00\x00\x00\x00\x00\x00\x08" +"\x00\x00\x00\x00\x00\x00\x00\x09" +"\x00\x00\x00\x00\x00\x00\x00\x0a" +"\x00\x00\x00\x00\x00\x00\x00\x0d" +"\x00\x00\x00\x00\x00\x00\x00\x0f" +"\x00\x00\x00\x00\x00\x00\x00\x11" +"\x00\x00\x00\x00\x00\x00\x00\x12" +"\x00\x00\x00\x00\x00\x00\x00\x16" +"\x00\x00\x00\x00\x00\x00\x00\x17" +"\x00\x00\x00\x00\x00\x00\x00\x19" +"\x00\x00\x00\x00\x00\x00\x00\x28" +"\x00\x00\x00\x00\x00\x00\x00\x31" +"\x00\x00\x00\x00\x00\x00\x00\x39" +"\x00\x00\x00\x00\x00\x00\x00\x3b" +"\x00\x00\x00\x00\x00\x00\x00\x3e" +"\x00\x00\x00\x00\x00\x00\x00\x88" +"\x00\x00\x00\x00\x00\x00\x00\xae" +"\x00\x00\x00\x00\x00\x00\x00\xd8" +"\x00\x00\x00\x00\x00\x00\x00\xfb" +"\x00\x00\x00\x00\x00\x00\x009" +"\x00\x00\x00\x00\x00\x00\x00i" +"\x00\x00\x00\x00\x00\x00\x00y" +"\x01\x00\x00\x00\x00\x00\x00\x01" +"\x01\x00\x00\x00\x00\x00\x00\x02" +"\x01\x00\x00\x00\x00\x00\x00\x04" +"\x01\x00\x00\x00\x00\x00\x00\x05" +"\x01\x00\x00\x00\x00\x00\x00\x07" +"\x01\x00\x00\x00\x00\x00\x00\x08" +"\x01\x00\x00\x00\x00\x00\x00\x0a" +"\x01\x00\x00\x00\x00\x00\x00\x0b" +"\x01\x00\x00\x00\x00\x00\x00\x0c" +"\x01\x00\x00\x00\x00\x00\x00\x0d" +"\x01\x00\x00\x00\x00\x00\x00\x0e" +"\x01\x00\x00\x00\x00\x00\x00\x0f" +"\x01\x00\x00\x00\x00\x00\x00\x11" +"\x01\x00\x00\x00\x00\x00\x00\x18" +"\x01\x00\x00\x00\x00\x00\x00\x24" +"\x01\x00\x00\x00\x00\x00\x00\x27" +"\x01\x00\x00\x00\x00\x00\x00\x2b" +"\x01\x00\x00\x00\x00\x00\x00\x33" +"\x01\x00\x00\x00\x00\x00\x00\x35" +"\x01\x00\x00\x00\x00\x00\x00\x36" +"\x01\x00\x00\x00\x00\x00\x00\x3b" +"\x01\x00\x00\x00\x00\x00\x00\x40" +"\x01\x00\x00\x00\x00\x00\x00\x4f" +"\x01\x00\x00\x00\x00\x00\x00\x5d" +"\x01\x00\x00\x00\x00\x00\x00\x63" +"\x01\x00\x00\x00\x00\x00\x00\x65" +"\x01\x00\x00\x00\x00\x00\x00\x76" +"\x01\x00\x00\x00\x00\x00\x00\x80" +"\x01\x00\x00\x00\x00\x00\x00\x88" +"\x01\x00\x00\x00\x00\x00\x00\x8b" +"\x01\x00\x00\x00\x00\x00\x00\x94" +"\x01\x00\x00\x00\x00\x00\x00\x98" +"\x01\x00\x00\x00\x00\x00\x00\xd7" +"\x01\x00\x00\x00\x00\x00\x00\xf7" +"\x01\x00\x00\x00\x00\x00\x00-" +"\x01\x00\x00\x00\x00\x00\x003" +"\x01\x00\x00\x00\x00\x00\x00]" +"\x01\x00\x00\x00\x00\x00\x01\x47" +"\x01\x00\x00\x00\x00\x00\x01\x52" +"\x01\x00\x00\x00\x00\x00\x02\x17" +"\x01\x00\x00\x00\x00\x03\x0d\x40" +"\x00\x00\x00\x00\x00\x03\x0d\x40" +"\x00\x01\x00\x00\x00\x00\x00\x00" +"\x01\x00\x01\x00\x00\x00\x00\x00" +"\x15\x01\x00\x00\x00\x00\x00\x00" +"\x23\x01\x00\x00\x00\x00\x00\x00" +"\x2e\x01\x00\x00\x00\x00\x00\x00" +"\x51\x01\x00\x00\x00\x00\x00\x00" +"\x81\x00\x00\x00\x00\x00\x00\x00" +"\x90\x01\x00\x00\x00\x00\x00\x00" +"\x91\x01\x00\x00\x00\x00\x00\x00" +"\xb5\x01\x00\x00\x00\x00\x00\x00" +"\x1a\x03\x00\x00\x00\x00\x00\x00" +"\xff\xff\xff\xff\xff\xff\x02\x00" +"\xff\xff\xff\xff\xff\x02\x0d\x40" +"\xff\xff\xff\xff\xff\x00\x00\x00" "\xff\xff\xff\xff\x20" +"\xff\xff\xff\xff\xff\xff\xff\x00" "\xff\xff\xff\xff\xff\xff\xff\x01" "\xff\xff\xff\xff\xff\xff\xff\x02" "\xff\xff\xff\xff\xff\xff\xff\x03" "\xff\xff\xff\xff\xff\xff\xff\x04" +"\xff\xff\xff\xff\xff\xff\xff\x05" +"\xff\xff\xff\xff\xff\xff\xff\x07" +"\xff\xff\xff\xff\xff\xff\xff\x08" "\xff\xff\xff\xff\xff\xff\xff\x09" "\xff\xff\xff\xff\xff\xff\xff\x0a" "\xff\xff\xff\xff\xff\xff\xff\x0b" +"\xff\xff\xff\xff\xff\xff\xff\x0c" "\xff\xff\xff\xff\xff\xff\xff\x0f" +"\xff\xff\xff\xff\xff\xff\xff\x10" "\xff\xff\xff\xff\xff\xff\xff\x12" "\xff\xff\xff\xff\xff\xff\xff\x13" +"\xff\xff\xff\xff\xff\xff\xff\x14" "\xff\xff\xff\xff\xff\xff\xff\x1d" "\xff\xff\xff\xff\xff\xff\xff\x25" "\xff\xff\xff\xff\xff\xff\xff\x27" +"\xff\xff\xff\xff\xff\xff\xff\x29" +"\xff\xff\xff\xff\xff\xff\xff\x2f" +"\xff\xff\xff\xff\xff\xff\xff\x31" "\xff\xff\xff\xff\xff\xff\xff\x32" +"\xff\xff\xff\xff\xff\xff\xff\x39" "\xff\xff\xff\xff\xff\xff\xff\x3b" "\xff\xff\xff\xff\xff\xff\xff\x3f" "\xff\xff\xff\xff\xff\xff\xff\x49" "\xff\xff\xff\xff\xff\xff\xff\x68" +"\xff\xff\xff\xff\xff\xff\xff\x69" "\xff\xff\xff\xff\xff\xff\xff\x6e" "\xff\xff\xff\xff\xff\xff\xff\x76" "\xff\xff\xff\xff\xff\xff\xff\x7b" +"\xff\xff\xff\xff\xff\xff\xff\x7c" "\xff\xff\xff\xff\xff\xff\xff\x7e" "\xff\xff\xff\xff\xff\xff\xff\x8c" "\xff\xff\xff\xff\xff\xff\xff\x92" +"\xff\xff\xff\xff\xff\xff\xff\x95" "\xff\xff\xff\xff\xff\xff\xff\x97" "\xff\xff\xff\xff\xff\xff\xff\xd0" +"\xff\xff\xff\xff\xff\xff\xff\xd2" +"\xff\xff\xff\xff\xff\xff\xff\xdb" "\xff\xff\xff\xff\xff\xff\xff\xeb" "\xff\xff\xff\xff\xff\xff\xff\xfa" "\xff\xff\xff\xff\xff\xff\xff\xfb" "\xff\xff\xff\xff\xff\xff\xff\xfd" "\xff\xff\xff\xff\xff\xff\xff\xfe" -"\xff\xff\xff\xff\xff\xff\xff\xff" -"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0." +"\xff\xff\xff\xff\xff\xff\xffN" +"\xff\xff\xff\xff\xff\xff\xffV" +"\x00\xd0\x80\x00\xe7\xbc\x80\x00\x00\x00-\x00\x00`\x00\x00\x00\x00\x00\x00-\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xb4\x80\xe7\x93\x9c" +"\x22\x00\x00\x00\x00\x00\x00\x00" +"\x2f\x2f" +"\x41\x23" +"\x57\x57" +"\x65\x65" +"\x73\x00\x00\x00\x00\x00\x00\x00" +"\x79\x4e" +"\x7e\x2f" +"\x7f5" +"\x7f\x00" +"\xed\x80\x80\x00\x00\xc4\xb2" +"?\x00\x00\x00\x00\x00\x00\x00" +".\x00\x00\x00\x00\x00\x00\x00" +"0[" +"[\x00\x00\x00\x00\x00\x00\x00" +"@E" +"\x05[" +"\x77\x27" +"\x4f\x67\x67\x53" +"\x78\x35\x30\x39" +"\x37\x37\x37\x37" +"\x25\x6e" +"\x69\x7e" +"\x73\x68\x6c\x76\x6c" +"\x7b\x2b" +"\x21\x28\x00\x00\x00\x00\x00\x00" +"\x69\x64\x79\x79\x79\x79\x7a\x79" +"\x30\x6f" +"\x2f\x61" +"\x41\x7f" +"\x27\x00" +"\x30\x30" +"\xe2\xbd\x9b\x7f\xe2\xb8\x80\xc2\x80\x00\x00\x00\x00\x00" +"\x2f\x7f" +"\x5b\x6e" +"\x32\x6f" +"\x2f\x64" +"\x6e\x73\x65\x64\x76\x75\x6e" +"\x24\x76" +"\x70\x28" +"\x25\x30" +"\xe2\xbc\x81\x00" +"\x68\x74\x2b\x31" +"\x4c\x00\x00\x00\x00\x00\x00\x00"