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.
Files changed (271) hide show
  1. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/CHANGELOG.md +6 -0
  2. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/PKG-INFO +1 -1
  3. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/usage.md +4 -3
  4. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/pyproject.toml +1 -1
  5. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/__init__.py +1 -1
  6. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/python_stdlib/python_stdlib.py +3 -2
  7. coretrace_python_analyzer-0.11.0/src/coretrace_python/bundled/security/code_injection/code_injection.py +19 -0
  8. coretrace_python_analyzer-0.11.0/src/coretrace_python/bundled/security/code_injection/plugin.toml +9 -0
  9. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/pygoat.json +14 -0
  10. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/vulnerable-flask.json +7 -0
  11. coretrace_python_analyzer-0.11.0/tests/test_code_injection.py +68 -0
  12. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_detectors.py +2 -1
  13. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_http_clients.py +1 -0
  14. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_docs.py +1 -1
  15. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_packaging.py +2 -2
  16. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_release.py +1 -1
  17. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/ci.yml +0 -0
  18. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.github/workflows/release.yml +0 -0
  19. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/.gitignore +0 -0
  20. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/LICENSE +0 -0
  21. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/NOTICE +0 -0
  22. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/README.md +0 -0
  23. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/architecture.md +0 -0
  24. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/docs/plugins.md +0 -0
  25. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/examples/add.py +0 -0
  26. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/examples/canonical_symbols.py +0 -0
  27. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/__main__.py +0 -0
  28. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/__init__.py +0 -0
  29. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/constants.py +0 -0
  30. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/heap.py +0 -0
  31. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/ranges.py +0 -0
  32. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/abstract/values.py +0 -0
  33. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/__init__.py +0 -0
  34. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/manager.py +0 -0
  35. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/analysis/provider.py +0 -0
  36. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/dependency_policy/dependency_policy.py +0 -0
  37. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/dependency_policy/plugin.toml +0 -0
  38. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/plugin.toml +0 -0
  39. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/reachable_vulnerability.py +0 -0
  40. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/sample_advisories/plugin.toml +0 -0
  41. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/sample_advisories/sample_advisories.py +0 -0
  42. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/plugin.toml +0 -0
  43. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/vulnerable_dependency.py +0 -0
  44. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/aiohttp/aiohttp_models.py +0 -0
  45. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/aiohttp/plugin.toml +0 -0
  46. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/bottle/bottle_models.py +0 -0
  47. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/bottle/plugin.toml +0 -0
  48. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/cli/cli_models.py +0 -0
  49. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/cli/plugin.toml +0 -0
  50. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/credentials/credential_models.py +0 -0
  51. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/credentials/plugin.toml +0 -0
  52. {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
  53. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/db_drivers/plugin.toml +0 -0
  54. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/django/django_models.py +0 -0
  55. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/django/plugin.toml +0 -0
  56. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/fastapi/fastapi_models.py +0 -0
  57. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/fastapi/plugin.toml +0 -0
  58. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/flask/flask_models.py +0 -0
  59. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/flask/plugin.toml +0 -0
  60. {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
  61. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/http_clients/plugin.toml +0 -0
  62. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/python_stdlib/plugin.toml +0 -0
  63. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/sqlalchemy/plugin.toml +0 -0
  64. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/sqlalchemy/sqlalchemy_models.py +0 -0
  65. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/tornado/plugin.toml +0 -0
  66. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/models/tornado/tornado_models.py +0 -0
  67. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/config_secrets/config_secrets.py +0 -0
  68. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/config_secrets/plugin.toml +0 -0
  69. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/hardcoded_secrets.py +0 -0
  70. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/plugin.toml +0 -0
  71. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/command_injection/command_injection.py +0 -0
  72. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/command_injection/plugin.toml +0 -0
  73. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/insecure_deserialization/insecure_deserialization.py +0 -0
  74. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/insecure_deserialization/plugin.toml +0 -0
  75. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/open_redirect/open_redirect.py +0 -0
  76. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/open_redirect/plugin.toml +0 -0
  77. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/path_traversal/path_traversal.py +0 -0
  78. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/path_traversal/plugin.toml +0 -0
  79. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/plaintext_credentials/plaintext_credentials.py +0 -0
  80. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/plaintext_credentials/plugin.toml +0 -0
  81. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/sql_injection/plugin.toml +0 -0
  82. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/sql_injection/sql_injection.py +0 -0
  83. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/ssrf/plugin.toml +0 -0
  84. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/ssrf/ssrf.py +0 -0
  85. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/xss/plugin.toml +0 -0
  86. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/security/xss/xss.py +0 -0
  87. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/dangerous_eval/dangerous_eval.py +0 -0
  88. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/dangerous_eval/plugin.toml +0 -0
  89. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/flask_debug/flask_debug.py +0 -0
  90. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/flask_debug/plugin.toml +0 -0
  91. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/insecure_tempfile.py +0 -0
  92. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/plugin.toml +0 -0
  93. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tls/insecure_tls.py +0 -0
  94. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/insecure_tls/plugin.toml +0 -0
  95. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/missing_timeout/missing_timeout.py +0 -0
  96. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/missing_timeout/plugin.toml +0 -0
  97. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_archive/plugin.toml +0 -0
  98. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_archive/unsafe_archive.py +0 -0
  99. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_xml/plugin.toml +0 -0
  100. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/unsafe_xml/unsafe_xml.py +0 -0
  101. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_crypto/plugin.toml +0 -0
  102. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_crypto/weak_crypto.py +0 -0
  103. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_random/plugin.toml +0 -0
  104. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/bundled/syntax/weak_random/weak_random.py +0 -0
  105. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cache.py +0 -0
  106. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/__init__.py +0 -0
  107. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/builder.py +0 -0
  108. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/dominance.py +0 -0
  109. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cfg/model.py +0 -0
  110. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/cli.py +0 -0
  111. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/__init__.py +0 -0
  112. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/lattice.py +0 -0
  113. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dataflow/solver.py +0 -0
  114. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/__init__.py +0 -0
  115. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/advisories.py +0 -0
  116. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/correlation.py +0 -0
  117. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/graph.py +0 -0
  118. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/policy.py +0 -0
  119. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/sbom.py +0 -0
  120. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/dependency/vex.py +0 -0
  121. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/engine.py +0 -0
  122. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/__init__.py +0 -0
  123. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/baseline.py +0 -0
  124. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/coverage.py +0 -0
  125. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/model.py +0 -0
  126. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/provenance.py +0 -0
  127. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/refutation.py +0 -0
  128. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/findings/suppressions.py +0 -0
  129. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/__init__.py +0 -0
  130. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/ast_adapter.py +0 -0
  131. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/frontend/parser.py +0 -0
  132. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/__init__.py +0 -0
  133. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/nodes.py +0 -0
  134. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/hir/visitors.py +0 -0
  135. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/__init__.py +0 -0
  136. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/callgraph.py +0 -0
  137. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/modulegraph.py +0 -0
  138. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/interprocedural/summaries.py +0 -0
  139. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/__init__.py +0 -0
  140. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/defuse.py +0 -0
  141. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/lowering.py +0 -0
  142. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/model.py +0 -0
  143. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/printer.py +0 -0
  144. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/ir/ssa.py +0 -0
  145. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/__init__.py +0 -0
  146. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/api.py +0 -0
  147. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/detectors.py +0 -0
  148. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/loader.py +0 -0
  149. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/manifest.py +0 -0
  150. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/registry.py +0 -0
  151. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/plugins/secrets.py +0 -0
  152. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/__init__.py +0 -0
  153. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/json_format.py +0 -0
  154. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/report.py +0 -0
  155. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/sarif.py +0 -0
  156. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/reporters/text.py +0 -0
  157. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/__init__.py +0 -0
  158. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/identity.py +0 -0
  159. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/imports.py +0 -0
  160. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/scopes.py +0 -0
  161. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/semantic/symbols.py +0 -0
  162. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/__init__.py +0 -0
  163. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/manager.py +0 -0
  164. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/source/model.py +0 -0
  165. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/__init__.py +0 -0
  166. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/engine.py +0 -0
  167. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/models.py +0 -0
  168. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/routes.py +0 -0
  169. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/src/coretrace_python/taint/templates.py +0 -0
  170. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Chatbot.json +0 -0
  171. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/DjangoGoat.json +0 -0
  172. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Flask-Image-Editing-Website.json +0 -0
  173. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/InsecureGram.json +0 -0
  174. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/MiniBookApiServer.json +0 -0
  175. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/NPL-IA.json +0 -0
  176. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Spam-Detection-Project.json +0 -0
  177. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/Vulnerable_fastapi.json +0 -0
  178. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/dvpwa.json +0 -0
  179. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/full-stack-fastapi-template.json +0 -0
  180. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/healthchecks.json +0 -0
  181. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/httpie.json +0 -0
  182. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/luigi.json +0 -0
  183. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/my_gdb.json +0 -0
  184. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/network-topologer.json +0 -0
  185. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/uploadbox-cloud-storage-solution.json +0 -0
  186. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/expected/yt-fts.json +0 -0
  187. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/README.md +0 -0
  188. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/app.py +0 -0
  189. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/requirements.txt +0 -0
  190. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/fixtures/vulnerable-flask/vulnerable_services.py +0 -0
  191. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/regression/repositories.toml +0 -0
  192. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_advisory_evidence.py +0 -0
  193. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_advisory_feeds.py +0 -0
  194. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_aiohttp_models.py +0 -0
  195. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_analysis_manager.py +0 -0
  196. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_architecture.py +0 -0
  197. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_argument_conditions.py +0 -0
  198. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_attacker_arguments.py +0 -0
  199. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_audit_detectors.py +0 -0
  200. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_baseline.py +0 -0
  201. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cache.py +0 -0
  202. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cfg.py +0 -0
  203. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_class_keywords_with_targets.py +0 -0
  204. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_cli.py +0 -0
  205. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_closures.py +0 -0
  206. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_config_secrets_coverage.py +0 -0
  207. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_constants.py +0 -0
  208. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_correlation.py +0 -0
  209. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_credential_context.py +0 -0
  210. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dataflow.py +0 -0
  211. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dependencies.py +0 -0
  212. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_discovery.py +0 -0
  213. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_routes.py +0 -0
  214. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_django_safe_values.py +0 -0
  215. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_dominance.py +0 -0
  216. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_emit_ir.py +0 -0
  217. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_exceptions.py +0 -0
  218. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_factories_match_loop_else.py +0 -0
  219. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_fail_on.py +0 -0
  220. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_fastapi_cli_precision.py +0 -0
  221. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_frameworks.py +0 -0
  222. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_frontend_gaps.py +0 -0
  223. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_heap.py +0 -0
  224. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_hex_digests.py +0 -0
  225. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_hir_builder.py +0 -0
  226. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_imports.py +0 -0
  227. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_interprocedural.py +0 -0
  228. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_interprocedural_taint.py +0 -0
  229. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ir.py +0 -0
  230. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_match_patterns.py +0 -0
  231. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_module_level.py +0 -0
  232. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_nonlocal_writeback.py +0 -0
  233. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_operator_sources.py +0 -0
  234. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_parallel.py +0 -0
  235. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_parser.py +0 -0
  236. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_plaintext_credentials.py +0 -0
  237. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_plugins.py +0 -0
  238. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project.py +0 -0
  239. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project_models.py +0 -0
  240. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_project_validators.py +0 -0
  241. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_provenance.py +0 -0
  242. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_pyir_imports.py +0 -0
  243. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_read_entry_points.py +0 -0
  244. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_real_code_precision.py +0 -0
  245. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_redirect_targets.py +0 -0
  246. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_refutation.py +0 -0
  247. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_refutation_evidence.py +0 -0
  248. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_regression.py +0 -0
  249. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_relative_paths.py +0 -0
  250. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_remaining_limits.py +0 -0
  251. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_reporters.py +0 -0
  252. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_safe_arguments.py +0 -0
  253. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_scale.py +0 -0
  254. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_scopes.py +0 -0
  255. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_secrets_sbom.py +0 -0
  256. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_self_state.py +0 -0
  257. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_source_manager.py +0 -0
  258. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ssa.py +0 -0
  259. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_ssrf_targets.py +0 -0
  260. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_summary_sanitizers.py +0 -0
  261. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_suppressions.py +0 -0
  262. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_symbol_resolution.py +0 -0
  263. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_symbols.py +0 -0
  264. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntactic_rules.py +0 -0
  265. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_control_flow.py +0 -0
  266. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_coverage.py +0 -0
  267. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_syntax_expressions.py +0 -0
  268. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_taint.py +0 -0
  269. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_template_escaping.py +0 -0
  270. {coretrace_python_analyzer-0.10.0 → coretrace_python_analyzer-0.11.0}/tests/test_tornado_bottle_models.py +0 -0
  271. {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.10.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.10.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.10.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.10.0; curated-advisories 2026.09.25 (sha256:…)`), so the
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "coretrace-python-analyzer"
7
- version = "0.10.0"
7
+ version = "0.11.0"
8
8
  description = "Static security analysis infrastructure for Python code"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,4 +1,4 @@
1
1
  """CoreTrace's Python static analysis frontend."""
2
2
 
3
- __version__ = "0.10.0"
3
+ __version__ = "0.11.0"
4
4
 
@@ -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
- Sink(_sym("builtins.eval"), TaintKind.CODE),
61
- Sink(_sym("builtins.exec"), TaintKind.CODE),
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"
@@ -0,0 +1,9 @@
1
+ name = "code-injection"
2
+ version = "1.0.0"
3
+ plugin_api = ">=1,<2"
4
+ requires = ["taint.flows", "findings.refutation"]
5
+ provides = ["vulnerability.code-injection"]
6
+
7
+ [entrypoint]
8
+ module = "code_injection"
9
+ class = "CodeInjectionPlugin"
@@ -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")
@@ -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) == 35
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
 
@@ -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) == 35
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")) == 35
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.10.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: