cloud-audit 2.3.1__tar.gz → 2.5.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.
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/workflows/ci.yml +7 -7
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/workflows/docs.yml +2 -2
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/workflows/example-scan.yml +1 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/workflows/release.yml +9 -9
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/CHANGELOG.md +181 -0
- cloud_audit-2.5.0/PKG-INFO +540 -0
- cloud_audit-2.5.0/README.md +493 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/ROADMAP.md +24 -3
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/mkdocs.yml +4 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/pyproject.toml +8 -3
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/server.json +2 -2
- cloud_audit-2.5.0/src/cloud_audit/agent_blast.py +671 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/blast_radius.py +24 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/cli.py +231 -148
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/bsi_c5_2020.json +6 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/cis_aws_v3.json +6 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/hipaa_security.json +12 -2
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/iso27001_2022.json +12 -2
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/nis2_directive.json +6 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/frameworks/soc2_type2.json +24 -4
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/config.py +1 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/cost_model.py +89 -0
- cloud_audit-2.5.0/src/cloud_audit/demo_data.py +475 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/mcp_server.py +28 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/models.py +107 -0
- cloud_audit-2.5.0/src/cloud_audit/proof.py +418 -0
- cloud_audit-2.5.0/src/cloud_audit/providers/aws/agent_inventory.py +476 -0
- cloud_audit-2.5.0/src/cloud_audit/providers/aws/checks/agentcore.py +545 -0
- cloud_audit-2.5.0/src/cloud_audit/providers/aws/checks/data_perimeter.py +702 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/iam_analyzer.py +141 -1
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/provider.py +4 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/markdown.py +2 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/scanner.py +68 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/simulate.py +6 -8
- cloud_audit-2.5.0/tests/aws/test_agent_inventory.py +440 -0
- cloud_audit-2.5.0/tests/aws/test_agentcore.py +383 -0
- cloud_audit-2.5.0/tests/aws/test_data_perimeter.py +662 -0
- cloud_audit-2.5.0/tests/test_agent_blast.py +375 -0
- cloud_audit-2.5.0/tests/test_cli_agent_blast.py +143 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_cli_scan.py +35 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_compliance_frameworks.py +5 -0
- cloud_audit-2.5.0/tests/test_coverage_gaps.py +66 -0
- cloud_audit-2.5.0/tests/test_demo_data.py +86 -0
- cloud_audit-2.5.0/tests/test_iam_grants.py +168 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_mcp_server.py +39 -0
- cloud_audit-2.5.0/tests/test_proof.py +538 -0
- cloud_audit-2.3.1/PKG-INFO +0 -535
- cloud_audit-2.3.1/README.md +0 -488
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.cloud-audit.example.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/FUNDING.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.github/dependabot.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.gitignore +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.mcp.json +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/.pre-commit-hooks.yaml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/CODEOWNERS +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/CODE_OF_CONDUCT.md +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/CONTRIBUTING.md +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/Dockerfile +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/LICENSE +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/Makefile +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/SECURITY.md +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/action.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/blast-audit-boardroom.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/blast-audit-counterfactual.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/blast-audit-hero.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/demo.gif +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/logo-nobg.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/logo.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/report-preview.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/assets/social-preview.png +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/examples/daily-scan-with-diff.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/examples/github-actions.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/examples/post-deploy-scan.yml +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/overrides/main.html +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/scripts/generate_demo_gif.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/scripts/generate_report_screenshot.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/__main__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/compliance/engine.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/correlate.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/diff.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/graph.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/history.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/account.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/backup.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/bedrock.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/cloudtrail.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/cloudwatch.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/config_.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/ddb.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/ec2.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/ecs.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/efs.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/eip.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/guardduty.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/iam.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/inspector.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/kms.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/lambda_.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/rds.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/s3.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/sagemaker.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/secrets.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/securityhub.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/ssm.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/vpc.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/checks/waf.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/iam_trust_graph.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/cloudtrail_tampering.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/cryptomining_role.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/datazone_overgrant.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/lambda_function_url.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/mmdsv1_in_use.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/quarantine_policy.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/roles_anywhere_abuse.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/ses_phishing.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/trufflehog_ua.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/aws/threat_feed/whoami_confusion.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/providers/base.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/py.typed +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/compliance_html.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/compliance_markdown.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/diff_markdown.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/html.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/sarif.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/reports/templates/report.html.j2 +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/src/cloud_audit/root_cause.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_bedrock.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_cis_checks.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_cloudtrail.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_cloudwatch.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_config.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_ddb.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_ec2.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_ecs.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_eip.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_guardduty.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_iam.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_iam_analyzer.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_iam_trust_graph.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_kms.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_lambda.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_rds.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_s3.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_sagemaker.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_secrets.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_ssm.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/test_vpc.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/__init__.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_cloudtrail_tampering.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_cryptomining_role.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_datazone_overgrant.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_lambda_function_url.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_mmdsv1_in_use.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_quarantine_policy.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_roles_anywhere_abuse.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_ses_phishing.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_trufflehog_ua.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/aws/threat_feed/test_whoami_confusion.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/conftest.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_blast_radius.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_cli.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_config.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_correlate.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_cost_model.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_diff.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_graph.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_history.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_html.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_markdown.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_models.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_provider.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_root_cause.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_sarif.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_scanner.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_simulate.py +0 -0
- {cloud_audit-2.3.1 → cloud_audit-2.5.0}/tests/test_soc2_framework.py +0 -0
|
@@ -15,8 +15,8 @@ jobs:
|
|
|
15
15
|
name: Lint & Format
|
|
16
16
|
runs-on: ubuntu-latest
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
19
|
-
- uses: actions/setup-python@
|
|
18
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v6
|
|
20
20
|
with:
|
|
21
21
|
python-version: "3.12"
|
|
22
22
|
cache: "pip"
|
|
@@ -28,8 +28,8 @@ jobs:
|
|
|
28
28
|
name: Type Check
|
|
29
29
|
runs-on: ubuntu-latest
|
|
30
30
|
steps:
|
|
31
|
-
- uses: actions/checkout@
|
|
32
|
-
- uses: actions/setup-python@
|
|
31
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
32
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v6
|
|
33
33
|
with:
|
|
34
34
|
python-version: "3.12"
|
|
35
35
|
cache: "pip"
|
|
@@ -43,8 +43,8 @@ jobs:
|
|
|
43
43
|
matrix:
|
|
44
44
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
45
45
|
steps:
|
|
46
|
-
- uses: actions/checkout@
|
|
47
|
-
- uses: actions/setup-python@
|
|
46
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
47
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v6
|
|
48
48
|
with:
|
|
49
49
|
python-version: ${{ matrix.python-version }}
|
|
50
50
|
cache: "pip"
|
|
@@ -55,6 +55,6 @@ jobs:
|
|
|
55
55
|
name: Docker Build
|
|
56
56
|
runs-on: ubuntu-latest
|
|
57
57
|
steps:
|
|
58
|
-
- uses: actions/checkout@
|
|
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,8 +15,8 @@ jobs:
|
|
|
15
15
|
deploy:
|
|
16
16
|
runs-on: ubuntu-latest
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
19
|
-
- uses: actions/setup-python@
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
- uses: actions/setup-python@v7
|
|
20
20
|
with:
|
|
21
21
|
python-version: '3.12'
|
|
22
22
|
- run: pip install mkdocs-material
|
|
@@ -18,8 +18,8 @@ jobs:
|
|
|
18
18
|
needs: ci
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
steps:
|
|
21
|
-
- uses: actions/checkout@
|
|
22
|
-
- uses: actions/setup-python@
|
|
21
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
22
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v6
|
|
23
23
|
with:
|
|
24
24
|
python-version: "3.12"
|
|
25
25
|
- name: Verify tag matches package version
|
|
@@ -51,7 +51,7 @@ jobs:
|
|
|
51
51
|
with:
|
|
52
52
|
name: dist
|
|
53
53
|
path: dist/
|
|
54
|
-
- uses: pypa/gh-action-pypi-publish@
|
|
54
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
55
55
|
|
|
56
56
|
docker:
|
|
57
57
|
name: Publish Docker image
|
|
@@ -61,17 +61,17 @@ jobs:
|
|
|
61
61
|
contents: read
|
|
62
62
|
packages: write
|
|
63
63
|
steps:
|
|
64
|
-
- uses: actions/checkout@
|
|
65
|
-
- uses: docker/login-action@
|
|
64
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
65
|
+
- uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.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@
|
|
70
|
+
- uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
|
71
71
|
with:
|
|
72
72
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
73
73
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
74
|
-
- uses: docker/metadata-action@
|
|
74
|
+
- uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.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@
|
|
84
|
+
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.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@
|
|
98
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v6
|
|
99
99
|
- name: Extract changelog for this version
|
|
100
100
|
id: changelog
|
|
101
101
|
run: |
|
|
@@ -7,6 +7,187 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.5.0] - 2026-09-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`cloud-audit agent-blast`** - what can a hijacked AI agent reach in your
|
|
15
|
+
AWS account, and can you prove it? For every Bedrock Agent, AgentCore runtime,
|
|
16
|
+
gateway, code interpreter and browser discovered by `scan`, answers under two
|
|
17
|
+
threat models: *identity takeover* (the attacker holds the credentials of a
|
|
18
|
+
role the agent runs as: full role, escalation methods, AssumeRole hops) and
|
|
19
|
+
*behaviour takeover* (prompt injection steering the agent's tools, bounded by
|
|
20
|
+
the tools' own execution roles). Reach covers S3, Secrets Manager, SSM,
|
|
21
|
+
DynamoDB, RDS Data API, KMS, SQS, Lambda invoke/code, AssumeRole and Bedrock
|
|
22
|
+
model invocation; the agent's own knowledge-base buckets are concrete targets
|
|
23
|
+
even under wildcard grants (write access there is flagged as RAG poisoning).
|
|
24
|
+
Findings carry OWASP Top 10 for Agentic Applications (2026) and MITRE ATLAS
|
|
25
|
+
(v2026.08) identifiers. Output: tree, JSON, Markdown. Pure in-memory analysis
|
|
26
|
+
of the saved scan. `--verify` asks the read-only IAM policy simulator about
|
|
27
|
+
every concrete (principal, action, resource) and every escalation path.
|
|
28
|
+
- **AI agent identity inventory** - `scan` now records `agents` on the report:
|
|
29
|
+
Bedrock Agents (resource role, action groups at DRAFT version resolved to the
|
|
30
|
+
Lambda execution role, knowledge bases resolved to S3 data-source buckets)
|
|
31
|
+
and AgentCore (runtime role and network mode, gateway role with authorizer,
|
|
32
|
+
policy engine and targets, code interpreter and browser execution roles).
|
|
33
|
+
Read-only list/get calls, no charge. A denied read is recorded as a coverage
|
|
34
|
+
gap, never as "no agents here".
|
|
35
|
+
- **Policy grants for agent identities** - `report.principal_grants` keeps the
|
|
36
|
+
raw `(action, resource, effect, condition-flag, source)` statements for agent
|
|
37
|
+
roles and their tools' roles only. Conditions are flagged, not evaluated; the
|
|
38
|
+
IAM policy simulator decides.
|
|
39
|
+
- **Coverage gaps** - `CheckResult.coverage_gaps` and `summary.coverage_gaps`.
|
|
40
|
+
AgentCore checks now record an `AccessDenied` as "not assessed in this
|
|
41
|
+
region" (console, JSON, Markdown) instead of silently skipping the region.
|
|
42
|
+
A pass with gaps is not a clean pass.
|
|
43
|
+
- **Proof Mode per resource** - `proof.verify_resource_access` simulates one
|
|
44
|
+
action against concrete resource ARNs with optional context keys
|
|
45
|
+
(`ATTACKER_CONTEXT_ENTRIES`: no MFA on the session, TLS transport), reports
|
|
46
|
+
which policy layer denied (SCP, permissions boundary) and follows result
|
|
47
|
+
pagination.
|
|
48
|
+
- **Sample scan through the real engines** - `cloud-audit demo` now renders an
|
|
49
|
+
invented account through the actual correlation, root-cause, breach-cost and
|
|
50
|
+
security-graph engines instead of printing canned text; `demo --save FILE`
|
|
51
|
+
writes it as a scan report so `blast-radius`, `agent-blast`, `simulate`,
|
|
52
|
+
`exposure` and `diff` can be tried offline, and `agent-blast --demo` needs no
|
|
53
|
+
file at all. The sample includes a Bedrock Agent, an AgentCore runtime, a
|
|
54
|
+
gateway with Lambda and remote-MCP targets and a code interpreter.
|
|
55
|
+
- **MCP tool `get_agent_blast`** - the agent-blast report (Markdown) for every
|
|
56
|
+
agent in the last scan, or one agent by name, id or ARN substring.
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- The MCP SDK dependency is pinned to `mcp>=1.20,<2`. The `mcp` 2.x line
|
|
61
|
+
(released 2026-07-28) moved `FastMCP` out of `mcp.server.fastmcp`, so a fresh
|
|
62
|
+
`pip install cloud-audit` resolved to 2.x and `cloud-audit-mcp` failed to
|
|
63
|
+
import. The 1.x line is still maintained (1.30.0 on 2026-09-07); 2.x support
|
|
64
|
+
is a follow-up.
|
|
65
|
+
- `simulate` reported relationship-based chains (`AC-01` internet-exposed admin
|
|
66
|
+
instance, `AC-07` OIDC to admin) as broken by any fix, because re-detection
|
|
67
|
+
from findings alone cannot see EC2-to-role and OIDC-to-policy relationships a
|
|
68
|
+
saved scan does not carry. A chain now survives a simulated fix unless one of
|
|
69
|
+
its own findings was fixed, and the remaining risk exposure is priced
|
|
70
|
+
accordingly.
|
|
71
|
+
- `blast-radius` (tree output) crashed on Windows consoles with `cp1250`
|
|
72
|
+
encoding, and rendered emoji elsewhere, when a node label contained an ARN
|
|
73
|
+
segment such as `:secret:`: Rich interpreted it as an emoji shortcode.
|
|
74
|
+
Tree labels are now rendered with emoji disabled. `agent-blast` uses the same
|
|
75
|
+
renderer.
|
|
76
|
+
|
|
77
|
+
### Changed
|
|
78
|
+
|
|
79
|
+
- Proof Mode documentation now reflects the IAM policy simulator as of
|
|
80
|
+
2026-07-30: the attached permissions boundary and the organization's SCPs
|
|
81
|
+
(including their condition keys and resource scoping) are evaluated; RCPs,
|
|
82
|
+
VPC endpoint policies, role chaining and resource-based policies for IAM
|
|
83
|
+
roles are not. The "verified" detail text says so.
|
|
84
|
+
- `blast-radius` labels IAM principals as `role/<name>` / `user/<name>` instead
|
|
85
|
+
of a truncated account prefix.
|
|
86
|
+
- README rewritten around `agent-blast`, with every sample block taken from the
|
|
87
|
+
commands' real output on the built-in sample scan.
|
|
88
|
+
|
|
89
|
+
## [2.4.0] - 2026-06-30
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- **Data Perimeter Scanner** - new check category (`aws-dp-001` .. `aws-dp-005`)
|
|
94
|
+
that evaluates resource-based policies for the two boundary failures detectable
|
|
95
|
+
from a single account's configuration - read-only, and without AWS Organizations
|
|
96
|
+
access:
|
|
97
|
+
|
|
98
|
+
- **Confused deputy**: an `Allow` statement grants an AWS service principal
|
|
99
|
+
without an `aws:SourceAccount` / `aws:SourceArn` / `aws:SourceOrgID` /
|
|
100
|
+
`aws:SourceOwner` condition (`MEDIUM`). A service acting on behalf of another
|
|
101
|
+
account could be coerced into operating on your resource.
|
|
102
|
+
- **Cross-organization exposure**: an `Allow` statement grants a wildcard
|
|
103
|
+
(`"*"`) or external-account AWS principal without an organization-boundary
|
|
104
|
+
condition (`aws:PrincipalOrgID`, `aws:ResourceOrgID`, `aws:SourceOrgID`, ...).
|
|
105
|
+
Wildcard grants are `HIGH`; a named external account is `LOW` (often an
|
|
106
|
+
intentional partner share). On Secrets Manager these are escalated to
|
|
107
|
+
`CRITICAL` (wildcard) / `MEDIUM` (external) as a direct credential-exfiltration
|
|
108
|
+
path.
|
|
109
|
+
|
|
110
|
+
Services covered: S3 bucket policies (`aws-dp-001`), SNS topic policies
|
|
111
|
+
(`aws-dp-002`), SQS queue policies (`aws-dp-003`), Secrets Manager resource
|
|
112
|
+
policies (`aws-dp-004`), and Lambda resource policies (`aws-dp-005`). Every
|
|
113
|
+
finding ships CLI + Terraform remediation and a breach-cost estimate. Condition
|
|
114
|
+
keys are matched case-insensitively, and condition **values** are evaluated (not
|
|
115
|
+
just key presence) - a guardrail scoped to a *foreign* account or org is still
|
|
116
|
+
flagged. Default SNS/SQS policies relying on `aws:SourceOwner` set to the owner
|
|
117
|
+
account are correctly treated as account-scoped (no false positive). Federated
|
|
118
|
+
provider ARNs in a foreign account are flagged as external; federated URL IdPs
|
|
119
|
+
and `CanonicalUser` principals are out of scope.
|
|
120
|
+
|
|
121
|
+
This closes a gap the dominant open-source scanner explicitly does not cover
|
|
122
|
+
(Prowler issue #7114, "Integrating SCP/RCP Policy Awareness", open since
|
|
123
|
+
2025-03): evaluating data-perimeter condition keys on resource policies. SCP/RCP
|
|
124
|
+
enforcement at the AWS Organizations level is intentionally out of scope.
|
|
125
|
+
Detection taxonomy follows the AWS data perimeter whitepaper and the AWS
|
|
126
|
+
cross-service confused-deputy guidance.
|
|
127
|
+
|
|
128
|
+
- **Proof Mode** - new opt-in `scan --verify` that cross-checks each detected IAM
|
|
129
|
+
privilege-escalation path against the read-only `iam:SimulatePrincipalPolicy`
|
|
130
|
+
API to confirm the principal's policies actually allow the required actions. Each
|
|
131
|
+
path is annotated `verified` with `verification_detail` evidence: `true` = the
|
|
132
|
+
simulator allowed every required action (policy-allowed; *simulated, not
|
|
133
|
+
executed*); `false` = the simulator denied one (the static path is likely a
|
|
134
|
+
false positive); `null` = not asserted. The scan prints
|
|
135
|
+
`Proof Mode: N/M escalation path(s) policy-allowed by IAM simulator`. Honest
|
|
136
|
+
framing throughout: this confirms the permission exists, not end-to-end
|
|
137
|
+
exploitability - the simulator does not factor in SCPs, permission boundaries,
|
|
138
|
+
resource policies, or trust conditions. Resource-scoped methods (`iam:PassRole`,
|
|
139
|
+
`sts:AssumeRole`, compute-hijack) are deliberately left `null` because without
|
|
140
|
+
resource ARNs the simulator evaluates against `*` and would over-report; paths
|
|
141
|
+
gated by unevaluated condition keys are also left `null`.
|
|
142
|
+
`iam:SimulatePrincipalPolicy` has no per-call charge, so the opt-in controls
|
|
143
|
+
latency/throttling only; calls are deduplicated per (principal, action-set). New
|
|
144
|
+
module `proof.py`; `EscalationPath` gains `verified` / `verification_detail`
|
|
145
|
+
(backward compatible, default unchecked). Brings the 2026 "proof, not
|
|
146
|
+
probability" validation trend - which commercial scanners sell as a paid
|
|
147
|
+
flagship - to open-source AWS.
|
|
148
|
+
|
|
149
|
+
- **AgentCore checks** - first OSS scanner with dedicated Amazon Bedrock AgentCore
|
|
150
|
+
(GA 2025-10) coverage: 6 read-only checks `aws-agc-001..006` over the AI agent
|
|
151
|
+
platform. Flags Code Interpreter / Runtime in PUBLIC network mode (egress
|
|
152
|
+
exfiltration), Runtime not enforcing MMDSv2 (metadata credential theft), Memory
|
|
153
|
+
without a customer-managed KMS key, Gateway with no inbound authorizer
|
|
154
|
+
(`authorizerType=NONE`), and Gateway with no enforcing policy engine (missing or
|
|
155
|
+
`LOG_ONLY`). Each finding ships a CLI + Terraform fix and breach-cost estimate,
|
|
156
|
+
and maps to Palo Alto Unit 42 "Cracks in the Bedrock" research. Read-only
|
|
157
|
+
`bedrock-agentcore-control` (no per-call charge); the service is regional and
|
|
158
|
+
absent regions are skipped silently. New module `agentcore.py`; field names,
|
|
159
|
+
operations and enum values verified against the live boto3 service model.
|
|
160
|
+
|
|
161
|
+
### Changed
|
|
162
|
+
|
|
163
|
+
- Check count: 99 -> 110 (across 25 services). AgentCore adds a new service module
|
|
164
|
+
of 6 checks; the data perimeter's 5 checks remain a cross-cutting category over
|
|
165
|
+
existing services, like Threat Feed.
|
|
166
|
+
|
|
167
|
+
### Tests
|
|
168
|
+
|
|
169
|
+
- 836 -> 948 (+112). New file `tests/aws/test_data_perimeter.py`: 43 unit tests
|
|
170
|
+
pinning the `_find_perimeter_gaps` detection engine (confused deputy, cross-org
|
|
171
|
+
wildcard/external, condition-value evaluation so a guardrail pointing at a
|
|
172
|
+
foreign account/org is still flagged, federated provider ARNs, case-insensitive
|
|
173
|
+
conditions, Deny/NotPrincipal/CanonicalUser/malformed handling) plus 17 moto
|
|
174
|
+
integration tests across all five services. New file `tests/test_proof.py`:
|
|
175
|
+
28 tests pinning the Proof Mode engine (decision semantics: allowed /
|
|
176
|
+
explicit+implicit deny / unknown-decision / incomplete / empty / malformed; the
|
|
177
|
+
resource-scoping gate that leaves PassRole/AssumeRole and deny-removal paths
|
|
178
|
+
unasserted; condition-key gating; API-call dedup; per-path error isolation;
|
|
179
|
+
provider-backed path). New file `tests/aws/test_agentcore.py`: 24 fixture-based
|
|
180
|
+
tests (moto lacks bedrock-agentcore-control) covering each check's positive and
|
|
181
|
+
negative cases across network mode, MMDSv2, memory KMS, gateway authorizer and
|
|
182
|
+
policy engine, empty policy config, multi-page pagination, plus
|
|
183
|
+
region-unavailable / access-denied skip and multi-region aggregation.
|
|
184
|
+
|
|
185
|
+
### Compliance
|
|
186
|
+
|
|
187
|
+
- `aws-dp-001` .. `aws-dp-005` mapped: SOC 2 (CC5.2, CC6.1, CC6.6, C1.1),
|
|
188
|
+
CIS AWS v3.0 (2.1.4), HIPAA (164.308(a)(1)(ii)(A), 164.312(a)(1)),
|
|
189
|
+
ISO/IEC 27001:2022 (A.8.3, A.8.12), NIS2 (NIS2-RM-09a), BSI C5:2020 (IDM-07).
|
|
190
|
+
|
|
10
191
|
## [2.3.1] - 2026-05-26
|
|
11
192
|
|
|
12
193
|
### Added
|