zizmor 1.2.2__tar.gz → 1.3.1__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.

Potentially problematic release.


This version of zizmor might be problematic. Click here for more details.

Files changed (205) hide show
  1. {zizmor-1.2.2 → zizmor-1.3.1}/.github/workflows/ci.yml +6 -4
  2. {zizmor-1.2.2 → zizmor-1.3.1}/.github/workflows/pypi.yml +8 -8
  3. {zizmor-1.2.2 → zizmor-1.3.1}/.github/workflows/site.yml +1 -1
  4. {zizmor-1.2.2 → zizmor-1.3.1}/.github/workflows/zizmor.yml +2 -2
  5. {zizmor-1.2.2 → zizmor-1.3.1}/Cargo.lock +69 -25
  6. {zizmor-1.2.2 → zizmor-1.3.1}/Cargo.toml +16 -9
  7. {zizmor-1.2.2 → zizmor-1.3.1}/PKG-INFO +13 -3
  8. {zizmor-1.2.2 → zizmor-1.3.1}/README.md +12 -2
  9. {zizmor-1.2.2 → zizmor-1.3.1}/docs/audits.md +63 -2
  10. {zizmor-1.2.2 → zizmor-1.3.1}/docs/development.md +22 -7
  11. {zizmor-1.2.2 → zizmor-1.3.1}/docs/release-notes.md +50 -1
  12. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/trophies.md +94 -0
  13. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/trophies.txt +17 -0
  14. {zizmor-1.2.2 → zizmor-1.3.1}/docs/usage.md +1 -1
  15. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/bot_conditions.rs +15 -10
  16. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/mod.rs +39 -4
  17. zizmor-1.3.1/src/audit/overprovisioned_secrets.rs +117 -0
  18. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/template_injection.rs +14 -15
  19. {zizmor-1.2.2 → zizmor-1.3.1}/src/expr/expr.pest +1 -1
  20. {zizmor-1.2.2 → zizmor-1.3.1}/src/expr/mod.rs +167 -25
  21. {zizmor-1.2.2 → zizmor-1.3.1}/src/finding/mod.rs +118 -23
  22. {zizmor-1.2.2 → zizmor-1.3.1}/src/github_api.rs +1 -1
  23. {zizmor-1.2.2 → zizmor-1.3.1}/src/main.rs +17 -5
  24. {zizmor-1.2.2 → zizmor-1.3.1}/src/models.rs +9 -0
  25. {zizmor-1.2.2 → zizmor-1.3.1}/src/registry.rs +2 -2
  26. {zizmor-1.2.2 → zizmor-1.3.1}/src/render.rs +31 -3
  27. {zizmor-1.2.2 → zizmor-1.3.1}/src/utils.rs +27 -24
  28. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshot.rs +33 -16
  29. zizmor-1.3.1/tests/snapshots/snapshot__invalid_inputs.snap +17 -0
  30. zizmor-1.3.1/tests/snapshots/snapshot__overprovisioned_secrets.snap +22 -0
  31. zizmor-1.3.1/tests/snapshots/snapshot__ref_confusion-2.snap +5 -0
  32. zizmor-1.3.1/tests/snapshots/snapshot__ref_confusion.snap +13 -0
  33. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/artipacked/issue-447-repro.yml +1 -1
  34. zizmor-1.3.1/tests/test-data/invalid/invalid-workflow.yml +14 -0
  35. zizmor-1.3.1/tests/test-data/overprovisioned-secrets.yml +27 -0
  36. zizmor-1.3.1/tests/test-data/ref-confusion/issue-518-repro.yml +12 -0
  37. zizmor-1.3.1/tests/test-data/ref-confusion.yml +11 -0
  38. zizmor-1.2.2/src/finding/locate.rs +0 -59
  39. zizmor-1.2.2/tests/snapshots/snapshot__conflicting_online_options-2.snap +0 -10
  40. zizmor-1.2.2/tests/snapshots/snapshot__conflicting_online_options-3.snap +0 -10
  41. zizmor-1.2.2/tests/snapshots/snapshot__conflicting_online_options.snap +0 -10
  42. {zizmor-1.2.2 → zizmor-1.3.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  43. {zizmor-1.2.2 → zizmor-1.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  44. {zizmor-1.2.2 → zizmor-1.3.1}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  45. {zizmor-1.2.2 → zizmor-1.3.1}/.github/dependabot.yml +0 -0
  46. {zizmor-1.2.2 → zizmor-1.3.1}/.github/workflows/release.yml +0 -0
  47. {zizmor-1.2.2 → zizmor-1.3.1}/.gitignore +0 -0
  48. {zizmor-1.2.2 → zizmor-1.3.1}/CONTRIBUTING.md +0 -0
  49. {zizmor-1.2.2 → zizmor-1.3.1}/LICENSE +0 -0
  50. {zizmor-1.2.2 → zizmor-1.3.1}/Makefile +0 -0
  51. {zizmor-1.2.2 → zizmor-1.3.1}/docs/assets/favicon48x48.png +0 -0
  52. {zizmor-1.2.2 → zizmor-1.3.1}/docs/assets/rainbow.svg +0 -0
  53. {zizmor-1.2.2 → zizmor-1.3.1}/docs/assets/zizmor-demo.gif +0 -0
  54. {zizmor-1.2.2 → zizmor-1.3.1}/docs/configuration.md +0 -0
  55. {zizmor-1.2.2 → zizmor-1.3.1}/docs/index.md +0 -0
  56. {zizmor-1.2.2 → zizmor-1.3.1}/docs/installation.md +0 -0
  57. {zizmor-1.2.2 → zizmor-1.3.1}/docs/magiclink.css +0 -0
  58. {zizmor-1.2.2 → zizmor-1.3.1}/docs/quickstart.md +0 -0
  59. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/help.txt +0 -0
  60. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/render-sponsors.py +0 -0
  61. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/render-trophies.py +0 -0
  62. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/sponsors.html +0 -0
  63. {zizmor-1.2.2 → zizmor-1.3.1}/docs/snippets/sponsors.json +0 -0
  64. {zizmor-1.2.2 → zizmor-1.3.1}/docs/trophy-case.md +0 -0
  65. {zizmor-1.2.2 → zizmor-1.3.1}/mkdocs.yml +0 -0
  66. {zizmor-1.2.2 → zizmor-1.3.1}/pyproject.toml +0 -0
  67. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/artipacked.rs +0 -0
  68. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/cache_poisoning.rs +0 -0
  69. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/dangerous_triggers.rs +0 -0
  70. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/excessive_permissions.rs +0 -0
  71. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/github_env.rs +0 -0
  72. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/hardcoded_container_credentials.rs +0 -0
  73. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/impostor_commit.rs +0 -0
  74. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/insecure_commands.rs +0 -0
  75. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/known_vulnerable_actions.rs +0 -0
  76. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/ref_confusion.rs +0 -0
  77. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/secrets_inherit.rs +0 -0
  78. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/self_hosted_runner.rs +0 -0
  79. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/unpinned_uses.rs +0 -0
  80. {zizmor-1.2.2 → zizmor-1.3.1}/src/audit/use_trusted_publishing.rs +0 -0
  81. {zizmor-1.2.2 → zizmor-1.3.1}/src/config.rs +0 -0
  82. {zizmor-1.2.2 → zizmor-1.3.1}/src/models/coordinate.rs +0 -0
  83. {zizmor-1.2.2 → zizmor-1.3.1}/src/models/uses.rs +0 -0
  84. {zizmor-1.2.2 → zizmor-1.3.1}/src/sarif.rs +0 -0
  85. {zizmor-1.2.2 → zizmor-1.3.1}/src/state.rs +0 -0
  86. {zizmor-1.2.2 → zizmor-1.3.1}/tests/acceptance.rs +0 -0
  87. {zizmor-1.2.2 → zizmor-1.3.1}/tests/common.rs +0 -0
  88. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__artipacked-2.snap +0 -0
  89. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__artipacked-3.snap +0 -0
  90. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__artipacked-4.snap +0 -0
  91. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__artipacked.snap +0 -0
  92. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__bot_conditions.snap +0 -0
  93. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-10.snap +0 -0
  94. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-11.snap +0 -0
  95. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-12.snap +0 -0
  96. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-13.snap +0 -0
  97. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-14.snap +0 -0
  98. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-2.snap +0 -0
  99. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-3.snap +0 -0
  100. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-4.snap +0 -0
  101. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-5.snap +0 -0
  102. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-6.snap +0 -0
  103. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-7.snap +0 -0
  104. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-8.snap +0 -0
  105. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning-9.snap +0 -0
  106. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cache_poisoning.snap +0 -0
  107. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__cant_retrieve.snap +0 -0
  108. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-10.snap +0 -0
  109. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-11.snap +0 -0
  110. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-12.snap +0 -0
  111. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-2.snap +0 -0
  112. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-3.snap +0 -0
  113. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-4.snap +0 -0
  114. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-5.snap +0 -0
  115. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-6.snap +0 -0
  116. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-7.snap +0 -0
  117. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-8.snap +0 -0
  118. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions-9.snap +0 -0
  119. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__excessive_permissions.snap +0 -0
  120. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__github_env-2.snap +0 -0
  121. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__github_env-3.snap +0 -0
  122. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__github_env.snap +0 -0
  123. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__insecure_commands-2.snap +0 -0
  124. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__insecure_commands-3.snap +0 -0
  125. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__insecure_commands.snap +0 -0
  126. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__secrets_inherit.snap +0 -0
  127. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-2.snap +0 -0
  128. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-3.snap +0 -0
  129. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-4.snap +0 -0
  130. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-5.snap +0 -0
  131. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-6.snap +0 -0
  132. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-7.snap +0 -0
  133. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted-8.snap +0 -0
  134. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__self_hosted.snap +0 -0
  135. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-2.snap +0 -0
  136. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-3.snap +0 -0
  137. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-4.snap +0 -0
  138. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-5.snap +0 -0
  139. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-6.snap +0 -0
  140. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-7.snap +0 -0
  141. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection-8.snap +0 -0
  142. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__template_injection.snap +0 -0
  143. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__unpinned_uses-2.snap +0 -0
  144. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__unpinned_uses-3.snap +0 -0
  145. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__unpinned_uses-4.snap +0 -0
  146. {zizmor-1.2.2 → zizmor-1.3.1}/tests/snapshots/snapshot__unpinned_uses.snap +0 -0
  147. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/artipacked.yml +0 -0
  148. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/bot-conditions.yml +0 -0
  149. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-disabled-by-default.yml +0 -0
  150. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-enabled-by-default.yml +0 -0
  151. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-not-configurable.yml +0 -0
  152. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-opt-in-boolean-toggle.yml +0 -0
  153. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-opt-in-boolish-toggle.yml +0 -0
  154. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-opt-in-expression.yml +0 -0
  155. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-opt-in-multi-value-toggle.yml +0 -0
  156. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/caching-opt-out.yml +0 -0
  157. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/issue-343-repro.yml +0 -0
  158. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/issue-378-repro.yml +0 -0
  159. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/no-cache-aware-steps.yml +0 -0
  160. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/publisher-step.yml +0 -0
  161. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/workflow-release-branch-trigger.yml +0 -0
  162. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning/workflow-tag-trigger.yml +0 -0
  163. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/cache-poisoning.yml +0 -0
  164. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/issue-336-repro.yml +0 -0
  165. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/issue-472-repro.yml +0 -0
  166. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/jobs-broaden-permissions.yml +0 -0
  167. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/reusable-workflow-call.yml +0 -0
  168. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/reusable-workflow-other-triggers.yml +0 -0
  169. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-default-perms-all-jobs-explicit.yml +0 -0
  170. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-default-perms.yml +0 -0
  171. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-empty-perms.yml +0 -0
  172. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-read-all.yml +0 -0
  173. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-write-all.yml +0 -0
  174. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions/workflow-write-explicit.yml +0 -0
  175. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/excessive-permissions.yml +0 -0
  176. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/github-env/action.yml +0 -0
  177. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/github-env/github-path.yml +0 -0
  178. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/github-env/issue-397-repro.yml +0 -0
  179. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/github_env.yml +0 -0
  180. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/hardcoded-credentials.yml +0 -0
  181. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/inlined-ignores.yml +0 -0
  182. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/insecure-commands/action.yml +0 -0
  183. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/insecure-commands.yml +0 -0
  184. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/secrets-inherit.yml +0 -0
  185. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/issue-283-repro.yml +0 -0
  186. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/self-hosted-matrix-dimension.yml +0 -0
  187. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/self-hosted-matrix-exclusion.yml +0 -0
  188. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/self-hosted-matrix-inclusion.yml +0 -0
  189. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/self-hosted-runner-group.yml +0 -0
  190. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted/self-hosted-runner-label.yml +0 -0
  191. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/self-hosted.yml +0 -0
  192. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/issue-22-repro.yml +0 -0
  193. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/issue-339-repro.yml +0 -0
  194. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/issue-418-repro.yml +0 -0
  195. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/pr-317-repro.yml +0 -0
  196. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/pr-425-backstop/action.yml +0 -0
  197. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/static-env.yml +0 -0
  198. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/template-injection-dynamic-matrix.yml +0 -0
  199. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection/template-injection-static-matrix.yml +0 -0
  200. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/template-injection.yml +0 -0
  201. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/unpinned-uses/action.yml +0 -0
  202. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/unpinned-uses/issue-433-repro.yml +0 -0
  203. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/unpinned-uses.yml +0 -0
  204. {zizmor-1.2.2 → zizmor-1.3.1}/tests/test-data/use-trusted-publishing.yml +0 -0
  205. {zizmor-1.2.2 → zizmor-1.3.1}/uv.lock +0 -0
@@ -22,7 +22,7 @@ jobs:
22
22
  - uses: Swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
23
23
 
24
24
  - name: Lint
25
- run: cargo clippy -- -D warnings
25
+ run: cargo clippy -- -D warnings -D clippy::dbg_macro
26
26
 
27
27
  test:
28
28
  runs-on: ubuntu-latest
@@ -33,10 +33,12 @@ jobs:
33
33
 
34
34
  - uses: Swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
35
35
 
36
- - uses: astral-sh/setup-uv@b5f58b2abc5763ade55e4e9d0fe52cd1ff7979ca # v5.2.1
36
+ - uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5.2.2
37
37
 
38
38
  - name: Test
39
- run: cargo test
39
+ run: cargo test --features online-tests
40
+ env:
41
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
40
42
 
41
43
  - name: Test snippets
42
44
  run: |
@@ -50,7 +52,7 @@ jobs:
50
52
  with:
51
53
  persist-credentials: false
52
54
 
53
- - uses: astral-sh/setup-uv@b5f58b2abc5763ade55e4e9d0fe52cd1ff7979ca # v5.2.1
55
+ - uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5.2.2
54
56
 
55
57
  - name: Test site
56
58
  run: make site
@@ -23,7 +23,7 @@ jobs:
23
23
  - runner: ubuntu-24.04
24
24
  target: x86
25
25
  manylinux: auto
26
- - runner: ubuntu-24.04-arm
26
+ - runner: ubuntu-24.04
27
27
  target: aarch64
28
28
  manylinux: "2_24"
29
29
  - runner: ubuntu-24.04
@@ -40,7 +40,7 @@ jobs:
40
40
  with:
41
41
  persist-credentials: false
42
42
  - name: Build wheels
43
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
43
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
44
44
  with:
45
45
  target: ${{ matrix.platform.target }}
46
46
  args: --release --out dist
@@ -70,7 +70,7 @@ jobs:
70
70
  with:
71
71
  persist-credentials: false
72
72
  - name: Build wheels
73
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
73
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
74
74
  with:
75
75
  target: ${{ matrix.platform.target }}
76
76
  args: --release --out dist
@@ -96,7 +96,7 @@ jobs:
96
96
  with:
97
97
  persist-credentials: false
98
98
  - name: Build wheels
99
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
99
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
100
100
  with:
101
101
  target: ${{ matrix.platform.target }}
102
102
  args: --release --out dist
@@ -121,7 +121,7 @@ jobs:
121
121
  with:
122
122
  persist-credentials: false
123
123
  - name: Build wheels
124
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
124
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
125
125
  with:
126
126
  target: ${{ matrix.platform.target }}
127
127
  args: --release --out dist
@@ -139,7 +139,7 @@ jobs:
139
139
  with:
140
140
  persist-credentials: false
141
141
  - name: Build sdist
142
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
142
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
143
143
  with:
144
144
  command: sdist
145
145
  args: --out dist
@@ -167,12 +167,12 @@ jobs:
167
167
  steps:
168
168
  - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
169
169
  - name: Generate artifact attestation
170
- uses: actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2
170
+ uses: actions/attest-build-provenance@520d128f165991a6c774bcb264f323e3d70747f4 # v2
171
171
  with:
172
172
  subject-path: 'wheels-*/*'
173
173
  - name: Publish to PyPI
174
174
  if: ${{ startsWith(github.ref, 'refs/tags/') }}
175
- uses: PyO3/maturin-action@ea5bac0f1ccd0ab11c805e2b804bfcb65dac2eab # v1
175
+ uses: PyO3/maturin-action@5f8a1b3b0aad13193f46c9131f9b9e663def8ce5 # v1
176
176
  with:
177
177
  command: upload
178
178
  args: --non-interactive --skip-existing wheels-*/*
@@ -30,7 +30,7 @@ jobs:
30
30
  persist-credentials: false
31
31
 
32
32
  - name: Install the latest version of uv
33
- uses: astral-sh/setup-uv@b5f58b2abc5763ade55e4e9d0fe52cd1ff7979ca # v5.2.1
33
+ uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5.2.2
34
34
 
35
35
  - name: build site
36
36
  run: make site
@@ -21,13 +21,13 @@ jobs:
21
21
  with:
22
22
  persist-credentials: false
23
23
  - name: Install the latest version of uv
24
- uses: astral-sh/setup-uv@b5f58b2abc5763ade55e4e9d0fe52cd1ff7979ca # v5.2.1
24
+ uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5.2.2
25
25
  - name: Run zizmor 🌈
26
26
  run: uvx zizmor --format sarif . > results.sarif
27
27
  env:
28
28
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
29
  - name: Upload SARIF file
30
- uses: github/codeql-action/upload-sarif@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
30
+ uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8
31
31
  with:
32
32
  sarif_file: results.sarif
33
33
  category: zizmor
@@ -125,9 +125,9 @@ dependencies = [
125
125
 
126
126
  [[package]]
127
127
  name = "async-trait"
128
- version = "0.1.83"
128
+ version = "0.1.86"
129
129
  source = "registry+https://github.com/rust-lang/crates.io-index"
130
- checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
130
+ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
131
131
  dependencies = [
132
132
  "proc-macro2",
133
133
  "quote",
@@ -273,9 +273,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
273
273
 
274
274
  [[package]]
275
275
  name = "clap"
276
- version = "4.5.26"
276
+ version = "4.5.27"
277
277
  source = "registry+https://github.com/rust-lang/crates.io-index"
278
- checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783"
278
+ checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796"
279
279
  dependencies = [
280
280
  "clap_builder",
281
281
  "clap_derive",
@@ -293,9 +293,9 @@ dependencies = [
293
293
 
294
294
  [[package]]
295
295
  name = "clap_builder"
296
- version = "4.5.26"
296
+ version = "4.5.27"
297
297
  source = "registry+https://github.com/rust-lang/crates.io-index"
298
- checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121"
298
+ checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7"
299
299
  dependencies = [
300
300
  "anstream",
301
301
  "anstyle",
@@ -616,9 +616,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
616
616
 
617
617
  [[package]]
618
618
  name = "github-actions-models"
619
- version = "0.22.0"
619
+ version = "0.25.0"
620
620
  source = "registry+https://github.com/rust-lang/crates.io-index"
621
- checksum = "ea4c30fa8bf11e002d3ca72233e7a7bac33ffce4dc50877d63a8f5a161e0cd84"
621
+ checksum = "d3d33cc977e9aaa73b0e447c5c387e1720dcdfbc54e7f86e32c76e2a78bfcb9c"
622
622
  dependencies = [
623
623
  "indexmap",
624
624
  "serde",
@@ -660,9 +660,9 @@ dependencies = [
660
660
 
661
661
  [[package]]
662
662
  name = "http"
663
- version = "1.1.0"
663
+ version = "1.2.0"
664
664
  source = "registry+https://github.com/rust-lang/crates.io-index"
665
- checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
665
+ checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
666
666
  dependencies = [
667
667
  "bytes",
668
668
  "fnv",
@@ -694,9 +694,9 @@ dependencies = [
694
694
 
695
695
  [[package]]
696
696
  name = "http-cache"
697
- version = "0.20.0"
697
+ version = "0.20.1"
698
698
  source = "registry+https://github.com/rust-lang/crates.io-index"
699
- checksum = "33b65cd1687caf2c7fff496741a2f264c26f54e6d6cec03dac8f276fa4e5430e"
699
+ checksum = "7e883defacf53960c7717d9e928dc8667be9501d9f54e6a8b7703d7a30320e9c"
700
700
  dependencies = [
701
701
  "async-trait",
702
702
  "bincode",
@@ -710,9 +710,9 @@ dependencies = [
710
710
 
711
711
  [[package]]
712
712
  name = "http-cache-reqwest"
713
- version = "0.15.0"
713
+ version = "0.15.1"
714
714
  source = "registry+https://github.com/rust-lang/crates.io-index"
715
- checksum = "735586904a5ce0c13877c57cb4eb8195eb7c11ec1ffd64d4db053fb8559ca62e"
715
+ checksum = "e076afd9d376f09073b515ce95071b29393687d98ed521948edb899195595ddf"
716
716
  dependencies = [
717
717
  "anyhow",
718
718
  "async-trait",
@@ -972,9 +972,9 @@ dependencies = [
972
972
 
973
973
  [[package]]
974
974
  name = "indexmap"
975
- version = "2.7.0"
975
+ version = "2.7.1"
976
976
  source = "registry+https://github.com/rust-lang/crates.io-index"
977
- checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
977
+ checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
978
978
  dependencies = [
979
979
  "equivalent",
980
980
  "hashbrown",
@@ -983,9 +983,9 @@ dependencies = [
983
983
 
984
984
  [[package]]
985
985
  name = "indicatif"
986
- version = "0.17.9"
986
+ version = "0.17.11"
987
987
  source = "registry+https://github.com/rust-lang/crates.io-index"
988
- checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281"
988
+ checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235"
989
989
  dependencies = [
990
990
  "console",
991
991
  "number_prefix",
@@ -997,13 +997,14 @@ dependencies = [
997
997
 
998
998
  [[package]]
999
999
  name = "insta"
1000
- version = "1.42.0"
1000
+ version = "1.42.1"
1001
1001
  source = "registry+https://github.com/rust-lang/crates.io-index"
1002
- checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5"
1002
+ checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86"
1003
1003
  dependencies = [
1004
1004
  "console",
1005
1005
  "linked-hash-map",
1006
1006
  "once_cell",
1007
+ "pin-project",
1007
1008
  "similar",
1008
1009
  ]
1009
1010
 
@@ -1072,6 +1073,16 @@ dependencies = [
1072
1073
  "redox_syscall",
1073
1074
  ]
1074
1075
 
1076
+ [[package]]
1077
+ name = "line-index"
1078
+ version = "0.1.2"
1079
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1080
+ checksum = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2"
1081
+ dependencies = [
1082
+ "nohash-hasher",
1083
+ "text-size",
1084
+ ]
1085
+
1075
1086
  [[package]]
1076
1087
  name = "linked-hash-map"
1077
1088
  version = "0.5.6"
@@ -1176,6 +1187,12 @@ dependencies = [
1176
1187
  "windows-sys 0.52.0",
1177
1188
  ]
1178
1189
 
1190
+ [[package]]
1191
+ name = "nohash-hasher"
1192
+ version = "0.2.0"
1193
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1194
+ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
1195
+
1179
1196
  [[package]]
1180
1197
  name = "nom"
1181
1198
  version = "7.1.3"
@@ -1297,6 +1314,26 @@ dependencies = [
1297
1314
  "sha2",
1298
1315
  ]
1299
1316
 
1317
+ [[package]]
1318
+ name = "pin-project"
1319
+ version = "1.1.8"
1320
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1321
+ checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916"
1322
+ dependencies = [
1323
+ "pin-project-internal",
1324
+ ]
1325
+
1326
+ [[package]]
1327
+ name = "pin-project-internal"
1328
+ version = "1.1.8"
1329
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1330
+ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
1331
+ dependencies = [
1332
+ "proc-macro2",
1333
+ "quote",
1334
+ "syn 2.0.90",
1335
+ ]
1336
+
1300
1337
  [[package]]
1301
1338
  name = "pin-project-lite"
1302
1339
  version = "0.2.15"
@@ -1766,9 +1803,9 @@ dependencies = [
1766
1803
 
1767
1804
  [[package]]
1768
1805
  name = "serde_json"
1769
- version = "1.0.135"
1806
+ version = "1.0.138"
1770
1807
  source = "registry+https://github.com/rust-lang/crates.io-index"
1771
- checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9"
1808
+ checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
1772
1809
  dependencies = [
1773
1810
  "itoa",
1774
1811
  "memchr",
@@ -2083,6 +2120,12 @@ version = "0.4.1"
2083
2120
  source = "registry+https://github.com/rust-lang/crates.io-index"
2084
2121
  checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
2085
2122
 
2123
+ [[package]]
2124
+ name = "text-size"
2125
+ version = "1.1.1"
2126
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2127
+ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233"
2128
+
2086
2129
  [[package]]
2087
2130
  name = "thiserror"
2088
2131
  version = "1.0.69"
@@ -2332,9 +2375,9 @@ dependencies = [
2332
2375
 
2333
2376
  [[package]]
2334
2377
  name = "tracing-indicatif"
2335
- version = "0.3.8"
2378
+ version = "0.3.9"
2336
2379
  source = "registry+https://github.com/rust-lang/crates.io-index"
2337
- checksum = "74ba258e9de86447f75edf6455fded8e5242704c6fccffe7bf8d7fb6daef1180"
2380
+ checksum = "8201ca430e0cd893ef978226fd3516c06d9c494181c8bf4e5b32e30ed4b40aa1"
2338
2381
  dependencies = [
2339
2382
  "indicatif",
2340
2383
  "tracing",
@@ -3108,7 +3151,7 @@ dependencies = [
3108
3151
 
3109
3152
  [[package]]
3110
3153
  name = "zizmor"
3111
- version = "1.2.2"
3154
+ version = "1.3.1"
3112
3155
  dependencies = [
3113
3156
  "annotate-snippets",
3114
3157
  "anstream",
@@ -3126,6 +3169,7 @@ dependencies = [
3126
3169
  "indicatif",
3127
3170
  "insta",
3128
3171
  "itertools",
3172
+ "line-index",
3129
3173
  "owo-colors",
3130
3174
  "pest",
3131
3175
  "pest_derive",
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "zizmor"
3
3
  description = "Static analysis for GitHub Actions"
4
- version = "1.2.2"
4
+ version = "1.3.1"
5
5
  edition = "2021"
6
6
  repository = "https://github.com/woodruffw/zizmor"
7
7
  homepage = "https://github.com/woodruffw/zizmor"
@@ -12,23 +12,30 @@ keywords = ["cli", "github-actions", "static-analysis", "security"]
12
12
  categories = ["command-line-utilities"]
13
13
  rust-version = "1.80.1"
14
14
 
15
+ [features]
16
+ # Test-only: enable online audits that make use of a GitHub token via GH_TOKEN.
17
+ gh-token-tests = []
18
+ # Test-only: enable all online audits.
19
+ online-tests = ["gh-token-tests"]
20
+
15
21
  [dependencies]
16
22
  annotate-snippets = "0.11.5"
17
23
  anstream = "0.6.18"
18
24
  anyhow = "1.0.95"
19
25
  camino = { version = "1.1.9", features = ["serde1"] }
20
- clap = { version = "4.5.26", features = ["derive", "env"] }
26
+ clap = { version = "4.5.27", features = ["derive", "env"] }
21
27
  clap-verbosity-flag = { version = "3.0.2", features = [
22
28
  "tracing",
23
29
  ], default-features = false }
24
30
  etcetera = "0.8.0"
25
31
  flate2 = "1.0.35"
26
- github-actions-models = "0.22.0"
27
- http-cache-reqwest = "0.15.0"
32
+ github-actions-models = "0.25.0"
33
+ http-cache-reqwest = "0.15.1"
28
34
  human-panic = "2.0.1"
29
- indexmap = "2.7.0"
30
- indicatif = "0.17.9"
35
+ indexmap = "2.7.1"
36
+ indicatif = "0.17.11"
31
37
  itertools = "0.14.0"
38
+ line-index = "0.1.2"
32
39
  owo-colors = "4.1.0"
33
40
  pest = "2.7.15"
34
41
  pest_derive = "2.7.15"
@@ -41,7 +48,7 @@ reqwest = { version = "0.12.12", features = [
41
48
  reqwest-middleware = "0.4.0"
42
49
  serde = { version = "1.0.217", features = ["derive"] }
43
50
  serde-sarif = "0.7.0"
44
- serde_json = "1.0.135"
51
+ serde_json = "1.0.138"
45
52
  serde_yaml = "0.9.34"
46
53
  # TODO remove pending https://github.com/tree-sitter/tree-sitter/pull/4034
47
54
  streaming-iterator = "0.1.9"
@@ -49,7 +56,7 @@ tar = "0.4.43"
49
56
  terminal-link = "0.1.0"
50
57
  tokio = { version = "1.43.0", features = ["rt-multi-thread"] }
51
58
  tracing = "0.1.41"
52
- tracing-indicatif = "0.3.8"
59
+ tracing-indicatif = "0.3.9"
53
60
  tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
54
61
  tree-sitter = "0.24.7"
55
62
  tree-sitter-bash = "0.23.3"
@@ -65,6 +72,6 @@ lto = true
65
72
 
66
73
  [dev-dependencies]
67
74
  assert_cmd = "2.0.16"
68
- insta = { version = "1.42.0" }
75
+ insta = { version = "1.42.1" }
69
76
  pretty_assertions = "1.4.1"
70
77
  serde_json_path = "0.7.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zizmor
3
- Version: 1.2.2
3
+ Version: 1.3.1
4
4
  License-File: LICENSE
5
5
  Summary: Static analysis for GitHub Actions
6
6
  Keywords: cli,github-actions,static-analysis,security
@@ -19,8 +19,18 @@ Project-URL: Source Code, https://github.com/woodruffw/zizmor
19
19
  [![Packaging status](https://repology.org/badge/tiny-repos/zizmor.svg)](https://repology.org/project/zizmor/versions)
20
20
  [![GitHub Sponsors](https://img.shields.io/github/sponsors/woodruffw?style=flat&logo=githubsponsors&labelColor=white&color=white)](https://github.com/sponsors/woodruffw)
21
21
 
22
- `zizmor` is a static analysis tool for GitHub Actions. It can find
23
- many common security issues in typical GitHub Actions CI/CD setups.
22
+ `zizmor` is a static analysis tool for GitHub Actions.
23
+
24
+ It can find many common security issues in typical GitHub Actions CI/CD setups,
25
+ including:
26
+
27
+ * Template injection vulnerabilities, leading to attacker-controlled code execution
28
+ * Accidental credential persistence and leakage
29
+ * Excessive permission scopes and credential grants to runners
30
+ * Impostor commits and confusable `git` references
31
+ * ...[and much more]!
32
+
33
+ [and much more]: https://woodruffw.github.io/zizmor/audits/
24
34
 
25
35
  ![zizmor demo](https://raw.githubusercontent.com/woodruffw/zizmor/main/docs/assets/zizmor-demo.gif)
26
36
 
@@ -5,8 +5,18 @@
5
5
  [![Packaging status](https://repology.org/badge/tiny-repos/zizmor.svg)](https://repology.org/project/zizmor/versions)
6
6
  [![GitHub Sponsors](https://img.shields.io/github/sponsors/woodruffw?style=flat&logo=githubsponsors&labelColor=white&color=white)](https://github.com/sponsors/woodruffw)
7
7
 
8
- `zizmor` is a static analysis tool for GitHub Actions. It can find
9
- many common security issues in typical GitHub Actions CI/CD setups.
8
+ `zizmor` is a static analysis tool for GitHub Actions.
9
+
10
+ It can find many common security issues in typical GitHub Actions CI/CD setups,
11
+ including:
12
+
13
+ * Template injection vulnerabilities, leading to attacker-controlled code execution
14
+ * Accidental credential persistence and leakage
15
+ * Excessive permission scopes and credential grants to runners
16
+ * Impostor commits and confusable `git` references
17
+ * ...[and much more]!
18
+
19
+ [and much more]: https://woodruffw.github.io/zizmor/audits/
10
20
 
11
21
  ![zizmor demo](https://raw.githubusercontent.com/woodruffw/zizmor/main/docs/assets/zizmor-demo.gif)
12
22
 
@@ -849,7 +849,7 @@ not using `pull_request_target` for auto-merge workflows.
849
849
  jobs:
850
850
  automerge:
851
851
  runs-on: ubuntu-latest
852
- if: github.actor == 'dependabot[bot] && github.repository == 'me/my-repo'
852
+ if: github.actor == 'dependabot[bot]' && github.repository == github.event.pull_request.head.repo.full_name
853
853
  steps:
854
854
  - run: gh pr merge --auto --merge "$PR_URL"
855
855
  env:
@@ -865,7 +865,7 @@ not using `pull_request_target` for auto-merge workflows.
865
865
  jobs:
866
866
  automerge:
867
867
  runs-on: ubuntu-latest
868
- if: github.event.pull_request.user.login == 'dependabot[bot] && github.repository == 'me/my-repo'
868
+ if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == github.event.pull_request.head.repo.full_name
869
869
  steps:
870
870
  - run: gh pr merge --auto --merge "$PR_URL"
871
871
  env:
@@ -873,6 +873,67 @@ not using `pull_request_target` for auto-merge workflows.
873
873
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
874
874
  ```
875
875
 
876
+ ## `overprovisioned-secrets`
877
+
878
+ | Type | Examples | Introduced in | Works offline | Enabled by default |
879
+ |----------|-------------------------|---------------|----------------|--------------------|
880
+ | Workflow | [overprovisioned-secrets.yml] | v1.3.0 | ✅ | ✅ |
881
+
882
+ [overprovisioned-secrets.yml]: https://github.com/woodruffw/gha-hazmat/blob/main/.github/workflows/overprovisioned-secrets.yml
883
+
884
+ Detects excessive sharing of the `secrets` context.
885
+
886
+ Typically, users access the `secrets` context via its individual members:
887
+
888
+ ```yaml
889
+ env:
890
+ SECRET_ONE: ${{ secrets.SECRET_ONE }}
891
+ SECRET_TWO: ${{ secrets.SECRET_TWO }}
892
+ ```
893
+
894
+ This allows the Actions runner to only expose the secrets actually used by
895
+ the workflow to the job environment.
896
+
897
+ However, if the user instead accesses the *entire* `secrets` context:
898
+
899
+ ```yaml
900
+ env:
901
+ SECRETS: ${{ toJson(secrets) }}
902
+ ```
903
+
904
+ ...then the entire `secrets` context is exposed to the runner, even if
905
+ only a single secret is actually needed.
906
+
907
+ ### Remediation
908
+
909
+ In general, users should avoid loading the entire `secrets` context.
910
+ Secrets should be accessed individually by name.
911
+
912
+ === "Before :warning:"
913
+
914
+ ```yaml title="overprovisioned.yml" hl_lines="7"
915
+ jobs:
916
+ deploy:
917
+ runs-on: ubuntu-latest
918
+ steps:
919
+ - run: ./deploy.sh
920
+ env:
921
+ SECRETS: ${{ toJSON(secrets) }}
922
+ ```
923
+
924
+ === "After :white_check_mark:"
925
+
926
+ ```yaml title="overprovisioned.yml" hl_lines="7-8"
927
+ jobs:
928
+ deploy:
929
+ runs-on: ubuntu-latest
930
+ steps:
931
+ - run: ./deploy.sh
932
+ env:
933
+ SECRET_ONE: ${{ secrets.SECRET_ONE }}
934
+ SECRET_TWO: ${{ secrets.SECRET_TWO }}
935
+ ```
936
+
876
937
  [ArtiPACKED: Hacking Giants Through a Race Condition in GitHub Actions Artifacts]: https://unit42.paloaltonetworks.com/github-repo-artifacts-leak-tokens/
877
938
  [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests]: https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/
878
939
  [What the fork? Imposter commits in GitHub Actions and CI/CD]: https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd
@@ -90,6 +90,21 @@ cargo test --test snapshot
90
90
  cargo test
91
91
  ```
92
92
 
93
+ ### Online tests
94
+
95
+ `zizmor` has some online tests that are ignored by default. These
96
+ tests are gated behind crate features:
97
+
98
+ - `gh-token-tests`: Enable online tests that use the GitHub API.
99
+ - `online-tests`: Enable all online tests, including `gh-token-tests`.
100
+
101
+ To run these successfully, you'll need to set the `GH_TOKEN` environment
102
+ variable and pass the `--features` flag to `cargo test`:
103
+
104
+ ```bash
105
+ GH_TOKEN=$(gh auth token) cargo test --features online-tests
106
+ ```
107
+
93
108
  ### Writing snapshot tests
94
109
 
95
110
  `zizmor` uses @mitsuhiko/insta for snapshot testing.
@@ -215,9 +230,9 @@ Some things that can be useful to discuss beforehand:
215
230
  When developing a new `zizmor` audit, there are a couple of implementation details to be aware of:
216
231
 
217
232
  - All existing audits live in a Rust modules grouped under `src/audit` folder
218
- - The expected behavior for all audits is defined by the `WorkflowAudit` trait at `src/audit/mod.rs`
233
+ - The expected behavior for all audits is defined by the `Audit` trait at `src/audit/mod.rs`
219
234
  - The expected outcome of an executed audit is defined by the `Finding` struct at `src/finding/mod.rs`
220
- - Any `WorkflowAudit` implementation can have access to an `AuditState` instance, as per `src/state.rs`
235
+ - Any `Audit` implementation can have access to an `AuditState` instance, as per `src/state.rs`
221
236
  - If an audit requires data from the GitHub API, there is a `Client` implementation at `src/github_api.rs`
222
237
  - All the audits must be registered at `src/main.rs` according to the `register_audit!` macro
223
238
 
@@ -233,12 +248,12 @@ cargo test
233
248
 
234
249
  !!! tip
235
250
 
236
- `WorkflowAudit` has various default implementations that are useful if your
251
+ `Audit` has various default implementations that are useful if your
237
252
  audit only needs to look at individual jobs, steps, etc.
238
253
 
239
- For example, you may want to implement `WorkflowAudit::audit_step` to
254
+ For example, you may want to implement `Audit::audit_step` to
240
255
  audit each step individually rather than having to iterate from the workflow
241
- downwards with `WorkflowAudit::audit`.
256
+ downwards with `Audit::audit`.
242
257
 
243
258
  !!! tip
244
259
 
@@ -248,8 +263,8 @@ The general procedure for adding a new audit can be described as:
248
263
 
249
264
  - Define a new file at `src/audit/my_new_audit.rs`
250
265
  - Define a struct like `MyNewAudit`
251
- - Use the `audit_meta!` macro to implement `Audit` for `MyNewAudit`
252
- - Implement the `WorkflowAudit` trait for `MyNewAudit`
266
+ - Use the `audit_meta!` macro to implement `AuditCore` for `MyNewAudit`
267
+ - Implement the `Audit` trait for `MyNewAudit`
253
268
  - You may want to use both the `AuditState` and `github_api::Client` to get the job done
254
269
  - Assign the proper `location` when creating a `Finding`, grabbing it from the
255
270
  proper `Workflow`, `Job` or `Step` instance