attackmap 0.4.3__tar.gz → 0.4.4__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.3/src/attackmap.egg-info → attackmap-0.4.4}/PKG-INFO +1 -1
- {attackmap-0.4.3 → attackmap-0.4.4}/pyproject.toml +1 -1
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/__init__.py +1 -1
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/cli.py +25 -1
- {attackmap-0.4.3 → attackmap-0.4.4/src/attackmap.egg-info}/PKG-INFO +1 -1
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap.egg-info/SOURCES.txt +1 -0
- attackmap-0.4.4/tests/test_modules_cli.py +44 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/LICENSE +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/README.md +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/setup.cfg +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/analyzer.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/analyzer_contracts.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/analyzers.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/anomalies.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/asset_model.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/attack_taxonomy.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/authz.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/config_scanner.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/context_pack.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/control_model.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/crypto.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/cve.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/defensive_review.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/detection_opportunities.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/diagrams.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/diff.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/exploitability.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/graph.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/insights.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/llm_review.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/merge.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/models.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/progress.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/recon_models.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/recon_to_analysis.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/report.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/review_eval.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/review_json.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/review_prompts.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/sarif.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/sbom.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/scanner.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/sdk/__init__.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/sdk/contracts.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/sdk/models.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/security_overlay.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/srcpaths.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/suggest.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/taint.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/threat_model.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/topology.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/weaknesses.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap/webhardening.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap.egg-info/dependency_links.txt +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap.egg-info/entry_points.txt +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap.egg-info/requires.txt +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/src/attackmap.egg-info/top_level.txt +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_analyzer.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_analyzer_metadata_schema.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_analyzers.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_anomalies.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_artifact_schemas.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_authz.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_config_scanner.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_context_pack.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_crypto.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_cve.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_defensive_review.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_diagrams.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_diff.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_exploitability.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_graph.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_hunt.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_injection_sinks.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_llm_review.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_merge.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_pr_comment.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_progress.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_provenance.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_recon_to_analysis.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_remediate.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_report.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_review_eval.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_review_json.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_review_prompts.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_sarif.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_sbom.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_scanner.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_security_overlay.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_shared_contract_imports.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_signal_v2.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_srcpaths.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_suggest.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_taint.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_threat_intel.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_threat_model.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_topology.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_weaknesses.py +0 -0
- {attackmap-0.4.3 → attackmap-0.4.4}/tests/test_webhardening.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attackmap
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
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
5
|
Author: AttackMap Contributors
|
|
6
6
|
Author-email: Matthew Davis <matthewd@matthewd.xyz>
|
|
@@ -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.4"
|
|
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"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["__version__"]
|
|
2
|
-
__version__ = "0.4.
|
|
2
|
+
__version__ = "0.4.4"
|
|
@@ -449,8 +449,32 @@ def analyze(
|
|
|
449
449
|
|
|
450
450
|
|
|
451
451
|
@app.command("modules")
|
|
452
|
-
def modules(
|
|
452
|
+
def modules(
|
|
453
|
+
json_output: bool = typer.Option(
|
|
454
|
+
False,
|
|
455
|
+
"--json",
|
|
456
|
+
help="Emit the installed analyzer modules as a JSON array "
|
|
457
|
+
"(name/display_name/description/scope/ecosystems/enabled_by_default). "
|
|
458
|
+
"Network-free — the remote module-repository section is omitted. "
|
|
459
|
+
"Intended for tool / GUI front-ends that offer analyzer selection.",
|
|
460
|
+
),
|
|
461
|
+
) -> None:
|
|
453
462
|
available_modules = get_available_modules()
|
|
463
|
+
if json_output:
|
|
464
|
+
payload = [
|
|
465
|
+
{
|
|
466
|
+
"name": meta.name,
|
|
467
|
+
"display_name": meta.display_name or meta.name,
|
|
468
|
+
"description": meta.description,
|
|
469
|
+
"scope": meta.scope,
|
|
470
|
+
"ecosystems": list(meta.ecosystems),
|
|
471
|
+
"enabled_by_default": meta.enabled_by_default,
|
|
472
|
+
}
|
|
473
|
+
for meta in available_modules
|
|
474
|
+
]
|
|
475
|
+
typer.echo(json.dumps(payload, indent=2))
|
|
476
|
+
return
|
|
477
|
+
|
|
454
478
|
if not available_modules:
|
|
455
479
|
typer.echo("No analyzer modules are currently available.")
|
|
456
480
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attackmap
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
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
5
|
Author: AttackMap Contributors
|
|
6
6
|
Author-email: Matthew Davis <matthewd@matthewd.xyz>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from typer.testing import CliRunner
|
|
6
|
+
|
|
7
|
+
from attackmap.cli import app
|
|
8
|
+
|
|
9
|
+
runner = CliRunner()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_modules_json_emits_installed_modules_as_array() -> None:
|
|
13
|
+
result = runner.invoke(app, ["modules", "--json"])
|
|
14
|
+
assert result.exit_code == 0, result.output
|
|
15
|
+
|
|
16
|
+
payload = json.loads(result.output)
|
|
17
|
+
assert isinstance(payload, list) and payload, "expected a non-empty JSON array"
|
|
18
|
+
|
|
19
|
+
for entry in payload:
|
|
20
|
+
assert set(entry) >= {
|
|
21
|
+
"name",
|
|
22
|
+
"display_name",
|
|
23
|
+
"description",
|
|
24
|
+
"scope",
|
|
25
|
+
"ecosystems",
|
|
26
|
+
"enabled_by_default",
|
|
27
|
+
}
|
|
28
|
+
assert isinstance(entry["name"], str) and entry["name"]
|
|
29
|
+
assert isinstance(entry["ecosystems"], list)
|
|
30
|
+
assert isinstance(entry["enabled_by_default"], bool)
|
|
31
|
+
|
|
32
|
+
# The built-in Python web analyzer ships in-tree and runs by default.
|
|
33
|
+
by_name = {e["name"]: e for e in payload}
|
|
34
|
+
assert "python-web" in by_name
|
|
35
|
+
assert by_name["python-web"]["enabled_by_default"] is True
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_modules_json_is_network_free_and_omits_remote_section() -> None:
|
|
39
|
+
# --json must not print the "module repositories (mlaify GitHub org)" block
|
|
40
|
+
# (that section does network I/O); the output is pure JSON.
|
|
41
|
+
result = runner.invoke(app, ["modules", "--json"])
|
|
42
|
+
assert result.exit_code == 0
|
|
43
|
+
assert "GitHub org" not in result.output
|
|
44
|
+
json.loads(result.output) # parses cleanly as a whole
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|