cloud-audit 2.2.1__tar.gz → 2.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.
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/CHANGELOG.md +298 -17
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/PKG-INFO +140 -23
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/README.md +138 -21
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/ROADMAP.md +7 -3
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/SECURITY.md +5 -6
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/action.yml +51 -19
- cloud_audit-2.3.1/assets/blast-audit-boardroom.png +0 -0
- cloud_audit-2.3.1/assets/blast-audit-counterfactual.png +0 -0
- cloud_audit-2.3.1/assets/blast-audit-hero.png +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/mkdocs.yml +1 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/pyproject.toml +7 -2
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/server.json +2 -2
- cloud_audit-2.3.1/src/cloud_audit/blast_radius.py +1257 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/cli.py +383 -5
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/bsi_c5_2020.json +20 -8
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/cis_aws_v3.json +4 -2
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/hipaa_security.json +11 -5
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/iso27001_2022.json +20 -8
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/nis2_directive.json +20 -7
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/frameworks/soc2_type2.json +20 -8
- cloud_audit-2.3.1/src/cloud_audit/graph.py +543 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/models.py +7 -0
- cloud_audit-2.3.1/src/cloud_audit/providers/aws/checks/config_.py +484 -0
- cloud_audit-2.3.1/src/cloud_audit/providers/aws/checks/ddb.py +522 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/s3.py +214 -14
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/provider.py +4 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/compliance_html.py +21 -2
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/html.py +29 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/templates/report.html.j2 +7 -3
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/scanner.py +62 -0
- cloud_audit-2.3.1/tests/aws/test_config.py +245 -0
- cloud_audit-2.3.1/tests/aws/test_ddb.py +212 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_s3.py +119 -2
- cloud_audit-2.3.1/tests/test_blast_radius.py +629 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_compliance_frameworks.py +5 -0
- cloud_audit-2.3.1/tests/test_graph.py +297 -0
- cloud_audit-2.2.1/src/cloud_audit/providers/aws/checks/config_.py +0 -145
- cloud_audit-2.2.1/tests/aws/test_config.py +0 -82
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.cloud-audit.example.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/FUNDING.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/dependabot.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/workflows/ci.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/workflows/docs.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/workflows/example-scan.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.github/workflows/release.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.gitignore +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.mcp.json +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/.pre-commit-hooks.yaml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/CODEOWNERS +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/CODE_OF_CONDUCT.md +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/CONTRIBUTING.md +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/Dockerfile +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/LICENSE +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/Makefile +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/assets/demo.gif +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/assets/logo-nobg.png +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/assets/logo.png +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/assets/report-preview.png +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/assets/social-preview.png +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/examples/daily-scan-with-diff.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/examples/github-actions.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/examples/post-deploy-scan.yml +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/overrides/main.html +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/scripts/generate_demo_gif.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/scripts/generate_report_screenshot.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/__main__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/compliance/engine.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/config.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/correlate.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/cost_model.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/diff.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/history.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/mcp_server.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/account.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/backup.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/bedrock.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/cloudtrail.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/cloudwatch.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/ec2.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/ecs.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/efs.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/eip.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/guardduty.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/iam.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/inspector.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/kms.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/lambda_.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/rds.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/sagemaker.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/secrets.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/securityhub.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/ssm.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/vpc.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/checks/waf.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/iam_analyzer.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/iam_trust_graph.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/cloudtrail_tampering.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/cryptomining_role.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/datazone_overgrant.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/lambda_function_url.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/mmdsv1_in_use.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/quarantine_policy.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/roles_anywhere_abuse.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/ses_phishing.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/trufflehog_ua.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/aws/threat_feed/whoami_confusion.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/providers/base.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/py.typed +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/compliance_markdown.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/diff_markdown.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/markdown.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/reports/sarif.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/root_cause.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/src/cloud_audit/simulate.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_bedrock.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_cis_checks.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_cloudtrail.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_cloudwatch.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_ec2.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_ecs.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_eip.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_guardduty.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_iam.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_iam_analyzer.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_iam_trust_graph.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_kms.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_lambda.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_rds.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_sagemaker.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_secrets.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_ssm.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/test_vpc.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/__init__.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_cloudtrail_tampering.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_cryptomining_role.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_datazone_overgrant.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_lambda_function_url.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_mmdsv1_in_use.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_quarantine_policy.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_roles_anywhere_abuse.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_ses_phishing.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_trufflehog_ua.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/aws/threat_feed/test_whoami_confusion.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/conftest.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_cli.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_cli_scan.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_config.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_correlate.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_cost_model.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_diff.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_history.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_html.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_markdown.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_mcp_server.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_models.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_provider.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_root_cause.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_sarif.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_scanner.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_simulate.py +0 -0
- {cloud_audit-2.2.1 → cloud_audit-2.3.1}/tests/test_soc2_framework.py +0 -0
|
@@ -7,6 +7,286 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.3.1] - 2026-05-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **DynamoDB hygiene module** - new `ddb.py` module adds 3 checks covering
|
|
15
|
+
production-baseline DynamoDB configuration. cloud-audit previously had zero
|
|
16
|
+
DynamoDB coverage across 23 services; v2.3.1 closes that gap.
|
|
17
|
+
|
|
18
|
+
- **`aws-ddb-001` - Encryption at rest visibility** (tiered severity).
|
|
19
|
+
Surfaces tables where `SSEDescription` is absent (AWS-owned default key,
|
|
20
|
+
`LOW` - encryption is on but no CloudTrail audit trail, no rotation
|
|
21
|
+
control, no incident-time revocation), `InaccessibleEncryptionDateTime`
|
|
22
|
+
is set (`CRITICAL` - CMK was disabled or access revoked, table will be
|
|
23
|
+
archived in 7 days), or `Status != ENABLED` on a steady-state table
|
|
24
|
+
(`HIGH`). AWS-managed KMS (`alias/aws/dynamodb`) and customer-managed
|
|
25
|
+
CMKs both pass. The AWS Security Hub managed standard has no equivalent
|
|
26
|
+
control; cloud-audit is more opinionated because compliance auditors
|
|
27
|
+
(SOC 2, HIPAA, ISO 27001) typically require an auditable key.
|
|
28
|
+
- **`aws-ddb-002` - Point-in-time recovery enabled** (`MEDIUM`). Matches
|
|
29
|
+
AWS Security Hub `DynamoDB.2` severity. Without PITR, accidental drops
|
|
30
|
+
or mass conditional-update bugs are unrecoverable except from on-demand
|
|
31
|
+
backups, which require explicit scheduling.
|
|
32
|
+
- **`aws-ddb-003` - Autoscaling on PROVISIONED tables** (`MEDIUM`). Matches
|
|
33
|
+
AWS Security Hub `DynamoDB.1` severity. PROVISIONED billing with manual
|
|
34
|
+
capacity either over-provisions (cost waste, billed 24/7) or
|
|
35
|
+
under-provisions (`ProvisionedThroughputExceededException`, client
|
|
36
|
+
retries amplifying load). `PAY_PER_REQUEST` tables are skipped. Read-only
|
|
37
|
+
or write-only autoscaling registrations produce a sub-finding identifying
|
|
38
|
+
the missing dimension.
|
|
39
|
+
|
|
40
|
+
All three checks include CLI + Terraform remediation. Pagination via
|
|
41
|
+
`list_tables`. Application Auto Scaling targets are cached per-region for
|
|
42
|
+
the duration of the scan (one API call returns every DDB target in the
|
|
43
|
+
region).
|
|
44
|
+
|
|
45
|
+
- **`aws-cfg-003` - AWS Config recording group complete** (`MEDIUM`). Detects
|
|
46
|
+
recorders that record only a subset of resource types - either via the
|
|
47
|
+
legacy `allSupported=false` configuration or the modern
|
|
48
|
+
`recordingStrategy.useOnly` set to `INCLUSION_BY_RESOURCE_TYPES` or
|
|
49
|
+
`EXCLUSION_BY_RESOURCE_TYPES`. Also fires when `includeGlobalResourceTypes`
|
|
50
|
+
is false, which silently drops every IAM/CloudFront/Route53 change from
|
|
51
|
+
the configuration timeline. Filters out service-linked recorders
|
|
52
|
+
(`recordingScope=INTERNAL`).
|
|
53
|
+
|
|
54
|
+
- **`aws-cfg-004` - AWS Config delivery channel exists and is configured**
|
|
55
|
+
(tiered). Reports `HIGH` when a recorder exists but no delivery channel
|
|
56
|
+
is configured (snapshots and configuration history items go nowhere).
|
|
57
|
+
Reports `LOW` when the delivery channel exists but is throttled to the
|
|
58
|
+
slowest `TwentyFour_Hours` snapshot frequency, or when `s3KmsKeyArn` is
|
|
59
|
+
not set (delivery uses SSE-S3 instead of a CMK).
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- **`aws-s3-004` - Smarter S3 lifecycle check** (community feedback). The
|
|
64
|
+
prior check only fired when a bucket had zero lifecycle rules - which
|
|
65
|
+
missed the most expensive anti-pattern in production: a versioning-enabled
|
|
66
|
+
bucket whose lifecycle rules don't include `NoncurrentVersionExpiration`.
|
|
67
|
+
Without NCVE every object overwrite or delete retains the old version at
|
|
68
|
+
full storage rates indefinitely. The check now cross-references bucket
|
|
69
|
+
versioning state with lifecycle rules:
|
|
70
|
+
|
|
71
|
+
- Versioning `Enabled` or `Suspended` + no `NoncurrentVersionExpiration` in
|
|
72
|
+
any enabled rule -> `MEDIUM` (the storage runaway case; matches AWS
|
|
73
|
+
Security Hub `S3.10`).
|
|
74
|
+
- No enabled lifecycle on an unversioned bucket -> `LOW` (existing
|
|
75
|
+
behaviour preserved).
|
|
76
|
+
- No `AbortIncompleteMultipartUpload` rule -> `LOW` (new sub-finding;
|
|
77
|
+
orphaned multipart uploads accumulate billable storage that never
|
|
78
|
+
appears in regular object listings).
|
|
79
|
+
|
|
80
|
+
Cross-check adds one `get_bucket_versioning` call per bucket; result is
|
|
81
|
+
cached implicitly via the existing bucket-list cache pattern. Backward
|
|
82
|
+
compatible: same check ID, no behaviour change for unversioned buckets.
|
|
83
|
+
|
|
84
|
+
- **`aws-cfg-001` and `aws-cfg-002` - service-linked recorder filtering**.
|
|
85
|
+
Both existing checks now filter out service-linked recorders
|
|
86
|
+
(`recordingScope=INTERNAL`), which are created by other AWS services
|
|
87
|
+
(AWS Security Hub, AWS Audit Manager) and do not replace a
|
|
88
|
+
customer-managed recorder.
|
|
89
|
+
|
|
90
|
+
### Tests
|
|
91
|
+
|
|
92
|
+
- 812 -> 836 (+24 net). New test files: `tests/aws/test_ddb.py` (12 tests
|
|
93
|
+
covering all four encryption states, PITR enabled/disabled, autoscaling
|
|
94
|
+
with read+write/read-only/none/pay-per-request). `tests/aws/test_config.py`
|
|
95
|
+
expanded with 8 new tests for `aws-cfg-003` and `aws-cfg-004`.
|
|
96
|
+
`tests/aws/test_s3.py` expanded with 4 new tests for the smart lifecycle
|
|
97
|
+
cross-check (versioned without NCVE, versioned with NCVE, lifecycle
|
|
98
|
+
rules-but-no-NCVE, AbortMPU missing).
|
|
99
|
+
|
|
100
|
+
### Compliance
|
|
101
|
+
|
|
102
|
+
Compliance framework mappings updated to cover the new check IDs:
|
|
103
|
+
|
|
104
|
+
- **SOC 2 Type II**: `aws-cfg-003` and `aws-cfg-004` added to CC2.1, CC3.4,
|
|
105
|
+
CC4.1, CC7.1, CC8.1; `aws-ddb-001` mapped to CC6.1; `aws-ddb-002` mapped
|
|
106
|
+
to A1.2.
|
|
107
|
+
- **HIPAA Security Rule**: `aws-cfg-003` and `aws-cfg-004` added to
|
|
108
|
+
164.308(a)(1)(i) and 164.308(a)(8); `aws-ddb-001` to 164.312(a)(2)(iv);
|
|
109
|
+
`aws-ddb-002` to 164.308(a)(7)(i).
|
|
110
|
+
- **ISO/IEC 27001:2022**: `aws-cfg-003` and `aws-cfg-004` added to A.5.9,
|
|
111
|
+
A.5.23, A.5.36, A.8.9, A.8.32; `aws-ddb-001` to A.8.24; `aws-ddb-002` to
|
|
112
|
+
A.8.13.
|
|
113
|
+
- **NIS2 Directive**: `aws-cfg-003` and `aws-cfg-004` added to NIS2-RM-01b,
|
|
114
|
+
NIS2-RM-05, NIS2-RM-05b, NIS2-RM-06, NIS2-RM-06b, NIS2-GOV-01;
|
|
115
|
+
`aws-ddb-001` to NIS2-RM-05b.
|
|
116
|
+
- **BSI C5:2020**: `aws-cfg-003` and `aws-cfg-004` added to AM-01, OPS-14,
|
|
117
|
+
COS-07, COS-08, INQ-03; `aws-ddb-001` to CRY-04; `aws-ddb-002` to OPS-06.
|
|
118
|
+
- **CIS AWS Foundations Benchmark v3.0.0**: `aws-cfg-003` and `aws-cfg-004`
|
|
119
|
+
added to control 3.3. CIS v3.0.0 has no DynamoDB controls; the gap is
|
|
120
|
+
documented honestly rather than invented.
|
|
121
|
+
|
|
122
|
+
### Acknowledgments
|
|
123
|
+
|
|
124
|
+
These improvements were prompted by feedback received via community channels.
|
|
125
|
+
|
|
126
|
+
### Also in this release (carried over from prior unreleased work)
|
|
127
|
+
|
|
128
|
+
- **GitHub Action hardening** - `action.yml` now pins cloud-audit to a specific
|
|
129
|
+
PyPI version via the new `cloud-audit-version` input (default tracks the
|
|
130
|
+
action's release tag). Previously installed unpinned `cloud-audit` latest,
|
|
131
|
+
which made builds non-reproducible. Version string is validated against
|
|
132
|
+
`[0-9A-Za-z.+-]` before being passed to `pip install`.
|
|
133
|
+
|
|
134
|
+
- **GitHub Action shell injection prevention** - all `run:` blocks moved from
|
|
135
|
+
direct `${{ inputs.* }}` interpolation to env-var pattern (`env:` map +
|
|
136
|
+
bash arrays). `extra-args`, `regions`, `output`, and `diff-baseline` are
|
|
137
|
+
now passed as argv entries to `cloud-audit`, not concatenated into shell
|
|
138
|
+
strings. A malicious workflow author can still pass odd flag values but
|
|
139
|
+
cannot break out of the cloud-audit invocation.
|
|
140
|
+
|
|
141
|
+
- **README polish** - dropped promotional "first/only" wording in three
|
|
142
|
+
places (blast-radius section, AI-SPM row, IAM Privilege Escalation row).
|
|
143
|
+
PMapper row reframed from "this is its open-source replacement" to a
|
|
144
|
+
factual statement of PMapper's last release date and cloud-audit's
|
|
145
|
+
distinct scope. Honest tone over marketing tone.
|
|
146
|
+
|
|
147
|
+
- **README Prowler comparison refreshed** - 572 checks / 83 services / 41
|
|
148
|
+
frameworks updated to 600 / 84 / 44 (verified against
|
|
149
|
+
github.com/prowler-cloud/prowler on 2026-05-25). Dropped unsubstantiated
|
|
150
|
+
"55 fixers" reference and "10+ providers" puffery. Footnote datestamp
|
|
151
|
+
changed from "April 2026" to "2026-05-25".
|
|
152
|
+
|
|
153
|
+
- **README broken links fixed** - two relative links to
|
|
154
|
+
`docs/features/blast-radius.md` (gitignored - the file is published only
|
|
155
|
+
via the docs site, not committed to git) replaced with absolute URLs
|
|
156
|
+
pointing at `https://haitmg.pl/cloud-audit/features/blast-radius/`.
|
|
157
|
+
|
|
158
|
+
- **docs/features/blast-radius.md** - same "first pure-CLI open-source"
|
|
159
|
+
wording softened to "aims to be a lightweight CLI-native alternative".
|
|
160
|
+
|
|
161
|
+
- **SECURITY.md supported versions matrix** - stale `1.1.x` / `1.2.x` rows
|
|
162
|
+
replaced with `2.3.x` (current) / `2.2.x` (security fixes only) / `< 2.2`
|
|
163
|
+
(no). The matrix had not been touched since the v1.x line was current.
|
|
164
|
+
|
|
165
|
+
## [2.3.0] - 2026-05-15
|
|
166
|
+
|
|
167
|
+
### Added
|
|
168
|
+
|
|
169
|
+
- **Blast Radius CLI** - new `cloud-audit blast-radius --resource <id>` command
|
|
170
|
+
that walks outward from a single AWS resource and shows what an attacker
|
|
171
|
+
could reach if THAT resource were compromised. Pure in-memory analysis
|
|
172
|
+
against a saved scan - zero AWS API calls at blast-radius time.
|
|
173
|
+
|
|
174
|
+
Seed resource types supported:
|
|
175
|
+
- EC2 instance (short id `i-XXX`)
|
|
176
|
+
- IAM Role / IAM User (full ARN)
|
|
177
|
+
- Lambda function (full ARN)
|
|
178
|
+
- S3 bucket (full ARN)
|
|
179
|
+
- Secrets Manager secret (full ARN)
|
|
180
|
+
|
|
181
|
+
Expansion rules:
|
|
182
|
+
- Compute -> attached IAM role (via attack chain `viz_steps` from AC-01,
|
|
183
|
+
AC-02, AC-05 etc.) -> reachable identities and data
|
|
184
|
+
- Identity -> admin impact node when `escalation_paths` indicate admin
|
|
185
|
+
- Identity -> AssumeRole chain targets from `iam_trust_graph`
|
|
186
|
+
- Identity (admin) -> S3 buckets / Secrets Manager secrets present in
|
|
187
|
+
findings as candidate exfiltration targets
|
|
188
|
+
|
|
189
|
+
Output formats (`--format`):
|
|
190
|
+
- `tree` (default) - Rich tree in CLI with color-coded node types
|
|
191
|
+
- `json` - BlastRadiusGraph v1.0 schema, the wire-format contract with
|
|
192
|
+
cloud-audit-demo's 3D visualization (camelCase fields preserved on purpose)
|
|
193
|
+
- `mermaid` - Mermaid `graph TD` diagram with per-type styling
|
|
194
|
+
- `markdown` - compact summary for PRs or reports
|
|
195
|
+
|
|
196
|
+
Bounds:
|
|
197
|
+
- `--max-depth N` (default 5) caps BFS hops
|
|
198
|
+
- `--max-nodes N` (default 50) caps total nodes in the graph
|
|
199
|
+
|
|
200
|
+
Pure CLI, no Neo4j, no Docker, no SaaS account. Built on top of the
|
|
201
|
+
existing `iam_trust_graph` (524 lines, AssumeRole BFS), `iam_analyzer`
|
|
202
|
+
(706 lines, 60 escalation methods catalog), `correlate` (1574 lines,
|
|
203
|
+
31 attack-chain rules with `VizStep`s), and `cost_model` so the
|
|
204
|
+
same fixes you see in `scan` show up under the same finding ids in the
|
|
205
|
+
blast-radius output. Documented in `docs/features/blast-radius.md`.
|
|
206
|
+
|
|
207
|
+
- **`exposure` command** - new `cloud-audit exposure` rolls up findings by
|
|
208
|
+
blast-impact heuristic (which identities/data would compound on the next
|
|
209
|
+
hop). Complements `blast-radius` (single-seed) with an account-wide view.
|
|
210
|
+
|
|
211
|
+
### Changed
|
|
212
|
+
|
|
213
|
+
- **`ScanReport.security_graph`** - new optional field (`dict[str, object] | None`).
|
|
214
|
+
Populated by the scanner for blast-radius / exposure consumers. Backwards-
|
|
215
|
+
compatible: existing parsers that don't know the field will keep working
|
|
216
|
+
thanks to `default=None`.
|
|
217
|
+
|
|
218
|
+
### Fixed
|
|
219
|
+
|
|
220
|
+
Nine issues addressed by the pre-release security audit (`SECURITY-AUDIT-2026-05-15.md`):
|
|
221
|
+
|
|
222
|
+
- **SEC-001** - Mermaid output now HTML-entity escapes user-controlled node
|
|
223
|
+
labels (`<`, `>`, `&`, `"`, `\`, plus brackets, braces, pipes). Without this,
|
|
224
|
+
a crafted scan label `</text>` would break out of the Mermaid SVG context
|
|
225
|
+
when the diagram is rendered in a GitHub README.
|
|
226
|
+
- **SEC-002** - `_make_id` collision protection: when a sanitised candidate id
|
|
227
|
+
exceeds 120 chars, a SHA-256(prefix + value) suffix is appended so two
|
|
228
|
+
long-but-different inputs cannot collide post-truncation (CWE-345 / CWE-1023).
|
|
229
|
+
- **SEC-003** - AssumeRole cycle (A->B->A) no longer re-emits the seed role
|
|
230
|
+
as a lateral target node. ARN-level dedup (`visited_arns`) catches the
|
|
231
|
+
cross-prefix duplicate that graph-id dedup alone misses.
|
|
232
|
+
- **SEC-004** - `_find_execution_role_for_lambda` now refuses to return a
|
|
233
|
+
role belonging to a different function (CWE-697 narrow-match): scan with
|
|
234
|
+
chain for `fnA` and query for `fnB` returns `None`, not `fnA`'s role.
|
|
235
|
+
- **SEC-005** - `--max-depth` and `--max-nodes` are clamped to safe bounds
|
|
236
|
+
(1..25 and 1..10_000) instead of accepting unbounded user input (DoS).
|
|
237
|
+
- **SEC-006** - `--format tree` + `--output FILE` returns an error instead of
|
|
238
|
+
silently writing ANSI escape sequences to disk (CWE-684).
|
|
239
|
+
- **SEC-007** - Exception handler in the CLI wraps `OSError` with a friendly
|
|
240
|
+
message instead of leaking a full Python traceback to stderr.
|
|
241
|
+
- **SEC-008** - Rich console rendering of node lines escapes Rich markup
|
|
242
|
+
(`[red]...[/]`) found inside scan labels so a crafted scan can't recolor
|
|
243
|
+
the terminal output.
|
|
244
|
+
- **SEC-009** - Scanner persists `escalation_paths` to the saved scan so
|
|
245
|
+
blast-radius can read them without re-running the IAM analyzer.
|
|
246
|
+
|
|
247
|
+
Plus pre-release follow-ups from the second security pass:
|
|
248
|
+
|
|
249
|
+
- **F-S2-01** - HTML report templates (`report.html.j2`, `compliance_html.py`)
|
|
250
|
+
now strip non-`http(s)` URL schemes from `finding.cost_estimate.source_url`
|
|
251
|
+
and `finding.remediation.doc_url`. Without this, a `javascript:` URL in a
|
|
252
|
+
crafted scan JSON would execute when the user clicks the link in the
|
|
253
|
+
rendered HTML report.
|
|
254
|
+
- **F-S2-02** - All `--output` writers refuse to follow pre-existing symlinks
|
|
255
|
+
(TOCTOU symlink attack protection on shared CI runners). The CLI raises a
|
|
256
|
+
clear error instead of silently clobbering the symlink target.
|
|
257
|
+
- **F-S2-03** - Markdown output (`--format markdown`) now escapes markdown
|
|
258
|
+
control characters in user-controlled labels so a crafted resource name
|
|
259
|
+
cannot inject `[link](javascript:...)` into the rendered report.
|
|
260
|
+
- **F-S2-04** - `_resolve_role_arn` falls back to `report.all_findings` when
|
|
261
|
+
the role isn't present in `escalation_paths` (an EC2 with an attached
|
|
262
|
+
admin role but no separate escalation path previously returned a
|
|
263
|
+
seed-only blast graph - now resolves and reports Account Takeover).
|
|
264
|
+
- **F-S2-05** - BFS `--max-depth=1` now surfaces Account Takeover for an
|
|
265
|
+
EC2 seed with an attached admin role (was off-by-one: compute->role
|
|
266
|
+
linkage previously consumed the depth budget).
|
|
267
|
+
- **F-S2-06** - Fix/detection matching no longer uses bare `endswith(label)`
|
|
268
|
+
for short labels - now requires a `/` or `:` boundary, eliminating false
|
|
269
|
+
positives where label `"admin"` matched `super-admin`.
|
|
270
|
+
|
|
271
|
+
### Tests
|
|
272
|
+
|
|
273
|
+
- 786 -> 812 (+26 net). New regression tests in `tests/test_blast_radius.py`
|
|
274
|
+
and `tests/test_graph.py` cover: resource-type detection (8 regex patterns),
|
|
275
|
+
empty-scan seed-only behaviour, IAM role -> impact node, EC2 with attached
|
|
276
|
+
role linkage, Lambda with execution role, max-depth and max-nodes
|
|
277
|
+
enforcement, Rich tree render, Mermaid `graph TD` shape, JSON schema
|
|
278
|
+
spot-checks (top-level fields, camelCase preservation, node + edge type
|
|
279
|
+
enums), fixes and detections pulled from findings, and a full
|
|
280
|
+
`TestSecurityRegression` class for SEC-001 through SEC-009.
|
|
281
|
+
|
|
282
|
+
### Schema contract
|
|
283
|
+
|
|
284
|
+
The JSON output is the schema documented in
|
|
285
|
+
`cloud-audit-demo/src/types/blast-radius.ts` (`BlastRadiusGraph` v1.0).
|
|
286
|
+
Field names are camelCase by intent because the demo's TypeScript types
|
|
287
|
+
are the consumer. A per-file ruff exemption in `pyproject.toml` documents
|
|
288
|
+
this trade-off.
|
|
289
|
+
|
|
10
290
|
## [2.2.1] - 2026-05-12
|
|
11
291
|
|
|
12
292
|
### Changed
|
|
@@ -52,7 +332,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
52
332
|
|
|
53
333
|
### Added
|
|
54
334
|
|
|
55
|
-
- **Threat Feed v1**
|
|
335
|
+
- **Threat Feed v1** - new `cloud-audit threat-feed` command and a dedicated
|
|
56
336
|
detector pipeline (`providers/aws/threat_feed/`) that flags ACTIVE abuse
|
|
57
337
|
indicators rather than misconfiguration. Each pattern has a versioned
|
|
58
338
|
`TF-XXX` ID, maps to the new `Category.THREAT`, and carries external
|
|
@@ -61,44 +341,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
61
341
|
|
|
62
342
|
Ten patterns shipped:
|
|
63
343
|
|
|
64
|
-
- `TF-001-ses-phishing-setup` (MEDIUM/HIGH)
|
|
344
|
+
- `TF-001-ses-phishing-setup` (MEDIUM/HIGH) - SES email/domain identities
|
|
65
345
|
verified within the last 14 days, with severity escalating when an
|
|
66
346
|
out-of-sandbox account hosts a typosquat-style email identity that has
|
|
67
347
|
no matching domain identity. Tracks the Wiz May 2025 + BleepingComputer
|
|
68
348
|
May 2026 SES abuse campaigns.
|
|
69
|
-
- `TF-002-lambda-function-url-persistence` (HIGH/CRITICAL)
|
|
349
|
+
- `TF-002-lambda-function-url-persistence` (HIGH/CRITICAL) - Lambda
|
|
70
350
|
functions exposed via `AuthType=NONE` Function URLs, escalating to
|
|
71
351
|
CRITICAL when the execution role grants admin-class permissions
|
|
72
352
|
(matching the role profile of the Nov-Dec 2025 cryptomining campaign).
|
|
73
|
-
- `TF-003-quarantine-policy` (CRITICAL)
|
|
353
|
+
- `TF-003-quarantine-policy` (CRITICAL) - IAM principals with
|
|
74
354
|
`AWSCompromisedKeyQuarantineV1/V2/V3` attached. AWS auto-attaches these
|
|
75
355
|
after detecting credential exposure (typically a public GitHub commit).
|
|
76
|
-
- `TF-004-trufflehog-ua-cloudtrail` (CRITICAL)
|
|
356
|
+
- `TF-004-trufflehog-ua-cloudtrail` (CRITICAL) - `sts:GetCallerIdentity`
|
|
77
357
|
calls in the last 24h whose user-agent matches known leaked-credentials
|
|
78
358
|
discovery scanners (TruffleHog, gitleaks, CloudGrappler, DetentionDodger,
|
|
79
359
|
NoseyParker). Confirmed credential validation by an external scanner.
|
|
80
|
-
- `TF-005-cryptomining-role` (HIGH/CRITICAL)
|
|
360
|
+
- `TF-005-cryptomining-role` (HIGH/CRITICAL) - IAM roles created within
|
|
81
361
|
the last 48 hours that carry broad compute managed policies (EC2 Full,
|
|
82
362
|
PowerUser, Admin, ECS Full, Lambda Full). Escalates to CRITICAL when
|
|
83
363
|
the same role also has SES sending permissions (mining + email-spam
|
|
84
364
|
combo from the documented late-2025 campaign cluster).
|
|
85
|
-
- `TF-006-mmdsv1-in-use` (HIGH/CRITICAL)
|
|
365
|
+
- `TF-006-mmdsv1-in-use` (HIGH/CRITICAL) - EC2 instances where
|
|
86
366
|
`HttpTokens != required` (IMDSv1 still callable) and Bedrock AgentCore
|
|
87
|
-
agents on `metadataVersion=v1` (CRITICAL
|
|
367
|
+
agents on `metadataVersion=v1` (CRITICAL - addresses Unit 42 'Cracks in
|
|
88
368
|
the Bedrock' research and the Feb 2026 MMDSv2 default).
|
|
89
|
-
- `TF-007-whoami-confusion` (MEDIUM)
|
|
369
|
+
- `TF-007-whoami-confusion` (MEDIUM) - IAM roles trusted by CI/CD
|
|
90
370
|
identities (codebuild service principals, GitHub OIDC, GitLab OIDC,
|
|
91
|
-
Buildkite federation) that have a broad EC2 managed policy attached
|
|
371
|
+
Buildkite federation) that have a broad EC2 managed policy attached -
|
|
92
372
|
the precondition for the Datadog Feb 2025 whoAMI confusion attack.
|
|
93
|
-
- `TF-008-cloudtrail-tampering` (HIGH/CRITICAL)
|
|
94
|
-
`IsLogging=False` (CRITICAL
|
|
373
|
+
- `TF-008-cloudtrail-tampering` (HIGH/CRITICAL) - CloudTrail trails with
|
|
374
|
+
`IsLogging=False` (CRITICAL - canonical post-credential-theft attacker
|
|
95
375
|
behaviour, AiTM phishing follow-on per Datadog March 2026) or with a
|
|
96
|
-
populated `LatestDeliveryError` (HIGH
|
|
97
|
-
- `TF-009-roles-anywhere-abuse` (HIGH/MEDIUM)
|
|
376
|
+
populated `LatestDeliveryError` (HIGH - S3 destination broken).
|
|
377
|
+
- `TF-009-roles-anywhere-abuse` (HIGH/MEDIUM) - IAM Roles Anywhere trust
|
|
98
378
|
anchors with `sourceType=CERTIFICATE_BUNDLE` instead of the recommended
|
|
99
379
|
AWS_ACM_PCA. Anyone able to issue a chain-valid cert can mint AWS
|
|
100
380
|
credentials (fwd:cloudsec 2025 'Let's Encrypt for AWS Console').
|
|
101
|
-
- `TF-010-datazone-overgrant` (HIGH)
|
|
381
|
+
- `TF-010-datazone-overgrant` (HIGH) - `AmazonDataZoneFullAccess` attached
|
|
102
382
|
to non-admin principals (the "easy" onboarding policy that bridges
|
|
103
383
|
identity, Glue catalog, and S3 storage in a single grant).
|
|
104
384
|
|
|
@@ -213,7 +493,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
213
493
|
- AC-29: Unpatched Instance Exposed to Internet (CRITICAL)
|
|
214
494
|
- AC-30: Unpatched Instances Without Vulnerability Scanning (HIGH)
|
|
215
495
|
- AC-31: Internet-Exposed Without WAF or Flow Logs (HIGH)
|
|
216
|
-
- AC-32: CloudTrail Blind Spot
|
|
496
|
+
- AC-32: CloudTrail Blind Spot - Alarms Non-Functional (HIGH)
|
|
217
497
|
- AC-33: All-Public VPC Without Network Segmentation (HIGH)
|
|
218
498
|
- 3 new service modules: AWS Backup, Amazon Inspector, AWS WAF
|
|
219
499
|
- 67 new tests for framework validation (412 total)
|
|
@@ -621,7 +901,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
621
901
|
- Docker image support
|
|
622
902
|
- Rich terminal UI with progress bar and color-coded findings
|
|
623
903
|
|
|
624
|
-
[Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/
|
|
904
|
+
[Unreleased]: https://github.com/gebalamariusz/cloud-audit/compare/v2.3.1...HEAD
|
|
905
|
+
[2.3.1]: https://github.com/gebalamariusz/cloud-audit/compare/v2.3.0...v2.3.1
|
|
625
906
|
[1.3.0]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.2...v1.3.0
|
|
626
907
|
[1.2.2]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.1...v1.2.2
|
|
627
908
|
[1.2.1]: https://github.com/gebalamariusz/cloud-audit/compare/v1.2.0...v1.2.1
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloud-audit
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: Open-source AWS security scanner. Threat Feed v1 (
|
|
3
|
+
Version: 2.3.1
|
|
4
|
+
Summary: Open-source AWS security scanner. 99 checks across 24 services. Blast Radius CLI, Threat Feed v1, DynamoDB hygiene (encryption/PITR/autoscaling), opinionated Config checks, smart S3 lifecycle, 64 IAM escalation methods, What-If simulator, AI-SPM (Bedrock/SageMaker), 6 compliance frameworks, 31 attack chain rules, breach cost estimation, MCP server. CLI + Terraform remediation for every finding.
|
|
5
5
|
Project-URL: Homepage, https://haitmg.pl/cloud-audit/
|
|
6
6
|
Project-URL: Documentation, https://haitmg.pl/cloud-audit/
|
|
7
7
|
Project-URL: Source, https://github.com/gebalamariusz/cloud-audit
|
|
@@ -52,12 +52,16 @@ Description-Content-Type: text/markdown
|
|
|
52
52
|
<!-- mcp-name: io.github.gebalamariusz/cloud-audit -->
|
|
53
53
|
<h1 align="center">cloud-audit</h1>
|
|
54
54
|
|
|
55
|
+
<p align="center">
|
|
56
|
+
<a href="README.md">English</a> | <a href="README_zh-CN.md">简体中文</a>
|
|
57
|
+
</p>
|
|
58
|
+
|
|
55
59
|
<p align="center">
|
|
56
60
|
<strong>Find AWS attack paths, IAM escalation routes, and the fixes that matter most.</strong>
|
|
57
61
|
</p>
|
|
58
62
|
|
|
59
63
|
<p align="center">
|
|
60
|
-
Open-source CLI scanner that helps you decide what to fix first
|
|
64
|
+
Open-source CLI scanner that helps you decide what to fix first -<br>
|
|
61
65
|
not just what's wrong.
|
|
62
66
|
</p>
|
|
63
67
|
|
|
@@ -80,14 +84,22 @@ Description-Content-Type: text/markdown
|
|
|
80
84
|
<p align="center">
|
|
81
85
|
<a href="https://haitmg.pl/cloud-audit/">Documentation</a> -
|
|
82
86
|
<a href="https://haitmg.pl/cloud-audit/getting-started/quick-start/">Quick Start</a> -
|
|
83
|
-
<a href="https://haitmg.pl/cloud-audit/
|
|
87
|
+
<a href="https://haitmg.pl/cloud-audit/features/blast-radius/">Blast Radius</a> -
|
|
88
|
+
<a href="https://blast-audit.haitmg.pl/">Live Visualizer</a> -
|
|
84
89
|
<a href="https://haitmg.pl/cloud-audit/features/attack-chains/">Attack Chains</a> -
|
|
85
90
|
<a href="https://haitmg.pl/cloud-audit/features/iam-escalation/">IAM Escalation</a> -
|
|
86
91
|
<a href="https://haitmg.pl/cloud-audit/features/threat-feed/">Threat Feed</a> -
|
|
87
|
-
<a href="https://haitmg.pl/cloud-audit/features/simulate/">Simulator</a> -
|
|
88
92
|
<a href="https://haitmg.pl/cloud-audit/features/mcp-server/">MCP Server</a>
|
|
89
93
|
</p>
|
|
90
94
|
|
|
95
|
+
<p align="center">
|
|
96
|
+
<a href="https://blast-audit.haitmg.pl/demo/capital-one-2019/?board=1">
|
|
97
|
+
<img src="assets/blast-audit-boardroom.png" alt="blast-audit visualizer - executive briefing view of Snowflake 2024 breach: $28M exposure, 4 years to detect, fix = enforce MFA" width="820">
|
|
98
|
+
</a>
|
|
99
|
+
<br>
|
|
100
|
+
<sub>Drop a <code>cloud-audit blast-radius</code> JSON into the live visualizer at <a href="https://blast-audit.haitmg.pl/">blast-audit.haitmg.pl</a> - or click the screenshot to explore the Snowflake 2024 breach interactively.</sub>
|
|
101
|
+
</p>
|
|
102
|
+
|
|
91
103
|
## Quick Start
|
|
92
104
|
|
|
93
105
|
```bash
|
|
@@ -101,6 +113,59 @@ Uses your default AWS credentials and region. Try without an AWS account:
|
|
|
101
113
|
cloud-audit demo
|
|
102
114
|
```
|
|
103
115
|
|
|
116
|
+
### NEW in v2.3: Blast Radius CLI + live visualizer
|
|
117
|
+
|
|
118
|
+
> *Walk outward from any AWS resource and show exactly what an attacker reaches
|
|
119
|
+
> if THAT resource is compromised.* The CLI runs offline against a saved scan
|
|
120
|
+
> (zero AWS API calls at blast-radius time); the matching open visualizer at
|
|
121
|
+
> [blast-audit.haitmg.pl](https://blast-audit.haitmg.pl/) renders the same JSON
|
|
122
|
+
> as an interactive attack graph with break-point highlighting, MITRE ATT&CK
|
|
123
|
+
> overlay, and an executive boardroom mode for CFO/CISO briefings.
|
|
124
|
+
|
|
125
|
+
Seeds: EC2 short id (`i-XXX`), IAM role/user ARN, Lambda ARN, S3 bucket ARN,
|
|
126
|
+
Secrets Manager secret ARN.
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 1. Run a scan once (saves to ~/.cloud-audit/last-scan.json)
|
|
130
|
+
cloud-audit scan
|
|
131
|
+
|
|
132
|
+
# 2. Inspect blast radius from any resource (uses the last scan automatically)
|
|
133
|
+
cloud-audit blast-radius --resource i-0abc123def456 # tree (default)
|
|
134
|
+
cloud-audit blast-radius --resource i-0abc123 --format mermaid # for docs/slides
|
|
135
|
+
cloud-audit blast-radius --resource i-0abc123 --format markdown # for PR comments
|
|
136
|
+
|
|
137
|
+
# 3. Export JSON and visualize it interactively
|
|
138
|
+
cloud-audit blast-radius --resource arn:aws:iam::123456789012:role/deploy \
|
|
139
|
+
--format json --output blast.json
|
|
140
|
+
# → open https://blast-audit.haitmg.pl/demo/upload/ → drop blast.json
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
<p align="center">
|
|
144
|
+
<img src="assets/blast-audit-counterfactual.png" alt="Counterfactual view: applying the IAM fix collapses Capital One exposure from $270M to $0" width="820">
|
|
145
|
+
<br>
|
|
146
|
+
<sub>The visualizer's boardroom mode includes a one-click counterfactual -
|
|
147
|
+
<em>"What stops this attack?"</em> - that animates the exposure tile to
|
|
148
|
+
$0 when you preview the recommended IAM remediation.</sub>
|
|
149
|
+
</p>
|
|
150
|
+
|
|
151
|
+
Seven historical breach scenarios ship pre-loaded for context
|
|
152
|
+
(Capital One 2019, Cryptomining 2025, AgentCore 2026, Snowflake UNC5537 2024,
|
|
153
|
+
nx Supply Chain 2026, Codefinger SSE-C 2025, Trivy / TeamPCP 2026), each with
|
|
154
|
+
verified primary-source citations. See the [Blast Radius documentation](https://haitmg.pl/cloud-audit/features/blast-radius/)
|
|
155
|
+
for expansion rules, the BlastRadiusGraph v1.0 schema, and the risk-score heuristic.
|
|
156
|
+
|
|
157
|
+
### Also new since v2.0
|
|
158
|
+
|
|
159
|
+
| Version | Highlight |
|
|
160
|
+
|---|---|
|
|
161
|
+
| **v2.3.0** (May 2026) | **Blast Radius CLI** + live visualizer + 15 security-hardening fixes (Mermaid XSS escape, ID collision, BFS bounds, symlink-safe writes, URL scheme allow-list). 812 tests. |
|
|
162
|
+
| v2.2.1 (May 2026) | TF-001 SES phishing burst escalation + TF-004 defensive-tool exclusion. |
|
|
163
|
+
| v2.2.0 (May 2026) | **Threat Feed v1** - 10 active-abuse detectors from 2025-2026 incidents (cryptomining, leaked-cred scanners, MMDSv1, DataZone, Roles Anywhere, CloudTrail tampering). External research refs on every finding. |
|
|
164
|
+
| v2.1.0 (Apr 2026) | 64 IAM escalation methods, full pathfinding.cloud coverage. |
|
|
165
|
+
| v2.0.0 (Apr 2026) | IAM Escalation graph, What-If simulator, Trend tracking, AI-SPM (Bedrock + SageMaker). |
|
|
166
|
+
|
|
167
|
+
Detail per release in [CHANGELOG.md](CHANGELOG.md).
|
|
168
|
+
|
|
104
169
|
### NEW in v2.2: Threat Feed
|
|
105
170
|
|
|
106
171
|
Detect ACTIVE abuse patterns from 2025-2026 incidents (cryptomining campaigns,
|
|
@@ -150,7 +215,7 @@ cloud-audit simulate --fix aws-vpc-002
|
|
|
150
215
|
# Score: 34 -> 58 (+24) | Chains broken: 8 of 22 | Findings resolved: 11
|
|
151
216
|
```
|
|
152
217
|
|
|
153
|
-
|
|
218
|
+
99 checks across 24 AWS services. Every finding includes copy-paste AWS CLI + Terraform remediation.
|
|
154
219
|
|
|
155
220
|
<p align="center">
|
|
156
221
|
<a href="https://www.youtube.com/watch?v=5uHoqggmTB8">
|
|
@@ -162,15 +227,17 @@ cloud-audit simulate --fix aws-vpc-002
|
|
|
162
227
|
|
|
163
228
|
---
|
|
164
229
|
|
|
165
|
-
##
|
|
230
|
+
## Feature matrix
|
|
166
231
|
|
|
167
|
-
|
|
|
232
|
+
| Capability | What it does |
|
|
168
233
|
|---|---|
|
|
169
|
-
| **
|
|
170
|
-
| **
|
|
171
|
-
| **
|
|
172
|
-
| **
|
|
173
|
-
| **
|
|
234
|
+
| **Blast Radius CLI** (v2.3) | `cloud-audit blast-radius --resource <id>` walks outward from any AWS resource and emits the reachable attack graph as tree, JSON ([BlastRadiusGraph v1.0](https://haitmg.pl/cloud-audit/features/blast-radius/#output-json-blastradiusgraph-v10)), Mermaid, or Markdown. The JSON drops straight into the [live visualizer](https://blast-audit.haitmg.pl/) for interactive exploration. |
|
|
235
|
+
| **Threat Feed v1** (v2.2) | 10 active-abuse detectors from real 2025-2026 incidents - cryptomining, leaked-cred scanners, MMDSv1, DataZone overgrant, Roles Anywhere, CloudTrail tampering. Each detector ships with primary-source citation. |
|
|
236
|
+
| **IAM Privilege Escalation** (v2.1) | 64 escalation methods across 9 categories, including lateral movement detection via AssumeRole graph traversal. PMapper has been unmaintained since v1.1.5 (Jan 2022); cloud-audit offers a CLI-native alternative that covers additional escalation patterns beyond PMapper's IAM-principal scope. |
|
|
237
|
+
| **What-If Simulator** (v2.0) | `cloud-audit simulate --fix aws-vpc-002` shows score change, chains broken, and risk reduction before you apply anything. |
|
|
238
|
+
| **Root Cause Grouping** (v2.0) | "Fix 4 things, break 22 chains." Groups findings by shared root cause and ranks by impact. |
|
|
239
|
+
| **Security Posture Trend** (v2.0) | `cloud-audit trend` tracks health score, chains, and risk over time with sparkline visualization. |
|
|
240
|
+
| **AI-SPM** (v2.0) | Open-source Bedrock + SageMaker scanner. 5 checks, 3 attack chains (model theft, LLMjacking, data poisoning). |
|
|
174
241
|
|
|
175
242
|
---
|
|
176
243
|
|
|
@@ -244,15 +311,15 @@ claude mcp add cloud-audit -- uvx --from cloud-audit cloud-audit-mcp
|
|
|
244
311
|
|
|
245
312
|
## How It Compares
|
|
246
313
|
|
|
247
|
-
[Prowler](https://github.com/prowler-cloud/prowler) is the AWS security standard:
|
|
314
|
+
[Prowler](https://github.com/prowler-cloud/prowler) is the AWS security standard: 600 checks across 84 services, 44 compliance frameworks (CIS, PCI-DSS, HIPAA, SOC2, NIST 800, ISO 27001, GDPR, FedRAMP, NIS2, MITRE ATT&CK and more), auto-remediation fixers, and graph-based attack path analysis in the Prowler App (Cartography + Neo4j). It also covers Azure, GCP, Kubernetes, M365, and several other providers.
|
|
248
315
|
|
|
249
|
-
cloud-audit is AWS-only and intentionally narrower (
|
|
316
|
+
cloud-audit is AWS-only and intentionally narrower (99 curated checks). It goes deep where Prowler goes wide: attack chain correlation and IAM escalation detection run in the free CLI with zero infrastructure, every finding ships with reviewable Terraform + AWS CLI remediation, and scan diff / drift tracking is built into the CLI.
|
|
250
317
|
|
|
251
318
|
| Feature | Prowler | cloud-audit |
|
|
252
319
|
|---------|---------|-------------|
|
|
253
|
-
| AWS checks |
|
|
254
|
-
| Compliance frameworks (AWS) |
|
|
255
|
-
| Auto-remediation | 55 fixers across 17 AWS services (direct API calls) |
|
|
320
|
+
| AWS checks | 600 across 84 services | 99 across 24 services |
|
|
321
|
+
| Compliance frameworks (AWS) | 44 (CIS, PCI-DSS, HIPAA, SOC2, NIST, ISO 27001, GDPR, FedRAMP, NIS2, ...) | 6 (CIS v3.0, SOC 2, BSI C5, ISO 27001, HIPAA, NIS2) |
|
|
322
|
+
| Auto-remediation | 55 fixers across 17 AWS services (direct API calls) | 99/99 findings with CLI + Terraform output (reviewable, you apply) |
|
|
256
323
|
| Attack path / graph analysis | Prowler App (Cartography + graph queries) | CLI-native (31 rules, no infra) |
|
|
257
324
|
| IAM privilege escalation graph | Prowler App | CLI-native (61 methods + AssumeRole graph) |
|
|
258
325
|
| What-If remediation simulator | No | Yes |
|
|
@@ -265,7 +332,30 @@ cloud-audit is AWS-only and intentionally narrower (94 curated checks). It goes
|
|
|
265
332
|
|
|
266
333
|
Use Prowler for compliance breadth, multi-cloud coverage, and graph-based attack path analysis. Use cloud-audit for fast CLI-native attack chain detection, reviewable Terraform remediation, and CI/CD drift tracking. They are complementary, not competitors - a common setup is Prowler for quarterly compliance evidence plus cloud-audit daily in CI/CD.
|
|
267
334
|
|
|
268
|
-
<sub>Prowler stats verified from github.com/prowler-cloud/prowler
|
|
335
|
+
<sub>Prowler stats verified from github.com/prowler-cloud/prowler on 2026-05-25. cloud-audit snapshot as of v2.3.0.</sub>
|
|
336
|
+
|
|
337
|
+
### Blast radius specifically
|
|
338
|
+
|
|
339
|
+
Most existing AWS blast-radius tooling either lives behind paid SaaS, requires standing up Neo4j + Cartography, or has been unmaintained for years. `cloud-audit blast-radius` aims to be a lightweight CLI-native alternative: arbitrary AWS resource seeds (EC2, IAM, Lambda, S3, secret), a documented JSON contract (BlastRadiusGraph v1.0) that downstream tools can consume, and no infrastructure to stand up.
|
|
340
|
+
|
|
341
|
+
| Tool | Forward BFS from arbitrary AWS resource? | Pure CLI? | Last release |
|
|
342
|
+
|---|---|---|---|
|
|
343
|
+
| Wiz / Stream Security CloudTwin | yes | no (paid SaaS) | active |
|
|
344
|
+
| Prowler App | yes | no (needs Neo4j + Cartography) | active |
|
|
345
|
+
| Prowler CLI | no | yes | active |
|
|
346
|
+
| PMapper | IAM-only, optimised for privesc-to-admin | yes | v1.1.5, Jan 2022 (unmaintained) |
|
|
347
|
+
| Cloudsplaining | no (IAM policy analysis only) | yes | v0.8.2, Oct 2024 |
|
|
348
|
+
| CloudFox | no for AWS (`lateral-movement` GCP only) | yes | active |
|
|
349
|
+
| DetentionDodger | IAM-only, only post-quarantine users | yes | v1.0, Oct 2024 |
|
|
350
|
+
| awspx | partial (graph + web UI) | Docker | v1.3.4, Aug 2021 (unmaintained) |
|
|
351
|
+
| ScoutSuite | no | yes | v5.14.0, May 2024 |
|
|
352
|
+
| Cartography | no built-in (bring your own Cypher) | no (graph ingestor) | active |
|
|
353
|
+
| BloodHound CE | no for AWS (AD + Azure scope) | no (web app) | active |
|
|
354
|
+
| pathfinding.cloud | no (it's a catalog) | n/a | n/a |
|
|
355
|
+
| Trivy | no | yes | active |
|
|
356
|
+
| **cloud-audit blast-radius** | **yes** | **yes** | **v2.3.0, May 2026** |
|
|
357
|
+
|
|
358
|
+
The companion visualizer at [blast-audit.haitmg.pl](https://blast-audit.haitmg.pl/) consumes the same JSON without an account, install, or upload-to-cloud step. Everything stays in your browser.
|
|
269
359
|
|
|
270
360
|
---
|
|
271
361
|
|
|
@@ -376,26 +466,53 @@ cloud-audit never modifies your infrastructure. The `simulate` command runs loca
|
|
|
376
466
|
|
|
377
467
|
## What It Checks
|
|
378
468
|
|
|
379
|
-
|
|
469
|
+
99 checks across IAM, S3, EC2, VPC, RDS, EIP, EFS, CloudTrail, GuardDuty, KMS, CloudWatch, Lambda, ECS, SSM, Secrets Manager, AWS Config, Security Hub, Account, AWS Backup, Amazon Inspector, AWS WAF, Amazon Bedrock, Amazon SageMaker, and Amazon DynamoDB.
|
|
380
470
|
|
|
381
|
-
[See all
|
|
471
|
+
[See all 99 checks by service](https://haitmg.pl/cloud-audit/checks/) or run `cloud-audit list-checks` locally.
|
|
382
472
|
|
|
383
473
|
## Documentation
|
|
384
474
|
|
|
385
475
|
Full docs at **[haitmg.pl/cloud-audit](https://haitmg.pl/cloud-audit/)**:
|
|
386
476
|
|
|
387
477
|
- **[Getting Started](https://haitmg.pl/cloud-audit/getting-started/installation/)** - installation, quick start, demo mode
|
|
478
|
+
- **[Blast Radius](https://haitmg.pl/cloud-audit/features/blast-radius/)** - forward BFS from arbitrary AWS resource, JSON schema, visualizer integration
|
|
388
479
|
- **[Attack Chains](https://haitmg.pl/cloud-audit/features/attack-chains/)** - all 31 rules with MITRE ATT&CK references
|
|
389
|
-
- **[IAM Escalation](https://haitmg.pl/cloud-audit/features/iam-escalation/)** -
|
|
480
|
+
- **[IAM Escalation](https://haitmg.pl/cloud-audit/features/iam-escalation/)** - 64 methods, 9 categories (action-based + lateral AssumeRole graph)
|
|
481
|
+
- **[Threat Feed](https://haitmg.pl/cloud-audit/features/threat-feed/)** - 10 active-abuse detectors from 2025-2026 incidents
|
|
390
482
|
- **[What-If Simulator](https://haitmg.pl/cloud-audit/features/simulate/)** - simulate remediation impact
|
|
391
483
|
- **[Compliance](https://haitmg.pl/cloud-audit/compliance/overview/)** - 6 frameworks: CIS, SOC 2, BSI C5, ISO 27001, HIPAA, NIS2
|
|
392
484
|
- **[All 94 Checks](https://haitmg.pl/cloud-audit/checks/)** - full check reference by service
|
|
393
485
|
|
|
486
|
+
## Companion visualizer
|
|
487
|
+
|
|
488
|
+
The same BlastRadiusGraph v1.0 JSON that `cloud-audit blast-radius --format json` emits also drives the live visualizer at **[blast-audit.haitmg.pl](https://blast-audit.haitmg.pl/)** - no install, no signup, no upload to a third-party cloud (everything runs in your browser).
|
|
489
|
+
|
|
490
|
+
<p align="center">
|
|
491
|
+
<a href="https://blast-audit.haitmg.pl/demo/capital-one-2019/">
|
|
492
|
+
<img src="assets/blast-audit-hero.png" alt="blast-audit operator view of the Capital One 2019 attack chain with the break-point IAM role highlighted" width="820">
|
|
493
|
+
</a>
|
|
494
|
+
</p>
|
|
495
|
+
|
|
496
|
+
Seven historical breach scenarios are pre-loaded with primary-source citations:
|
|
497
|
+
|
|
498
|
+
| Scenario | Year | One-line pitch | URL |
|
|
499
|
+
|---|---|---|---|
|
|
500
|
+
| Capital One | 2019 | SSRF → IMDSv1 → admin S3 (100M records, $190M total damage) | [/demo/capital-one-2019/](https://blast-audit.haitmg.pl/demo/capital-one-2019/) |
|
|
501
|
+
| Cryptomining | 2025 | Leaked AKID → 14 ASGs spinning in 10 minutes | [/demo/cryptomining-2025/](https://blast-audit.haitmg.pl/demo/cryptomining-2025/) |
|
|
502
|
+
| Bedrock AgentCore | 2026 | Sandbox bypass via DNS resolver (AWS classed "won't fix") | [/demo/agentcore-2026/](https://blast-audit.haitmg.pl/demo/agentcore-2026/) |
|
|
503
|
+
| Snowflake / UNC5537 | 2024 | Infostealer-harvested credentials replayed against no-MFA tenants (165 orgs, $28M+ AT&T settlement) | [/demo/snowflake-unc5537-2024/](https://blast-audit.haitmg.pl/demo/snowflake-unc5537-2024/) |
|
|
504
|
+
| nx Supply Chain / UNC6426 | 2026 | Trojanised npm → LLM stealer → GitHub OIDC → AWS Admin in <72 h | [/demo/unc6426-nx-2026/](https://blast-audit.haitmg.pl/demo/unc6426-nx-2026/) |
|
|
505
|
+
| Codefinger | 2025 | AWS-native SSE-C ransomware (no key recovery from CloudTrail) | [/demo/codefinger-ssec-2025/](https://blast-audit.haitmg.pl/demo/codefinger-ssec-2025/) |
|
|
506
|
+
| Trivy / TeamPCP | 2026 | 76 of 77 GitHub Action tags force-pushed to a credential stealer | [/demo/trivy-teampcp-2026/](https://blast-audit.haitmg.pl/demo/trivy-teampcp-2026/) |
|
|
507
|
+
|
|
508
|
+
Boardroom mode (`?board=1` on any scenario) renders the same graph as a CFO/CISO briefing with the dollar exposure, time-to-detect, and recommended fix surfaced as 3 big tiles - click *"What stops this attack?"* and the exposure tile animates to $0.
|
|
509
|
+
|
|
394
510
|
## What's Next
|
|
395
511
|
|
|
396
512
|
- Multi-account scanning (AWS Organizations)
|
|
397
513
|
- SCP + permission boundary evaluation in IAM escalation
|
|
398
514
|
- Terraform drift detection
|
|
515
|
+
- Security Graph v3.0.0 (network reachability, cross-account propagation, permission-boundary semantics)
|
|
399
516
|
|
|
400
517
|
Past releases: [CHANGELOG.md](CHANGELOG.md)
|
|
401
518
|
|
|
@@ -406,7 +523,7 @@ git clone https://github.com/gebalamariusz/cloud-audit.git
|
|
|
406
523
|
cd cloud-audit
|
|
407
524
|
pip install -e ".[dev]"
|
|
408
525
|
|
|
409
|
-
pytest -v #
|
|
526
|
+
pytest -v # 812 tests
|
|
410
527
|
ruff check src/ tests/ # lint
|
|
411
528
|
mypy src/ # type check
|
|
412
529
|
```
|