attackmap 0.4.26__tar.gz → 0.4.29__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of attackmap might be problematic. Click here for more details.
- attackmap-0.4.29/PKG-INFO +201 -0
- attackmap-0.4.29/README.md +139 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/pyproject.toml +2 -1
- attackmap-0.4.29/src/attackmap/bench.py +461 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/cli.py +73 -3
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/cve.py +229 -33
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/models.py +2 -2
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/__init__.py +2 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/models.py +2 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/suggest.py +6 -0
- attackmap-0.4.29/src/attackmap.egg-info/PKG-INFO +201 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/SOURCES.txt +2 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/requires.txt +1 -0
- attackmap-0.4.29/tests/test_bench.py +249 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_cve.py +199 -17
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_shared_contract_imports.py +12 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_suggest.py +6 -0
- attackmap-0.4.26/PKG-INFO +0 -940
- attackmap-0.4.26/README.md +0 -879
- attackmap-0.4.26/src/attackmap.egg-info/PKG-INFO +0 -940
- {attackmap-0.4.26 → attackmap-0.4.29}/LICENSE +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/setup.cfg +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/__init__.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzer.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzer_contracts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzers.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/anomalies.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/asset_model.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/attack_taxonomy.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/authz.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/config_scanner.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/context_pack.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/contracts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/control_model.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/crossrepo.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/crypto.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/defensive_review.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/detection_opportunities.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/diagrams.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/diff.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/exploitability.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/fleet.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/graph.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/hunt_harness.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/insights.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/llm_review.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/lockfiles.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/merge.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/progress.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/recon_models.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/recon_to_analysis.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/report.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_eval.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_json.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_prompts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/route_auth_fusion.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sarif.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sbom.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/scanner.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/contracts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/security_overlay.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/srcpaths.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/suppress.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/taint.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/threat_model.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/topology.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/triage.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/weaknesses.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/webhardening.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/workflow_scanner.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/dependency_links.txt +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/entry_points.txt +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/top_level.txt +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzer.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzer_metadata_schema.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzers.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_anomalies.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_artifact_schemas.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_authz.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_config_scanner.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_context_pack.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_contracts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_crossrepo.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_crypto.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_defensive_review.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_diagrams.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_diff.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_exploitability.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_fleet.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_graph.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_hunt.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_hunt_harness.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_injection_sinks.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_llm_review.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_lockfiles.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_merge.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_modules_cli.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_pr_comment.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_progress.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_provenance.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_recall.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_recon_to_analysis.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_remediate.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_report.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_eval.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_json.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_prompts.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_route_auth_fusion.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_sarif.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_sbom.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_scanner.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_security_overlay.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_signal_v2.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_srcpaths.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_suppress.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_taint.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_taint_sanitizer.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_threat_intel.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_threat_model.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_topology.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_triage.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_weaknesses.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_webhardening.py +0 -0
- {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_workflow_scanner.py +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: attackmap
|
|
3
|
+
Version: 0.4.29
|
|
4
|
+
Summary: AI-assisted defensive security analyzer for codebases — scans a repository, models assets and controls, finds cross-cutting weaknesses, and generates an evidence-grounded review with MITRE ATT&CK mappings and detection-engineering hints.
|
|
5
|
+
Author: AttackMap Contributors
|
|
6
|
+
Author-email: Matthew Davis <matthewd@matthewd.xyz>
|
|
7
|
+
Maintainer-email: Matthew Davis <matthewd@matthewd.xyz>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Homepage, https://github.com/mlaify/AttackMap
|
|
10
|
+
Project-URL: Documentation, https://github.com/mlaify/AttackMap/wiki
|
|
11
|
+
Project-URL: Repository, https://github.com/mlaify/AttackMap
|
|
12
|
+
Project-URL: Issues, https://github.com/mlaify/AttackMap/issues
|
|
13
|
+
Project-URL: Changelog, https://github.com/mlaify/AttackMap/blob/main/CHANGELOG.md
|
|
14
|
+
Keywords: security,static-analysis,appsec,defensive-security,threat-modeling,attack-surface,mitre-attack,detection-engineering,code-review,llm,claude
|
|
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.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
27
|
+
Classifier: Topic :: Security
|
|
28
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
29
|
+
Classifier: Topic :: Software Development :: Testing
|
|
30
|
+
Classifier: Typing :: Typed
|
|
31
|
+
Requires-Python: >=3.11
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
License-File: LICENSE
|
|
34
|
+
Requires-Dist: typer>=0.12.3
|
|
35
|
+
Requires-Dist: pydantic>=2.7.0
|
|
36
|
+
Requires-Dist: networkx>=3.3
|
|
37
|
+
Requires-Dist: PyYAML>=6.0
|
|
38
|
+
Provides-Extra: llm
|
|
39
|
+
Requires-Dist: anthropic>=0.40.0; extra == "llm"
|
|
40
|
+
Requires-Dist: openai>=1.60.0; extra == "llm"
|
|
41
|
+
Provides-Extra: all
|
|
42
|
+
Requires-Dist: attackmap[llm]; extra == "all"
|
|
43
|
+
Requires-Dist: attackmap-analyzer-python>=0.1.0; extra == "all"
|
|
44
|
+
Requires-Dist: attackmap-analyzer-rust>=0.1.0; extra == "all"
|
|
45
|
+
Requires-Dist: attackmap-analyzer-go>=0.1.0; extra == "all"
|
|
46
|
+
Requires-Dist: attackmap-analyzer-java-spring>=0.1.0; extra == "all"
|
|
47
|
+
Requires-Dist: attackmap-analyzer-dotnet>=0.1.0; extra == "all"
|
|
48
|
+
Requires-Dist: attackmap-analyzer-terraform>=0.1.0; extra == "all"
|
|
49
|
+
Requires-Dist: attackmap-analyzer-c>=0.1.0; extra == "all"
|
|
50
|
+
Requires-Dist: attackmap-analyzer-cpp>=0.1.0; extra == "all"
|
|
51
|
+
Requires-Dist: attackmap-analyzer-swift>=0.1.0; extra == "all"
|
|
52
|
+
Requires-Dist: attackmap-analyzer-node-service>=0.2.0; extra == "all"
|
|
53
|
+
Requires-Dist: attackmap-analyzer-atproto>=0.1.0; extra == "all"
|
|
54
|
+
Requires-Dist: attackmap-analyzer-php-web>=0.1.0; extra == "all"
|
|
55
|
+
Requires-Dist: attackmap-analyzer-php-laminas>=0.1.0; extra == "all"
|
|
56
|
+
Requires-Dist: attackmap-analyzer-omeka-s>=0.1.0; extra == "all"
|
|
57
|
+
Requires-Dist: attackmap-analyzer-iac>=0.1.0; extra == "all"
|
|
58
|
+
Provides-Extra: dev
|
|
59
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
60
|
+
Requires-Dist: build>=1.2.0; extra == "dev"
|
|
61
|
+
Dynamic: license-file
|
|
62
|
+
|
|
63
|
+
# AttackMap
|
|
64
|
+
|
|
65
|
+
**Local-first, AI-assisted defensive security analysis for codebases.** AttackMap
|
|
66
|
+
reads a repository (or a whole fleet of them), reconstructs the attack surface —
|
|
67
|
+
routes, data stores, external calls, auth signals, trust boundaries — traces
|
|
68
|
+
request-to-sink data flow, and produces an evidence-grounded, prioritized security
|
|
69
|
+
review. It finds the cross-cutting weaknesses single-file scanners miss, and never
|
|
70
|
+
sends your code anywhere.
|
|
71
|
+
|
|
72
|
+
[](LICENSE)
|
|
73
|
+
[](https://pypi.org/project/attackmap/)
|
|
74
|
+
[](https://www.python.org/)
|
|
75
|
+
|
|
76
|
+
> **Status: beta (v0.4.27).** Core engine + 14 analyzer plugins published to PyPI,
|
|
77
|
+
> Homebrew, and GHCR, validated on real codebases. AttackMap is heuristic by
|
|
78
|
+
> design — findings are confidence-tiered evidence, not proof. Roadmap to 1.0:
|
|
79
|
+
> [issue #209](https://github.com/mlaify/AttackMap/issues/209).
|
|
80
|
+
|
|
81
|
+
Full documentation: **[docs.matthewd.xyz](https://docs.matthewd.xyz)** ·
|
|
82
|
+
architecture & internals: **[wiki](https://github.com/mlaify/AttackMap/wiki)**.
|
|
83
|
+
|
|
84
|
+
### The macOS app
|
|
85
|
+
|
|
86
|
+
Prefer a GUI? A native macOS front-end drives this CLI and renders every result
|
|
87
|
+
view — `brew install --cask mlaify/tap/attackmap-app` (pulls the CLI too).
|
|
88
|
+
|
|
89
|
+
| Overview | Exploitability |
|
|
90
|
+
|---|---|
|
|
91
|
+
| [](https://docs.matthewd.xyz/gui/) | [](https://docs.matthewd.xyz/gui/) |
|
|
92
|
+
|
|
93
|
+
*Scanning OWASP Juice Shop. Walkthrough in the [macOS app docs](https://docs.matthewd.xyz/gui/); source at [mlaify/AttackMap-mac](https://github.com/mlaify/AttackMap-mac).*
|
|
94
|
+
|
|
95
|
+
## Quickstart
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pip install "attackmap[all]" # or: brew install mlaify/tap/attackmap
|
|
99
|
+
attackmap analyze /path/to/repo # heuristic review → reports/
|
|
100
|
+
attackmap analyze /path/to/repo --llm # + AI-narrated review (Claude or OpenAI)
|
|
101
|
+
attackmap analyze ./svc-a ./svc-b ./gw # cross-repo / fleet scan
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Read `reports/defensive-review.md` for the heuristic review, and (with `--llm`)
|
|
105
|
+
`reports/defensive-review-llm.md` for the AI narration. `--llm` resolves auth
|
|
106
|
+
automatically (`ANTHROPIC_API_KEY`, or your Claude/`codex` CLI subscription); add
|
|
107
|
+
`--llm-provider openai` for OpenAI/Codex.
|
|
108
|
+
|
|
109
|
+
Other install paths: `pip install attackmap` (core only) or `"attackmap[llm]"`;
|
|
110
|
+
`docker run --rm -v "$PWD:/src" ghcr.io/mlaify/attackmap analyze /src`. Not sure
|
|
111
|
+
which analyzer plugins a repo needs? `attackmap suggest ./repo`. Full install and
|
|
112
|
+
CI setup: **[docs.matthewd.xyz/install](https://docs.matthewd.xyz/install/)**.
|
|
113
|
+
|
|
114
|
+
## What it finds
|
|
115
|
+
|
|
116
|
+
- **Attack-surface recon** — routes, data stores, external calls, auth signals,
|
|
117
|
+
secrets, frameworks, entrypoints; every signal carries a `file:line` citation,
|
|
118
|
+
evidence snippet, and confidence.
|
|
119
|
+
- **Data-flow / injection taint** (Python, JS/TS, Go, PHP) — SSRF, SSTI, NoSQL,
|
|
120
|
+
unsafe deserialization, eval/exec/shell, SQL, open redirect — sanitizer-aware,
|
|
121
|
+
with a deterministic 0–100 **exploitability score**.
|
|
122
|
+
- **Novel vuln classes** — prototype pollution, mass assignment, JWT, XXE, ReDoS,
|
|
123
|
+
insecure upload, GraphQL exposure; **BOLA/IDOR** authorization; insecure-crypto
|
|
124
|
+
& web-hardening; anomaly/outlier + signature-free **invariant mining**.
|
|
125
|
+
- **Dependency CVEs** (`--cve`) — SBOM + lockfile resolution against OSV.dev,
|
|
126
|
+
folded into the exploitability score.
|
|
127
|
+
- **Unknown-bug discovery** — `--hunt --verify` (a multi-pass, majority-vote LLM
|
|
128
|
+
jury), verifier-gated `--recall`, and **cross-repo / fleet** analysis:
|
|
129
|
+
confused-deputy flows, trust-assumption gaps, and the sibling service that omits
|
|
130
|
+
a control its peers enforce.
|
|
131
|
+
- **Workflow** — `--triage`, `--remediate`, finding suppression, baseline diff
|
|
132
|
+
gating, SARIF + Mermaid/Graphviz output, and a GitHub **Action + PR bot**.
|
|
133
|
+
|
|
134
|
+
Each run writes Markdown, JSON (`attackmap-report.json`), **SARIF 2.1.0**, and
|
|
135
|
+
diagram artifacts; fleet runs add `fleet-summary.{md,json}` + `fleet-graph.md`.
|
|
136
|
+
See the [outputs reference](https://docs.matthewd.xyz/scanning/) for the full list.
|
|
137
|
+
|
|
138
|
+
## Supported ecosystems
|
|
139
|
+
|
|
140
|
+
Fourteen analyzer plugins (each installable on its own; `[all]` installs every one):
|
|
141
|
+
**Python**, **JavaScript/TypeScript** (Node services), **Go**, **Java/Kotlin**
|
|
142
|
+
(Spring), **C#** (ASP.NET Core), **Rust**, **PHP** (web / Laminas / Omeka-S),
|
|
143
|
+
**C**, **C++**, **Terraform**, **IaC** (Docker / compose / GitHub Actions),
|
|
144
|
+
**AT Protocol**. Details: [analyzers reference](https://docs.matthewd.xyz/analyzers/).
|
|
145
|
+
Write your own against the documented [analyzer SDK](docs/external-analyzers.md).
|
|
146
|
+
|
|
147
|
+
## CLI cheat-sheet
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
attackmap analyze <path> # review a repo (--output dir, --format all|json|markdown)
|
|
151
|
+
attackmap analyze repoA repoB … # multi-repo fleet scan
|
|
152
|
+
attackmap analyze <path> --cve # dependency CVEs (OSV.dev)
|
|
153
|
+
attackmap analyze <path> --recall # widen taint discovery (extra reach = SPECULATIVE)
|
|
154
|
+
attackmap analyze <path> --llm # AI narrative (--llm-provider claude|openai)
|
|
155
|
+
attackmap analyze <path> --hunt --verify # LLM exploit-hypothesis hunt, adjudicated vs. source
|
|
156
|
+
attackmap analyze <path> --triage # cluster/dedupe/rank existing findings
|
|
157
|
+
attackmap analyze <path> --remediate # review-first fix suggestions
|
|
158
|
+
attackmap analyze <path> --baseline prev.json --fail-on-new-high # PR gate
|
|
159
|
+
attackmap suggest ./repo # recommend analyzer plugins · attackmap modules # list installed
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Verify-jury knobs (`--verify-votes` / `--hunt-lenses` / `--hunt-rounds` /
|
|
163
|
+
`--hunt-budget`) and suppression (`--no-suppress` / `--suppress-file`) are
|
|
164
|
+
documented in the [CLI reference](https://docs.matthewd.xyz/cli/).
|
|
165
|
+
|
|
166
|
+
## What AttackMap is *not*
|
|
167
|
+
|
|
168
|
+
- **Not a runtime detector.** It's static; its detection hints are leads for your
|
|
169
|
+
SIEM team, not deployable rules.
|
|
170
|
+
- **Not a replacement for dedicated SCA.** `--cve` folds CVE signal into an
|
|
171
|
+
architecture-aware narrative; Trivy/Grype/Dependabot go deeper on resolution.
|
|
172
|
+
- **Not a sound taint engine.** The data-flow pass is a call-graph-refined
|
|
173
|
+
import-graph walk — precision over recall; findings are evidence, not proof.
|
|
174
|
+
- **Not exhaustive.** Heuristic by design, with explicit confidence tiers and
|
|
175
|
+
guardrails for stale signals.
|
|
176
|
+
|
|
177
|
+
## Documentation & links
|
|
178
|
+
|
|
179
|
+
- **[docs.matthewd.xyz](https://docs.matthewd.xyz)** — user guide, install, CLI,
|
|
180
|
+
analyzers, SDK
|
|
181
|
+
- **[Wiki](https://github.com/mlaify/AttackMap/wiki)** — architecture, roadmap,
|
|
182
|
+
contributor references
|
|
183
|
+
- **[Roadmap / Bug Triage / Kanban](https://github.com/orgs/mlaify/projects)** —
|
|
184
|
+
project boards · [Road to 1.0](https://github.com/mlaify/AttackMap/issues/209)
|
|
185
|
+
- [`CHANGELOG.md`](CHANGELOG.md) · [`CONTRIBUTING.md`](CONTRIBUTING.md) ·
|
|
186
|
+
[`SECURITY.md`](SECURITY.md) · [`VISION.md`](VISION.md)
|
|
187
|
+
|
|
188
|
+
## Special thanks
|
|
189
|
+
|
|
190
|
+
AttackMap is built by its contributors.
|
|
191
|
+
|
|
192
|
+
<a href="https://github.com/mlaify/AttackMap/graphs/contributors"><img src="https://contrib.rocks/image?repo=mlaify/AttackMap" alt="AttackMap contributors" /></a>
|
|
193
|
+
|
|
194
|
+
## Contributing
|
|
195
|
+
|
|
196
|
+
Issues and PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). By contributing
|
|
197
|
+
you agree your contributions will be MIT-licensed.
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
[MIT](LICENSE). Copyright (c) 2026 Matthew Davis and AttackMap Contributors.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# AttackMap
|
|
2
|
+
|
|
3
|
+
**Local-first, AI-assisted defensive security analysis for codebases.** AttackMap
|
|
4
|
+
reads a repository (or a whole fleet of them), reconstructs the attack surface —
|
|
5
|
+
routes, data stores, external calls, auth signals, trust boundaries — traces
|
|
6
|
+
request-to-sink data flow, and produces an evidence-grounded, prioritized security
|
|
7
|
+
review. It finds the cross-cutting weaknesses single-file scanners miss, and never
|
|
8
|
+
sends your code anywhere.
|
|
9
|
+
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://pypi.org/project/attackmap/)
|
|
12
|
+
[](https://www.python.org/)
|
|
13
|
+
|
|
14
|
+
> **Status: beta (v0.4.27).** Core engine + 14 analyzer plugins published to PyPI,
|
|
15
|
+
> Homebrew, and GHCR, validated on real codebases. AttackMap is heuristic by
|
|
16
|
+
> design — findings are confidence-tiered evidence, not proof. Roadmap to 1.0:
|
|
17
|
+
> [issue #209](https://github.com/mlaify/AttackMap/issues/209).
|
|
18
|
+
|
|
19
|
+
Full documentation: **[docs.matthewd.xyz](https://docs.matthewd.xyz)** ·
|
|
20
|
+
architecture & internals: **[wiki](https://github.com/mlaify/AttackMap/wiki)**.
|
|
21
|
+
|
|
22
|
+
### The macOS app
|
|
23
|
+
|
|
24
|
+
Prefer a GUI? A native macOS front-end drives this CLI and renders every result
|
|
25
|
+
view — `brew install --cask mlaify/tap/attackmap-app` (pulls the CLI too).
|
|
26
|
+
|
|
27
|
+
| Overview | Exploitability |
|
|
28
|
+
|---|---|
|
|
29
|
+
| [](https://docs.matthewd.xyz/gui/) | [](https://docs.matthewd.xyz/gui/) |
|
|
30
|
+
|
|
31
|
+
*Scanning OWASP Juice Shop. Walkthrough in the [macOS app docs](https://docs.matthewd.xyz/gui/); source at [mlaify/AttackMap-mac](https://github.com/mlaify/AttackMap-mac).*
|
|
32
|
+
|
|
33
|
+
## Quickstart
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install "attackmap[all]" # or: brew install mlaify/tap/attackmap
|
|
37
|
+
attackmap analyze /path/to/repo # heuristic review → reports/
|
|
38
|
+
attackmap analyze /path/to/repo --llm # + AI-narrated review (Claude or OpenAI)
|
|
39
|
+
attackmap analyze ./svc-a ./svc-b ./gw # cross-repo / fleet scan
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Read `reports/defensive-review.md` for the heuristic review, and (with `--llm`)
|
|
43
|
+
`reports/defensive-review-llm.md` for the AI narration. `--llm` resolves auth
|
|
44
|
+
automatically (`ANTHROPIC_API_KEY`, or your Claude/`codex` CLI subscription); add
|
|
45
|
+
`--llm-provider openai` for OpenAI/Codex.
|
|
46
|
+
|
|
47
|
+
Other install paths: `pip install attackmap` (core only) or `"attackmap[llm]"`;
|
|
48
|
+
`docker run --rm -v "$PWD:/src" ghcr.io/mlaify/attackmap analyze /src`. Not sure
|
|
49
|
+
which analyzer plugins a repo needs? `attackmap suggest ./repo`. Full install and
|
|
50
|
+
CI setup: **[docs.matthewd.xyz/install](https://docs.matthewd.xyz/install/)**.
|
|
51
|
+
|
|
52
|
+
## What it finds
|
|
53
|
+
|
|
54
|
+
- **Attack-surface recon** — routes, data stores, external calls, auth signals,
|
|
55
|
+
secrets, frameworks, entrypoints; every signal carries a `file:line` citation,
|
|
56
|
+
evidence snippet, and confidence.
|
|
57
|
+
- **Data-flow / injection taint** (Python, JS/TS, Go, PHP) — SSRF, SSTI, NoSQL,
|
|
58
|
+
unsafe deserialization, eval/exec/shell, SQL, open redirect — sanitizer-aware,
|
|
59
|
+
with a deterministic 0–100 **exploitability score**.
|
|
60
|
+
- **Novel vuln classes** — prototype pollution, mass assignment, JWT, XXE, ReDoS,
|
|
61
|
+
insecure upload, GraphQL exposure; **BOLA/IDOR** authorization; insecure-crypto
|
|
62
|
+
& web-hardening; anomaly/outlier + signature-free **invariant mining**.
|
|
63
|
+
- **Dependency CVEs** (`--cve`) — SBOM + lockfile resolution against OSV.dev,
|
|
64
|
+
folded into the exploitability score.
|
|
65
|
+
- **Unknown-bug discovery** — `--hunt --verify` (a multi-pass, majority-vote LLM
|
|
66
|
+
jury), verifier-gated `--recall`, and **cross-repo / fleet** analysis:
|
|
67
|
+
confused-deputy flows, trust-assumption gaps, and the sibling service that omits
|
|
68
|
+
a control its peers enforce.
|
|
69
|
+
- **Workflow** — `--triage`, `--remediate`, finding suppression, baseline diff
|
|
70
|
+
gating, SARIF + Mermaid/Graphviz output, and a GitHub **Action + PR bot**.
|
|
71
|
+
|
|
72
|
+
Each run writes Markdown, JSON (`attackmap-report.json`), **SARIF 2.1.0**, and
|
|
73
|
+
diagram artifacts; fleet runs add `fleet-summary.{md,json}` + `fleet-graph.md`.
|
|
74
|
+
See the [outputs reference](https://docs.matthewd.xyz/scanning/) for the full list.
|
|
75
|
+
|
|
76
|
+
## Supported ecosystems
|
|
77
|
+
|
|
78
|
+
Fourteen analyzer plugins (each installable on its own; `[all]` installs every one):
|
|
79
|
+
**Python**, **JavaScript/TypeScript** (Node services), **Go**, **Java/Kotlin**
|
|
80
|
+
(Spring), **C#** (ASP.NET Core), **Rust**, **PHP** (web / Laminas / Omeka-S),
|
|
81
|
+
**C**, **C++**, **Terraform**, **IaC** (Docker / compose / GitHub Actions),
|
|
82
|
+
**AT Protocol**. Details: [analyzers reference](https://docs.matthewd.xyz/analyzers/).
|
|
83
|
+
Write your own against the documented [analyzer SDK](docs/external-analyzers.md).
|
|
84
|
+
|
|
85
|
+
## CLI cheat-sheet
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
attackmap analyze <path> # review a repo (--output dir, --format all|json|markdown)
|
|
89
|
+
attackmap analyze repoA repoB … # multi-repo fleet scan
|
|
90
|
+
attackmap analyze <path> --cve # dependency CVEs (OSV.dev)
|
|
91
|
+
attackmap analyze <path> --recall # widen taint discovery (extra reach = SPECULATIVE)
|
|
92
|
+
attackmap analyze <path> --llm # AI narrative (--llm-provider claude|openai)
|
|
93
|
+
attackmap analyze <path> --hunt --verify # LLM exploit-hypothesis hunt, adjudicated vs. source
|
|
94
|
+
attackmap analyze <path> --triage # cluster/dedupe/rank existing findings
|
|
95
|
+
attackmap analyze <path> --remediate # review-first fix suggestions
|
|
96
|
+
attackmap analyze <path> --baseline prev.json --fail-on-new-high # PR gate
|
|
97
|
+
attackmap suggest ./repo # recommend analyzer plugins · attackmap modules # list installed
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Verify-jury knobs (`--verify-votes` / `--hunt-lenses` / `--hunt-rounds` /
|
|
101
|
+
`--hunt-budget`) and suppression (`--no-suppress` / `--suppress-file`) are
|
|
102
|
+
documented in the [CLI reference](https://docs.matthewd.xyz/cli/).
|
|
103
|
+
|
|
104
|
+
## What AttackMap is *not*
|
|
105
|
+
|
|
106
|
+
- **Not a runtime detector.** It's static; its detection hints are leads for your
|
|
107
|
+
SIEM team, not deployable rules.
|
|
108
|
+
- **Not a replacement for dedicated SCA.** `--cve` folds CVE signal into an
|
|
109
|
+
architecture-aware narrative; Trivy/Grype/Dependabot go deeper on resolution.
|
|
110
|
+
- **Not a sound taint engine.** The data-flow pass is a call-graph-refined
|
|
111
|
+
import-graph walk — precision over recall; findings are evidence, not proof.
|
|
112
|
+
- **Not exhaustive.** Heuristic by design, with explicit confidence tiers and
|
|
113
|
+
guardrails for stale signals.
|
|
114
|
+
|
|
115
|
+
## Documentation & links
|
|
116
|
+
|
|
117
|
+
- **[docs.matthewd.xyz](https://docs.matthewd.xyz)** — user guide, install, CLI,
|
|
118
|
+
analyzers, SDK
|
|
119
|
+
- **[Wiki](https://github.com/mlaify/AttackMap/wiki)** — architecture, roadmap,
|
|
120
|
+
contributor references
|
|
121
|
+
- **[Roadmap / Bug Triage / Kanban](https://github.com/orgs/mlaify/projects)** —
|
|
122
|
+
project boards · [Road to 1.0](https://github.com/mlaify/AttackMap/issues/209)
|
|
123
|
+
- [`CHANGELOG.md`](CHANGELOG.md) · [`CONTRIBUTING.md`](CONTRIBUTING.md) ·
|
|
124
|
+
[`SECURITY.md`](SECURITY.md) · [`VISION.md`](VISION.md)
|
|
125
|
+
|
|
126
|
+
## Special thanks
|
|
127
|
+
|
|
128
|
+
AttackMap is built by its contributors.
|
|
129
|
+
|
|
130
|
+
<a href="https://github.com/mlaify/AttackMap/graphs/contributors"><img src="https://contrib.rocks/image?repo=mlaify/AttackMap" alt="AttackMap contributors" /></a>
|
|
131
|
+
|
|
132
|
+
## Contributing
|
|
133
|
+
|
|
134
|
+
Issues and PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). By contributing
|
|
135
|
+
you agree your contributions will be MIT-licensed.
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
[MIT](LICENSE). Copyright (c) 2026 Matthew Davis and AttackMap Contributors.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "attackmap"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.29"
|
|
8
8
|
description = "AI-assisted defensive security analyzer for codebases — scans a repository, models assets and controls, finds cross-cutting weaknesses, and generates an evidence-grounded review with MITRE ATT&CK mappings and detection-engineering hints."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -69,6 +69,7 @@ all = [
|
|
|
69
69
|
"attackmap-analyzer-terraform>=0.1.0",
|
|
70
70
|
"attackmap-analyzer-c>=0.1.0",
|
|
71
71
|
"attackmap-analyzer-cpp>=0.1.0",
|
|
72
|
+
"attackmap-analyzer-swift>=0.1.0",
|
|
72
73
|
"attackmap-analyzer-node-service>=0.2.0",
|
|
73
74
|
"attackmap-analyzer-atproto>=0.1.0",
|
|
74
75
|
"attackmap-analyzer-php-web>=0.1.0",
|