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