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.

Files changed (124) hide show
  1. attackmap-0.4.29/PKG-INFO +201 -0
  2. attackmap-0.4.29/README.md +139 -0
  3. {attackmap-0.4.26 → attackmap-0.4.29}/pyproject.toml +2 -1
  4. attackmap-0.4.29/src/attackmap/bench.py +461 -0
  5. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/cli.py +73 -3
  6. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/cve.py +229 -33
  7. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/models.py +2 -2
  8. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/__init__.py +2 -0
  9. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/models.py +2 -0
  10. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/suggest.py +6 -0
  11. attackmap-0.4.29/src/attackmap.egg-info/PKG-INFO +201 -0
  12. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/SOURCES.txt +2 -0
  13. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/requires.txt +1 -0
  14. attackmap-0.4.29/tests/test_bench.py +249 -0
  15. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_cve.py +199 -17
  16. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_shared_contract_imports.py +12 -0
  17. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_suggest.py +6 -0
  18. attackmap-0.4.26/PKG-INFO +0 -940
  19. attackmap-0.4.26/README.md +0 -879
  20. attackmap-0.4.26/src/attackmap.egg-info/PKG-INFO +0 -940
  21. {attackmap-0.4.26 → attackmap-0.4.29}/LICENSE +0 -0
  22. {attackmap-0.4.26 → attackmap-0.4.29}/setup.cfg +0 -0
  23. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/__init__.py +0 -0
  24. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzer.py +0 -0
  25. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzer_contracts.py +0 -0
  26. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/analyzers.py +0 -0
  27. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/anomalies.py +0 -0
  28. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/asset_model.py +0 -0
  29. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/attack_taxonomy.py +0 -0
  30. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/authz.py +0 -0
  31. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/config_scanner.py +0 -0
  32. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/context_pack.py +0 -0
  33. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/contracts.py +0 -0
  34. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/control_model.py +0 -0
  35. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/crossrepo.py +0 -0
  36. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/crypto.py +0 -0
  37. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/defensive_review.py +0 -0
  38. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/detection_opportunities.py +0 -0
  39. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/diagrams.py +0 -0
  40. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/diff.py +0 -0
  41. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/exploitability.py +0 -0
  42. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/fleet.py +0 -0
  43. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/graph.py +0 -0
  44. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/hunt_harness.py +0 -0
  45. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/insights.py +0 -0
  46. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/llm_review.py +0 -0
  47. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/lockfiles.py +0 -0
  48. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/merge.py +0 -0
  49. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/progress.py +0 -0
  50. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/recon_models.py +0 -0
  51. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/recon_to_analysis.py +0 -0
  52. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/report.py +0 -0
  53. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_eval.py +0 -0
  54. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_json.py +0 -0
  55. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/review_prompts.py +0 -0
  56. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/route_auth_fusion.py +0 -0
  57. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sarif.py +0 -0
  58. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sbom.py +0 -0
  59. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/scanner.py +0 -0
  60. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/sdk/contracts.py +0 -0
  61. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/security_overlay.py +0 -0
  62. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/srcpaths.py +0 -0
  63. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/suppress.py +0 -0
  64. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/taint.py +0 -0
  65. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/threat_model.py +0 -0
  66. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/topology.py +0 -0
  67. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/triage.py +0 -0
  68. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/weaknesses.py +0 -0
  69. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/webhardening.py +0 -0
  70. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap/workflow_scanner.py +0 -0
  71. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/dependency_links.txt +0 -0
  72. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/entry_points.txt +0 -0
  73. {attackmap-0.4.26 → attackmap-0.4.29}/src/attackmap.egg-info/top_level.txt +0 -0
  74. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzer.py +0 -0
  75. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzer_metadata_schema.py +0 -0
  76. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_analyzers.py +0 -0
  77. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_anomalies.py +0 -0
  78. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_artifact_schemas.py +0 -0
  79. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_authz.py +0 -0
  80. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_config_scanner.py +0 -0
  81. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_context_pack.py +0 -0
  82. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_contracts.py +0 -0
  83. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_crossrepo.py +0 -0
  84. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_crypto.py +0 -0
  85. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_defensive_review.py +0 -0
  86. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_diagrams.py +0 -0
  87. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_diff.py +0 -0
  88. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_exploitability.py +0 -0
  89. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_fleet.py +0 -0
  90. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_graph.py +0 -0
  91. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_hunt.py +0 -0
  92. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_hunt_harness.py +0 -0
  93. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_injection_sinks.py +0 -0
  94. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_llm_review.py +0 -0
  95. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_lockfiles.py +0 -0
  96. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_merge.py +0 -0
  97. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_modules_cli.py +0 -0
  98. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_pr_comment.py +0 -0
  99. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_progress.py +0 -0
  100. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_provenance.py +0 -0
  101. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_recall.py +0 -0
  102. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_recon_to_analysis.py +0 -0
  103. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_remediate.py +0 -0
  104. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_report.py +0 -0
  105. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_eval.py +0 -0
  106. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_json.py +0 -0
  107. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_review_prompts.py +0 -0
  108. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_route_auth_fusion.py +0 -0
  109. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_sarif.py +0 -0
  110. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_sbom.py +0 -0
  111. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_scanner.py +0 -0
  112. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_security_overlay.py +0 -0
  113. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_signal_v2.py +0 -0
  114. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_srcpaths.py +0 -0
  115. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_suppress.py +0 -0
  116. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_taint.py +0 -0
  117. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_taint_sanitizer.py +0 -0
  118. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_threat_intel.py +0 -0
  119. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_threat_model.py +0 -0
  120. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_topology.py +0 -0
  121. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_triage.py +0 -0
  122. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_weaknesses.py +0 -0
  123. {attackmap-0.4.26 → attackmap-0.4.29}/tests/test_webhardening.py +0 -0
  124. {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: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
73
+ [![PyPI](https://img.shields.io/pypi/v/attackmap.svg)](https://pypi.org/project/attackmap/)
74
+ [![Python: 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](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
+ | [![AttackMap macOS app — overview](https://raw.githubusercontent.com/mlaify/AttackMap/main/docs/screenshots/04-overview.png)](https://docs.matthewd.xyz/gui/) | [![AttackMap macOS app — exploitability](https://raw.githubusercontent.com/mlaify/AttackMap/main/docs/screenshots/06-exploitability-ranked.png)](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: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
11
+ [![PyPI](https://img.shields.io/pypi/v/attackmap.svg)](https://pypi.org/project/attackmap/)
12
+ [![Python: 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](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
+ | [![AttackMap macOS app — overview](https://raw.githubusercontent.com/mlaify/AttackMap/main/docs/screenshots/04-overview.png)](https://docs.matthewd.xyz/gui/) | [![AttackMap macOS app — exploitability](https://raw.githubusercontent.com/mlaify/AttackMap/main/docs/screenshots/06-exploitability-ranked.png)](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.26"
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",