cloud-audit 2.3.0__tar.gz → 2.4.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 (181) hide show
  1. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/workflows/ci.yml +4 -4
  2. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/workflows/docs.yml +1 -1
  3. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/workflows/example-scan.yml +1 -1
  4. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/workflows/release.yml +7 -7
  5. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/CHANGELOG.md +259 -1
  6. cloud_audit-2.4.0/PKG-INFO +240 -0
  7. cloud_audit-2.4.0/README.md +193 -0
  8. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/SECURITY.md +5 -6
  9. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/action.yml +51 -19
  10. cloud_audit-2.4.0/assets/blast-audit-boardroom.png +0 -0
  11. cloud_audit-2.4.0/assets/blast-audit-counterfactual.png +0 -0
  12. cloud_audit-2.4.0/assets/blast-audit-hero.png +0 -0
  13. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/mkdocs.yml +1 -0
  14. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/pyproject.toml +2 -2
  15. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/cli.py +11 -0
  16. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/bsi_c5_2020.json +26 -9
  17. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/cis_aws_v3.json +10 -3
  18. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/hipaa_security.json +23 -7
  19. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/iso27001_2022.json +32 -10
  20. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/nis2_directive.json +26 -8
  21. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/frameworks/soc2_type2.json +43 -11
  22. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/cost_model.py +89 -0
  23. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/models.py +10 -0
  24. cloud_audit-2.4.0/src/cloud_audit/proof.py +198 -0
  25. cloud_audit-2.4.0/src/cloud_audit/providers/aws/checks/agentcore.py +520 -0
  26. cloud_audit-2.4.0/src/cloud_audit/providers/aws/checks/config_.py +484 -0
  27. cloud_audit-2.4.0/src/cloud_audit/providers/aws/checks/data_perimeter.py +702 -0
  28. cloud_audit-2.4.0/src/cloud_audit/providers/aws/checks/ddb.py +522 -0
  29. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/s3.py +214 -14
  30. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/provider.py +8 -0
  31. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/scanner.py +24 -0
  32. cloud_audit-2.4.0/tests/aws/test_agentcore.py +324 -0
  33. cloud_audit-2.4.0/tests/aws/test_config.py +245 -0
  34. cloud_audit-2.4.0/tests/aws/test_data_perimeter.py +662 -0
  35. cloud_audit-2.4.0/tests/aws/test_ddb.py +212 -0
  36. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_s3.py +119 -2
  37. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_compliance_frameworks.py +10 -0
  38. cloud_audit-2.4.0/tests/test_proof.py +298 -0
  39. cloud_audit-2.3.0/PKG-INFO +0 -443
  40. cloud_audit-2.3.0/README.md +0 -396
  41. cloud_audit-2.3.0/src/cloud_audit/providers/aws/checks/config_.py +0 -145
  42. cloud_audit-2.3.0/tests/aws/test_config.py +0 -82
  43. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.cloud-audit.example.yml +0 -0
  44. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/FUNDING.yml +0 -0
  45. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  46. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  47. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  48. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.github/dependabot.yml +0 -0
  49. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.gitignore +0 -0
  50. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.mcp.json +0 -0
  51. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/.pre-commit-hooks.yaml +0 -0
  52. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/CODEOWNERS +0 -0
  53. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/CODE_OF_CONDUCT.md +0 -0
  54. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/CONTRIBUTING.md +0 -0
  55. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/Dockerfile +0 -0
  56. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/LICENSE +0 -0
  57. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/Makefile +0 -0
  58. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/ROADMAP.md +0 -0
  59. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/assets/demo.gif +0 -0
  60. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/assets/logo-nobg.png +0 -0
  61. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/assets/logo.png +0 -0
  62. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/assets/report-preview.png +0 -0
  63. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/assets/social-preview.png +0 -0
  64. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/examples/daily-scan-with-diff.yml +0 -0
  65. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/examples/github-actions.yml +0 -0
  66. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/examples/post-deploy-scan.yml +0 -0
  67. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/overrides/main.html +0 -0
  68. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/scripts/generate_demo_gif.py +0 -0
  69. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/scripts/generate_report_screenshot.py +0 -0
  70. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/server.json +0 -0
  71. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/__init__.py +0 -0
  72. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/__main__.py +0 -0
  73. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/blast_radius.py +0 -0
  74. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/__init__.py +0 -0
  75. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/compliance/engine.py +0 -0
  76. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/config.py +0 -0
  77. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/correlate.py +0 -0
  78. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/diff.py +0 -0
  79. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/graph.py +0 -0
  80. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/history.py +0 -0
  81. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/mcp_server.py +0 -0
  82. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/__init__.py +0 -0
  83. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/__init__.py +0 -0
  84. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/__init__.py +0 -0
  85. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/account.py +0 -0
  86. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/backup.py +0 -0
  87. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/bedrock.py +0 -0
  88. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/cloudtrail.py +0 -0
  89. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/cloudwatch.py +0 -0
  90. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/ec2.py +0 -0
  91. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/ecs.py +0 -0
  92. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/efs.py +0 -0
  93. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/eip.py +0 -0
  94. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/guardduty.py +0 -0
  95. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/iam.py +0 -0
  96. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/inspector.py +0 -0
  97. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/kms.py +0 -0
  98. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/lambda_.py +0 -0
  99. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/rds.py +0 -0
  100. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/sagemaker.py +0 -0
  101. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/secrets.py +0 -0
  102. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/securityhub.py +0 -0
  103. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/ssm.py +0 -0
  104. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/vpc.py +0 -0
  105. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/checks/waf.py +0 -0
  106. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/iam_analyzer.py +0 -0
  107. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/iam_trust_graph.py +0 -0
  108. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/__init__.py +0 -0
  109. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/cloudtrail_tampering.py +0 -0
  110. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/cryptomining_role.py +0 -0
  111. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/datazone_overgrant.py +0 -0
  112. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/lambda_function_url.py +0 -0
  113. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/mmdsv1_in_use.py +0 -0
  114. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/quarantine_policy.py +0 -0
  115. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/roles_anywhere_abuse.py +0 -0
  116. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/ses_phishing.py +0 -0
  117. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/trufflehog_ua.py +0 -0
  118. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/aws/threat_feed/whoami_confusion.py +0 -0
  119. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/providers/base.py +0 -0
  120. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/py.typed +0 -0
  121. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/__init__.py +0 -0
  122. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/compliance_html.py +0 -0
  123. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/compliance_markdown.py +0 -0
  124. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/diff_markdown.py +0 -0
  125. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/html.py +0 -0
  126. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/markdown.py +0 -0
  127. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/sarif.py +0 -0
  128. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/reports/templates/report.html.j2 +0 -0
  129. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/root_cause.py +0 -0
  130. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/src/cloud_audit/simulate.py +0 -0
  131. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/__init__.py +0 -0
  132. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/__init__.py +0 -0
  133. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_bedrock.py +0 -0
  134. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_cis_checks.py +0 -0
  135. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_cloudtrail.py +0 -0
  136. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_cloudwatch.py +0 -0
  137. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_ec2.py +0 -0
  138. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_ecs.py +0 -0
  139. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_eip.py +0 -0
  140. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_guardduty.py +0 -0
  141. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_iam.py +0 -0
  142. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_iam_analyzer.py +0 -0
  143. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_iam_trust_graph.py +0 -0
  144. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_kms.py +0 -0
  145. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_lambda.py +0 -0
  146. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_rds.py +0 -0
  147. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_sagemaker.py +0 -0
  148. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_secrets.py +0 -0
  149. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_ssm.py +0 -0
  150. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/test_vpc.py +0 -0
  151. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/__init__.py +0 -0
  152. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_cloudtrail_tampering.py +0 -0
  153. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_cryptomining_role.py +0 -0
  154. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_datazone_overgrant.py +0 -0
  155. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_lambda_function_url.py +0 -0
  156. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_mmdsv1_in_use.py +0 -0
  157. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_quarantine_policy.py +0 -0
  158. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_roles_anywhere_abuse.py +0 -0
  159. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_ses_phishing.py +0 -0
  160. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_trufflehog_ua.py +0 -0
  161. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/aws/threat_feed/test_whoami_confusion.py +0 -0
  162. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/conftest.py +0 -0
  163. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_blast_radius.py +0 -0
  164. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_cli.py +0 -0
  165. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_cli_scan.py +0 -0
  166. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_config.py +0 -0
  167. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_correlate.py +0 -0
  168. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_cost_model.py +0 -0
  169. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_diff.py +0 -0
  170. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_graph.py +0 -0
  171. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_history.py +0 -0
  172. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_html.py +0 -0
  173. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_markdown.py +0 -0
  174. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_mcp_server.py +0 -0
  175. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_models.py +0 -0
  176. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_provider.py +0 -0
  177. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_root_cause.py +0 -0
  178. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_sarif.py +0 -0
  179. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_scanner.py +0 -0
  180. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_simulate.py +0 -0
  181. {cloud_audit-2.3.0 → cloud_audit-2.4.0}/tests/test_soc2_framework.py +0 -0
@@ -15,7 +15,7 @@ jobs:
15
15
  name: Lint & Format
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
18
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
19
19
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
20
20
  with:
21
21
  python-version: "3.12"
@@ -28,7 +28,7 @@ jobs:
28
28
  name: Type Check
29
29
  runs-on: ubuntu-latest
30
30
  steps:
31
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
31
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
32
32
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
33
33
  with:
34
34
  python-version: "3.12"
@@ -43,7 +43,7 @@ jobs:
43
43
  matrix:
44
44
  python-version: ["3.10", "3.11", "3.12", "3.13"]
45
45
  steps:
46
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
46
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
47
47
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
48
48
  with:
49
49
  python-version: ${{ matrix.python-version }}
@@ -55,6 +55,6 @@ jobs:
55
55
  name: Docker Build
56
56
  runs-on: ubuntu-latest
57
57
  steps:
58
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
58
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
59
59
  - run: docker build -t cloud-audit:test .
60
60
  - run: docker run --rm cloud-audit:test version
@@ -15,7 +15,7 @@ jobs:
15
15
  deploy:
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
- - uses: actions/checkout@v6
18
+ - uses: actions/checkout@v7
19
19
  - uses: actions/setup-python@v6
20
20
  with:
21
21
  python-version: '3.12'
@@ -27,7 +27,7 @@ jobs:
27
27
  name: cloud-audit scan
28
28
  runs-on: ubuntu-latest
29
29
  steps:
30
- - uses: actions/checkout@v6
30
+ - uses: actions/checkout@v7
31
31
 
32
32
  - uses: aws-actions/configure-aws-credentials@v6
33
33
  with:
@@ -18,7 +18,7 @@ jobs:
18
18
  needs: ci
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
21
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
22
22
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
23
23
  with:
24
24
  python-version: "3.12"
@@ -61,17 +61,17 @@ jobs:
61
61
  contents: read
62
62
  packages: write
63
63
  steps:
64
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
65
- - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
64
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
65
+ - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
66
66
  with:
67
67
  registry: ghcr.io
68
68
  username: ${{ github.actor }}
69
69
  password: ${{ secrets.GITHUB_TOKEN }}
70
- - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
70
+ - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
71
71
  with:
72
72
  username: ${{ secrets.DOCKERHUB_USERNAME }}
73
73
  password: ${{ secrets.DOCKERHUB_TOKEN }}
74
- - uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
74
+ - uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0
75
75
  id: meta
76
76
  with:
77
77
  images: |
@@ -81,7 +81,7 @@ jobs:
81
81
  type=semver,pattern={{version}}
82
82
  type=semver,pattern={{major}}.{{minor}}
83
83
  type=raw,value=latest
84
- - uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
84
+ - uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
85
85
  with:
86
86
  context: .
87
87
  push: true
@@ -95,7 +95,7 @@ jobs:
95
95
  permissions:
96
96
  contents: write
97
97
  steps:
98
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
98
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
99
99
  - name: Extract changelog for this version
100
100
  id: changelog
101
101
  run: |
@@ -7,6 +7,263 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.0] - 2026-06-30
11
+
12
+ ### Added
13
+
14
+ - **Data Perimeter Scanner** - new check category (`aws-dp-001` .. `aws-dp-005`)
15
+ that evaluates resource-based policies for the two boundary failures detectable
16
+ from a single account's configuration - read-only, and without AWS Organizations
17
+ access:
18
+
19
+ - **Confused deputy**: an `Allow` statement grants an AWS service principal
20
+ without an `aws:SourceAccount` / `aws:SourceArn` / `aws:SourceOrgID` /
21
+ `aws:SourceOwner` condition (`MEDIUM`). A service acting on behalf of another
22
+ account could be coerced into operating on your resource.
23
+ - **Cross-organization exposure**: an `Allow` statement grants a wildcard
24
+ (`"*"`) or external-account AWS principal without an organization-boundary
25
+ condition (`aws:PrincipalOrgID`, `aws:ResourceOrgID`, `aws:SourceOrgID`, ...).
26
+ Wildcard grants are `HIGH`; a named external account is `LOW` (often an
27
+ intentional partner share). On Secrets Manager these are escalated to
28
+ `CRITICAL` (wildcard) / `MEDIUM` (external) as a direct credential-exfiltration
29
+ path.
30
+
31
+ Services covered: S3 bucket policies (`aws-dp-001`), SNS topic policies
32
+ (`aws-dp-002`), SQS queue policies (`aws-dp-003`), Secrets Manager resource
33
+ policies (`aws-dp-004`), and Lambda resource policies (`aws-dp-005`). Every
34
+ finding ships CLI + Terraform remediation and a breach-cost estimate. Condition
35
+ keys are matched case-insensitively, and condition **values** are evaluated (not
36
+ just key presence) - a guardrail scoped to a *foreign* account or org is still
37
+ flagged. Default SNS/SQS policies relying on `aws:SourceOwner` set to the owner
38
+ account are correctly treated as account-scoped (no false positive). Federated
39
+ provider ARNs in a foreign account are flagged as external; federated URL IdPs
40
+ and `CanonicalUser` principals are out of scope.
41
+
42
+ This closes a gap the dominant open-source scanner explicitly does not cover
43
+ (Prowler issue #7114, "Integrating SCP/RCP Policy Awareness", open since
44
+ 2025-03): evaluating data-perimeter condition keys on resource policies. SCP/RCP
45
+ enforcement at the AWS Organizations level is intentionally out of scope.
46
+ Detection taxonomy follows the AWS data perimeter whitepaper and the AWS
47
+ cross-service confused-deputy guidance.
48
+
49
+ - **Proof Mode** - new opt-in `scan --verify` that cross-checks each detected IAM
50
+ privilege-escalation path against the read-only `iam:SimulatePrincipalPolicy`
51
+ API to confirm the principal's policies actually allow the required actions. Each
52
+ path is annotated `verified` with `verification_detail` evidence: `true` = the
53
+ simulator allowed every required action (policy-allowed; *simulated, not
54
+ executed*); `false` = the simulator denied one (the static path is likely a
55
+ false positive); `null` = not asserted. The scan prints
56
+ `Proof Mode: N/M escalation path(s) policy-allowed by IAM simulator`. Honest
57
+ framing throughout: this confirms the permission exists, not end-to-end
58
+ exploitability - the simulator does not factor in SCPs, permission boundaries,
59
+ resource policies, or trust conditions. Resource-scoped methods (`iam:PassRole`,
60
+ `sts:AssumeRole`, compute-hijack) are deliberately left `null` because without
61
+ resource ARNs the simulator evaluates against `*` and would over-report; paths
62
+ gated by unevaluated condition keys are also left `null`.
63
+ `iam:SimulatePrincipalPolicy` has no per-call charge, so the opt-in controls
64
+ latency/throttling only; calls are deduplicated per (principal, action-set). New
65
+ module `proof.py`; `EscalationPath` gains `verified` / `verification_detail`
66
+ (backward compatible, default unchecked). Brings the 2026 "proof, not
67
+ probability" validation trend - which commercial scanners sell as a paid
68
+ flagship - to open-source AWS.
69
+
70
+ - **AgentCore checks** - first OSS scanner with dedicated Amazon Bedrock AgentCore
71
+ (GA 2025-10) coverage: 6 read-only checks `aws-agc-001..006` over the AI agent
72
+ platform. Flags Code Interpreter / Runtime in PUBLIC network mode (egress
73
+ exfiltration), Runtime not enforcing MMDSv2 (metadata credential theft), Memory
74
+ without a customer-managed KMS key, Gateway with no inbound authorizer
75
+ (`authorizerType=NONE`), and Gateway with no enforcing policy engine (missing or
76
+ `LOG_ONLY`). Each finding ships a CLI + Terraform fix and breach-cost estimate,
77
+ and maps to Palo Alto Unit 42 "Cracks in the Bedrock" research. Read-only
78
+ `bedrock-agentcore-control` (no per-call charge); the service is regional and
79
+ absent regions are skipped silently. New module `agentcore.py`; field names,
80
+ operations and enum values verified against the live boto3 service model.
81
+
82
+ ### Changed
83
+
84
+ - Check count: 99 -> 110 (across 25 services). AgentCore adds a new service module
85
+ of 6 checks; the data perimeter's 5 checks remain a cross-cutting category over
86
+ existing services, like Threat Feed.
87
+
88
+ ### Tests
89
+
90
+ - 836 -> 948 (+112). New file `tests/aws/test_data_perimeter.py`: 43 unit tests
91
+ pinning the `_find_perimeter_gaps` detection engine (confused deputy, cross-org
92
+ wildcard/external, condition-value evaluation so a guardrail pointing at a
93
+ foreign account/org is still flagged, federated provider ARNs, case-insensitive
94
+ conditions, Deny/NotPrincipal/CanonicalUser/malformed handling) plus 17 moto
95
+ integration tests across all five services. New file `tests/test_proof.py`:
96
+ 28 tests pinning the Proof Mode engine (decision semantics: allowed /
97
+ explicit+implicit deny / unknown-decision / incomplete / empty / malformed; the
98
+ resource-scoping gate that leaves PassRole/AssumeRole and deny-removal paths
99
+ unasserted; condition-key gating; API-call dedup; per-path error isolation;
100
+ provider-backed path). New file `tests/aws/test_agentcore.py`: 24 fixture-based
101
+ tests (moto lacks bedrock-agentcore-control) covering each check's positive and
102
+ negative cases across network mode, MMDSv2, memory KMS, gateway authorizer and
103
+ policy engine, empty policy config, multi-page pagination, plus
104
+ region-unavailable / access-denied skip and multi-region aggregation.
105
+
106
+ ### Compliance
107
+
108
+ - `aws-dp-001` .. `aws-dp-005` mapped: SOC 2 (CC5.2, CC6.1, CC6.6, C1.1),
109
+ CIS AWS v3.0 (2.1.4), HIPAA (164.308(a)(1)(ii)(A), 164.312(a)(1)),
110
+ ISO/IEC 27001:2022 (A.8.3, A.8.12), NIS2 (NIS2-RM-09a), BSI C5:2020 (IDM-07).
111
+
112
+ ## [2.3.1] - 2026-05-26
113
+
114
+ ### Added
115
+
116
+ - **DynamoDB hygiene module** - new `ddb.py` module adds 3 checks covering
117
+ production-baseline DynamoDB configuration. cloud-audit previously had zero
118
+ DynamoDB coverage across 23 services; v2.3.1 closes that gap.
119
+
120
+ - **`aws-ddb-001` - Encryption at rest visibility** (tiered severity).
121
+ Surfaces tables where `SSEDescription` is absent (AWS-owned default key,
122
+ `LOW` - encryption is on but no CloudTrail audit trail, no rotation
123
+ control, no incident-time revocation), `InaccessibleEncryptionDateTime`
124
+ is set (`CRITICAL` - CMK was disabled or access revoked, table will be
125
+ archived in 7 days), or `Status != ENABLED` on a steady-state table
126
+ (`HIGH`). AWS-managed KMS (`alias/aws/dynamodb`) and customer-managed
127
+ CMKs both pass. The AWS Security Hub managed standard has no equivalent
128
+ control; cloud-audit is more opinionated because compliance auditors
129
+ (SOC 2, HIPAA, ISO 27001) typically require an auditable key.
130
+ - **`aws-ddb-002` - Point-in-time recovery enabled** (`MEDIUM`). Matches
131
+ AWS Security Hub `DynamoDB.2` severity. Without PITR, accidental drops
132
+ or mass conditional-update bugs are unrecoverable except from on-demand
133
+ backups, which require explicit scheduling.
134
+ - **`aws-ddb-003` - Autoscaling on PROVISIONED tables** (`MEDIUM`). Matches
135
+ AWS Security Hub `DynamoDB.1` severity. PROVISIONED billing with manual
136
+ capacity either over-provisions (cost waste, billed 24/7) or
137
+ under-provisions (`ProvisionedThroughputExceededException`, client
138
+ retries amplifying load). `PAY_PER_REQUEST` tables are skipped. Read-only
139
+ or write-only autoscaling registrations produce a sub-finding identifying
140
+ the missing dimension.
141
+
142
+ All three checks include CLI + Terraform remediation. Pagination via
143
+ `list_tables`. Application Auto Scaling targets are cached per-region for
144
+ the duration of the scan (one API call returns every DDB target in the
145
+ region).
146
+
147
+ - **`aws-cfg-003` - AWS Config recording group complete** (`MEDIUM`). Detects
148
+ recorders that record only a subset of resource types - either via the
149
+ legacy `allSupported=false` configuration or the modern
150
+ `recordingStrategy.useOnly` set to `INCLUSION_BY_RESOURCE_TYPES` or
151
+ `EXCLUSION_BY_RESOURCE_TYPES`. Also fires when `includeGlobalResourceTypes`
152
+ is false, which silently drops every IAM/CloudFront/Route53 change from
153
+ the configuration timeline. Filters out service-linked recorders
154
+ (`recordingScope=INTERNAL`).
155
+
156
+ - **`aws-cfg-004` - AWS Config delivery channel exists and is configured**
157
+ (tiered). Reports `HIGH` when a recorder exists but no delivery channel
158
+ is configured (snapshots and configuration history items go nowhere).
159
+ Reports `LOW` when the delivery channel exists but is throttled to the
160
+ slowest `TwentyFour_Hours` snapshot frequency, or when `s3KmsKeyArn` is
161
+ not set (delivery uses SSE-S3 instead of a CMK).
162
+
163
+ ### Changed
164
+
165
+ - **`aws-s3-004` - Smarter S3 lifecycle check** (community feedback). The
166
+ prior check only fired when a bucket had zero lifecycle rules - which
167
+ missed the most expensive anti-pattern in production: a versioning-enabled
168
+ bucket whose lifecycle rules don't include `NoncurrentVersionExpiration`.
169
+ Without NCVE every object overwrite or delete retains the old version at
170
+ full storage rates indefinitely. The check now cross-references bucket
171
+ versioning state with lifecycle rules:
172
+
173
+ - Versioning `Enabled` or `Suspended` + no `NoncurrentVersionExpiration` in
174
+ any enabled rule -> `MEDIUM` (the storage runaway case; matches AWS
175
+ Security Hub `S3.10`).
176
+ - No enabled lifecycle on an unversioned bucket -> `LOW` (existing
177
+ behaviour preserved).
178
+ - No `AbortIncompleteMultipartUpload` rule -> `LOW` (new sub-finding;
179
+ orphaned multipart uploads accumulate billable storage that never
180
+ appears in regular object listings).
181
+
182
+ Cross-check adds one `get_bucket_versioning` call per bucket; result is
183
+ cached implicitly via the existing bucket-list cache pattern. Backward
184
+ compatible: same check ID, no behaviour change for unversioned buckets.
185
+
186
+ - **`aws-cfg-001` and `aws-cfg-002` - service-linked recorder filtering**.
187
+ Both existing checks now filter out service-linked recorders
188
+ (`recordingScope=INTERNAL`), which are created by other AWS services
189
+ (AWS Security Hub, AWS Audit Manager) and do not replace a
190
+ customer-managed recorder.
191
+
192
+ ### Tests
193
+
194
+ - 812 -> 836 (+24 net). New test files: `tests/aws/test_ddb.py` (12 tests
195
+ covering all four encryption states, PITR enabled/disabled, autoscaling
196
+ with read+write/read-only/none/pay-per-request). `tests/aws/test_config.py`
197
+ expanded with 8 new tests for `aws-cfg-003` and `aws-cfg-004`.
198
+ `tests/aws/test_s3.py` expanded with 4 new tests for the smart lifecycle
199
+ cross-check (versioned without NCVE, versioned with NCVE, lifecycle
200
+ rules-but-no-NCVE, AbortMPU missing).
201
+
202
+ ### Compliance
203
+
204
+ Compliance framework mappings updated to cover the new check IDs:
205
+
206
+ - **SOC 2 Type II**: `aws-cfg-003` and `aws-cfg-004` added to CC2.1, CC3.4,
207
+ CC4.1, CC7.1, CC8.1; `aws-ddb-001` mapped to CC6.1; `aws-ddb-002` mapped
208
+ to A1.2.
209
+ - **HIPAA Security Rule**: `aws-cfg-003` and `aws-cfg-004` added to
210
+ 164.308(a)(1)(i) and 164.308(a)(8); `aws-ddb-001` to 164.312(a)(2)(iv);
211
+ `aws-ddb-002` to 164.308(a)(7)(i).
212
+ - **ISO/IEC 27001:2022**: `aws-cfg-003` and `aws-cfg-004` added to A.5.9,
213
+ A.5.23, A.5.36, A.8.9, A.8.32; `aws-ddb-001` to A.8.24; `aws-ddb-002` to
214
+ A.8.13.
215
+ - **NIS2 Directive**: `aws-cfg-003` and `aws-cfg-004` added to NIS2-RM-01b,
216
+ NIS2-RM-05, NIS2-RM-05b, NIS2-RM-06, NIS2-RM-06b, NIS2-GOV-01;
217
+ `aws-ddb-001` to NIS2-RM-05b.
218
+ - **BSI C5:2020**: `aws-cfg-003` and `aws-cfg-004` added to AM-01, OPS-14,
219
+ COS-07, COS-08, INQ-03; `aws-ddb-001` to CRY-04; `aws-ddb-002` to OPS-06.
220
+ - **CIS AWS Foundations Benchmark v3.0.0**: `aws-cfg-003` and `aws-cfg-004`
221
+ added to control 3.3. CIS v3.0.0 has no DynamoDB controls; the gap is
222
+ documented honestly rather than invented.
223
+
224
+ ### Acknowledgments
225
+
226
+ These improvements were prompted by feedback received via community channels.
227
+
228
+ ### Also in this release (carried over from prior unreleased work)
229
+
230
+ - **GitHub Action hardening** - `action.yml` now pins cloud-audit to a specific
231
+ PyPI version via the new `cloud-audit-version` input (default tracks the
232
+ action's release tag). Previously installed unpinned `cloud-audit` latest,
233
+ which made builds non-reproducible. Version string is validated against
234
+ `[0-9A-Za-z.+-]` before being passed to `pip install`.
235
+
236
+ - **GitHub Action shell injection prevention** - all `run:` blocks moved from
237
+ direct `${{ inputs.* }}` interpolation to env-var pattern (`env:` map +
238
+ bash arrays). `extra-args`, `regions`, `output`, and `diff-baseline` are
239
+ now passed as argv entries to `cloud-audit`, not concatenated into shell
240
+ strings. A malicious workflow author can still pass odd flag values but
241
+ cannot break out of the cloud-audit invocation.
242
+
243
+ - **README polish** - dropped promotional "first/only" wording in three
244
+ places (blast-radius section, AI-SPM row, IAM Privilege Escalation row).
245
+ PMapper row reframed from "this is its open-source replacement" to a
246
+ factual statement of PMapper's last release date and cloud-audit's
247
+ distinct scope. Honest tone over marketing tone.
248
+
249
+ - **README Prowler comparison refreshed** - 572 checks / 83 services / 41
250
+ frameworks updated to 600 / 84 / 44 (verified against
251
+ github.com/prowler-cloud/prowler on 2026-05-25). Dropped unsubstantiated
252
+ "55 fixers" reference and "10+ providers" puffery. Footnote datestamp
253
+ changed from "April 2026" to "2026-05-25".
254
+
255
+ - **README broken links fixed** - two relative links to
256
+ `docs/features/blast-radius.md` (gitignored - the file is published only
257
+ via the docs site, not committed to git) replaced with absolute URLs
258
+ pointing at `https://haitmg.pl/cloud-audit/features/blast-radius/`.
259
+
260
+ - **docs/features/blast-radius.md** - same "first pure-CLI open-source"
261
+ wording softened to "aims to be a lightweight CLI-native alternative".
262
+
263
+ - **SECURITY.md supported versions matrix** - stale `1.1.x` / `1.2.x` rows
264
+ replaced with `2.3.x` (current) / `2.2.x` (security fixes only) / `< 2.2`
265
+ (no). The matrix had not been touched since the v1.x line was current.
266
+
10
267
  ## [2.3.0] - 2026-05-15
11
268
 
12
269
  ### Added
@@ -746,7 +1003,8 @@ this trade-off.
746
1003
  - Docker image support
747
1004
  - Rich terminal UI with progress bar and color-coded findings
748
1005
 
749
- [Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/v1.3.0...HEAD
1006
+ [Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/v2.3.1...HEAD
1007
+ [2.3.1]: https://github.com/gebalamariusz/cloud-audit/compare/v2.3.0...v2.3.1
750
1008
  [1.3.0]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.2...v1.3.0
751
1009
  [1.2.2]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.1...v1.2.2
752
1010
  [1.2.1]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.0...v1.2.1
@@ -0,0 +1,240 @@
1
+ Metadata-Version: 2.4
2
+ Name: cloud-audit
3
+ Version: 2.4.0
4
+ Summary: Open-source, read-only AWS security scanner. 110 checks across 25 services, 31 attack-chain rules, 64 IAM escalation methods (incl. lateral AssumeRole graph), Proof Mode exploitability verification, data perimeter and Bedrock AgentCore checks, Blast Radius CLI, Threat Feed, What-If simulator, AI-SPM, 6 compliance frameworks, breach-cost estimation, MCP server. CLI + Terraform remediation on every finding.
5
+ Project-URL: Homepage, https://haitmg.pl/cloud-audit/
6
+ Project-URL: Documentation, https://haitmg.pl/cloud-audit/
7
+ Project-URL: Source, https://github.com/gebalamariusz/cloud-audit
8
+ Project-URL: Repository, https://github.com/gebalamariusz/cloud-audit
9
+ Project-URL: Issues, https://github.com/gebalamariusz/cloud-audit/issues
10
+ Project-URL: Changelog, https://github.com/gebalamariusz/cloud-audit/blob/main/CHANGELOG.md
11
+ Author-email: Mariusz Gebala <kontakt@haitmg.pl>
12
+ License-Expression: MIT
13
+ License-File: LICENSE
14
+ Keywords: audit,aws,aws-security,breach-cost,cis,cis-benchmark,cloud,cloud-security,compliance,devops,devsecops,mcp,mcp-server,model-context-protocol,remediation,sarif,scanner,security,security-scanner,soc2,terraform
15
+ Classifier: Development Status :: 4 - Beta
16
+ Classifier: Environment :: Console
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Intended Audience :: Information Technology
19
+ Classifier: Intended Audience :: System Administrators
20
+ Classifier: License :: OSI Approved :: MIT License
21
+ Classifier: Operating System :: OS Independent
22
+ Classifier: Programming Language :: Python :: 3
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Topic :: Security
28
+ Classifier: Topic :: System :: Systems Administration
29
+ Classifier: Typing :: Typed
30
+ Requires-Python: >=3.10
31
+ Requires-Dist: boto3>=1.35.0
32
+ Requires-Dist: jinja2>=3.1.6
33
+ Requires-Dist: mcp>=1.20.0
34
+ Requires-Dist: pydantic>=2.10.0
35
+ Requires-Dist: pyyaml>=6.0
36
+ Requires-Dist: rich>=13.9.0
37
+ Requires-Dist: typer>=0.15.0
38
+ Provides-Extra: dev
39
+ Requires-Dist: boto3-stubs[essential]>=1.35.0; extra == 'dev'
40
+ Requires-Dist: moto[all]>=5.0.0; extra == 'dev'
41
+ Requires-Dist: mypy>=1.13.0; extra == 'dev'
42
+ Requires-Dist: pytest-cov>=6.0; extra == 'dev'
43
+ Requires-Dist: pytest>=8.0; extra == 'dev'
44
+ Requires-Dist: ruff>=0.8.0; extra == 'dev'
45
+ Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
46
+ Description-Content-Type: text/markdown
47
+
48
+ <p align="center">
49
+ <img src="assets/logo-nobg.png" alt="cloud-audit logo" width="200">
50
+ </p>
51
+
52
+ <!-- mcp-name: io.github.gebalamariusz/cloud-audit -->
53
+ <h1 align="center">cloud-audit</h1>
54
+
55
+ <p align="center">
56
+ <a href="README.md">English</a> | <a href="README_zh-CN.md">简体中文</a>
57
+ </p>
58
+
59
+ <p align="center">
60
+ <strong>Find AWS attack paths, IAM escalation routes, and the fixes that matter most.</strong>
61
+ </p>
62
+
63
+ <p align="center">
64
+ Open-source, read-only AWS security scanner. It correlates findings into attack chains,
65
+ ranks fixes by how many chains they break, and ships an <strong>AWS CLI + Terraform fix with
66
+ every finding</strong>. No agent, no infrastructure, nothing written to your account.
67
+ </p>
68
+
69
+ <p align="center">
70
+ <a href="https://pypi.org/project/cloud-audit/"><img src="https://img.shields.io/pypi/v/cloud-audit?style=flat" alt="PyPI version"></a>
71
+ <a href="https://pypi.org/project/cloud-audit/"><img src="https://img.shields.io/pypi/pyversions/cloud-audit?style=flat" alt="Python versions"></a>
72
+ <a href="https://github.com/gebalamariusz/cloud-audit/actions/workflows/ci.yml"><img src="https://github.com/gebalamariusz/cloud-audit/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
73
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow?style=flat" alt="License: MIT"></a>
74
+ <a href="https://ghcr.io/gebalamariusz/cloud-audit"><img src="https://img.shields.io/badge/Docker-GHCR-blue?style=flat&logo=docker" alt="Docker"></a>
75
+ <a href="https://haitmg.pl/cloud-audit/"><img src="https://img.shields.io/badge/Docs-haitmg.pl-blue?style=flat" alt="Documentation"></a>
76
+ </p>
77
+
78
+ <p align="center">
79
+ <a href="#quick-start">Quick Start</a> -
80
+ <a href="#what-you-get">What You Get</a> -
81
+ <a href="#installation">Installation</a> -
82
+ <a href="#whats-checked">What's Checked</a> -
83
+ <a href="https://haitmg.pl/cloud-audit/">Documentation</a>
84
+ </p>
85
+
86
+ ## Quick Start
87
+
88
+ ```bash
89
+ pip install cloud-audit
90
+ cloud-audit scan # uses your default AWS credentials and region
91
+ ```
92
+
93
+ No AWS account handy? Run a full sample report offline:
94
+
95
+ ```bash
96
+ cloud-audit demo
97
+ ```
98
+
99
+ cloud-audit is **read-only**. It never modifies your infrastructure; `SecurityAudit` is enough ([permissions](#aws-permissions)).
100
+
101
+ ## Example Output
102
+
103
+ ```
104
+ +---- Attack Chains (5 detected) -----------------------------------+
105
+ | CRITICAL Internet-Exposed Admin Instance |
106
+ | i-0abc123 - public SG + admin IAM role + IMDSv1 |
107
+ | CRITICAL IAM Privilege Escalation via iam:PassRole |
108
+ | ci-deploy-role - 3-step path to admin |
109
+ | CRITICAL CI/CD to Admin Takeover |
110
+ | github-deploy - OIDC without sub + admin policy |
111
+ +-------------------------------------------------------------------+
112
+
113
+ +---- Remediation Plan ---------------------------------------------+
114
+ | Fix 4 root causes, break 22 attack chains |
115
+ | Quick wins (effort LOW, 14 chains): |
116
+ | 1. Restrict SG ingress on sg-0abc123 -> breaks 8 chains |
117
+ | 2. Add OIDC sub condition -> breaks 6 chains |
118
+ +-------------------------------------------------------------------+
119
+ ```
120
+
121
+ Preview a fix before you touch anything:
122
+
123
+ ```bash
124
+ cloud-audit simulate --fix aws-vpc-002
125
+ # Score 34 -> 58 (+24) | Chains broken 8 of 22 | Findings resolved 11
126
+ ```
127
+
128
+ ## What You Get
129
+
130
+ - **Attack chains** // 31 rules correlate individual findings into exploitable paths (MITRE ATT&CK + pathfinding.cloud). [docs](https://haitmg.pl/cloud-audit/features/attack-chains/)
131
+ - **Root-cause fixes** // groups findings by shared cause and ranks them: "fix 4 things, break 22 chains," with a what-if `simulate` to preview impact. [docs](https://haitmg.pl/cloud-audit/features/simulate/)
132
+ - **IAM privilege escalation** // 64 methods across 9 categories, including lateral movement through the AssumeRole graph. [docs](https://haitmg.pl/cloud-audit/features/iam-escalation/)
133
+ - **Blast radius** // walk outward from any resource to see what an attacker reaches; export JSON to the live [visualizer](https://blast-audit.haitmg.pl/). [docs](https://haitmg.pl/cloud-audit/features/blast-radius/)
134
+ - **Proof Mode** // `scan --verify` checks each escalation path against the IAM policy simulator (read-only) and flags the ones the principal can actually perform. [docs](https://haitmg.pl/cloud-audit/features/proof-mode/)
135
+ - **Data perimeter** // resource-policy checks for confused-deputy and cross-org exposure, evaluating condition *values* (not just their presence). [docs](https://haitmg.pl/cloud-audit/features/data-perimeter/)
136
+ - **AgentCore security** // checks for Amazon Bedrock AgentCore AI agents: network mode, MMDSv2, memory encryption, gateway authorizer. [docs](https://haitmg.pl/cloud-audit/features/agentcore/)
137
+ - **Threat Feed** // 10 detectors for active-abuse patterns from 2025-2026 incidents, each with a primary-source citation. [docs](https://haitmg.pl/cloud-audit/features/threat-feed/)
138
+ - **Remediation on every finding** // copy-paste AWS CLI + reviewable Terraform you apply yourself; security findings also carry a USD breach-cost estimate with sources.
139
+ - **Trend & drift** // `cloud-audit diff` catches ClickOps drift between scans; `cloud-audit trend` tracks posture over time.
140
+
141
+ <p align="center">
142
+ <a href="https://blast-audit.haitmg.pl/">
143
+ <img src="assets/blast-audit-boardroom.png" alt="blast-audit visualizer - executive briefing view" width="760">
144
+ </a>
145
+ <br>
146
+ <sub>Drop a <code>cloud-audit blast-radius --format json</code> export into the open visualizer at
147
+ <a href="https://blast-audit.haitmg.pl/">blast-audit.haitmg.pl</a> - everything runs in your browser.</sub>
148
+ </p>
149
+
150
+ ## Reports
151
+
152
+ ```bash
153
+ cloud-audit scan --format html -o report.html # client-ready
154
+ cloud-audit scan --format sarif -o results.sarif # GitHub Code Scanning
155
+ cloud-audit scan --format json -o report.json # machine-readable
156
+ cloud-audit scan --format markdown -o report.md # PR comments
157
+ ```
158
+
159
+ ## CI/CD
160
+
161
+ ```yaml
162
+ - run: pip install cloud-audit
163
+ - run: cloud-audit scan --format sarif --output results.sarif
164
+ - uses: github/codeql-action/upload-sarif@v3
165
+ with:
166
+ sarif_file: results.sarif
167
+ ```
168
+
169
+ `--quiet` exits with a code only: `0` clean, `1` findings, `2` error. Gate on severity with `--min-severity high`. Ready-made workflows: [basic scan](examples/github-actions.yml), [daily diff](examples/daily-scan-with-diff.yml), [post-deploy](examples/post-deploy-scan.yml).
170
+
171
+ ## Installation
172
+
173
+ ```bash
174
+ pip install cloud-audit # pip (recommended)
175
+ pipx install cloud-audit # isolated
176
+ docker run ghcr.io/gebalamariusz/cloud-audit scan # Docker
177
+ ```
178
+
179
+ Docker with credentials:
180
+
181
+ ```bash
182
+ docker run -v ~/.aws:/home/cloudaudit/.aws:ro ghcr.io/gebalamariusz/cloud-audit scan
183
+ ```
184
+
185
+ ## AWS Permissions
186
+
187
+ Read-only. Attach the AWS-managed `SecurityAudit` policy (covers every check, including IAM escalation analysis):
188
+
189
+ ```bash
190
+ aws iam attach-role-policy --role-name auditor \
191
+ --policy-arn arn:aws:iam::aws:policy/SecurityAudit
192
+ ```
193
+
194
+ cloud-audit never modifies your infrastructure. `simulate` runs locally against scan data and makes no AWS calls.
195
+
196
+ ## What's Checked
197
+
198
+ **110 checks across 25 AWS services** - IAM, S3, EC2, VPC, RDS, KMS, CloudTrail, GuardDuty, Lambda, Secrets Manager, Bedrock, SageMaker, Bedrock AgentCore, DynamoDB, and more. Run `cloud-audit list-checks`, or see the [full check reference](https://haitmg.pl/cloud-audit/checks/).
199
+
200
+ **6 compliance frameworks** via `scan --compliance <id>`: CIS AWS v3.0 and SOC 2 Type II (stable), plus ISO 27001:2022, HIPAA, NIS2, and BSI C5:2020 (beta). [docs](https://haitmg.pl/cloud-audit/compliance/overview/)
201
+
202
+ **MCP server** for AI agents - 6 read-only tools (`scan_aws`, `get_findings`, `get_attack_chains`, `get_remediation`, `get_health_score`, `list_checks`):
203
+
204
+ ```bash
205
+ claude mcp add cloud-audit -- uvx --from cloud-audit cloud-audit-mcp
206
+ ```
207
+
208
+ <details>
209
+ <summary>Common flags and configuration</summary>
210
+
211
+ ```bash
212
+ cloud-audit scan -R # show remediation inline
213
+ cloud-audit scan --profile prod --regions eu-central-1 # profile / region
214
+ cloud-audit scan --regions all # all enabled regions
215
+ cloud-audit scan --role-arn arn:aws:iam::...:role/audit # cross-account
216
+ cloud-audit scan --export-fixes fixes.sh # export all fixes
217
+ ```
218
+
219
+ Configure defaults in `.cloud-audit.yml` (regions, `min_severity`, `exclude_checks`, time-boxed `suppressions`). Environment variables (`CLOUD_AUDIT_REGIONS`, `CLOUD_AUDIT_MIN_SEVERITY`, ...) override the file; CLI flags override everything. See the [configuration guide](https://haitmg.pl/cloud-audit/configuration/config-file/).
220
+
221
+ </details>
222
+
223
+ ## Documentation
224
+
225
+ Full documentation at **[haitmg.pl/cloud-audit](https://haitmg.pl/cloud-audit/)**: [getting started](https://haitmg.pl/cloud-audit/getting-started/installation/), [attack chains](https://haitmg.pl/cloud-audit/features/attack-chains/), [IAM escalation](https://haitmg.pl/cloud-audit/features/iam-escalation/), [blast radius](https://haitmg.pl/cloud-audit/features/blast-radius/), [Proof Mode](https://haitmg.pl/cloud-audit/features/proof-mode/), [data perimeter](https://haitmg.pl/cloud-audit/features/data-perimeter/), [AgentCore](https://haitmg.pl/cloud-audit/features/agentcore/), [compliance](https://haitmg.pl/cloud-audit/compliance/overview/), and the [full check reference](https://haitmg.pl/cloud-audit/checks/).
226
+
227
+ ## Development
228
+
229
+ ```bash
230
+ git clone https://github.com/gebalamariusz/cloud-audit.git
231
+ cd cloud-audit
232
+ pip install -e ".[dev]"
233
+ pytest -q && ruff check src/ tests/ && mypy src/
234
+ ```
235
+
236
+ See [CONTRIBUTING.md](CONTRIBUTING.md) to add a check. Past releases in [CHANGELOG.md](CHANGELOG.md).
237
+
238
+ ## License
239
+
240
+ [MIT](LICENSE) - Mariusz Gebala / [HAIT](https://haitmg.pl)