coretrace-python-analyzer 0.23.0__tar.gz → 0.24.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CHANGELOG.md +94 -0
  2. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/PKG-INFO +1 -1
  3. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/plugins.md +26 -0
  4. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/usage.md +59 -8
  5. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/pyproject.toml +1 -1
  6. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/__init__.py +1 -1
  7. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/dependency_policy/dependency_policy.py +12 -2
  8. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/reachable_vulnerability.py +8 -2
  9. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/vulnerable_dependency.py +8 -2
  10. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/code_injection/code_injection.py +8 -1
  11. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/command_injection/command_injection.py +7 -1
  12. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/insecure_deserialization/insecure_deserialization.py +8 -1
  13. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/nosql_injection/nosql_injection.py +8 -1
  14. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/open_redirect/open_redirect.py +8 -1
  15. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/path_traversal/path_traversal.py +8 -1
  16. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/plaintext_credentials/plaintext_credentials.py +8 -1
  17. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/sql_injection/sql_injection.py +8 -1
  18. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/ssrf/ssrf.py +8 -1
  19. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/xss/xss.py +8 -1
  20. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/dangerous_eval/dangerous_eval.py +8 -1
  21. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/flask_debug/flask_debug.py +8 -2
  22. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/insecure_tempfile.py +8 -1
  23. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tls/insecure_tls.py +7 -1
  24. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/missing_timeout/missing_timeout.py +8 -2
  25. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_archive/unsafe_archive.py +7 -1
  26. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_xml/unsafe_xml.py +7 -1
  27. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_crypto/weak_crypto.py +8 -1
  28. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_random/weak_random.py +8 -2
  29. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cache.py +8 -2
  30. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cli.py +3 -1
  31. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/engine.py +214 -88
  32. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/__init__.py +10 -1
  33. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/model.py +11 -1
  34. coretrace_python_analyzer-0.24.0/src/coretrace_python/findings/rules.py +16 -0
  35. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/__init__.py +4 -0
  36. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/modulegraph.py +54 -28
  37. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/summaries.py +51 -15
  38. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/api.py +5 -1
  39. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/detectors.py +6 -1
  40. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/secrets.py +16 -2
  41. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/report.py +6 -2
  42. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/sarif.py +57 -14
  43. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/scopes.py +42 -1
  44. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/__init__.py +9 -1
  45. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/manager.py +53 -7
  46. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/model.py +12 -1
  47. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/__init__.py +2 -0
  48. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/templates.py +686 -77
  49. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/pygoat.json +3 -27
  50. coretrace_python_analyzer-0.24.0/tests/test_annotation_bindings.py +154 -0
  51. coretrace_python_analyzer-0.24.0/tests/test_annotation_expression_scopes.py +93 -0
  52. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_injection.py +29 -0
  53. coretrace_python_analyzer-0.24.0/tests/test_namespace_module_imports.py +249 -0
  54. coretrace_python_analyzer-0.24.0/tests/test_namespace_module_names.py +90 -0
  55. coretrace_python_analyzer-0.24.0/tests/test_namespace_module_visibility.py +275 -0
  56. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_release.py +1 -1
  57. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_reporters.py +87 -1
  58. coretrace_python_analyzer-0.24.0/tests/test_rule_descriptions.py +157 -0
  59. coretrace_python_analyzer-0.24.0/tests/test_rule_descriptions_of_given_plugins.py +40 -0
  60. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sarif_injection.py +6 -4
  61. coretrace_python_analyzer-0.24.0/tests/test_summary_external_call_order.py +114 -0
  62. coretrace_python_analyzer-0.24.0/tests/test_summary_fixpoint.py +264 -0
  63. coretrace_python_analyzer-0.24.0/tests/test_template_comment_continuations.py +221 -0
  64. coretrace_python_analyzer-0.24.0/tests/test_template_filter_walk.py +279 -0
  65. coretrace_python_analyzer-0.24.0/tests/test_template_open_constructs.py +239 -0
  66. coretrace_python_analyzer-0.24.0/tests/test_template_page_composition.py +510 -0
  67. coretrace_python_analyzer-0.24.0/tests/test_template_tag_backtracking.py +193 -0
  68. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_vendored_context.py +3 -2
  69. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.github/workflows/ci.yml +0 -0
  70. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.github/workflows/release.yml +0 -0
  71. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/.gitignore +0 -0
  72. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/AUTHORS.md +0 -0
  73. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CODE_OF_CONDUCT.md +0 -0
  74. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/CONTRIBUTING.md +0 -0
  75. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/LICENSE +0 -0
  76. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/NOTICE +0 -0
  77. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/README.md +0 -0
  78. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/SECURITY.md +0 -0
  79. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/docs/architecture.md +0 -0
  80. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/examples/add.py +0 -0
  81. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/examples/canonical_symbols.py +0 -0
  82. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/analysis.stderr +0 -0
  83. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/findings.json +0 -0
  84. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/rapport.md +0 -0
  85. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/sbom.json +0 -0
  86. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/triage.csv +0 -0
  87. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/verification.txt +0 -0
  88. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/reports/mitmproxy-2026-10-02/vex.json +0 -0
  89. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/__main__.py +0 -0
  90. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/__init__.py +0 -0
  91. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/constants.py +0 -0
  92. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/heap.py +0 -0
  93. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/module_constants.py +0 -0
  94. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/ranges.py +0 -0
  95. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/strings.py +0 -0
  96. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/abstract/values.py +0 -0
  97. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/__init__.py +0 -0
  98. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/manager.py +0 -0
  99. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/analysis/provider.py +0 -0
  100. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/dependency_policy/plugin.toml +0 -0
  101. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/reachable_vulnerability/plugin.toml +0 -0
  102. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/sample_advisories/plugin.toml +0 -0
  103. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/sample_advisories/sample_advisories.py +0 -0
  104. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/dependency/vulnerable_dependency/plugin.toml +0 -0
  105. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/aiohttp/aiohttp_models.py +0 -0
  106. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/aiohttp/plugin.toml +0 -0
  107. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/bottle/bottle_models.py +0 -0
  108. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/bottle/plugin.toml +0 -0
  109. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/cli/cli_models.py +0 -0
  110. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/cli/plugin.toml +0 -0
  111. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/credentials/credential_models.py +0 -0
  112. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/credentials/plugin.toml +0 -0
  113. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/db_drivers/db_driver_models.py +0 -0
  114. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/db_drivers/plugin.toml +0 -0
  115. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/django/django_models.py +0 -0
  116. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/django/plugin.toml +0 -0
  117. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/fastapi/fastapi_models.py +0 -0
  118. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/fastapi/plugin.toml +0 -0
  119. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/flask/flask_models.py +0 -0
  120. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/flask/plugin.toml +0 -0
  121. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/http_clients/http_client_models.py +0 -0
  122. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/http_clients/plugin.toml +0 -0
  123. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/python_stdlib/plugin.toml +0 -0
  124. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/python_stdlib/python_stdlib.py +0 -0
  125. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/sqlalchemy/plugin.toml +0 -0
  126. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/sqlalchemy/sqlalchemy_models.py +0 -0
  127. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/tornado/plugin.toml +0 -0
  128. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/models/tornado/tornado_models.py +0 -0
  129. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/config_secrets/config_secrets.py +0 -0
  130. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/config_secrets/plugin.toml +0 -0
  131. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/hardcoded_secrets.py +0 -0
  132. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/secrets/hardcoded_secrets/plugin.toml +0 -0
  133. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/code_injection/plugin.toml +0 -0
  134. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/command_injection/plugin.toml +0 -0
  135. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/insecure_deserialization/plugin.toml +0 -0
  136. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/nosql_injection/plugin.toml +0 -0
  137. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/open_redirect/plugin.toml +0 -0
  138. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/path_traversal/plugin.toml +0 -0
  139. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/plaintext_credentials/plugin.toml +0 -0
  140. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/sql_injection/plugin.toml +0 -0
  141. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/ssrf/plugin.toml +0 -0
  142. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/security/xss/plugin.toml +0 -0
  143. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/dangerous_eval/plugin.toml +0 -0
  144. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/flask_debug/plugin.toml +0 -0
  145. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tempfile/plugin.toml +0 -0
  146. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/insecure_tls/plugin.toml +0 -0
  147. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/missing_timeout/plugin.toml +0 -0
  148. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_archive/plugin.toml +0 -0
  149. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/unsafe_xml/plugin.toml +0 -0
  150. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_crypto/plugin.toml +0 -0
  151. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/bundled/syntax/weak_random/plugin.toml +0 -0
  152. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/__init__.py +0 -0
  153. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/builder.py +0 -0
  154. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/dominance.py +0 -0
  155. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/cfg/model.py +0 -0
  156. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/__init__.py +0 -0
  157. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/lattice.py +0 -0
  158. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dataflow/solver.py +0 -0
  159. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/__init__.py +0 -0
  160. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/advisories.py +0 -0
  161. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/correlation.py +0 -0
  162. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/graph.py +0 -0
  163. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/policy.py +0 -0
  164. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/sbom.py +0 -0
  165. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/dependency/vex.py +0 -0
  166. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/baseline.py +0 -0
  167. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/context.py +0 -0
  168. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/coverage.py +0 -0
  169. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/provenance.py +0 -0
  170. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/refutation.py +0 -0
  171. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/findings/suppressions.py +0 -0
  172. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/__init__.py +0 -0
  173. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/ast_adapter.py +0 -0
  174. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/frontend/parser.py +0 -0
  175. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/__init__.py +0 -0
  176. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/nodes.py +0 -0
  177. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/hir/visitors.py +0 -0
  178. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/interprocedural/callgraph.py +0 -0
  179. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/__init__.py +0 -0
  180. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/defuse.py +0 -0
  181. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/lowering.py +0 -0
  182. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/model.py +0 -0
  183. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/printer.py +0 -0
  184. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/ir/ssa.py +0 -0
  185. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/__init__.py +0 -0
  186. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/loader.py +0 -0
  187. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/manifest.py +0 -0
  188. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/plugins/registry.py +0 -0
  189. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/__init__.py +0 -0
  190. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/json_format.py +0 -0
  191. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/reporters/text.py +0 -0
  192. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/__init__.py +0 -0
  193. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/identity.py +0 -0
  194. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/imports.py +0 -0
  195. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/semantic/symbols.py +0 -0
  196. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/source/positions.py +0 -0
  197. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/commands.py +0 -0
  198. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/engine.py +0 -0
  199. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/models.py +0 -0
  200. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/routes.py +0 -0
  201. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/src/coretrace_python/taint/urls.py +0 -0
  202. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Chatbot.json +0 -0
  203. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/DjangoGoat.json +0 -0
  204. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Flask-Image-Editing-Website.json +0 -0
  205. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/InsecureGram.json +0 -0
  206. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/MiniBookApiServer.json +0 -0
  207. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/NPL-IA.json +0 -0
  208. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Spam-Detection-Project.json +0 -0
  209. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/Vulnerable_fastapi.json +0 -0
  210. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/dvpwa.json +0 -0
  211. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/full-stack-fastapi-template.json +0 -0
  212. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/healthchecks.json +0 -0
  213. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/httpie.json +0 -0
  214. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/luigi.json +0 -0
  215. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/my_gdb.json +0 -0
  216. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/network-topologer.json +0 -0
  217. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/uploadbox-cloud-storage-solution.json +0 -0
  218. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/vulnerable-flask.json +0 -0
  219. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/expected/yt-fts.json +0 -0
  220. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/README.md +0 -0
  221. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/app.py +0 -0
  222. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/requirements.txt +0 -0
  223. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/fixtures/vulnerable-flask/vulnerable_services.py +0 -0
  224. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/regression/repositories.toml +0 -0
  225. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_evidence.py +0 -0
  226. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_feeds.py +0 -0
  227. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_advisory_url_host.py +0 -0
  228. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_aiohttp_models.py +0 -0
  229. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_allowlist_shapes.py +0 -0
  230. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_analysis_manager.py +0 -0
  231. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_architecture.py +0 -0
  232. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_argument_conditions.py +0 -0
  233. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_argument_present_conditions.py +0 -0
  234. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attacker_arguments.py +0 -0
  235. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_loops.py +0 -0
  236. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_review.py +0 -0
  237. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_attribute_call_sinks.py +0 -0
  238. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_audit_detectors.py +0 -0
  239. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_base_patterns.py +0 -0
  240. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline.py +0 -0
  241. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_digests.py +0 -0
  242. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_key.py +0 -0
  243. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_baseline_schema_1.py +0 -0
  244. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_block_super.py +0 -0
  245. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cache.py +0 -0
  246. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cache_engine_version.py +0 -0
  247. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cfg.py +0 -0
  248. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_class_keywords_with_targets.py +0 -0
  249. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_cli.py +0 -0
  250. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_closures.py +0 -0
  251. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_context.py +0 -0
  252. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_code_context_single_file.py +0 -0
  253. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_arguments.py +0 -0
  254. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_decided_cases.py +0 -0
  255. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_command_injection_nature.py +0 -0
  256. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_config_secrets_coverage.py +0 -0
  257. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_config_value_spans.py +0 -0
  258. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_constants.py +0 -0
  259. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_correlation.py +0 -0
  260. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_credential_context.py +0 -0
  261. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_credential_project_path.py +0 -0
  262. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dataflow.py +0 -0
  263. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_declared_entry_points.py +0 -0
  264. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_deep_nesting.py +0 -0
  265. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dependencies.py +0 -0
  266. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_detectors.py +0 -0
  267. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_discovery.py +0 -0
  268. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_http_clients.py +0 -0
  269. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_routes.py +0 -0
  270. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_django_safe_values.py +0 -0
  271. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_docs.py +0 -0
  272. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dominance.py +0 -0
  273. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dynamic_import_sinks.py +0 -0
  274. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_dynamic_import_verdicts.py +0 -0
  275. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_emit_ir.py +0 -0
  276. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_entry_point_aliases.py +0 -0
  277. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_entry_point_suffixes.py +0 -0
  278. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_exceptions.py +0 -0
  279. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_factories_match_loop_else.py +0 -0
  280. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_fail_on.py +0 -0
  281. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_fastapi_cli_precision.py +0 -0
  282. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_file_locations.py +0 -0
  283. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_folded_secret_literals.py +0 -0
  284. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_frameworks.py +0 -0
  285. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_frontend_gaps.py +0 -0
  286. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_function_aliases_api.py +0 -0
  287. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_heap.py +0 -0
  288. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_hex_digests.py +0 -0
  289. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_hir_builder.py +0 -0
  290. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_import_path_sinks.py +0 -0
  291. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_imports.py +0 -0
  292. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_interprocedural.py +0 -0
  293. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_interprocedural_taint.py +0 -0
  294. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ir.py +0 -0
  295. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_jobs_option.py +0 -0
  296. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_jobs_workers.py +0 -0
  297. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_key_taint.py +0 -0
  298. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_keyword_name_conditions.py +0 -0
  299. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_line_numbering.py +0 -0
  300. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_lock_dependency_maps.py +0 -0
  301. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_lock_positions.py +0 -0
  302. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_match_patterns.py +0 -0
  303. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_members.py +0 -0
  304. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_module_identity.py +0 -0
  305. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_module_level.py +0 -0
  306. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nonlocal_kept_value.py +0 -0
  307. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nonlocal_writeback.py +0 -0
  308. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_nosql_injection.py +0 -0
  309. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_open_redirect_destinations.py +0 -0
  310. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_operator_sources.py +0 -0
  311. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_packaging.py +0 -0
  312. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parallel.py +0 -0
  313. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parse_warnings.py +0 -0
  314. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_parser.py +0 -0
  315. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_password_hashes.py +0 -0
  316. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_plaintext_credentials.py +0 -0
  317. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_plugins.py +0 -0
  318. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_powershell_file_operand.py +0 -0
  319. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project.py +0 -0
  320. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project_models.py +0 -0
  321. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_project_validators.py +0 -0
  322. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_provenance.py +0 -0
  323. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_pyir_imports.py +0 -0
  324. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_read_entry_points.py +0 -0
  325. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_real_code_precision.py +0 -0
  326. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_redirect_targets.py +0 -0
  327. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_refutation.py +0 -0
  328. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_refutation_evidence.py +0 -0
  329. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_regression.py +0 -0
  330. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_relative_paths.py +0 -0
  331. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_relative_root.py +0 -0
  332. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_remaining_limits.py +0 -0
  333. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_safe_arguments.py +0 -0
  334. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_scale.py +0 -0
  335. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_scopes.py +0 -0
  336. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_secrets_sbom.py +0 -0
  337. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_selection_sink_proofs.py +0 -0
  338. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_self_state.py +0 -0
  339. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sequence_conditions.py +0 -0
  340. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_settings_scope.py +0 -0
  341. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sink_called_result.py +0 -0
  342. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_sink_merge.py +0 -0
  343. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_source_manager.py +0 -0
  344. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssa.py +0 -0
  345. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssrf_destinations.py +0 -0
  346. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_ssrf_targets.py +0 -0
  347. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_structured_positions.py +0 -0
  348. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_summary_reachability.py +0 -0
  349. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_summary_sanitizers.py +0 -0
  350. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_suppressions.py +0 -0
  351. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_symbol_resolution.py +0 -0
  352. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_symbols.py +0 -0
  353. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntactic_rules.py +0 -0
  354. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_control_flow.py +0 -0
  355. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_coverage.py +0 -0
  356. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_syntax_expressions.py +0 -0
  357. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_taint.py +0 -0
  358. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_tar_implementations.py +0 -0
  359. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_context_flows.py +0 -0
  360. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_escaping.py +0 -0
  361. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_filter_calls.py +0 -0
  362. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_filter_overrides.py +0 -0
  363. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_template_request_processor.py +0 -0
  364. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_tornado_bottle_models.py +0 -0
  365. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_unreadable_templates.py +0 -0
  366. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_unsafe_xml_risk.py +0 -0
  367. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_url_proof.py +0 -0
  368. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_url_secret_placeholders.py +0 -0
  369. {coretrace_python_analyzer-0.23.0 → coretrace_python_analyzer-0.24.0}/tests/test_vex.py +0 -0
@@ -1,5 +1,99 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.0 (2026-10-23)
4
+
5
+ ### Compatibility and migration
6
+
7
+ - The cache format changes (19): caches built by an earlier version miss once.
8
+ - A module in a directory without `__init__.py` inside a package is named after that
9
+ package, as Python names it (#264): `pkg/sub/app.py` is `pkg.sub.app`. Its relative
10
+ imports now resolve, and a file that was a `syntax-error` (`relative import beyond
11
+ top-level package`) is analysed, flask's `sansio` for one. The project symbols of its
12
+ functions change with its name (`python.pkg.sub.app.view`), which a model declared on
13
+ the former symbol must follow; baseline keys do not change, since they hold no module
14
+ name. A script beside it still imports it by its short name, which answers no import
15
+ from another directory: at the project root, `import os` is the library even beside a
16
+ `pkg/sub/os.py`, which a top-level module of a directory took before. Files that share
17
+ only that short name are no longer noted as `ambiguous-module`, nor is an import that
18
+ only such names from other directories match.
19
+ - SARIF: each rule carries a title (`shortDescription`) and a description (`fullDescription`)
20
+ instead of repeating its id (#270), and each result carries its confidence as the
21
+ `confidence` property (#271). A flow reaching its sink inside a project function points at
22
+ that sink as a related location, which the result's message links to (#271).
23
+ - Django templates are read as a browser reads them (#263, #272, #278): a template that
24
+ leaves a tag, a `<script>` or `<style>` block or an end tag open, or includes one that
25
+ ends inside such a construct, is no longer established as escaping, so `xss` may be
26
+ reported where it was not.
27
+ - Django templates are also read as each page is put together (#273): a variable a
28
+ child's `{% block %}` prints inside its parent's `<script>`, an `{% include %}` that ends
29
+ the attribute value it stands in, or one of a name several files have outside HTML data,
30
+ is reported as `xss` where it was not, as is the variable `block` named anywhere but in
31
+ a bare `{{ block.super }}`. So is a template that includes Django's
32
+ `django/forms/widgets/attrs.html` inside a tag, which prints attribute names, and a
33
+ template including itself inside a tag or a script. A page beyond 8 MiB once put
34
+ together, or a template with more than 64 pages, or 16 MiB in all, through names
35
+ several files have, is not established and is listed in `Coverage.unread_templates`.
36
+ - Plugin API, additive: `Plugin.rules` maps the rules a plugin reports to their
37
+ `RuleDescription`, optional, so that third-party plugins describe their own rules;
38
+ `Finding.related` lists `RelatedLocation`s (a span and a message). `Report.rules` carries the
39
+ descriptions to the reporters.
40
+ - Plugin API: `coretrace_python.interprocedural.starting_summaries` gives the summaries an
41
+ import cycle's members start from, and `coretrace_python.engine.MAX_PROJECT_ITERATIONS`
42
+ is removed, since the project's summaries are iterated until they settle (#261).
43
+ - A summary lists its external calls in source order (#261): a finding naming the first
44
+ call of a callee's summary may name another of that callee, at the same line, as 4 of
45
+ saleor's 228 `orm-n-plus-one` findings do.
46
+
47
+ ### Analysis
48
+
49
+ - `--check` ends on projects whose summaries never settled (#261). Around a call cycle of
50
+ three functions or more, a caller copied its callee's external calls in an order that
51
+ rotated forever, so ansible, fastapi, sentry and home-assistant never ended: those calls
52
+ are now kept in source order. Around an import cycle of three modules or more, the
53
+ project's iteration shifted by one module each time and stopped at its bound, which
54
+ could miss a sink reached through the cycle: its members now start from the summaries a
55
+ module starts from, and the iteration goes on until the project's summaries settle.
56
+ - A lambda or comprehension in the annotation of a parameter or a variable no longer
57
+ stops the analysis of a directory with a `KeyError` (#262). An assignment expression in
58
+ an annotation binds its name as Python 3.11 to 3.13 do: in a function, the name is a
59
+ local whether the annotation is evaluated or not; at module level, it exists only once
60
+ the annotation is evaluated.
61
+
62
+ ### Templates
63
+
64
+ - Start tags and their attributes are read as the HTML tokenizer reads them, in time
65
+ linear in the size of the template (#263): a few dozen characters under a `templates`
66
+ directory, a PNG or `<a ` followed by 40 letters, stopped the analysis. A tag a template
67
+ leaves open is read to its end and its attributes are checked; a quoted value left open
68
+ stays quoted to the end of the template.
69
+ - A `<script>` or `<style>` block or an end tag a template leaves open runs to the end of
70
+ the template, and a variable inside it is refused, even where the page ends there
71
+ (#272). A template that ends inside such a construct or a tag is not established where
72
+ it is included, since the markup after the include continues it, and a template
73
+ extending another ends where that one ends.
74
+ - A comment ends where a browser ends it (`-->`, `--!>`, at once for `<!-->` and
75
+ `<!--->`), and one left open hides the rest of the template (#272). A comment holding
76
+ template tags may end at any of them, since an include there may close it and a
77
+ condition around its `<!--` may leave it out, or run to its close when they render
78
+ nothing: it is read on from its first tag, and that reading must be in HTML data right
79
+ after each later tag and right after the close (#278). Such a comment left open does
80
+ not end in HTML data.
81
+
82
+ ### Performance
83
+
84
+ - Collecting the filters a template's render reaches walks each template once for each set
85
+ of blocks the templates extending it override (#279). It followed every path through
86
+ nested includes: two includes of one template at each of 20 levels took 31 s.
87
+ A template in a cycle of includes is still walked again wherever the cycle cuts its
88
+ walk short.
89
+
90
+ ### Documentation
91
+
92
+ - `docs/usage.md` documents how templates are read and each page is put together, the
93
+ modules of a directory without `__init__.py`, assignment expressions in annotations,
94
+ and the rule descriptions and related locations of the SARIF report; `docs/plugins.md`
95
+ documents `Plugin.rules` and `Finding.related`.
96
+
3
97
  ## 0.23.0 (2026-10-16)
4
98
 
5
99
  ### Compatibility and migration
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: coretrace-python-analyzer
3
- Version: 0.23.0
3
+ Version: 0.24.0
4
4
  Summary: Static security analysis infrastructure for Python code
5
5
  Project-URL: Homepage, https://github.com/CoreTrace/coretrace-python-analyzer
6
6
  Project-URL: Repository, https://github.com/CoreTrace/coretrace-python-analyzer
@@ -341,6 +341,32 @@ JSON pointer of a value) for a value of a structured file whose line cannot be:
341
341
  that reads a finding's line checks which it has, and never invents a line for a
342
342
  `FileLocation` (`coretrace_python.source.positions` places JSON and TOML values).
343
343
 
344
+ A plugin describes the rules it reports in its optional `rules` attribute: each rule id to a
345
+ `RuleDescription`, a title and what the rule detects. The SARIF report gives them to its
346
+ consumers (`shortDescription` and `fullDescription`), so that GitHub code scanning names and
347
+ explains the alert; a rule the plugin does not describe is listed by its id alone.
348
+
349
+ ```python
350
+ from collections.abc import Mapping
351
+
352
+ from coretrace_python.findings import RuleDescription
353
+
354
+
355
+ class SensitiveLoggingPlugin(SymbolCallDetector):
356
+ ...
357
+ rules: ClassVar[Mapping[str, RuleDescription]] = {
358
+ "sensitive-logging": RuleDescription(
359
+ "Sensitive data logged",
360
+ "A logging call at debug level that may write sensitive data to the logs.",
361
+ ),
362
+ }
363
+ ```
364
+
365
+ A finding may also point at other places it involves, each a `RelatedLocation` (a span and a
366
+ short message) in its `related` tuple, as a taint flow reaching its sink inside a project
367
+ function points at that sink. The SARIF report lists them as `relatedLocations` and links to
368
+ them from the message.
369
+
344
370
  ## Testing a plugin
345
371
 
346
372
  Load the plugin directory with the engine and check one source or one project:
@@ -67,9 +67,16 @@ coretrace-python-analyzer [--check | --emit-ir [--ssa]] [options] [path]
67
67
  ## What is analysed
68
68
 
69
69
  Given a directory, every `.py` file below it is a module of one project, named after
70
- its package (`app/views.py` is `app.views`). 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.24.0"},
338
378
  "root": "/home/me/project",
339
379
  "findings": [
340
380
  {
@@ -398,7 +438,7 @@ bytes. A single-file check lists no components.
398
438
 
399
439
  ```json
400
440
  "tool": {
401
- "name": "coretrace-python-analyzer", "version": "0.23.0",
441
+ "name": "coretrace-python-analyzer", "version": "0.24.0",
402
442
  "components": [
403
443
  {"kind": "plugin", "name": "curated-advisories", "version": "2026.09.25", "digest": "sha256:…"},
404
444
  {"kind": "advisories", "name": "advisories.json", "digest": "sha256:…"}
@@ -412,7 +452,14 @@ several sources define the same advisory, it names the one whose definition is u
412
452
  the next section describes.
413
453
 
414
454
  `--format sarif` prints a SARIF 2.1.0 log, one run with the tool, its rules and one
415
- result per finding. 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`:
@@ -768,7 +815,7 @@ project's behalf would go unseen. Without a lock file, a package is never
768
815
  `not_affected`. The document's `@id` derives from its statements, so two runs with the
769
816
  same result share it; its `author` is `Unknown Author`, as OpenVEX tools write when they
770
817
  cannot know it. Its `tooling` names the analyzer and each component with its digest
771
- (`coretrace-python-analyzer 0.23.0; curated-advisories 2026.09.25 (sha256:…)`), so the
818
+ (`coretrace-python-analyzer 0.24.0; curated-advisories 2026.09.25 (sha256:…)`), so the
772
819
  `@id` changes with the advisory data a statement was decided with.
773
820
 
774
821
  ## Large projects
@@ -914,7 +961,11 @@ comprehensions, lambdas, nested functions and classes, `global`, `nonlocal`, `de
914
961
  assignment expressions (`(y := f(x))`, laid out as an assignment before the statement),
915
962
  `yield from`, starred assignment targets (`first, *rest = items`), class keyword arguments
916
963
  such as `metaclass=`, `with` targets of any assignable form and `match` with every
917
- pattern kind. `finally` is modelled on the normal path only. A
964
+ pattern kind. An assignment expression in an annotation binds its name as Python 3.11 to
965
+ 3.13 do, where the annotation stands: in a function, the name is a local whether the
966
+ annotation is evaluated or not; at module level, it exists only once the annotation is
967
+ evaluated, so under `from __future__ import annotations` a builtin it names stays the
968
+ builtin. `finally` is modelled on the normal path only. A
918
969
  `nonlocal` write made by a nested function flows back to the enclosing variable when the
919
970
  enclosing function calls that nested function directly by name; a nested function passed
920
971
  around and called elsewhere keeps its writes to itself. Where the nested function may
@@ -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.24.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.24.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
@@ -10,11 +10,12 @@ a base of unknown value or a URL built in a helper function, stays a vulnerabili
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
+ from collections.abc import Mapping
13
14
  from typing import ClassVar
14
15
 
15
16
  from coretrace_python.abstract.strings import ModuleStringsAnalysis
16
17
  from coretrace_python.analysis import AnyAnalysis
17
- from coretrace_python.findings import Severity
18
+ from coretrace_python.findings import RuleDescription, Severity
18
19
  from coretrace_python.findings.refutation import Status, Verdict
19
20
  from coretrace_python.hir import nodes
20
21
  from coretrace_python.ir.ssa import SSAAnalysis
@@ -25,6 +26,12 @@ from coretrace_python.taint.urls import flow_url, redirects_disabled
25
26
 
26
27
  class SsrfPlugin(TaintDetector):
27
28
  name: ClassVar[str] = "ssrf"
29
+ rules: ClassVar[Mapping[str, RuleDescription]] = {
30
+ "ssrf": RuleDescription(
31
+ "Server-side request forgery",
32
+ "Attacker-controlled data reaches the destination of an HTTP client request (Requests, httpx, urllib).",
33
+ ),
34
+ }
28
35
  rule_id: ClassVar[str] = "ssrf"
29
36
  kind: ClassVar[TaintKind] = TaintKind.SSRF
30
37
  severity: ClassVar[Severity] = Severity.HIGH
@@ -2,15 +2,22 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections.abc import Mapping
5
6
  from typing import ClassVar
6
7
 
7
- from coretrace_python.findings import Severity
8
+ from coretrace_python.findings import RuleDescription, Severity
8
9
  from coretrace_python.plugins import TaintDetector
9
10
  from coretrace_python.taint import TaintKind
10
11
 
11
12
 
12
13
  class XssPlugin(TaintDetector):
13
14
  name: ClassVar[str] = "xss"
15
+ rules: ClassVar[Mapping[str, RuleDescription]] = {
16
+ "xss": RuleDescription(
17
+ "Cross-site scripting",
18
+ "Attacker-controlled data reaches an HTTP response body built without escaping.",
19
+ ),
20
+ }
14
21
  rule_id: ClassVar[str] = "xss"
15
22
  kind: ClassVar[TaintKind] = TaintKind.HTML
16
23
  severity: ClassVar[Severity] = Severity.HIGH
@@ -2,15 +2,22 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections.abc import Mapping
5
6
  from typing import ClassVar
6
7
 
7
- from coretrace_python.findings import Severity
8
+ from coretrace_python.findings import RuleDescription, Severity
8
9
  from coretrace_python.plugins import SymbolCallDetector
9
10
  from coretrace_python.semantic.symbols import SymbolId
10
11
 
11
12
 
12
13
  class DangerousEvalPlugin(SymbolCallDetector):
13
14
  name: ClassVar[str] = "dangerous-eval"
15
+ rules: ClassVar[Mapping[str, RuleDescription]] = {
16
+ "dangerous-eval": RuleDescription(
17
+ "Dynamic code execution",
18
+ "A call to eval or exec, whatever name the file gives them.",
19
+ ),
20
+ }
14
21
  rule_id: ClassVar[str] = "dangerous-eval"
15
22
  symbols: ClassVar[frozenset[SymbolId]] = frozenset(
16
23
  {SymbolId("python.builtins.eval"), SymbolId("python.builtins.exec")}