coretrace-python-analyzer 0.10.0__tar.gz → 0.11.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.10.0 → coretrace_python_analyzer-0.11.0}/CHANGELOG.md +6 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/PKG-INFO +1 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/usage.md +4 -3
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/pyproject.toml +1 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/__init__.py +1 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/python_stdlib/python_stdlib.py +3 -2
- coretrace_python_analyzer-0.11.0/src/coretrace_python/bundled/security/code_injection/code_injection.py +19 -0
- coretrace_python_analyzer-0.11.0/src/coretrace_python/bundled/security/code_injection/plugin.toml +9 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/pygoat.json +14 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/vulnerable-flask.json +7 -0
- coretrace_python_analyzer-0.11.0/tests/test_code_injection.py +68 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_detectors.py +2 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_http_clients.py +1 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_docs.py +1 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_packaging.py +2 -2
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_release.py +1 -1
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/ci.yml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/release.yml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.gitignore +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/LICENSE +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/NOTICE +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/README.md +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/architecture.md +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/plugins.md +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/examples/add.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/examples/canonical_symbols.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/__main__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/constants.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/heap.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/ranges.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/values.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/manager.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/provider.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/dependency_policy/dependency_policy.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/dependency_policy/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/reachable_vulnerability.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/sample_advisories/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/sample_advisories/sample_advisories.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/vulnerable_dependency.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/aiohttp/aiohttp_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/aiohttp/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/bottle/bottle_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/bottle/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/cli/cli_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/cli/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/credentials/credential_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/credentials/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/db_drivers/db_driver_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/db_drivers/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/django/django_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/django/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/fastapi/fastapi_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/fastapi/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/flask/flask_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/flask/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/http_clients/http_client_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/http_clients/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/python_stdlib/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/sqlalchemy/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/sqlalchemy/sqlalchemy_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/tornado/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/tornado/tornado_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/config_secrets/config_secrets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/config_secrets/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/hardcoded_secrets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/command_injection/command_injection.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/command_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/insecure_deserialization/insecure_deserialization.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/insecure_deserialization/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/open_redirect/open_redirect.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/open_redirect/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/path_traversal/path_traversal.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/path_traversal/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/plaintext_credentials/plaintext_credentials.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/plaintext_credentials/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/sql_injection/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/sql_injection/sql_injection.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/ssrf/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/ssrf/ssrf.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/xss/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/xss/xss.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/dangerous_eval/dangerous_eval.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/dangerous_eval/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/flask_debug/flask_debug.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/flask_debug/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/insecure_tempfile.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tls/insecure_tls.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tls/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/missing_timeout/missing_timeout.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/missing_timeout/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_archive/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_archive/unsafe_archive.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_xml/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_xml/unsafe_xml.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_crypto/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_crypto/weak_crypto.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_random/plugin.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_random/weak_random.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cache.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/builder.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/dominance.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/model.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cli.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/lattice.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/solver.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/advisories.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/correlation.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/graph.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/policy.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/sbom.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/vex.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/engine.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/baseline.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/coverage.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/model.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/provenance.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/refutation.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/suppressions.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/ast_adapter.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/parser.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/nodes.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/visitors.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/callgraph.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/modulegraph.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/summaries.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/defuse.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/lowering.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/model.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/printer.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/ssa.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/api.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/detectors.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/loader.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/manifest.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/registry.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/secrets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/json_format.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/report.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/sarif.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/text.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/identity.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/imports.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/scopes.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/symbols.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/manager.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/model.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/__init__.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/engine.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/routes.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/templates.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Chatbot.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/DjangoGoat.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Flask-Image-Editing-Website.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/InsecureGram.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/MiniBookApiServer.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/NPL-IA.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Spam-Detection-Project.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Vulnerable_fastapi.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/dvpwa.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/full-stack-fastapi-template.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/healthchecks.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/httpie.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/luigi.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/my_gdb.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/network-topologer.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/uploadbox-cloud-storage-solution.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/yt-fts.json +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/README.md +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/app.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/requirements.txt +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/vulnerable_services.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/repositories.toml +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_advisory_evidence.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_advisory_feeds.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_aiohttp_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_analysis_manager.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_architecture.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_argument_conditions.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_attacker_arguments.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_audit_detectors.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_baseline.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cache.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cfg.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_class_keywords_with_targets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cli.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_closures.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_config_secrets_coverage.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_constants.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_correlation.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_credential_context.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dataflow.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dependencies.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_discovery.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_routes.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_safe_values.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dominance.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_emit_ir.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_exceptions.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_factories_match_loop_else.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_fail_on.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_fastapi_cli_precision.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_frameworks.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_frontend_gaps.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_heap.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_hex_digests.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_hir_builder.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_imports.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_interprocedural.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_interprocedural_taint.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ir.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_match_patterns.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_module_level.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_nonlocal_writeback.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_operator_sources.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_parallel.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_parser.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_plaintext_credentials.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_plugins.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project_validators.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_provenance.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_pyir_imports.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_read_entry_points.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_real_code_precision.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_redirect_targets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_refutation.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_refutation_evidence.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_regression.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_relative_paths.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_remaining_limits.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_reporters.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_safe_arguments.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_scale.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_scopes.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_secrets_sbom.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_self_state.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_source_manager.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ssa.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ssrf_targets.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_summary_sanitizers.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_suppressions.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_symbol_resolution.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_symbols.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntactic_rules.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_control_flow.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_coverage.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_expressions.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_taint.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_template_escaping.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_tornado_bottle_models.py +0 -0
- {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_vex.py +0 -0
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.11.0 (2026-09-25)
|
|
4
|
+
|
|
5
|
+
### Detection
|
|
6
|
+
|
|
7
|
+
- `code-injection` reports attacker input reaching the code `eval` or `exec` runs, with the same verdicts as the other taint rules. The globals and locals passed with the code are data, not code. `dangerous-eval` still reports every call to `eval` or `exec`, whatever it runs. The regression corpus gains three findings, each reviewed as a true positive: pygoat's `mitre_lab_25_api` and `cmd_lab2` evaluate a POST field, and the `vulnerable-flask` fixture evaluates a query parameter (#152).
|
|
8
|
+
|
|
3
9
|
## 0.10.0 (2026-09-25)
|
|
4
10
|
|
|
5
11
|
### Reports
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: coretrace-python-analyzer
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.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
|
|
@@ -110,6 +110,7 @@ variable is not treated that way yet.
|
|
|
110
110
|
| Rule | Reached sink |
|
|
111
111
|
|---|---|
|
|
112
112
|
| `command-injection` | Shell or process execution (`os.system`, `subprocess` with a string, …). |
|
|
113
|
+
| `code-injection` | The code `eval` or `exec` runs; the globals and locals passed with it are data. `dangerous-eval` reports every such call, this rule the ones attacker input reaches. |
|
|
113
114
|
| `sql-injection` | A database statement (`cursor.execute`, SQLAlchemy `text`, Django `raw`, …). Parameters of a parameterised query are not statements. |
|
|
114
115
|
| `path-traversal` | A file system path (`open`, `send_file`, `os.remove`, …). |
|
|
115
116
|
| `ssrf` | The URL of an HTTP client request (Requests, httpx, `urllib`), by position or as `url=`; the body, headers and query parameters are not the destination. |
|
|
@@ -239,7 +240,7 @@ the directory of the checked file; a path outside it is printed as it is.
|
|
|
239
240
|
```json
|
|
240
241
|
{
|
|
241
242
|
"schema_version": 1,
|
|
242
|
-
"tool": {"name": "coretrace-python-analyzer", "version": "0.
|
|
243
|
+
"tool": {"name": "coretrace-python-analyzer", "version": "0.11.0"},
|
|
243
244
|
"root": "/home/me/project",
|
|
244
245
|
"findings": [
|
|
245
246
|
{
|
|
@@ -271,7 +272,7 @@ bytes. A single-file check lists no components.
|
|
|
271
272
|
|
|
272
273
|
```json
|
|
273
274
|
"tool": {
|
|
274
|
-
"name": "coretrace-python-analyzer", "version": "0.
|
|
275
|
+
"name": "coretrace-python-analyzer", "version": "0.11.0",
|
|
275
276
|
"components": [
|
|
276
277
|
{"kind": "plugin", "name": "curated-advisories", "version": "2026.09.25", "digest": "sha256:…"},
|
|
277
278
|
{"kind": "advisories", "name": "advisories.json", "digest": "sha256:…"}
|
|
@@ -434,7 +435,7 @@ project's behalf would go unseen. Without a lock file, a package is never
|
|
|
434
435
|
`not_affected`. The document's `@id` derives from its statements, so two runs with the
|
|
435
436
|
same result share it; its `author` is `Unknown Author`, as OpenVEX tools write when they
|
|
436
437
|
cannot know it. Its `tooling` names the analyzer and each component with its digest
|
|
437
|
-
(`coretrace-python-analyzer 0.
|
|
438
|
+
(`coretrace-python-analyzer 0.11.0; curated-advisories 2026.09.25 (sha256:…)`), so the
|
|
438
439
|
`@id` changes with the advisory data a statement was decided with.
|
|
439
440
|
|
|
440
441
|
## Large projects
|
|
@@ -57,8 +57,9 @@ class PythonStdlibModels(ModelPlugin):
|
|
|
57
57
|
Sink(_sym("subprocess.check_call"), TaintKind.COMMAND),
|
|
58
58
|
Sink(_sym("subprocess.check_output"), TaintKind.COMMAND),
|
|
59
59
|
Sink(_sym("subprocess.Popen"), TaintKind.COMMAND),
|
|
60
|
-
|
|
61
|
-
Sink(_sym("builtins.
|
|
60
|
+
# The code is the first argument; the globals and locals it runs with are data.
|
|
61
|
+
Sink(_sym("builtins.eval"), TaintKind.CODE, ((TaintKind.CODE, (0,)),)),
|
|
62
|
+
Sink(_sym("builtins.exec"), TaintKind.CODE, ((TaintKind.CODE, (0,)),)),
|
|
62
63
|
Sink(_sym("builtins.open"), TaintKind.PATH),
|
|
63
64
|
Sink(_sym("os.remove"), TaintKind.PATH),
|
|
64
65
|
Sink(_sym("os.unlink"), TaintKind.PATH),
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Code injection: attacker-controlled input reaching a CODE sink, such as the code
|
|
2
|
+
``eval`` or ``exec`` runs. ``dangerous-eval`` reports every such call; this rule reports
|
|
3
|
+
the ones attacker input reaches."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import ClassVar
|
|
8
|
+
|
|
9
|
+
from coretrace_python.findings import Severity
|
|
10
|
+
from coretrace_python.plugins import TaintDetector
|
|
11
|
+
from coretrace_python.taint import TaintKind
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CodeInjectionPlugin(TaintDetector):
|
|
15
|
+
name: ClassVar[str] = "code-injection"
|
|
16
|
+
rule_id: ClassVar[str] = "code-injection"
|
|
17
|
+
kind: ClassVar[TaintKind] = TaintKind.CODE
|
|
18
|
+
severity: ClassVar[Severity] = Severity.HIGH
|
|
19
|
+
title: ClassVar[str] = "Code injection"
|
|
@@ -105,6 +105,13 @@
|
|
|
105
105
|
"rule": "weak-crypto",
|
|
106
106
|
"function": "csrf_lab_login"
|
|
107
107
|
},
|
|
108
|
+
{
|
|
109
|
+
"file": "introduction/mitre.py",
|
|
110
|
+
"line": 218,
|
|
111
|
+
"rule": "code-injection",
|
|
112
|
+
"function": "mitre_lab_25_api",
|
|
113
|
+
"verdict": "vulnerability"
|
|
114
|
+
},
|
|
108
115
|
{
|
|
109
116
|
"file": "introduction/mitre.py",
|
|
110
117
|
"line": 218,
|
|
@@ -175,6 +182,13 @@
|
|
|
175
182
|
"function": "cmd_lab",
|
|
176
183
|
"verdict": "vulnerability"
|
|
177
184
|
},
|
|
185
|
+
{
|
|
186
|
+
"file": "introduction/views.py",
|
|
187
|
+
"line": 460,
|
|
188
|
+
"rule": "code-injection",
|
|
189
|
+
"function": "cmd_lab2",
|
|
190
|
+
"verdict": "vulnerability"
|
|
191
|
+
},
|
|
178
192
|
{
|
|
179
193
|
"file": "introduction/views.py",
|
|
180
194
|
"line": 460,
|
|
@@ -53,6 +53,13 @@
|
|
|
53
53
|
"function": "cross_site_scripting",
|
|
54
54
|
"verdict": "vulnerability"
|
|
55
55
|
},
|
|
56
|
+
{
|
|
57
|
+
"file": "app.py",
|
|
58
|
+
"line": 71,
|
|
59
|
+
"rule": "code-injection",
|
|
60
|
+
"function": "code_injection",
|
|
61
|
+
"verdict": "vulnerability"
|
|
62
|
+
},
|
|
56
63
|
{
|
|
57
64
|
"file": "app.py",
|
|
58
65
|
"line": 71,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Code injection: attacker input reaching the code ``eval`` or ``exec`` runs.
|
|
2
|
+
|
|
3
|
+
``dangerous-eval`` reports every call to ``eval`` or ``exec``, whatever it evaluates;
|
|
4
|
+
``code-injection`` reports the calls attacker input reaches, through the same taint
|
|
5
|
+
engine and refutation as the other injection rules. Only the code counts: attacker data
|
|
6
|
+
in the ``globals`` or ``locals`` a call passes is data, not code.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from coretrace_python import engine
|
|
14
|
+
from coretrace_python.findings import Finding, Severity
|
|
15
|
+
from coretrace_python.source import SourceManager
|
|
16
|
+
|
|
17
|
+
PLUGINS = [engine.BUNDLED_PLUGINS]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def check(text: str) -> tuple[Finding, ...]:
|
|
21
|
+
return engine.check(SourceManager().add_source("app.py", text), PLUGINS)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def injected(text: str) -> list[int]:
|
|
25
|
+
return [f.span.start_line for f in check(text) if f.rule_id == "code-injection"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.mark.parametrize(
|
|
29
|
+
"body",
|
|
30
|
+
[
|
|
31
|
+
" return eval(input())\n",
|
|
32
|
+
" exec(input())\n",
|
|
33
|
+
" code = compile(input(), '<input>', 'exec')\n exec(code)\n",
|
|
34
|
+
" source = 'result = ' + input()\n exec(source, {})\n",
|
|
35
|
+
],
|
|
36
|
+
)
|
|
37
|
+
def test_attacker_input_in_the_code_eval_or_exec_runs_is_a_code_injection(body: str) -> None:
|
|
38
|
+
findings = [f for f in check(f"def run():\n{body}") if f.rule_id == "code-injection"]
|
|
39
|
+
|
|
40
|
+
assert [f.span.start_line for f in findings] == [len(body.splitlines()) + 1]
|
|
41
|
+
assert findings[0].severity is Severity.HIGH
|
|
42
|
+
assert findings[0].metadata["source_label"] == "stdin"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@pytest.mark.parametrize(
|
|
46
|
+
"body",
|
|
47
|
+
[
|
|
48
|
+
" return eval('1 + 1')\n",
|
|
49
|
+
" return eval('x + 1', {'x': input()})\n",
|
|
50
|
+
" exec('total = a + b', {}, {'a': input(), 'b': 1})\n",
|
|
51
|
+
" import ast\n return ast.literal_eval(input())\n",
|
|
52
|
+
],
|
|
53
|
+
)
|
|
54
|
+
def test_constant_code_or_attacker_data_beside_it_is_no_code_injection(body: str) -> None:
|
|
55
|
+
assert injected(f"def run():\n{body}") == []
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_dangerous_eval_still_reports_the_call_beside_the_injection() -> None:
|
|
59
|
+
rules = sorted(f.rule_id for f in check("def run():\n return eval(input())\n"))
|
|
60
|
+
|
|
61
|
+
assert rules == ["code-injection", "dangerous-eval"]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_code_reaching_eval_through_a_project_function_is_reported_at_the_call() -> None:
|
|
65
|
+
text = "def evaluate(expression):\n return eval(expression)\n\ndef run():\n return evaluate(input())\n"
|
|
66
|
+
|
|
67
|
+
(finding,) = [f for f in check(text) if f.rule_id == "code-injection"]
|
|
68
|
+
assert (finding.span.start_line, finding.metadata["through"], finding.metadata["sink_line"]) == (5, "evaluate", "2")
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_detectors.py
RENAMED
|
@@ -165,6 +165,7 @@ def test_shipped_plugins_load_with_their_manifests() -> None:
|
|
|
165
165
|
"aiohttp-models",
|
|
166
166
|
"bottle-models",
|
|
167
167
|
"cli-models",
|
|
168
|
+
"code-injection",
|
|
168
169
|
"command-injection",
|
|
169
170
|
"config-secrets",
|
|
170
171
|
"credential-models",
|
|
@@ -198,7 +199,7 @@ def test_shipped_plugins_load_with_their_manifests() -> None:
|
|
|
198
199
|
"weak-crypto",
|
|
199
200
|
"xss",
|
|
200
201
|
}
|
|
201
|
-
for rule in ("sql-injection", "command-injection", "path-traversal", "ssrf", "xss"):
|
|
202
|
+
for rule in ("sql-injection", "command-injection", "code-injection", "path-traversal", "ssrf", "xss"):
|
|
202
203
|
assert by_name[rule].requires == ("taint.flows", "findings.refutation")
|
|
203
204
|
assert by_name[rule].provides == (f"vulnerability.{rule}",)
|
|
204
205
|
assert by_name["python-stdlib-models"].provides == ("model.python-stdlib",)
|
|
@@ -292,6 +292,7 @@ def test_httpx_client_instances_and_sessions_are_ssrf_sinks() -> None:
|
|
|
292
292
|
|
|
293
293
|
def test_detectors_stay_generic() -> None:
|
|
294
294
|
assert sorted(p.name for p in (PLUGINS / "security").iterdir() if p.is_dir()) == [
|
|
295
|
+
"code_injection",
|
|
295
296
|
"command_injection",
|
|
296
297
|
"insecure_deserialization",
|
|
297
298
|
"open_redirect",
|
|
@@ -90,7 +90,7 @@ def test_every_bundled_plugin_is_named_in_the_guides() -> None:
|
|
|
90
90
|
re.search(r'^name = "([a-z-]+)"', manifest.read_text(encoding="utf-8"), re.MULTILINE).group(1) # type: ignore[union-attr]
|
|
91
91
|
for manifest in engine.BUNDLED_PLUGINS.rglob("plugin.toml")
|
|
92
92
|
]
|
|
93
|
-
assert len(names) ==
|
|
93
|
+
assert len(names) == 36
|
|
94
94
|
assert all(f"`{name}`" in text for name in names), [n for n in names if f"`{n}`" not in text]
|
|
95
95
|
|
|
96
96
|
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_packaging.py
RENAMED
|
@@ -64,7 +64,7 @@ def test_bundled_plugins_live_inside_the_package() -> None:
|
|
|
64
64
|
assert bundled == Path(coretrace_python.__file__).resolve().parent / "bundled"
|
|
65
65
|
assert bundled.is_dir()
|
|
66
66
|
manifests = sorted(p.relative_to(bundled).as_posix() for p in bundled.rglob("plugin.toml"))
|
|
67
|
-
assert len(manifests) ==
|
|
67
|
+
assert len(manifests) == 36
|
|
68
68
|
assert "syntax/dangerous_eval/plugin.toml" in manifests
|
|
69
69
|
assert not (REPO / "plugins").exists()
|
|
70
70
|
|
|
@@ -108,7 +108,7 @@ def test_the_wheel_carries_the_bundled_plugins(tmp_path: Path) -> None:
|
|
|
108
108
|
|
|
109
109
|
assert "coretrace_python/bundled/syntax/dangerous_eval/plugin.toml" in names
|
|
110
110
|
assert "coretrace_python/bundled/syntax/dangerous_eval/dangerous_eval.py" in names
|
|
111
|
-
assert sum(1 for n in names if n.endswith("/plugin.toml")) ==
|
|
111
|
+
assert sum(1 for n in names if n.endswith("/plugin.toml")) == 36
|
|
112
112
|
assert not any(n.startswith("tests/") or "tests-project" in n for n in names)
|
|
113
113
|
|
|
114
114
|
|
|
@@ -30,7 +30,7 @@ def require_changelog() -> None:
|
|
|
30
30
|
def test_the_version_is_declared_once_and_mirrored() -> None:
|
|
31
31
|
project = tomllib.loads((REPO / "pyproject.toml").read_text(encoding="utf-8"))["project"]
|
|
32
32
|
|
|
33
|
-
assert project["version"] == coretrace_python.__version__ == "0.
|
|
33
|
+
assert project["version"] == coretrace_python.__version__ == "0.11.0"
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def test_the_changelog_starts_with_the_current_version() -> None:
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/ci.yml
RENAMED
|
File without changes
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/release.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/examples/canonical_symbols.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cache.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cli.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/engine.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|