coretrace-python-analyzer 0.23.0__tar.gz → 0.24.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CHANGELOG.md +94 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/PKG-INFO +1 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/plugins.md +26 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/usage.md +59 -8
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/pyproject.toml +1 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/__init__.py +1 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/dependency_policy/dependency_policy.py +12 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/reachable_vulnerability.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/vulnerable_dependency.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/code_injection/code_injection.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/command_injection/command_injection.py +7 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/insecure_deserialization/insecure_deserialization.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/nosql_injection/nosql_injection.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/open_redirect/open_redirect.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/path_traversal/path_traversal.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/plaintext_credentials/plaintext_credentials.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/sql_injection/sql_injection.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/ssrf/ssrf.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/xss/xss.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/dangerous_eval/dangerous_eval.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/flask_debug/flask_debug.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/insecure_tempfile.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tls/insecure_tls.py +7 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/missing_timeout/missing_timeout.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_archive/unsafe_archive.py +7 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_xml/unsafe_xml.py +7 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_crypto/weak_crypto.py +8 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_random/weak_random.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cache.py +8 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cli.py +3 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/engine.py +214 -88
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/__init__.py +10 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/model.py +11 -1
- coretrace_python_analyzer-0.24.0/src/coretrace_python/findings/rules.py +16 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/__init__.py +4 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/modulegraph.py +54 -28
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/summaries.py +51 -15
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/api.py +5 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/detectors.py +6 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/secrets.py +16 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/report.py +6 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/sarif.py +57 -14
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/scopes.py +42 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/__init__.py +9 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/manager.py +53 -7
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/model.py +12 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/__init__.py +2 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/templates.py +686 -77
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/pygoat.json +3 -27
- coretrace_python_analyzer-0.24.0/tests/test_annotation_bindings.py +154 -0
- coretrace_python_analyzer-0.24.0/tests/test_annotation_expression_scopes.py +93 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_injection.py +29 -0
- coretrace_python_analyzer-0.24.0/tests/test_namespace_module_imports.py +249 -0
- coretrace_python_analyzer-0.24.0/tests/test_namespace_module_names.py +90 -0
- coretrace_python_analyzer-0.24.0/tests/test_namespace_module_visibility.py +275 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_release.py +1 -1
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_reporters.py +87 -1
- coretrace_python_analyzer-0.24.0/tests/test_rule_descriptions.py +157 -0
- coretrace_python_analyzer-0.24.0/tests/test_rule_descriptions_of_given_plugins.py +40 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sarif_injection.py +6 -4
- coretrace_python_analyzer-0.24.0/tests/test_summary_external_call_order.py +114 -0
- coretrace_python_analyzer-0.24.0/tests/test_summary_fixpoint.py +264 -0
- coretrace_python_analyzer-0.24.0/tests/test_template_comment_continuations.py +221 -0
- coretrace_python_analyzer-0.24.0/tests/test_template_filter_walk.py +279 -0
- coretrace_python_analyzer-0.24.0/tests/test_template_open_constructs.py +239 -0
- coretrace_python_analyzer-0.24.0/tests/test_template_page_composition.py +510 -0
- coretrace_python_analyzer-0.24.0/tests/test_template_tag_backtracking.py +193 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_vendored_context.py +3 -2
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.github/workflows/ci.yml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.github/workflows/release.yml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.gitignore +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/AUTHORS.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CODE_OF_CONDUCT.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CONTRIBUTING.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/LICENSE +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/NOTICE +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/README.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/SECURITY.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/architecture.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/examples/add.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/examples/canonical_symbols.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/analysis.stderr +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/findings.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/rapport.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/sbom.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/triage.csv +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/verification.txt +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/vex.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/__main__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/constants.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/heap.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/module_constants.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/ranges.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/strings.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/values.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/manager.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/provider.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/dependency_policy/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/sample_advisories/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/sample_advisories/sample_advisories.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/aiohttp/aiohttp_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/aiohttp/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/bottle/bottle_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/bottle/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/cli/cli_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/cli/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/credentials/credential_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/credentials/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/db_drivers/db_driver_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/db_drivers/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/django/django_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/django/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/fastapi/fastapi_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/fastapi/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/flask/flask_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/flask/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/http_clients/http_client_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/http_clients/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/python_stdlib/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/python_stdlib/python_stdlib.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/sqlalchemy/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/sqlalchemy/sqlalchemy_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/tornado/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/tornado/tornado_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/config_secrets/config_secrets.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/config_secrets/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/hardcoded_secrets.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/code_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/command_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/insecure_deserialization/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/nosql_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/open_redirect/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/path_traversal/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/plaintext_credentials/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/sql_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/ssrf/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/xss/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/dangerous_eval/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/flask_debug/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tls/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/missing_timeout/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_archive/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_xml/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_crypto/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_random/plugin.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/builder.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/dominance.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/model.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/lattice.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/solver.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/advisories.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/correlation.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/graph.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/policy.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/sbom.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/vex.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/baseline.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/context.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/coverage.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/provenance.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/refutation.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/suppressions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/ast_adapter.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/parser.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/nodes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/visitors.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/callgraph.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/defuse.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/lowering.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/model.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/printer.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/ssa.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/loader.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/manifest.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/registry.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/json_format.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/text.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/__init__.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/identity.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/imports.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/symbols.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/positions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/commands.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/engine.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/routes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/urls.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Chatbot.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/DjangoGoat.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Flask-Image-Editing-Website.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/InsecureGram.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/MiniBookApiServer.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/NPL-IA.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Spam-Detection-Project.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Vulnerable_fastapi.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/dvpwa.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/full-stack-fastapi-template.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/healthchecks.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/httpie.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/luigi.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/my_gdb.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/network-topologer.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/uploadbox-cloud-storage-solution.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/vulnerable-flask.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/yt-fts.json +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/README.md +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/app.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/requirements.txt +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/vulnerable_services.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/repositories.toml +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_evidence.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_feeds.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_url_host.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_aiohttp_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_allowlist_shapes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_analysis_manager.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_architecture.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_argument_conditions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_argument_present_conditions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attacker_arguments.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_loops.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_review.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_sinks.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_audit_detectors.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_base_patterns.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_digests.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_key.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_schema_1.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_block_super.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cache.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cache_engine_version.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cfg.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_class_keywords_with_targets.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cli.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_closures.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_context.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_context_single_file.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_arguments.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_decided_cases.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_injection_nature.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_config_secrets_coverage.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_config_value_spans.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_constants.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_correlation.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_credential_context.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_credential_project_path.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dataflow.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_declared_entry_points.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_deep_nesting.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dependencies.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_detectors.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_discovery.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_http_clients.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_routes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_safe_values.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_docs.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dominance.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dynamic_import_sinks.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dynamic_import_verdicts.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_emit_ir.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_entry_point_aliases.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_entry_point_suffixes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_exceptions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_factories_match_loop_else.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_fail_on.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_fastapi_cli_precision.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_file_locations.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_folded_secret_literals.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_frameworks.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_frontend_gaps.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_function_aliases_api.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_heap.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_hex_digests.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_hir_builder.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_import_path_sinks.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_imports.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_interprocedural.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_interprocedural_taint.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ir.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_jobs_option.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_jobs_workers.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_key_taint.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_keyword_name_conditions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_line_numbering.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_lock_dependency_maps.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_lock_positions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_match_patterns.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_members.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_module_identity.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_module_level.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nonlocal_kept_value.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nonlocal_writeback.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nosql_injection.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_open_redirect_destinations.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_operator_sources.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_packaging.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parallel.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parse_warnings.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parser.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_password_hashes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_plaintext_credentials.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_plugins.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_powershell_file_operand.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project_validators.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_provenance.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_pyir_imports.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_read_entry_points.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_real_code_precision.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_redirect_targets.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_refutation.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_refutation_evidence.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_regression.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_relative_paths.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_relative_root.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_remaining_limits.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_safe_arguments.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_scale.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_scopes.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_secrets_sbom.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_selection_sink_proofs.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_self_state.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sequence_conditions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_settings_scope.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sink_called_result.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sink_merge.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_source_manager.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssa.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssrf_destinations.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssrf_targets.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_structured_positions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_summary_reachability.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_summary_sanitizers.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_suppressions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_symbol_resolution.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_symbols.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntactic_rules.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_control_flow.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_coverage.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_expressions.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_taint.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_tar_implementations.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_context_flows.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_escaping.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_filter_calls.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_filter_overrides.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_request_processor.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_tornado_bottle_models.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_unreadable_templates.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_unsafe_xml_risk.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_url_proof.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_url_secret_placeholders.py +0 -0
- {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_vex.py +0 -0
|
@@ -1,5 +1,99 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.24.0 (2026-10-23)
|
|
4
|
+
|
|
5
|
+
### Compatibility and migration
|
|
6
|
+
|
|
7
|
+
- The cache format changes (19): caches built by an earlier version miss once.
|
|
8
|
+
- A module in a directory without `__init__.py` inside a package is named after that
|
|
9
|
+
package, as Python names it (#264): `pkg/sub/app.py` is `pkg.sub.app`. Its relative
|
|
10
|
+
imports now resolve, and a file that was a `syntax-error` (`relative import beyond
|
|
11
|
+
top-level package`) is analysed, flask's `sansio` for one. The project symbols of its
|
|
12
|
+
functions change with its name (`python.pkg.sub.app.view`), which a model declared on
|
|
13
|
+
the former symbol must follow; baseline keys do not change, since they hold no module
|
|
14
|
+
name. A script beside it still imports it by its short name, which answers no import
|
|
15
|
+
from another directory: at the project root, `import os` is the library even beside a
|
|
16
|
+
`pkg/sub/os.py`, which a top-level module of a directory took before. Files that share
|
|
17
|
+
only that short name are no longer noted as `ambiguous-module`, nor is an import that
|
|
18
|
+
only such names from other directories match.
|
|
19
|
+
- SARIF: each rule carries a title (`shortDescription`) and a description (`fullDescription`)
|
|
20
|
+
instead of repeating its id (#270), and each result carries its confidence as the
|
|
21
|
+
`confidence` property (#271). A flow reaching its sink inside a project function points at
|
|
22
|
+
that sink as a related location, which the result's message links to (#271).
|
|
23
|
+
- Django templates are read as a browser reads them (#263, #272, #278): a template that
|
|
24
|
+
leaves a tag, a `<script>` or `<style>` block or an end tag open, or includes one that
|
|
25
|
+
ends inside such a construct, is no longer established as escaping, so `xss` may be
|
|
26
|
+
reported where it was not.
|
|
27
|
+
- Django templates are also read as each page is put together (#273): a variable a
|
|
28
|
+
child's `{% block %}` prints inside its parent's `<script>`, an `{% include %}` that ends
|
|
29
|
+
the attribute value it stands in, or one of a name several files have outside HTML data,
|
|
30
|
+
is reported as `xss` where it was not, as is the variable `block` named anywhere but in
|
|
31
|
+
a bare `{{ block.super }}`. So is a template that includes Django's
|
|
32
|
+
`django/forms/widgets/attrs.html` inside a tag, which prints attribute names, and a
|
|
33
|
+
template including itself inside a tag or a script. A page beyond 8 MiB once put
|
|
34
|
+
together, or a template with more than 64 pages, or 16 MiB in all, through names
|
|
35
|
+
several files have, is not established and is listed in `Coverage.unread_templates`.
|
|
36
|
+
- Plugin API, additive: `Plugin.rules` maps the rules a plugin reports to their
|
|
37
|
+
`RuleDescription`, optional, so that third-party plugins describe their own rules;
|
|
38
|
+
`Finding.related` lists `RelatedLocation`s (a span and a message). `Report.rules` carries the
|
|
39
|
+
descriptions to the reporters.
|
|
40
|
+
- Plugin API: `coretrace_python.interprocedural.starting_summaries` gives the summaries an
|
|
41
|
+
import cycle's members start from, and `coretrace_python.engine.MAX_PROJECT_ITERATIONS`
|
|
42
|
+
is removed, since the project's summaries are iterated until they settle (#261).
|
|
43
|
+
- A summary lists its external calls in source order (#261): a finding naming the first
|
|
44
|
+
call of a callee's summary may name another of that callee, at the same line, as 4 of
|
|
45
|
+
saleor's 228 `orm-n-plus-one` findings do.
|
|
46
|
+
|
|
47
|
+
### Analysis
|
|
48
|
+
|
|
49
|
+
- `--check` ends on projects whose summaries never settled (#261). Around a call cycle of
|
|
50
|
+
three functions or more, a caller copied its callee's external calls in an order that
|
|
51
|
+
rotated forever, so ansible, fastapi, sentry and home-assistant never ended: those calls
|
|
52
|
+
are now kept in source order. Around an import cycle of three modules or more, the
|
|
53
|
+
project's iteration shifted by one module each time and stopped at its bound, which
|
|
54
|
+
could miss a sink reached through the cycle: its members now start from the summaries a
|
|
55
|
+
module starts from, and the iteration goes on until the project's summaries settle.
|
|
56
|
+
- A lambda or comprehension in the annotation of a parameter or a variable no longer
|
|
57
|
+
stops the analysis of a directory with a `KeyError` (#262). An assignment expression in
|
|
58
|
+
an annotation binds its name as Python 3.11 to 3.13 do: in a function, the name is a
|
|
59
|
+
local whether the annotation is evaluated or not; at module level, it exists only once
|
|
60
|
+
the annotation is evaluated.
|
|
61
|
+
|
|
62
|
+
### Templates
|
|
63
|
+
|
|
64
|
+
- Start tags and their attributes are read as the HTML tokenizer reads them, in time
|
|
65
|
+
linear in the size of the template (#263): a few dozen characters under a `templates`
|
|
66
|
+
directory, a PNG or `<a ` followed by 40 letters, stopped the analysis. A tag a template
|
|
67
|
+
leaves open is read to its end and its attributes are checked; a quoted value left open
|
|
68
|
+
stays quoted to the end of the template.
|
|
69
|
+
- A `<script>` or `<style>` block or an end tag a template leaves open runs to the end of
|
|
70
|
+
the template, and a variable inside it is refused, even where the page ends there
|
|
71
|
+
(#272). A template that ends inside such a construct or a tag is not established where
|
|
72
|
+
it is included, since the markup after the include continues it, and a template
|
|
73
|
+
extending another ends where that one ends.
|
|
74
|
+
- A comment ends where a browser ends it (`-->`, `--!>`, at once for `<!-->` and
|
|
75
|
+
`<!--->`), and one left open hides the rest of the template (#272). A comment holding
|
|
76
|
+
template tags may end at any of them, since an include there may close it and a
|
|
77
|
+
condition around its `<!--` may leave it out, or run to its close when they render
|
|
78
|
+
nothing: it is read on from its first tag, and that reading must be in HTML data right
|
|
79
|
+
after each later tag and right after the close (#278). Such a comment left open does
|
|
80
|
+
not end in HTML data.
|
|
81
|
+
|
|
82
|
+
### Performance
|
|
83
|
+
|
|
84
|
+
- Collecting the filters a template's render reaches walks each template once for each set
|
|
85
|
+
of blocks the templates extending it override (#279). It followed every path through
|
|
86
|
+
nested includes: two includes of one template at each of 20 levels took 31 s.
|
|
87
|
+
A template in a cycle of includes is still walked again wherever the cycle cuts its
|
|
88
|
+
walk short.
|
|
89
|
+
|
|
90
|
+
### Documentation
|
|
91
|
+
|
|
92
|
+
- `docs/usage.md` documents how templates are read and each page is put together, the
|
|
93
|
+
modules of a directory without `__init__.py`, assignment expressions in annotations,
|
|
94
|
+
and the rule descriptions and related locations of the SARIF report; `docs/plugins.md`
|
|
95
|
+
documents `Plugin.rules` and `Finding.related`.
|
|
96
|
+
|
|
3
97
|
## 0.23.0 (2026-10-16)
|
|
4
98
|
|
|
5
99
|
### Compatibility and migration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: coretrace-python-analyzer
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.0
|
|
4
4
|
Summary: Static security analysis infrastructure for Python code
|
|
5
5
|
Project-URL: Homepage, https://github.com/CoreTrace/coretrace-python-analyzer
|
|
6
6
|
Project-URL: Repository, https://github.com/CoreTrace/coretrace-python-analyzer
|
|
@@ -341,6 +341,32 @@ JSON pointer of a value) for a value of a structured file whose line cannot be:
|
|
|
341
341
|
that reads a finding's line checks which it has, and never invents a line for a
|
|
342
342
|
`FileLocation` (`coretrace_python.source.positions` places JSON and TOML values).
|
|
343
343
|
|
|
344
|
+
A plugin describes the rules it reports in its optional `rules` attribute: each rule id to a
|
|
345
|
+
`RuleDescription`, a title and what the rule detects. The SARIF report gives them to its
|
|
346
|
+
consumers (`shortDescription` and `fullDescription`), so that GitHub code scanning names and
|
|
347
|
+
explains the alert; a rule the plugin does not describe is listed by its id alone.
|
|
348
|
+
|
|
349
|
+
```python
|
|
350
|
+
from collections.abc import Mapping
|
|
351
|
+
|
|
352
|
+
from coretrace_python.findings import RuleDescription
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
class SensitiveLoggingPlugin(SymbolCallDetector):
|
|
356
|
+
...
|
|
357
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
358
|
+
"sensitive-logging": RuleDescription(
|
|
359
|
+
"Sensitive data logged",
|
|
360
|
+
"A logging call at debug level that may write sensitive data to the logs.",
|
|
361
|
+
),
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
A finding may also point at other places it involves, each a `RelatedLocation` (a span and a
|
|
366
|
+
short message) in its `related` tuple, as a taint flow reaching its sink inside a project
|
|
367
|
+
function points at that sink. The SARIF report lists them as `relatedLocations` and links to
|
|
368
|
+
them from the message.
|
|
369
|
+
|
|
344
370
|
## Testing a plugin
|
|
345
371
|
|
|
346
372
|
Load the plugin directory with the engine and check one source or one project:
|
|
@@ -67,9 +67,16 @@ coretrace-python-analyzer [--check | --emit-ir [--ssa]] [options] [path]
|
|
|
67
67
|
## What is analysed
|
|
68
68
|
|
|
69
69
|
Given a directory, every `.py` file below it is a module of one project, named after
|
|
70
|
-
its package (`app/views.py` is `app.views`).
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
its package (`app/views.py` is `app.views`). A directory without `__init__.py` inside a
|
|
71
|
+
package is a portion of it, as Python reads one: `pkg/sub/app.py` is `pkg.sub.app`, and
|
|
72
|
+
its relative imports resolve against `pkg`. A module there can also be imported by the
|
|
73
|
+
name a script run from its directory gives it, `app`: an absolute import from that
|
|
74
|
+
directory reaches what lies beside it first, then what the package's root holds, and
|
|
75
|
+
files sharing only such a name are told apart by the importer's directory. From another
|
|
76
|
+
directory that name answers nothing, as Python finds no such module there: at the
|
|
77
|
+
project root, `import os` is the library even beside a `pkg/sub/os.py`. Two files
|
|
78
|
+
that would share a module name, `a/app.py` and `z/app.py` outside any package, are told
|
|
79
|
+
apart by their path from the root, `a.app` and `z.app`, and reported: each carries an `ambiguous-module` note, since a symbol
|
|
73
80
|
`python.app.main` may name a function of either and an import of `app` resolves only
|
|
74
81
|
from the importer's own directory, and each is covered as `ambiguous` rather than
|
|
75
82
|
analysed. An import of such a name that no file of the importer's own directory answers
|
|
@@ -197,6 +204,39 @@ It establishes escaping only when all of the following hold:
|
|
|
197
204
|
or an attribute name.
|
|
198
205
|
- No Python file of the project sets `autoescape` to `False`.
|
|
199
206
|
|
|
207
|
+
Templates are read as a browser's HTML tokenizer reads them, in time linear in the size
|
|
208
|
+
of the template. What a template leaves open at its end is checked too, since once the
|
|
209
|
+
template is included it runs into the markup that follows: a tag's attributes are
|
|
210
|
+
checked, a quoted value stays quoted until its quote closes, and a variable in a
|
|
211
|
+
`<script>` or `<style>` block or an end tag left open is refused, even where the page
|
|
212
|
+
ends there and the browser would never run it. A template including one that ends inside
|
|
213
|
+
such a block, a tag or an end tag is not established either: the markup after the
|
|
214
|
+
include continues it. A template extending another ends where that one ends. A comment
|
|
215
|
+
holding template tags may end at any of them, since an include there may close it and a
|
|
216
|
+
condition around its `<!--` may leave it out, or run to its close when they render
|
|
217
|
+
nothing (#278). The markup is read on from its first tag, and that reading must be in
|
|
218
|
+
HTML data right after each later tag and right after the close, where the others
|
|
219
|
+
resume; where it is not, the template is not established. Such a comment left open does
|
|
220
|
+
not end in HTML data, since it may hide what follows.
|
|
221
|
+
|
|
222
|
+
Each page is also put together as Django renders it, and read once more (#273): the
|
|
223
|
+
templates it extends, each block taking the definition of the most derived one and `{{
|
|
224
|
+
block.super }}` the next one up, and each template it includes in place. What a child's
|
|
225
|
+
block prints inside its parent's `<script>`, or what an include puts inside an
|
|
226
|
+
attribute, is read where it lands. `{{ block.super }}` is put in place only bare: the
|
|
227
|
+
variable `block` named anywhere else, through a filter, a tag or an alias (`{% with
|
|
228
|
+
parent=block %}{{ parent.super }}`), may still print the parent's markup, marked safe,
|
|
229
|
+
and the template is not established. A name several files have, which Django resolves
|
|
230
|
+
through loaders the analyzer does not read, counts as each of them: a page extending it
|
|
231
|
+
must escape with each file, except those already in its chain, which Django leaves out,
|
|
232
|
+
so that a template extending its own name extends another file of it; an include of it
|
|
233
|
+
is accepted only in HTML data, never inside an attribute, a tag, a `<script>` or
|
|
234
|
+
`<style>` block or a comment, and only when each file ends in HTML data, nothing of it
|
|
235
|
+
left open. A template including itself is read the same way. A page beyond 8 MiB once
|
|
236
|
+
put together, or a template with more than 64 pages, or 16 MiB in all, through the files
|
|
237
|
+
the templates it extends may be, is not established, and is listed among the templates
|
|
238
|
+
the analyzer could not read.
|
|
239
|
+
|
|
200
240
|
The analyzer never assumes escaping where it cannot read the template. That covers a
|
|
201
241
|
template file it cannot read, a template named by an expression, a template found
|
|
202
242
|
through a `DIRS` entry not named `templates`, one shipped by an installed package, one
|
|
@@ -334,7 +374,7 @@ the directory of the checked file; a path outside it is printed as it is.
|
|
|
334
374
|
```json
|
|
335
375
|
{
|
|
336
376
|
"schema_version": 1,
|
|
337
|
-
"tool": {"name": "coretrace-python-analyzer", "version": "0.
|
|
377
|
+
"tool": {"name": "coretrace-python-analyzer", "version": "0.24.0"},
|
|
338
378
|
"root": "/home/me/project",
|
|
339
379
|
"findings": [
|
|
340
380
|
{
|
|
@@ -398,7 +438,7 @@ bytes. A single-file check lists no components.
|
|
|
398
438
|
|
|
399
439
|
```json
|
|
400
440
|
"tool": {
|
|
401
|
-
"name": "coretrace-python-analyzer", "version": "0.
|
|
441
|
+
"name": "coretrace-python-analyzer", "version": "0.24.0",
|
|
402
442
|
"components": [
|
|
403
443
|
{"kind": "plugin", "name": "curated-advisories", "version": "2026.09.25", "digest": "sha256:…"},
|
|
404
444
|
{"kind": "advisories", "name": "advisories.json", "digest": "sha256:…"}
|
|
@@ -412,7 +452,14 @@ several sources define the same advisory, it names the one whose definition is u
|
|
|
412
452
|
the next section describes.
|
|
413
453
|
|
|
414
454
|
`--format sarif` prints a SARIF 2.1.0 log, one run with the tool, its rules and one
|
|
415
|
-
result per finding.
|
|
455
|
+
result per finding. Each rule carries a title (`shortDescription`) and what it detects
|
|
456
|
+
(`fullDescription`), so that a code scanning service can explain a finding: the plugin that
|
|
457
|
+
reports a rule describes it, the engine its own notes, and a rule a plugin does not describe
|
|
458
|
+
keeps its id alone. Each result carries the finding's confidence as the `confidence`
|
|
459
|
+
property. A flow that reaches its sink inside a project function is reported at the call, and
|
|
460
|
+
points at the sink as a related location (`relatedLocations`), with the message
|
|
461
|
+
`sink <sink>, reached via <function>`, which the result's message links to. The root is
|
|
462
|
+
declared once as the `SRCROOT` original URI base and
|
|
416
463
|
every location under it is relative to that base, which is what code scanning services
|
|
417
464
|
need to attach results to files. The components of a directory check are the tool's
|
|
418
465
|
`extensions`, their kind and digest in `properties`:
|
|
@@ -768,7 +815,7 @@ project's behalf would go unseen. Without a lock file, a package is never
|
|
|
768
815
|
`not_affected`. The document's `@id` derives from its statements, so two runs with the
|
|
769
816
|
same result share it; its `author` is `Unknown Author`, as OpenVEX tools write when they
|
|
770
817
|
cannot know it. Its `tooling` names the analyzer and each component with its digest
|
|
771
|
-
(`coretrace-python-analyzer 0.
|
|
818
|
+
(`coretrace-python-analyzer 0.24.0; curated-advisories 2026.09.25 (sha256:…)`), so the
|
|
772
819
|
`@id` changes with the advisory data a statement was decided with.
|
|
773
820
|
|
|
774
821
|
## Large projects
|
|
@@ -914,7 +961,11 @@ comprehensions, lambdas, nested functions and classes, `global`, `nonlocal`, `de
|
|
|
914
961
|
assignment expressions (`(y := f(x))`, laid out as an assignment before the statement),
|
|
915
962
|
`yield from`, starred assignment targets (`first, *rest = items`), class keyword arguments
|
|
916
963
|
such as `metaclass=`, `with` targets of any assignable form and `match` with every
|
|
917
|
-
pattern kind.
|
|
964
|
+
pattern kind. An assignment expression in an annotation binds its name as Python 3.11 to
|
|
965
|
+
3.13 do, where the annotation stands: in a function, the name is a local whether the
|
|
966
|
+
annotation is evaluated or not; at module level, it exists only once the annotation is
|
|
967
|
+
evaluated, so under `from __future__ import annotations` a builtin it names stays the
|
|
968
|
+
builtin. `finally` is modelled on the normal path only. A
|
|
918
969
|
`nonlocal` write made by a nested function flows back to the enclosing variable when the
|
|
919
970
|
enclosing function calls that nested function directly by name; a nested function passed
|
|
920
971
|
around and called elsewhere keeps its writes to itself. Where the nested function may
|
|
@@ -2,17 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from collections.abc import Sequence
|
|
5
|
+
from collections.abc import Mapping, Sequence
|
|
6
6
|
from typing import ClassVar
|
|
7
7
|
|
|
8
8
|
from coretrace_python.analysis import AnyAnalysis
|
|
9
9
|
from coretrace_python.dependency import DependencyAnalysis
|
|
10
|
-
from coretrace_python.findings import Confidence, Finding, Severity
|
|
10
|
+
from coretrace_python.findings import Confidence, Finding, RuleDescription, Severity
|
|
11
11
|
from coretrace_python.plugins import ProjectContext, ProjectPlugin
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class DependencyPolicyPlugin(ProjectPlugin):
|
|
15
15
|
name: ClassVar[str] = "dependency-policy"
|
|
16
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
17
|
+
"denied-dependency": RuleDescription(
|
|
18
|
+
"Denied dependency",
|
|
19
|
+
"A requirement on a package the policy denies.",
|
|
20
|
+
),
|
|
21
|
+
"unpinned-dependency": RuleDescription(
|
|
22
|
+
"Unpinned dependency",
|
|
23
|
+
"A requirement without an exact pin, when the policy requires pins.",
|
|
24
|
+
),
|
|
25
|
+
}
|
|
16
26
|
requires: ClassVar[frozenset[AnyAnalysis]] = frozenset({DependencyAnalysis})
|
|
17
27
|
|
|
18
28
|
def analyze_project(self, ctx: ProjectContext) -> Sequence[Finding]:
|
|
@@ -4,7 +4,7 @@ template applies is a call to the function behind it, at the template's line."""
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from collections.abc import Iterator, Sequence
|
|
7
|
+
from collections.abc import Iterator, Mapping, Sequence
|
|
8
8
|
from typing import ClassVar
|
|
9
9
|
|
|
10
10
|
from coretrace_python.analysis import AnyAnalysis
|
|
@@ -17,7 +17,7 @@ from coretrace_python.dependency.correlation import (
|
|
|
17
17
|
evidence,
|
|
18
18
|
suffix_index,
|
|
19
19
|
)
|
|
20
|
-
from coretrace_python.findings import Confidence, Finding
|
|
20
|
+
from coretrace_python.findings import Confidence, Finding, RuleDescription
|
|
21
21
|
from coretrace_python.interprocedural import CallGraphAnalysis, ExternalSymbol
|
|
22
22
|
from coretrace_python.plugins import ProjectContext, ProjectPlugin
|
|
23
23
|
from coretrace_python.semantic.symbols import SymbolId
|
|
@@ -26,6 +26,12 @@ from coretrace_python.source import SourceSpan
|
|
|
26
26
|
|
|
27
27
|
class ReachableVulnerabilityPlugin(ProjectPlugin):
|
|
28
28
|
name: ClassVar[str] = "reachable-vulnerability"
|
|
29
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
30
|
+
"reachable-vulnerability": RuleDescription(
|
|
31
|
+
"Reachable dependency vulnerability",
|
|
32
|
+
"The project calls an API that an advisory of a vulnerable requirement affects.",
|
|
33
|
+
),
|
|
34
|
+
}
|
|
29
35
|
requires: ClassVar[frozenset[AnyAnalysis]] = frozenset({DependencyAnalysis, CallGraphAnalysis})
|
|
30
36
|
|
|
31
37
|
def analyze_project(self, ctx: ProjectContext) -> Sequence[Finding]:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from collections.abc import Sequence
|
|
5
|
+
from collections.abc import Mapping, Sequence
|
|
6
6
|
from pathlib import PurePath
|
|
7
7
|
from typing import ClassVar
|
|
8
8
|
|
|
@@ -15,13 +15,19 @@ from coretrace_python.dependency.correlation import (
|
|
|
15
15
|
ruled_out,
|
|
16
16
|
suffix_index,
|
|
17
17
|
)
|
|
18
|
-
from coretrace_python.findings import Confidence, Finding
|
|
18
|
+
from coretrace_python.findings import Confidence, Finding, RuleDescription
|
|
19
19
|
from coretrace_python.interprocedural import CallGraphAnalysis, ExternalSymbol
|
|
20
20
|
from coretrace_python.plugins import ProjectContext, ProjectPlugin
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class VulnerableDependencyPlugin(ProjectPlugin):
|
|
24
24
|
name: ClassVar[str] = "vulnerable-dependency"
|
|
25
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
26
|
+
"vulnerable-dependency": RuleDescription(
|
|
27
|
+
"Vulnerable dependency",
|
|
28
|
+
"A requirement allows a version that an advisory affects.",
|
|
29
|
+
),
|
|
30
|
+
}
|
|
25
31
|
requires: ClassVar[frozenset[AnyAnalysis]] = frozenset({DependencyAnalysis, CallGraphAnalysis})
|
|
26
32
|
|
|
27
33
|
def analyze_project(self, ctx: ProjectContext) -> Sequence[Finding]:
|
|
@@ -18,11 +18,12 @@ runs depends on what the object exposes, a hotspot."""
|
|
|
18
18
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
|
+
from collections.abc import Mapping
|
|
21
22
|
from typing import ClassVar
|
|
22
23
|
|
|
23
24
|
from coretrace_python.abstract.strings import ModuleStringsAnalysis, leading_text
|
|
24
25
|
from coretrace_python.analysis import AnyAnalysis
|
|
25
|
-
from coretrace_python.findings import Severity
|
|
26
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
26
27
|
from coretrace_python.findings.refutation import Status, Verdict
|
|
27
28
|
from coretrace_python.hir import nodes
|
|
28
29
|
from coretrace_python.ir.ssa import SSAAnalysis
|
|
@@ -42,6 +43,12 @@ _GETATTR = SymbolId("python.builtins.getattr")
|
|
|
42
43
|
|
|
43
44
|
class CodeInjectionPlugin(TaintDetector):
|
|
44
45
|
name: ClassVar[str] = "code-injection"
|
|
46
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
47
|
+
"code-injection": RuleDescription(
|
|
48
|
+
"Code injection",
|
|
49
|
+
"Attacker-controlled data chooses code that runs: the code eval or exec runs, the module an import loads, the script runpy runs, or the attribute getattr selects and the program calls.",
|
|
50
|
+
),
|
|
51
|
+
}
|
|
45
52
|
rule_id: ClassVar[str] = "code-injection"
|
|
46
53
|
kind: ClassVar[TaintKind] = TaintKind.CODE
|
|
47
54
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -36,7 +36,7 @@ from typing import ClassVar
|
|
|
36
36
|
|
|
37
37
|
from coretrace_python.abstract.strings import ModuleStringsAnalysis, leading_text
|
|
38
38
|
from coretrace_python.analysis import AnyAnalysis
|
|
39
|
-
from coretrace_python.findings import Severity
|
|
39
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
40
40
|
from coretrace_python.findings.refutation import Status, Verdict
|
|
41
41
|
from coretrace_python.hir import nodes
|
|
42
42
|
from coretrace_python.interprocedural import Arguments
|
|
@@ -398,6 +398,12 @@ class _Operands:
|
|
|
398
398
|
|
|
399
399
|
class CommandInjectionPlugin(TaintDetector):
|
|
400
400
|
name: ClassVar[str] = "command-injection"
|
|
401
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
402
|
+
"command-injection": RuleDescription(
|
|
403
|
+
"Command injection",
|
|
404
|
+
"Attacker-controlled data reaches a shell or process execution (os.system, subprocess, ...) where it can run or choose a command.",
|
|
405
|
+
),
|
|
406
|
+
}
|
|
401
407
|
rule_id: ClassVar[str] = "command-injection"
|
|
402
408
|
kind: ClassVar[TaintKind] = TaintKind.COMMAND
|
|
403
409
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Mapping
|
|
5
6
|
from typing import ClassVar
|
|
6
7
|
|
|
7
|
-
from coretrace_python.findings import Severity
|
|
8
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
8
9
|
from coretrace_python.plugins import TaintDetector
|
|
9
10
|
from coretrace_python.taint import TaintKind
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class InsecureDeserializationPlugin(TaintDetector):
|
|
13
14
|
name: ClassVar[str] = "insecure-deserialization"
|
|
15
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
16
|
+
"insecure-deserialization": RuleDescription(
|
|
17
|
+
"Insecure deserialization",
|
|
18
|
+
"Attacker-controlled data reaches a deserializer that can build arbitrary objects or run code: pickle, marshal, dill, jsonpickle, shelve, or a YAML loader without a safe loader.",
|
|
19
|
+
),
|
|
20
|
+
}
|
|
14
21
|
rule_id: ClassVar[str] = "insecure-deserialization"
|
|
15
22
|
kind: ClassVar[TaintKind] = TaintKind.DESERIALIZATION
|
|
16
23
|
severity: ClassVar[Severity] = Severity.CRITICAL
|
|
@@ -5,15 +5,22 @@ sink; model plugins declare them."""
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
from collections.abc import Mapping
|
|
8
9
|
from typing import ClassVar
|
|
9
10
|
|
|
10
|
-
from coretrace_python.findings import Severity
|
|
11
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
11
12
|
from coretrace_python.plugins import TaintDetector
|
|
12
13
|
from coretrace_python.taint import TaintKind
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class NoSqlInjectionPlugin(TaintDetector):
|
|
16
17
|
name: ClassVar[str] = "nosql-injection"
|
|
18
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
19
|
+
"nosql-injection": RuleDescription(
|
|
20
|
+
"NoSQL injection",
|
|
21
|
+
"Attacker input that may hold a structure, such as a JSON body, reaches a NoSQL query, where an operator such as {\"$ne\": null} matches any value.",
|
|
22
|
+
),
|
|
23
|
+
}
|
|
17
24
|
rule_id: ClassVar[str] = "nosql-injection"
|
|
18
25
|
kind: ClassVar[TaintKind] = TaintKind.NOSQL
|
|
19
26
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -10,11 +10,12 @@ unproven, ``"/" + next`` included, stays a vulnerability.
|
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
|
+
from collections.abc import Mapping
|
|
13
14
|
from typing import ClassVar
|
|
14
15
|
|
|
15
16
|
from coretrace_python.abstract.strings import ModuleStringsAnalysis
|
|
16
17
|
from coretrace_python.analysis import AnyAnalysis
|
|
17
|
-
from coretrace_python.findings import Severity
|
|
18
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
18
19
|
from coretrace_python.findings.refutation import Status, Verdict
|
|
19
20
|
from coretrace_python.hir import nodes
|
|
20
21
|
from coretrace_python.ir.ssa import SSAAnalysis
|
|
@@ -25,6 +26,12 @@ from coretrace_python.taint.urls import flow_url
|
|
|
25
26
|
|
|
26
27
|
class OpenRedirectPlugin(TaintDetector):
|
|
27
28
|
name: ClassVar[str] = "open-redirect"
|
|
29
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
30
|
+
"open-redirect": RuleDescription(
|
|
31
|
+
"Open redirect",
|
|
32
|
+
"Attacker-controlled data chooses the target of an HTTP redirect, which can send the user to another site.",
|
|
33
|
+
),
|
|
34
|
+
}
|
|
28
35
|
rule_id: ClassVar[str] = "open-redirect"
|
|
29
36
|
kind: ClassVar[TaintKind] = TaintKind.REDIRECT
|
|
30
37
|
severity: ClassVar[Severity] = Severity.MEDIUM
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Mapping
|
|
5
6
|
from typing import ClassVar
|
|
6
7
|
|
|
7
|
-
from coretrace_python.findings import Severity
|
|
8
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
8
9
|
from coretrace_python.plugins import TaintDetector
|
|
9
10
|
from coretrace_python.taint import TaintKind
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class PathTraversalPlugin(TaintDetector):
|
|
13
14
|
name: ClassVar[str] = "path-traversal"
|
|
15
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
16
|
+
"path-traversal": RuleDescription(
|
|
17
|
+
"Path traversal",
|
|
18
|
+
"Attacker-controlled data reaches a file system path (open, send_file, os.remove, ...).",
|
|
19
|
+
),
|
|
20
|
+
}
|
|
14
21
|
rule_id: ClassVar[str] = "path-traversal"
|
|
15
22
|
kind: ClassVar[TaintKind] = TaintKind.PATH
|
|
16
23
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -5,15 +5,22 @@ a hint, so medium confidence."""
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
from collections.abc import Mapping
|
|
8
9
|
from typing import ClassVar
|
|
9
10
|
|
|
10
|
-
from coretrace_python.findings import Confidence, Severity
|
|
11
|
+
from coretrace_python.findings import Confidence, RuleDescription, Severity
|
|
11
12
|
from coretrace_python.plugins import TaintDetector
|
|
12
13
|
from coretrace_python.taint import TaintKind
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class PlaintextCredentialsPlugin(TaintDetector):
|
|
16
17
|
name: ClassVar[str] = "plaintext-credentials"
|
|
18
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
19
|
+
"plaintext-credential-storage": RuleDescription(
|
|
20
|
+
"Plaintext credential storage",
|
|
21
|
+
"A parameter named like a password is stored in a database without hashing.",
|
|
22
|
+
),
|
|
23
|
+
}
|
|
17
24
|
rule_id: ClassVar[str] = "plaintext-credential-storage"
|
|
18
25
|
kind: ClassVar[TaintKind] = TaintKind.CREDENTIAL
|
|
19
26
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Mapping
|
|
5
6
|
from typing import ClassVar
|
|
6
7
|
|
|
7
|
-
from coretrace_python.findings import Severity
|
|
8
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
8
9
|
from coretrace_python.plugins import TaintDetector
|
|
9
10
|
from coretrace_python.taint import TaintKind
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class SqlInjectionPlugin(TaintDetector):
|
|
13
14
|
name: ClassVar[str] = "sql-injection"
|
|
15
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
16
|
+
"sql-injection": RuleDescription(
|
|
17
|
+
"SQL injection",
|
|
18
|
+
"Attacker-controlled data reaches a database statement (cursor.execute, SQLAlchemy text, Django raw, ...) rather than a query parameter.",
|
|
19
|
+
),
|
|
20
|
+
}
|
|
14
21
|
rule_id: ClassVar[str] = "sql-injection"
|
|
15
22
|
kind: ClassVar[TaintKind] = TaintKind.SQL
|
|
16
23
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -10,11 +10,12 @@ a base of unknown value or a URL built in a helper function, stays a vulnerabili
|
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
|
+
from collections.abc import Mapping
|
|
13
14
|
from typing import ClassVar
|
|
14
15
|
|
|
15
16
|
from coretrace_python.abstract.strings import ModuleStringsAnalysis
|
|
16
17
|
from coretrace_python.analysis import AnyAnalysis
|
|
17
|
-
from coretrace_python.findings import Severity
|
|
18
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
18
19
|
from coretrace_python.findings.refutation import Status, Verdict
|
|
19
20
|
from coretrace_python.hir import nodes
|
|
20
21
|
from coretrace_python.ir.ssa import SSAAnalysis
|
|
@@ -25,6 +26,12 @@ from coretrace_python.taint.urls import flow_url, redirects_disabled
|
|
|
25
26
|
|
|
26
27
|
class SsrfPlugin(TaintDetector):
|
|
27
28
|
name: ClassVar[str] = "ssrf"
|
|
29
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
30
|
+
"ssrf": RuleDescription(
|
|
31
|
+
"Server-side request forgery",
|
|
32
|
+
"Attacker-controlled data reaches the destination of an HTTP client request (Requests, httpx, urllib).",
|
|
33
|
+
),
|
|
34
|
+
}
|
|
28
35
|
rule_id: ClassVar[str] = "ssrf"
|
|
29
36
|
kind: ClassVar[TaintKind] = TaintKind.SSRF
|
|
30
37
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Mapping
|
|
5
6
|
from typing import ClassVar
|
|
6
7
|
|
|
7
|
-
from coretrace_python.findings import Severity
|
|
8
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
8
9
|
from coretrace_python.plugins import TaintDetector
|
|
9
10
|
from coretrace_python.taint import TaintKind
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class XssPlugin(TaintDetector):
|
|
13
14
|
name: ClassVar[str] = "xss"
|
|
15
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
16
|
+
"xss": RuleDescription(
|
|
17
|
+
"Cross-site scripting",
|
|
18
|
+
"Attacker-controlled data reaches an HTTP response body built without escaping.",
|
|
19
|
+
),
|
|
20
|
+
}
|
|
14
21
|
rule_id: ClassVar[str] = "xss"
|
|
15
22
|
kind: ClassVar[TaintKind] = TaintKind.HTML
|
|
16
23
|
severity: ClassVar[Severity] = Severity.HIGH
|
|
@@ -2,15 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Mapping
|
|
5
6
|
from typing import ClassVar
|
|
6
7
|
|
|
7
|
-
from coretrace_python.findings import Severity
|
|
8
|
+
from coretrace_python.findings import RuleDescription, Severity
|
|
8
9
|
from coretrace_python.plugins import SymbolCallDetector
|
|
9
10
|
from coretrace_python.semantic.symbols import SymbolId
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class DangerousEvalPlugin(SymbolCallDetector):
|
|
13
14
|
name: ClassVar[str] = "dangerous-eval"
|
|
15
|
+
rules: ClassVar[Mapping[str, RuleDescription]] = {
|
|
16
|
+
"dangerous-eval": RuleDescription(
|
|
17
|
+
"Dynamic code execution",
|
|
18
|
+
"A call to eval or exec, whatever name the file gives them.",
|
|
19
|
+
),
|
|
20
|
+
}
|
|
14
21
|
rule_id: ClassVar[str] = "dangerous-eval"
|
|
15
22
|
symbols: ClassVar[frozenset[SymbolId]] = frozenset(
|
|
16
23
|
{SymbolId("python.builtins.eval"), SymbolId("python.builtins.exec")}
|