socketsecurity 2.11.2__tar.gz → 2.11.4__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 (175) hide show
  1. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/dependency-review.yml +10 -1
  2. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/CHANGELOG.md +43 -0
  3. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/Dockerfile +13 -7
  4. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/PKG-INFO +7 -6
  5. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/docs/cli-reference.md +1 -1
  6. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/pyproject.toml +10 -6
  7. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/__init__.py +1 -1
  8. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/tools/reachability.py +6 -5
  9. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/socketcli.py +3 -4
  10. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_reachability.py +24 -1
  11. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/uv.lock +142 -100
  12. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/CODEOWNERS +0 -0
  13. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
  14. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
  15. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
  16. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/actions/setup-docker/action.yml +0 -0
  18. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/actions/setup-hatch/action.yml +0 -0
  19. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/actions/setup-sfw/action.yml +0 -0
  20. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/dependabot.yml +0 -0
  21. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/dependency-audit.yml +0 -0
  22. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/docker-stable.yml +0 -0
  23. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/e2e-test.yml +0 -0
  24. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/package-check.yml +0 -0
  25. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/pr-preview.yml +0 -0
  26. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/python-tests.yml +0 -0
  27. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/release.yml +0 -0
  28. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/workflows/version-check.yml +0 -0
  29. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.github/zizmor.yml +0 -0
  30. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.gitignore +0 -0
  31. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.hooks/sync_version.py +0 -0
  32. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.pre-commit-config.yaml +0 -0
  33. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/.python-version +0 -0
  34. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/CONTRIBUTING.md +0 -0
  35. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/Dockerfile.preview +0 -0
  36. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/LICENSE +0 -0
  37. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/Makefile +0 -0
  38. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/README.md +0 -0
  39. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/benchmarks/manifest_discovery.py +0 -0
  40. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/docs/ci-cd.md +0 -0
  41. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/docs/development.md +0 -0
  42. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/docs/troubleshooting.md +0 -0
  43. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-dashboard-parity.json +0 -0
  44. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-dashboard-parity.toml +0 -0
  45. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-diff-ci-cd.json +0 -0
  46. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-diff-ci-cd.toml +0 -0
  47. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-instance-detail.json +0 -0
  48. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/examples/config/sarif-instance-detail.toml +0 -0
  49. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/instructions/gitlab-commit-status/uat.md +0 -0
  50. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/pytest.ini +0 -0
  51. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/build_container.sh +0 -0
  52. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/build_container_flexible.sh +0 -0
  53. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/deploy-test-docker.sh +0 -0
  54. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/deploy-test-pypi.sh +0 -0
  55. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/docker-entrypoint.sh +0 -0
  56. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/scripts/run.sh +0 -0
  57. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/session.md +0 -0
  58. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socket.yml +0 -0
  59. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/config.py +0 -0
  60. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/__init__.py +0 -0
  61. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/alert_selection.py +0 -0
  62. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/classes.py +0 -0
  63. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/cli_client.py +0 -0
  64. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/cli_run.py +0 -0
  65. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/exceptions.py +0 -0
  66. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/git_interface.py +0 -0
  67. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/git_remote.py +0 -0
  68. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/helper/__init__.py +0 -0
  69. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/helper/socket_facts_loader.py +0 -0
  70. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/lazy_file_loader.py +0 -0
  71. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/log_uploader.py +0 -0
  72. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/logging.py +0 -0
  73. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/messages.py +0 -0
  74. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/pull_request.py +0 -0
  75. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/resource_utils.py +0 -0
  76. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm/__init__.py +0 -0
  77. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm/base.py +0 -0
  78. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm/client.py +0 -0
  79. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm/github.py +0 -0
  80. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm/gitlab.py +0 -0
  81. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/scm_comments.py +0 -0
  82. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/socket_config.py +0 -0
  83. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/streaming.py +0 -0
  84. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/tools/coana-cache.mjs +0 -0
  85. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/core/utils.py +0 -0
  86. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/fossa_compat.py +0 -0
  87. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/output.py +0 -0
  88. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/__init__.py +0 -0
  89. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/base.py +0 -0
  90. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/formatters/__init__.py +0 -0
  91. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/formatters/slack.py +0 -0
  92. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/jira.py +0 -0
  93. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/manager.py +0 -0
  94. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/slack.py +0 -0
  95. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/teams.py +0 -0
  96. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/socketsecurity/plugins/webhook.py +0 -0
  97. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/__init__.py +0 -0
  98. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/conftest.py +0 -0
  99. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/create_diff_input.json +0 -0
  100. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_diff_alerts.py +0 -0
  101. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_diff_generation.py +0 -0
  102. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_diff_scan_polling.py +0 -0
  103. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_facts_compression.py +0 -0
  104. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_full_scan_outputs.py +0 -0
  105. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_has_manifest_files.py +0 -0
  106. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_invalid_facts_marker.py +0 -0
  107. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_package_and_alerts.py +0 -0
  108. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_sdk_methods.py +0 -0
  109. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/core/test_supporting_methods.py +0 -0
  110. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/create_response.json +0 -0
  111. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/diff/stream_diff.json +0 -0
  112. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
  113. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/head_scan/metadata.json +0 -0
  114. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
  115. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
  116. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/new_scan/metadata.json +0 -0
  117. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
  118. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/repos/repo_info_error.json +0 -0
  119. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/repos/repo_info_no_head.json +0 -0
  120. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/repos/repo_info_success.json +0 -0
  121. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/data/settings/security-policy.json +0 -0
  122. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/fixtures/simple-npm/index.js +0 -0
  123. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/fixtures/simple-npm/package.json +0 -0
  124. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
  125. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/reach-facts-probe.sh +0 -0
  126. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/validate-gitlab.sh +0 -0
  127. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/validate-json.sh +0 -0
  128. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/validate-reachability.sh +0 -0
  129. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/validate-sarif.sh +0 -0
  130. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/e2e/validate-scan.sh +0 -0
  131. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/fixtures/fossa/README.md +0 -0
  132. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
  133. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
  134. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
  135. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
  136. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/__init__.py +0 -0
  137. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_alert_selection.py +0 -0
  138. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_cli_config.py +0 -0
  139. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_cli_run.py +0 -0
  140. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_client.py +0 -0
  141. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_commit_message_truncation.py +0 -0
  142. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_config.py +0 -0
  143. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_dependency_overview.py +0 -0
  144. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_disable_ignore.py +0 -0
  145. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_exclude_paths.py +0 -0
  146. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_fossa_compat.py +0 -0
  147. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_fossa_parity.py +0 -0
  148. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_full_scan_retry.py +0 -0
  149. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_git_interface.py +0 -0
  150. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_git_remote.py +0 -0
  151. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_github_buildkite_config.py +0 -0
  152. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_gitlab_auth.py +0 -0
  153. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_gitlab_auth_fallback.py +0 -0
  154. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_gitlab_commit_status.py +0 -0
  155. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_gitlab_format.py +0 -0
  156. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_ignore_authorization.py +0 -0
  157. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
  158. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_include_dirs.py +0 -0
  159. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_log_uploader.py +0 -0
  160. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_manifest_discovery.py +0 -0
  161. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_messages.py +0 -0
  162. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_output.py +0 -0
  163. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_pr_comment_rendering.py +0 -0
  164. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_pull_request_context.py +0 -0
  165. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_scan_scope.py +0 -0
  166. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_slack_plugin.py +0 -0
  167. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_slack_severity_normalization.py +0 -0
  168. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_socketcli.py +0 -0
  169. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_streaming.py +0 -0
  170. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_summary_text.py +0 -0
  171. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/tests/unit/test_tier1_finalize.py +0 -0
  172. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/workflows/bitbucket-pipelines.yml +0 -0
  173. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/workflows/buildkite.yml +0 -0
  174. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/workflows/github-actions.yml +0 -0
  175. {socketsecurity-2.11.2 → socketsecurity-2.11.4}/workflows/gitlab-ci.yml +0 -0
@@ -598,7 +598,8 @@ jobs:
598
598
 
599
599
  # The eMudhra test hosts serve certificates from the compromised
600
600
  # intermediates. Require the specific rejection, not just any failure, so
601
- # a DNS or network error cannot pass as "rejected".
601
+ # a DNS or network error cannot pass as "rejected". pip is checked on its
602
+ # own because it uses its vendored CA bundle, not the system store.
602
603
  - name: Check TLS clients reject the compromised eMudhra intermediates
603
604
  run: |
604
605
  docker run --rm --entrypoint sh socket-python-cli:dependabot-smoke -c '
@@ -640,6 +641,14 @@ jobs:
640
641
  echo "::error::python requests on $host: $result"
641
642
  status=1
642
643
  fi
644
+ if python -m pip download --no-deps --no-cache-dir --retries 0 --timeout 30 \
645
+ --dest /tmp/pip-tls --index-url "https://$host/simple/" certifi 2>&1 \
646
+ | grep -q CERTIFICATE_VERIFY_FAILED; then
647
+ echo "pip rejects $host"
648
+ else
649
+ echo "::error::pip on $host did not fail certificate verification"
650
+ status=1
651
+ fi
643
652
  done
644
653
  for url in https://api.socket.dev/v0/ https://registry.npmjs.org/ https://pypi.org/simple/; do
645
654
  if curl -sS -m 30 -o /dev/null "$url"; then
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.11.4
4
+
5
+ ### Fixed: bump `brotli` and `brotlicffi` to patched versions
6
+
7
+ - Bumped the pinned `brotli` (CPython) from `1.2.0` to `1.2.1` and `brotlicffi`
8
+ (other implementations) from `1.2.0.2` to `1.2.1.0`, which fix
9
+ CVE-2026-111497 (GHSA-9v8h-qqgm-4m35), an out-of-bounds write in the Brotli
10
+ decoder. The pins are exact, so earlier releases couldn't be installed
11
+ alongside the patched versions.
12
+
13
+ ### Fixed: find the reachability facts file when `--target-path` isn't the working directory
14
+
15
+ - `--only-facts-file` and `--reach-use-only-pregenerated-sboms` now submit the
16
+ facts file, and `--reach` no longer warns `Facts file not found`.
17
+
18
+ ### Changed: update the Docker image's PyPy to 3.12
19
+
20
+ - The amd64 Docker image now ships PyPy `8.0.1` (Python 3.12), up from PyPy
21
+ `7.3.20` (Python 3.11). The reachability engine uses it to speed up Python
22
+ analysis.
23
+
24
+ ### Changed: bump pinned Coana CLI to 15.13.0
25
+
26
+ - Bumped the pinned reachability engine (the Coana CLI) from `15.12.11` to
27
+ `15.13.0`. See the
28
+ [reachability analysis changelog](https://docs.socket.dev/docs/reachability-analysis-changelog)
29
+ for engine changes.
30
+
31
+ ## 2.11.3
32
+
33
+ ### Fixed: finish rejecting the compromised eMudhra intermediate CAs
34
+
35
+ - `socketsecurity` now requires `certifi>=2026.10.19`. Previously only the
36
+ Docker image's lockfile pinned it, so `pip install socketsecurity` could keep
37
+ an older CA bundle that trusts the compromised intermediates.
38
+ - The Docker image upgrades `pip` to `26.2.2` or newer. Earlier versions use
39
+ their own vendored CA bundle, which still trusted them.
40
+
41
+ ### Changed: bump the Socket Python SDK to 3.6.1
42
+
43
+ - Bumped the pinned Socket Python SDK (`socketdev`) from `3.6.0` to `3.6.1`,
44
+ which also requires `certifi>=2026.10.19`.
45
+
3
46
  ## 2.11.2
4
47
 
5
48
  ### Fixed: stop trusting the compromised eMudhra intermediate CAs
@@ -28,6 +28,12 @@ RUN apk update && apk add --no-cache \
28
28
  apk upgrade --no-cache ca-certificates && \
29
29
  [ "$(apk version -t "$(apk list -I ca-certificates | awk '{print $1}' | sed 's/^ca-certificates-//')" 20261020-r0)" != "<" ]
30
30
 
31
+ # pip uses its own vendored CA bundle, not the system store, and the base image's
32
+ # pip trusts the compromised eMudhra intermediates. 26.2.2 vendors certifi
33
+ # 2026.10.19. Upgrade it against the system store fixed above.
34
+ RUN python -m pip install --no-cache-dir --cert /etc/ssl/certs/ca-certificates.crt --upgrade "pip>=26.2.2" && \
35
+ python -c 'import sys, pip; sys.exit(tuple(map(int, pip.__version__.split(".")[:3])) < (26, 2, 2))'
36
+
31
37
  # npm, npx and yarn are symlinks in the node image. COPY would dereference them
32
38
  # into flat files and break their relative requires, so recreate the links.
33
39
  COPY --from=node /usr/local/bin/node /usr/local/bin/node
@@ -83,16 +89,16 @@ RUN if [ "$DOTNET_VERSION" = "6" ]; then \
83
89
 
84
90
  # Install PyPy (Alpine-compatible build for x86_64 only)
85
91
  # PyPy is an alternative Python interpreter that makes the Python reachability analysis faster.
86
- # This is a custom build of PyPy3.11 for Alpine on x86-64.
92
+ # This is a custom build of PyPy3.12 for Alpine on x86-64.
87
93
  ARG TARGETARCH # Passed by Docker buildx
88
94
  RUN if [ "$TARGETARCH" = "amd64" ]; then \
89
- PYPY_URL="https://github.com/BarrensZeppelin/alpine-pypy/releases/download/alp3.23.1-pypy3.11-7.3.20/pypy3.11-v7.3.20-linux64-alpine3.21.tar.bz2" && \
90
- PYPY_SHA256="60847fea6ffe96f10a3cd4b703686e944bb4fbcc01b7200c044088dd228425e1" && \
91
- curl -L -o /tmp/pypy.tar.bz2 "$PYPY_URL" && \
92
- echo "$PYPY_SHA256 /tmp/pypy.tar.bz2" | sha256sum -c - && \
95
+ PYPY_URL="https://github.com/BarrensZeppelin/alpine-pypy/releases/download/alp3.24.2-pypy3.12-8.0.1/pypy3.12-v8.0.1-linux64-alpine3.24.tar.gz" && \
96
+ PYPY_SHA256="b6d5dd429c6394f1710a52e3e20d5c9198547caff9528547c457d3f2ed37db09" && \
97
+ curl -L -o /tmp/pypy.tar.gz "$PYPY_URL" && \
98
+ echo "$PYPY_SHA256 /tmp/pypy.tar.gz" | sha256sum -c - && \
93
99
  mkdir -p /opt/pypy && \
94
- tar -xj --strip-components=1 -C /opt/pypy -f /tmp/pypy.tar.bz2 && \
95
- rm /tmp/pypy.tar.bz2 && \
100
+ tar -xz --strip-components=1 -C /opt/pypy -f /tmp/pypy.tar.gz && \
101
+ rm /tmp/pypy.tar.gz && \
96
102
  ln -s /opt/pypy/bin/pypy3 /bin/pypy3 && \
97
103
  pypy3 --version; \
98
104
  fi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: socketsecurity
3
- Version: 2.11.2
3
+ Version: 2.11.4
4
4
  Summary: Socket Security CLI for CI/CD
5
5
  Project-URL: Homepage, https://socket.dev
6
6
  Author-email: Douglas Coburn <douglas@socket.dev>
@@ -34,20 +34,21 @@ Classifier: Programming Language :: Python :: 3.11
34
34
  Classifier: Programming Language :: Python :: 3.12
35
35
  Requires-Python: >=3.11
36
36
  Requires-Dist: beautifulsoup4==4.15.0
37
- Requires-Dist: brotli==1.2.0; platform_python_implementation == 'CPython'
38
- Requires-Dist: brotlicffi==1.2.0.2; platform_python_implementation != 'CPython'
39
- Requires-Dist: gitpython==3.2.0
37
+ Requires-Dist: brotli==1.2.1; platform_python_implementation == 'CPython'
38
+ Requires-Dist: brotlicffi==1.2.1.0; platform_python_implementation != 'CPython'
39
+ Requires-Dist: certifi>=2026.10.19
40
+ Requires-Dist: gitpython==3.2.1
40
41
  Requires-Dist: markdown==3.11.1
41
42
  Requires-Dist: mdutils==1.8.1
42
43
  Requires-Dist: packaging==26.3
43
44
  Requires-Dist: prettytable==3.18.0
44
45
  Requires-Dist: python-dotenv==1.2.4
45
46
  Requires-Dist: requests==2.34.2
46
- Requires-Dist: socketdev==3.6.0
47
+ Requires-Dist: socketdev==3.6.1
47
48
  Provides-Extra: dev
48
49
  Requires-Dist: hatch==1.18.1; extra == 'dev'
49
50
  Requires-Dist: pre-commit==4.7.0; extra == 'dev'
50
- Requires-Dist: ruff==0.17.0; extra == 'dev'
51
+ Requires-Dist: ruff==0.17.1; extra == 'dev'
51
52
  Requires-Dist: twine==7.0.0; extra == 'dev'
52
53
  Requires-Dist: uv==0.13.4; extra == 'dev'
53
54
  Provides-Extra: test
@@ -338,7 +338,7 @@ If you don't want to provide the Socket API Token every time then you can use th
338
338
  | Parameter | Required | Default | Description |
339
339
  |:---------------------------------|:---------|:--------|:---------------------------------------------------------------------------------------------------------------------------|
340
340
  | `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code. Creates a full application reachability scan (`scan_type=socket_tier1`). |
341
- | `--reach-version` | False | 15.12.11 | Version of the Coana CLI to use. Defaults to the pinned version that ships with this CLI release, so the engine only changes when you upgrade the Socket CLI. Pass `latest` to always use the newest published version (opt-in auto-update), or an explicit version (e.g. `1.2.3`) to pin it. |
341
+ | `--reach-version` | False | 15.13.0 | Version of the Coana CLI to use. Defaults to the pinned version that ships with this CLI release, so the engine only changes when you upgrade the Socket CLI. Pass `latest` to always use the newest published version (opt-in auto-update), or an explicit version (e.g. `1.2.3`) to pin it. |
342
342
  | `--reach-analysis-timeout` | False | 10m | Timeout for each reachability analysis run, e.g. `90s`, `10m` or `1h`. Omitted by default, so coana applies its own default (`10m`). Alias: `--reach-timeout` |
343
343
  | `--reach-analysis-memory-limit` | False | 8GB | Memory limit for each reachability analysis run, e.g. `512MB` or `8GB`. Omitted by default, so coana applies its own default (`8GB`). Alias: `--reach-memory-limit` |
344
344
  | `--reach-concurrency` | False | 1 | Control parallel analysis execution (must be >= 1). Omitted by default, so coana applies its own default. |
@@ -6,21 +6,25 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "socketsecurity"
9
- version = "2.11.2"
9
+ version = "2.11.4"
10
10
  requires-python = ">= 3.11"
11
11
  license = {"file" = "LICENSE"}
12
12
  dependencies = [
13
13
  "requests==2.34.2",
14
14
  "mdutils==1.8.1",
15
15
  "prettytable==3.18.0",
16
- "gitpython==3.2.0",
16
+ "gitpython==3.2.1",
17
17
  "packaging==26.3",
18
18
  "python-dotenv==1.2.4",
19
- "socketdev==3.6.0",
19
+ "socketdev==3.6.1",
20
20
  "beautifulsoup4==4.15.0",
21
21
  "markdown==3.11.1",
22
- "brotli==1.2.0; platform_python_implementation == 'CPython'",
23
- "brotlicffi==1.2.0.2; platform_python_implementation != 'CPython'",
22
+ "brotli==1.2.1; platform_python_implementation == 'CPython'",
23
+ "brotlicffi==1.2.1.0; platform_python_implementation != 'CPython'",
24
+ # requests' CA bundle. A floor rather than an exact pin, so later trust-store
25
+ # fixes still reach installs; 2026.10.19 drops the roots behind the
26
+ # compromised eMudhra intermediates.
27
+ "certifi>=2026.10.19",
24
28
  ]
25
29
  readme = "README.md"
26
30
  description = "Socket Security CLI for CI/CD"
@@ -47,7 +51,7 @@ test = [
47
51
  "pytest-watch==4.2.0"
48
52
  ]
49
53
  dev = [
50
- "ruff==0.17.0",
54
+ "ruff==0.17.1",
51
55
  "twine==7.0.0", # for building
52
56
  "uv==0.13.4", # for dependency management
53
57
  "pre-commit==4.7.0",
@@ -1,3 +1,3 @@
1
1
  __author__ = 'socket.dev'
2
- __version__ = '2.11.2'
2
+ __version__ = '2.11.4'
3
3
  USER_AGENT = f'SocketPythonCLI/{__version__}'
@@ -22,7 +22,7 @@ log = logging.getLogger(__name__)
22
22
  # Pinned Coana CLI version. Bumped deliberately per Python CLI release so the
23
23
  # reachability engine version only changes through a standard pip upgrade (advance notice).
24
24
  # Pass --reach-version latest to opt into the newest published version instead.
25
- DEFAULT_COANA_CLI_VERSION: Final = "15.12.11"
25
+ DEFAULT_COANA_CLI_VERSION: Final = "15.13.0"
26
26
 
27
27
  # Vendored from coana-package-manager, where it is generated; the only code that may read or
28
28
  # write the cache Coana shares with the Socket CLIs. See "Launching Coana" in that repo's
@@ -132,7 +132,7 @@ class ReachabilityAnalyzer:
132
132
  org_slug: Socket organization slug
133
133
  target_directory: Directory to analyze
134
134
  tar_hash: Tar hash from manifest upload or existing scan (optional)
135
- output_path: Output file path for results
135
+ output_path: Output file path for results, relative to target_directory unless absolute
136
136
  timeout: Analysis timeout, forwarded verbatim to coana --analysis-timeout
137
137
  (coana parses the units, e.g. '90s', '10m', '1h'; a bare number is seconds)
138
138
  memory_limit: Memory limit, forwarded verbatim to coana --memory-limit
@@ -282,8 +282,9 @@ class ReachabilityAnalyzer:
282
282
  log.error(f"Reachability analysis failed with exit code {returncode}")
283
283
  raise Exception(f"Reachability analysis failed with exit code {returncode}")
284
284
 
285
- # Extract scan ID from output file
286
- scan_id = self._extract_scan_id(output_path)
285
+ # Coana runs in target_directory, so a relative output_path lands there.
286
+ report_path = os.path.join(target_directory, output_path)
287
+ scan_id = self._extract_scan_id(report_path)
287
288
 
288
289
  log.info("Reachability analysis completed successfully")
289
290
  if scan_id:
@@ -291,7 +292,7 @@ class ReachabilityAnalyzer:
291
292
 
292
293
  return {
293
294
  "scan_id": scan_id,
294
- "report_path": output_path,
295
+ "report_path": report_path,
295
296
  "tar_hash_used": tar_hash
296
297
  }
297
298
 
@@ -561,7 +561,7 @@ def main_code():
561
561
 
562
562
  # If only-facts-file mode, mark the facts file for submission
563
563
  if config.only_facts_file:
564
- facts_file_to_submit = os.path.abspath(output_path)
564
+ facts_file_to_submit = os.path.abspath(result['report_path'])
565
565
  log.info(f"Only-facts-file mode: will submit only {facts_file_to_submit}")
566
566
 
567
567
  # If reach-use-only-pregenerated-sboms mode, submit CDX, SPDX, and facts file
@@ -570,9 +570,8 @@ def main_code():
570
570
  sbom_files_to_submit = []
571
571
  for scan_path in scan_paths:
572
572
  sbom_files_to_submit.extend(core.find_sbom_files(scan_path))
573
- # Use relative path for facts file
574
- if os.path.exists(output_path):
575
- sbom_files_to_submit.append(output_path)
573
+ if os.path.exists(result['report_path']):
574
+ sbom_files_to_submit.append(result['report_path'])
576
575
  log.info(f"Pre-generated SBOMs mode: will submit {len(sbom_files_to_submit)} files (CDX, SPDX, and facts file)")
577
576
 
578
577
  except Exception as e:
@@ -20,12 +20,14 @@ from socketsecurity.core.tools.reachability import (
20
20
 
21
21
  VERSION = "1.2.3"
22
22
 
23
- # Records what it was run with in $FAKE_COANA_RUN, or fails when passed --fail.
23
+ # Records what it was run with in $FAKE_COANA_RUN, or fails when passed --fail. Like Coana, it
24
+ # writes the facts file to the --socket-mode path, resolved against its cwd.
24
25
  FAKE_CLI_WRAPPER = """
25
26
  import { writeFileSync } from 'node:fs'
26
27
  const args = process.argv.slice(2)
27
28
  if (args.includes('--fail')) process.exit(1)
28
29
  writeFileSync(process.env.FAKE_COANA_RUN, JSON.stringify({ args, cwd: process.cwd(), env: process.env }))
30
+ writeFileSync(args[args.indexOf('--socket-mode') + 1], JSON.stringify({ tier1ReachabilityScanId: 'reach-scan-id' }))
29
31
  """
30
32
 
31
33
 
@@ -84,6 +86,27 @@ def test_runs_the_cached_cli_wrapper_with_the_args_and_cwd(fake_run_path):
84
86
  assert run["cwd"] == str(fake_run_path.parent)
85
87
 
86
88
 
89
+ @pytest.mark.parametrize("absolute", [False, True])
90
+ def test_report_path_is_where_coana_wrote_the_facts_file(fake_run_path, tmp_path, monkeypatch, absolute):
91
+ target = tmp_path / "project"
92
+ target.mkdir()
93
+ monkeypatch.chdir(tmp_path)
94
+ output_path = str(tmp_path / "out" / "facts.json") if absolute else ".socket.facts.json"
95
+ if absolute:
96
+ (tmp_path / "out").mkdir()
97
+
98
+ result = _analyzer().run_reachability_analysis(
99
+ org_slug="my-org",
100
+ target_directory=str(target),
101
+ tar_hash="tar-hash-abc123",
102
+ output_path=output_path,
103
+ version=VERSION,
104
+ )
105
+
106
+ assert result["report_path"] == (output_path if absolute else str(target / ".socket.facts.json"))
107
+ assert result["scan_id"] == "reach-scan-id"
108
+
109
+
87
110
  def test_reach_debug_appends_debug_long_flag(fake_run_path):
88
111
  """G9: --reach-debug -> coana --debug; does not emit the global -d."""
89
112
  args = _run(fake_run_path, reach_debug=True)["args"]