@clear-capabilities/agentic-security-scanner 0.148.1 → 0.148.3
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.
- package/CHANGELOG.md +83 -0
- package/bin/agentic-security.js +5 -1
- package/dist/4970.index.js +58 -2
- package/dist/agentic-security.mjs +2 -2
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/dist/compliance-frameworks/ccpa.json +2 -0
- package/dist/compliance-frameworks/eu-ai-act.json +12 -16
- package/dist/compliance-frameworks/gdpr.json +8 -6
- package/dist/compliance-frameworks/hipaa-security-rule.json +9 -9
- package/dist/compliance-frameworks/nist-800-171-r3.json +6 -5
- package/dist/compliance-frameworks/nist-ai-600-1.json +6 -4
- package/dist/compliance-frameworks/nist-csf-2.json +6 -5
- package/dist/compliance-frameworks/nist-privacy-1-1.json +20 -10
- package/dist/compliance-frameworks/owasp-asvs-5.json +2 -0
- package/dist/compliance-frameworks/owasp-llm-top-10.json +10 -11
- package/package.json +4 -3
- package/src/engine.js +14 -0
- package/src/pipeline/assurance-mode.js +58 -2
- package/src/posture/accuracy-scorecard.js +34 -0
- package/src/posture/aibom.js +22 -0
- package/src/posture/artifact-registry.js +2 -0
- package/src/posture/auditor-walkthrough.js +91 -35
- package/src/posture/compliance-frameworks/ccpa.json +2 -0
- package/src/posture/compliance-frameworks/eu-ai-act.json +12 -16
- package/src/posture/compliance-frameworks/gdpr.json +8 -6
- package/src/posture/compliance-frameworks/hipaa-security-rule.json +9 -9
- package/src/posture/compliance-frameworks/nist-800-171-r3.json +6 -5
- package/src/posture/compliance-frameworks/nist-ai-600-1.json +6 -4
- package/src/posture/compliance-frameworks/nist-csf-2.json +6 -5
- package/src/posture/compliance-frameworks/nist-privacy-1-1.json +20 -10
- package/src/posture/compliance-frameworks/owasp-asvs-5.json +2 -0
- package/src/posture/compliance-frameworks/owasp-llm-top-10.json +10 -11
- package/src/posture/verifier.js +70 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
50ac012aad784a997fa9c835b7f9c38c1f482592eb6e2876e96e488d6e46f4f4 agentic-security.mjs
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
"publisher": "California Legislature",
|
|
5
5
|
"license": "California statute (public)",
|
|
6
6
|
"url": "https://leginfo.legislature.ca.gov/faces/codes_displayText.xhtml?division=3.&part=4.&lawCode=CIV&title=1.81.5",
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch): resolves to California Civil Code Title 1.81.5 sections 1798.100-1798.145, correctly reflecting amendments through Stats. 2025, Ch. 67 (effective 2026-01-01). No content hash is pinned deliberately: this URL serves the CURRENT, continuously-amended text of codified law by design, not a fixed publication, hash-pinning would misrepresent a living legal source as a static one.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 4 of the CCPA/CPRA obligations, chosen because a code scanner can produce evidence for them. The statute is far broader; the majority of its duties (notice, consumer request handling, contracts, retention policy) are organisational and are NOT represented here. Absence of a control is not a statement of compliance.",
|
|
8
10
|
"controlsDigest": "ebc1f708c329ab42",
|
|
9
11
|
"controlCount": 4,
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
"publisher": "European Parliament & Council",
|
|
5
5
|
"license": "EU law (Official Journal)",
|
|
6
6
|
"url": "https://eur-lex.europa.eu/eli/reg/2024/1689/oj",
|
|
7
|
+
"sourceVerificationAttempted": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verification attempted 2026-09-07 and NOT completed: eur-lex.europa.eu returned HTTP 202 with an empty body and an x-amzn-waf-action: challenge header (AWS WAF bot challenge), both via the WebFetch tool and via a direct curl request with a standard browser User-Agent. This is recorded honestly as an unverified URL rather than a false confirmation. GDPR (the sibling eur-lex.europa.eu/eli/reg/2016/679/oj source, same domain) resolved successfully in the same session, so this appears to be per-request or per-path challenge behavior, not a durable domain-wide block. Re-attempt this check periodically; a human should confirm the URL manually until automated verification succeeds.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 7 obligations drawn from the high-risk-system and GPAI articles where a code signal exists. The Act is far broader; conformity assessment, registration, human oversight and post-market monitoring are organisational and are NOT represented here.",
|
|
8
|
-
"controlsDigest": "
|
|
10
|
+
"controlsDigest": "f63f5763df191224",
|
|
9
11
|
"controlCount": 7,
|
|
10
12
|
"controls": [
|
|
11
13
|
{
|
|
@@ -53,11 +55,10 @@
|
|
|
53
55
|
"summary": "Record-keeping — automatic logging of system events for traceability.",
|
|
54
56
|
"codeTestable": "partial",
|
|
55
57
|
"evidence": [
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
+
"Scan history retained.",
|
|
59
|
+
"Removed module:mcp-audit after a second-review pass: mcp-audit.log records calls to THIS tool's own MCP server, i.e. how an agent used this scanner — it is not evidence that the assessed AI system logs its own events. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework."
|
|
58
60
|
],
|
|
59
61
|
"mapsTo": [
|
|
60
|
-
"module:mcp-audit",
|
|
61
62
|
"module:scan-history"
|
|
62
63
|
]
|
|
63
64
|
},
|
|
@@ -66,11 +67,10 @@
|
|
|
66
67
|
"summary": "Transparency — instructions for use enable users to interpret the system's output correctly.",
|
|
67
68
|
"codeTestable": "partial",
|
|
68
69
|
"evidence": [
|
|
69
|
-
"why-fired
|
|
70
|
+
"Removed module:why-fired after adversarial premortem Q6 (2026-09-07, re-run): why-fired.js explains why THIS SCANNER's OWN detectors fired on a finding ('the user can see exactly what produced the finding without reading the scanner source' — its own header comment) — it is provenance for this tool's decisions, not evidence that the ASSESSED AI system gives its own users instructions to interpret ITS OWN output, which is what Article 13 actually asks. Every other control in this framework uses 'the system' to mean the assessed AI product (Art.9's risk management system, Art.12's event logging), so this reads Art.13 the same way rather than as an exception. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework — this one was initially judged a borderline, undecided open question in the first premortem pass and is now adjudicated on a full reading of the actual control text and the actual module code.",
|
|
71
|
+
"Reported as an engine gap: whether an assessed AI system documents its own output for its own users is not something this engine, which never sees the assessed system's user-facing product surface, can evidence at all."
|
|
70
72
|
],
|
|
71
|
-
"mapsTo": [
|
|
72
|
-
"module:why-fired"
|
|
73
|
-
]
|
|
73
|
+
"mapsTo": []
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
76
|
"id": "Art.14",
|
|
@@ -78,10 +78,9 @@
|
|
|
78
78
|
"codeTestable": "partial",
|
|
79
79
|
"evidence": [
|
|
80
80
|
"Fix application requires confirm:true.",
|
|
81
|
-
"
|
|
81
|
+
"Removed module:pre-edit-bodyguard after a second-review pass: that file is this scanning tool's OWN installed hook, not an artifact of the assessed AI system. Its presence only shows this tool's plugin is installed, never that the assessed system itself permits human override or interruption. Category error (self-referential: about this tool, not the target)."
|
|
82
82
|
],
|
|
83
83
|
"mapsTo": [
|
|
84
|
-
"module:pre-edit-bodyguard",
|
|
85
84
|
"module:apply-fix"
|
|
86
85
|
]
|
|
87
86
|
},
|
|
@@ -90,13 +89,10 @@
|
|
|
90
89
|
"summary": "Accuracy, robustness, cybersecurity — appropriate level of accuracy and resilience.",
|
|
91
90
|
"codeTestable": "partial",
|
|
92
91
|
"evidence": [
|
|
93
|
-
"
|
|
94
|
-
"
|
|
92
|
+
"No automated signal in this engine after a second-review pass removed both prior mappings. module:calibration and module:holdout-eval pointed at THIS scanner's own ML calibration corpus and held-out evaluation labels (calibration-seed.json, holdout-eval.jsonl) — files that describe how accurately this tool's OWN detectors are calibrated, not whether the assessed AI system has an appropriate level of accuracy, robustness or cybersecurity. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework.",
|
|
93
|
+
"Reported as an engine gap: an AI system's own accuracy/robustness testing is code-observable in principle (evaluation harnesses, robustness test suites in the assessed system's own repo), but no detector here looks for that in the SCANNED project."
|
|
95
94
|
],
|
|
96
|
-
"mapsTo": [
|
|
97
|
-
"module:calibration",
|
|
98
|
-
"module:holdout-eval"
|
|
99
|
-
]
|
|
95
|
+
"mapsTo": []
|
|
100
96
|
}
|
|
101
97
|
]
|
|
102
98
|
}
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
"publisher": "European Parliament & Council",
|
|
5
5
|
"license": "EU law (Official Journal)",
|
|
6
6
|
"url": "https://eur-lex.europa.eu/eli/reg/2016/679/oj",
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch): eur-lex.europa.eu/eli/reg/2016/679/oj resolves to the consolidated text of Regulation (EU) 2016/679 (GDPR), confirming Articles 5, 25, 32, 33, 35 and 44 (the six represented here) match the mapped summaries. No content hash is pinned deliberately: EUR-Lex serves the CURRENT consolidated text and its page template can change independently of the legal text itself, so a page hash would drift on template changes that carry no legal-content change and would need constant, meaningless re-pinning — hash-pinning would misrepresent a living legal source as a static publication.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 6 articles where a code scanner can produce evidence (security of processing, data minimisation, DPIA inputs). GDPR has 99 articles; lawful basis, data-subject rights, transfers and records of processing are organisational and are NOT represented here.",
|
|
8
|
-
"controlsDigest": "
|
|
10
|
+
"controlsDigest": "cd018b0daad4fa66",
|
|
9
11
|
"controlCount": 6,
|
|
10
12
|
"controls": [
|
|
11
13
|
{
|
|
@@ -67,11 +69,10 @@
|
|
|
67
69
|
"codeTestable": "partial",
|
|
68
70
|
"evidence": [
|
|
69
71
|
"Fix history retained.",
|
|
70
|
-
"
|
|
72
|
+
"Removed module:mcp-audit after a second-review pass: mcp-audit.log records calls to THIS tool's own MCP server, not the controller's own breach-detection or notification workflow. Category error (self-referential: about this tool, not the target)."
|
|
71
73
|
],
|
|
72
74
|
"mapsTo": [
|
|
73
|
-
"module:fix-history"
|
|
74
|
-
"module:mcp-audit"
|
|
75
|
+
"module:fix-history"
|
|
75
76
|
]
|
|
76
77
|
},
|
|
77
78
|
{
|
|
@@ -79,10 +80,11 @@
|
|
|
79
80
|
"summary": "Data protection impact assessment (DPIA) for high-risk processing.",
|
|
80
81
|
"codeTestable": "partial",
|
|
81
82
|
"evidence": [
|
|
82
|
-
"DPIA artifact present at .agentic-security/dpia.md."
|
|
83
|
+
"DPIA artifact present at .agentic-security/dpia.md (privacy-taint.js's emitDpiaArtifact).",
|
|
84
|
+
"Fixed a malformed mapsTo entry (adversarial premortem Q2, 2026-09-07): 'module:privacy-taint:emitDpiaArtifact' does not match any key in the ARTIFACT vocabulary table (auditor-walkthrough.js parses everything after 'module:' as one literal key, with no ':'-suffix syntax) — this control could never read 'present' via this leg, on any project, since the mapping shipped. Corrected to the real key, 'module:privacy-taint'."
|
|
83
85
|
],
|
|
84
86
|
"mapsTo": [
|
|
85
|
-
"module:privacy-taint
|
|
87
|
+
"module:privacy-taint"
|
|
86
88
|
]
|
|
87
89
|
}
|
|
88
90
|
]
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
"publisher": "US Department of Health and Human Services",
|
|
5
5
|
"license": "US Federal regulation (public)",
|
|
6
6
|
"url": "https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164",
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verified 2026-09-07: the WebFetch tool was blocked by eCFR's automated bot detection (redirected to unblock.federalregister.gov, a CAPTCHA challenge). Verified instead via a direct HTTP request (curl with a standard browser User-Agent, HTTP 200), confirming sections 164.302/304/306/308 (the HIPAA Security Rule administrative safeguards) are present at this URL. No content hash is pinned: eCFR explicitly serves the CURRENT version of the regulation by design (the URL path itself says \"current\"), so hash-pinning would treat a living regulatory text as a fixed publication.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 8 of the Security Rule technical safeguards. Administrative and physical safeguards are outside what a code scanner can observe and are NOT represented here.",
|
|
8
|
-
"controlsDigest": "
|
|
10
|
+
"controlsDigest": "4be9e2264a574e33",
|
|
9
11
|
"controlCount": 8,
|
|
10
12
|
"controls": [
|
|
11
13
|
{
|
|
@@ -73,10 +75,10 @@
|
|
|
73
75
|
"summary": "Audit controls — record and examine activity in systems containing PHI.",
|
|
74
76
|
"codeTestable": "partial",
|
|
75
77
|
"evidence": [
|
|
76
|
-
"
|
|
78
|
+
"Fix history present and hash-chained.",
|
|
79
|
+
"Removed module:mcp-audit after a second-review pass: mcp-audit.log records calls to THIS tool's own MCP server, not activity in the covered entity's own systems containing PHI. Category error (self-referential: about this tool, not the target)."
|
|
77
80
|
],
|
|
78
81
|
"mapsTo": [
|
|
79
|
-
"module:mcp-audit",
|
|
80
82
|
"module:fix-history"
|
|
81
83
|
]
|
|
82
84
|
},
|
|
@@ -85,13 +87,11 @@
|
|
|
85
87
|
"summary": "Integrity — PHI not altered or destroyed in an unauthorized manner.",
|
|
86
88
|
"codeTestable": "partial",
|
|
87
89
|
"evidence": [
|
|
88
|
-
"last-scan.json
|
|
89
|
-
"Sigstore
|
|
90
|
+
"Removed module:integrity after a second-review pass: last-scan.json.sig is this scanner signing its OWN scan output, not evidence that the covered entity's PHI is protected from unauthorized alteration or destruction. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework.",
|
|
91
|
+
"Removed module:sigstore-verify after a second-review pass (adversarial premortem Q1, 2026-09-07): sigstore-attestations/ is never written anywhere in this codebase — the real Sigstore verification logic (scanner/src/sca/sigstore-verify.js) caches results in a per-user home-directory cache (~/.claude/agentic-security/sigstore-cache/), shared across every project scanned on that machine, by design (content-addressed by package sha256, correctly reused rather than duplicated per project). Its own annotation call is fire-and-forget async in engine.js, not awaited, so even a project-relative summary write would not reliably complete before the scan process exits — building one blind, without first fixing that completion guarantee, was judged a bigger and riskier change than this task's scope, so this mapping is disclosed as a gap instead of built unverified.",
|
|
92
|
+
"Reported as an engine gap: whether PHI integrity is protected against unauthorized alteration or destruction is code-observable in principle (checksums, WORM storage, tamper-evident logging in the covered entity's own application code), but no detector here evidences that in the SCANNED project."
|
|
90
93
|
],
|
|
91
|
-
"mapsTo": [
|
|
92
|
-
"module:integrity",
|
|
93
|
-
"module:sigstore-verify"
|
|
94
|
-
]
|
|
94
|
+
"mapsTo": []
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
"id": "§164.312(e)",
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
"publisher": "NIST",
|
|
5
5
|
"license": "public-domain (US Federal publication)",
|
|
6
6
|
"url": "https://csrc.nist.gov/pubs/sp/800/171/r3/final",
|
|
7
|
+
"sourceDoi": "https://doi.org/10.6028/NIST.SP.800-171r3",
|
|
8
|
+
"sourcePdfSha256": "3e4631df8b5d61f40a6e542b52779ef30ddbbfff31e09214fa94ad6e6f5e6d08",
|
|
9
|
+
"sourceVerificationNote": "Verified 2026-09-07: the CSRC landing page URL resolves and states title \"Protecting Controlled Unclassified Information in Nonfederal Systems and Organizations\", Rev. 3, published May 2024. The DOI resolves (302) to the PDF at nvlpubs.nist.gov, whose own embedded XMP metadata (pdfx:DOI, pdfx:Comments) confirms NIST.SP.800-171r3. sourcePdfSha256 is the SHA-256 of that exact downloaded PDF, so a future re-check can detect if NIST republishes under the same URL/DOI with different content. This does not verify the CSV control export against the PDF text control-by-control — see scripts/nist-800-171/README for that gap.",
|
|
7
10
|
"note": "Control text is generated from docs/standards/NIST_SP_800_171r3_Controls.csv by scripts/nist-800-171/build-catalog.py. The codeTestable rating is THIS ENGINE'S judgment, not NIST's. Unlike the AI 600-1 workbook, the 800-171 export rates no control for testability. Ratings and their rationales live in scripts/nist-800-171/code-testability.json.",
|
|
8
11
|
"scope": "FULL CATALOGUE — all 97 requirements of NIST SP 800-171 Rev. 3 are carried, deliberately including those this engine cannot assess, because omitting them would read as coverage. Automated evidence is PARTIAL and unevenly distributed: 16 requirements are rated code-testable, 38 partial, and 43 are organisational, physical or personnel controls NOT represented by any automated signal: all of Awareness and Training, Personnel Security and Physical Protection, and most of Incident Response, Maintenance and Media Protection. Those are forced to 'partial' with an explicit disclosure and can never read as satisfied. This is not a CMMC assessment and produces no SPRS score.",
|
|
9
|
-
"controlsDigest": "
|
|
12
|
+
"controlsDigest": "927295dcd1594189",
|
|
10
13
|
"controlCount": 97,
|
|
11
14
|
"controls": [
|
|
12
15
|
{
|
|
@@ -330,10 +333,8 @@
|
|
|
330
333
|
"summary": "Protection of Audit Information: a. Protect audit information and audit logging tools from unauthorized access, modification, and deletion. b. Authorize access to management of audit logging functionality to only a subset of…",
|
|
331
334
|
"codeTestable": "partial",
|
|
332
335
|
"evidence": [
|
|
333
|
-
"
|
|
334
|
-
|
|
335
|
-
"mapsTo": [
|
|
336
|
-
"module:integrity"
|
|
336
|
+
"No automated signal in this engine — this tool can sign and verify its OWN scan output (module:integrity), but that evidences this scanner's integrity, not whether the SCANNED PROJECT protects its own audit logs from unauthorized access, modification or deletion. No detector here inspects the scanned codebase for log-signing, tamper-evident storage, or access controls on audit data. Removed after a second-review pass found the original mapping was a category error (self-referential: about this tool, not the target).",
|
|
337
|
+
"Reported as an engine gap: this requirement is code-observable in principle (a detector could look for tamper-evident logging libraries or access-controlled log stores in application code), but no detector here decides it."
|
|
337
338
|
]
|
|
338
339
|
},
|
|
339
340
|
{
|
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
"publisher": "NIST",
|
|
5
5
|
"license": "public-domain (US Federal publication)",
|
|
6
6
|
"url": "https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf",
|
|
7
|
+
"sourceDoi": "https://doi.org/10.6028/NIST.AI.600-1",
|
|
8
|
+
"sourcePdfSha256": "6e73620ab6b64e90ef2c04bf0e0d6246185a2f4b1b13cab0df494496cff89b6a",
|
|
9
|
+
"sourceVerificationNote": "Verified 2026-09-07: the doi.org DOI resolves (302) to this exact url, and the downloaded PDF's own embedded XMP metadata (pdfx:Category, dc:title) confirms \"NIST AI 600-1\" / \"Artificial Intelligence Risk Management Framework: Generative Artificial Intelligence Profile\". sourcePdfSha256 is the SHA-256 of that exact downloaded PDF, so a future re-check can detect if NIST republishes under the same URL/DOI with different content.",
|
|
7
10
|
"scope": "SELECTIVE SUBSET. 6 actions from the Generative AI Profile with a code-observable signal. The profile is far larger; governance, provenance and incident-response actions are organisational and are NOT represented here. The full control catalogue is built and gated separately by scripts/nist-compliance/build-catalog.py.",
|
|
8
|
-
"controlsDigest": "
|
|
11
|
+
"controlsDigest": "6e7cc01c5ba8ae22",
|
|
9
12
|
"controlCount": 6,
|
|
10
13
|
"controls": [
|
|
11
14
|
{
|
|
@@ -84,11 +87,10 @@
|
|
|
84
87
|
"summary": "Establish content provenance / authenticity controls.",
|
|
85
88
|
"codeTestable": "partial",
|
|
86
89
|
"evidence": [
|
|
87
|
-
"
|
|
88
|
-
"
|
|
90
|
+
"ATTRIBUTIONS.md generated.",
|
|
91
|
+
"Removed module:sigstore-verify after a second-review pass (adversarial premortem Q1, 2026-09-07): sigstore-attestations/ is never written anywhere in this codebase — see the identical removal note on hipaa-security-rule.json's §164.312(c) for the full reasoning (home-directory cache by design, fire-and-forget async producer, not a quick artifact-path fix). Content-provenance / authenticity controls for model loads remain only partially evidenced by this control's surviving module:license-attributions leg."
|
|
89
92
|
],
|
|
90
93
|
"mapsTo": [
|
|
91
|
-
"module:sigstore-verify",
|
|
92
94
|
"module:license-attributions"
|
|
93
95
|
]
|
|
94
96
|
}
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
"publisher": "NIST",
|
|
5
5
|
"license": "public-domain (US Federal publication)",
|
|
6
6
|
"url": "https://www.nist.gov/cyberframework",
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch): confirmed NIST Cybersecurity Framework, CSF 2.0 stated as current throughout the page, matching this bundle. No content hash pinned: this is a resource hub page (quick-start guides, profiles, informative references, a downloadable PDF), not a single fixed document.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 8 subcategories with a code-observable signal. CSF 2.0 has over 100 subcategories; GOVERN in particular is organisational and is NOT represented here.",
|
|
8
|
-
"controlsDigest": "
|
|
10
|
+
"controlsDigest": "1df76b5bde1d0044",
|
|
9
11
|
"controlCount": 8,
|
|
10
12
|
"controls": [
|
|
11
13
|
{
|
|
@@ -45,12 +47,11 @@
|
|
|
45
47
|
"summary": "Vulnerabilities and threats are identified.",
|
|
46
48
|
"codeTestable": "partial",
|
|
47
49
|
"evidence": [
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
+
"ATT&CK / ATLAS technique mapping on findings (last-scan.json).",
|
|
51
|
+
"Removed module:exploitability-probability (adversarial premortem Q2, 2026-09-07): that name is not in the ARTIFACT vocabulary table — exploitability-probability.js is a real, live annotator (posture/exploitability-probability.js), but it sets fields directly on findings in memory and writes no standalone artifact of its own; its output lands in last-scan.json, the exact file the surviving module:attack-taxonomy leg on this control already checks. This mapping could never read 'present' via this leg, on any project, since it shipped — removed rather than pointed at a duplicate check with no new signal."
|
|
50
52
|
],
|
|
51
53
|
"mapsTo": [
|
|
52
|
-
"module:attack-taxonomy"
|
|
53
|
-
"module:exploitability-probability"
|
|
54
|
+
"module:attack-taxonomy"
|
|
54
55
|
]
|
|
55
56
|
},
|
|
56
57
|
{
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"publisher": "NIST",
|
|
5
5
|
"license": "public-domain (US Federal publication)",
|
|
6
6
|
"url": "https://www.nist.gov/privacy-framework",
|
|
7
|
-
"note": "Each control carries
|
|
8
|
-
"scope": "FULL CATALOGUE, partially assessable. All 104 controls are present and each carries `codeTestable
|
|
9
|
-
"controlsDigest": "
|
|
7
|
+
"note": "Each control carries a `codeTestable` rating (yes/partial/no). This rating is HAND-AUTHORED BY THIS PROJECT, not NIST: the Privacy Framework document ships no machine-readable testability column (unlike NIST AI 600-1, whose source workbook has one, read by scripts/nist-compliance/build-catalog.py). The rating says whether a control COULD be assessed from source code, in this project's judgment, it does not say this engine assesses it, and it is not NIST's own claim. `mapsTo` is present only where this engine produces a real signal; a control rated testable but which this engine cannot see is reported as an ENGINE GAP rather than silently passed.",
|
|
8
|
+
"scope": "FULL CATALOGUE, partially assessable, transcribed from an Initial Public Draft (IPD) NOT yet finalized by NIST as of the last verification (see sourceVerificationNote). All 104 controls are present and each carries `codeTestable`, hand-authored by this project (see `note`), NOT a NIST-published rating. 48 are governance controls no scanner can assess; those report `manual`, never `satisfied`. See posture/privacy-framework.js.",
|
|
9
|
+
"controlsDigest": "3b91775abd5ffc1b",
|
|
10
10
|
"controlCount": 104,
|
|
11
11
|
"controls": [
|
|
12
12
|
{
|
|
@@ -494,8 +494,11 @@
|
|
|
494
494
|
"summary": "Log records are determined, documented, implemented, and reviewed in accordance with policy and incorporating the principle of data minimization.",
|
|
495
495
|
"codeTestable": "partial",
|
|
496
496
|
"mapsTo": [
|
|
497
|
-
"module:scan-history"
|
|
498
|
-
|
|
497
|
+
"module:scan-history"
|
|
498
|
+
],
|
|
499
|
+
"evidence": [
|
|
500
|
+
"Scan history retained.",
|
|
501
|
+
"Removed module:mcp-audit after a second-review pass: mcp-audit.log records calls to THIS tool's own MCP server, not the organisation's own log-record policy and review practice. Category error (self-referential: about this tool, not the target)."
|
|
499
502
|
]
|
|
500
503
|
},
|
|
501
504
|
{
|
|
@@ -605,8 +608,10 @@
|
|
|
605
608
|
"category": "Data Processing Awareness (CM.AW-P)",
|
|
606
609
|
"summary": "Records of data disclosures and sharing are maintained and can be accessed for review or transmission/disclosure.",
|
|
607
610
|
"codeTestable": "yes",
|
|
608
|
-
"mapsTo": [
|
|
609
|
-
|
|
611
|
+
"mapsTo": [],
|
|
612
|
+
"evidence": [
|
|
613
|
+
"No automated signal in this engine after a second-review pass removed the only prior mapping. module:mcp-audit pointed at THIS scanner's own MCP call log, not at the organisation's own records of data disclosures and sharing. Category error (self-referential: about this tool, not the target).",
|
|
614
|
+
"Reported as an engine gap: NIST rates this control code-testable (data-disclosure records could in principle be evidenced from a disclosure-log artifact in the scanned project), but no detector here looks for one."
|
|
610
615
|
]
|
|
611
616
|
},
|
|
612
617
|
{
|
|
@@ -623,8 +628,11 @@
|
|
|
623
628
|
"summary": "Data provenance and lineage are maintained and can be accessed for review or transmission/disclosure.",
|
|
624
629
|
"codeTestable": "partial",
|
|
625
630
|
"mapsTo": [
|
|
626
|
-
"module:sbom-diff"
|
|
627
|
-
|
|
631
|
+
"module:sbom-diff"
|
|
632
|
+
],
|
|
633
|
+
"evidence": [
|
|
634
|
+
"SBOM diff history retained.",
|
|
635
|
+
"Removed module:integrity after a second-review pass: last-scan.json.sig is this scanner signing its OWN scan output, not evidence of the organisation's own data provenance and lineage tracking. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework."
|
|
628
636
|
]
|
|
629
637
|
},
|
|
630
638
|
{
|
|
@@ -845,5 +853,7 @@
|
|
|
845
853
|
"summary": "Adequate resource capacity to ensure availability is maintained.",
|
|
846
854
|
"codeTestable": "yes"
|
|
847
855
|
}
|
|
848
|
-
]
|
|
856
|
+
],
|
|
857
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
858
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch, two independent prompts against https://www.nist.gov/privacy-framework): NIST Privacy Framework 1.1 is currently an Initial Public Draft (IPD), not a finalized standard, per the page's own \"PF 1.1 IPD\" labeling. Version 1.0 is NIST's current final release. This bundled framework's 104 controls were transcribed from the 1.1 IPD text; if NIST finalizes 1.1 with control-text or numbering changes, this file will not automatically reflect them and needs a re-check against the final publication when it ships. No sourcePdfSha256 is pinned because the source is a navigation hub page, not a single fixed document, and because a draft is expected to change before finalization, unlike a published SP."
|
|
849
859
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
"publisher": "OWASP Foundation",
|
|
5
5
|
"license": "Creative Commons Attribution-ShareAlike 4.0",
|
|
6
6
|
"url": "https://owasp.org/www-project-application-security-verification-standard/",
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch): confirmed OWASP ASVS, latest stable release listed as 5.0.0, matching this bundle (owasp-asvs-5), released at Global AppSec EU Barcelona 2025-05-30. No content hash pinned: this is a project navigation page linking to a versioned downloads page, not the standard itself.",
|
|
7
9
|
"scope": "SELECTIVE SUBSET. 10 verification requirements with a direct detector behind them. ASVS 5.0 has several hundred requirements across 17 chapters; the remainder are NOT represented here.",
|
|
8
10
|
"controlsDigest": "6c4371a08f010f91",
|
|
9
11
|
"controlCount": 10,
|
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
"publisher": "OWASP Foundation",
|
|
5
5
|
"license": "Creative Commons Attribution-ShareAlike 4.0",
|
|
6
6
|
"url": "https://owasp.org/www-project-top-10-for-large-language-model-applications/",
|
|
7
|
-
"
|
|
8
|
-
"
|
|
7
|
+
"sourceVerifiedAt": "2026-09-07",
|
|
8
|
+
"sourceVersionDriftDetected": true,
|
|
9
|
+
"sourceVerificationNote": "Verified 2026-09-07 (WebFetch): confirmed page is OWASP Top 10 for LLM Applications, but the CURRENT published edition is now 2026 (2026-08-04), not the 2025 edition this file bundles. See scope field for the disclosure and what remediation this requires.",
|
|
10
|
+
"scope": "FULL TOP-10. All ten categories are present. Each category is a broad class rather than a single testable requirement, so a mapping indicates a detector exists for part of the class, not that the class is fully covered. VERSION DRIFT, disclosed 2026-09-07: this bundle is the 2025 edition. OWASP published a 2026 edition on 2026-08-04 (confirmed live, the project page now archives 2025 and lists 2026 as current); the 10-category taxonomy may have changed. This file has NOT been re-mapped to the 2026 edition, that requires a deliberate review of the new categories against this engine's detector families, not a rushed relabel. Treat this bundle as 2025-accurate only until that review lands.",
|
|
11
|
+
"controlsDigest": "7500b9c4268eba6f",
|
|
9
12
|
"controlCount": 10,
|
|
10
13
|
"controls": [
|
|
11
14
|
{
|
|
@@ -101,11 +104,10 @@
|
|
|
101
104
|
"summary": "Excessive Agency — agent autonomy is bounded by explicit guards.",
|
|
102
105
|
"codeTestable": "partial",
|
|
103
106
|
"evidence": [
|
|
104
|
-
"
|
|
105
|
-
"
|
|
107
|
+
"Apply-fix path requires HMAC-verified scan.",
|
|
108
|
+
"Removed module:mcp-tools after a second-review pass: that path points at THIS scanner's own source file (scanner/src/mcp/tools.js), which only resolves inside this tool's own checkout, never inside an arbitrary assessed project. It cannot evidence that the assessed LLM application bounds ITS OWN agent's autonomy. Category error (self-referential: about this tool, not the target)."
|
|
106
109
|
],
|
|
107
110
|
"mapsTo": [
|
|
108
|
-
"module:mcp-tools",
|
|
109
111
|
"module:apply-fix"
|
|
110
112
|
]
|
|
111
113
|
},
|
|
@@ -114,13 +116,10 @@
|
|
|
114
116
|
"summary": "Overreliance — human review checkpoints exist.",
|
|
115
117
|
"codeTestable": "partial",
|
|
116
118
|
"evidence": [
|
|
117
|
-
"security-fixer agent
|
|
118
|
-
"
|
|
119
|
+
"No automated signal in this engine after a second-review pass removed both prior mappings. module:security-fixer pointed at THIS scanner's own agent definition file (agents/security-fixer.md) and module:pre-edit-bodyguard at THIS scanner's own installed hook — both resolve only inside this tool's own checkout/plugin install, never inside an arbitrary assessed project, and neither evidences that the assessed LLM application itself has human review checkpoints. Category error (self-referential: about this tool, not the target), same class as the 03.03.08 fix in the NIST 800-171 framework.",
|
|
120
|
+
"Reported as an engine gap: human review checkpoints around an LLM application's outputs are code-observable in principle (an approval-gate library, a human-in-the-loop wrapper in the assessed system's own code), but no detector here looks for that in the SCANNED project."
|
|
119
121
|
],
|
|
120
|
-
"mapsTo": [
|
|
121
|
-
"module:security-fixer",
|
|
122
|
-
"module:pre-edit-bodyguard"
|
|
123
|
-
]
|
|
122
|
+
"mapsTo": []
|
|
124
123
|
},
|
|
125
124
|
{
|
|
126
125
|
"id": "LLM10",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clear-capabilities/agentic-security-scanner",
|
|
3
|
-
"version": "0.148.
|
|
3
|
+
"version": "0.148.3",
|
|
4
4
|
"description": "Scanner engine for the agentic-security Claude Code plugin — SAST, SCA (function-level reachability + CISA KEV), secrets, IaC, prompt-injection, MCP/agent-tool audit, auth/authZ deep analysis, attack chains, PoC generation, business logic, toxic-combinations scoring, SBOM, pipeline integrity, compliance attestation, and more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"web-tree-sitter": "0.20.8"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@types/node": "^26.
|
|
51
|
+
"@types/node": "^26.5.0",
|
|
52
52
|
"@vercel/ncc": "^0.45.0"
|
|
53
53
|
},
|
|
54
54
|
"overrides": {
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"test:smoke": "node --test test/smoke.test.js test/demo-app.test.js",
|
|
65
65
|
"test:glob": "node --test test/glob-compat.test.js",
|
|
66
66
|
"test:sast": "node --test test/cpp-hardcoded-secret.test.js test/sibling-guard.test.js test/comment-blindness.test.js test/crypto-specialist.test.js test/llm.test.js test/llm-cost-advisor.test.js test/llm-owasp.test.js test/logic.test.js test/authz.test.js test/model-load.test.js test/prompt-template.test.js test/business-logic.test.js test/python-sinks.test.js test/phase1-detectors.test.js test/phase2-detectors.test.js test/phase3-v3.test.js test/phase7-extensions.test.js test/phase8-extensions.test.js test/new-cwe-detectors.test.js test/file-upload.test.js test/llmsecops-detectors.test.js test/db-taint.test.js test/dart-swift.test.js test/zip-slip-containment-guard.test.js test/redos-anchoring.test.js test/path-guard-validator-call.test.js test/redos-nfa.test.js test/weak-randomness.test.js test/csharp-pipeline.test.js test/post-quantum-crypto.test.js test/web3-advanced.test.js test/cloud-iam-k8s.test.js test/crypto-protocol.test.js test/ml-supply-chain.test.js test/mcp-audit-scan.test.js test/wrong-context-sanitizer.test.js test/sanitizer-context.test.js test/frontend-hygiene.test.js test/csv-injection.test.js test/stored-taint.test.js test/tree-sitter-sinks.test.js test/kotlin-structural.test.js test/ruby-php-structural.test.js test/java-csharp-structural.test.js test/guard-recognition.test.js test/guard-window-identifier-correlation.test.js test/js-python-framework-structural.test.js test/go-structural.test.js test/secret-concat.test.js test/secret-redaction.test.js test/xss-reflected-multilang.test.js test/code-injection-multilang.test.js test/xxe-multilang.test.js test/xpath-injection-multilang.test.js test/gapfill-batch13.test.js test/agent-untrusted-flow.test.js test/api-authz.test.js test/event-entrypoint.test.js test/iac-terraform.test.js test/cross-service.test.js test/rbac-consistency.test.js test/adversarial-robustness.test.js test/secret-entropy.test.js test/comment-strip.test.js test/juliet-path-filter-gate.test.js test/java-bench-shape-opt-in.test.js test/reachability-missing-callgraph-data.test.js test/rate-limit.test.js test/auth-signals.test.js test/convention-deviation.test.js test/resource-exhaustion.test.js test/resource-exhaustion-realworld.test.js test/redirect-toctou.test.js test/redirect-toctou-realworld.test.js test/codegen-sink.test.js test/ownership-authz.test.js test/ownership-authz-realworld.test.js test/t21-precision-audit.test.js test/secrets-coverage.test.js test/prompt-injection-payloads.test.js test/iac-cloud-templates.test.js test/ruby-path-join.test.js test/sast/manifest-line-tracking.test.js",
|
|
67
|
-
"test:posture": "node --test test/threat-model.test.js test/git-hardening.test.js test/privacy-framework.test.js test/material-change.test.js test/drift.test.js test/scorecard.test.js test/accuracy-scorecard.test.js test/scorecard-gate.test.js test/predeploy-gate.test.js test/release-check.test.js test/pre-push-gate.test.js test/dependency-currency.test.js test/package-contents-check.test.js test/gate-verdict-cache.test.js test/run-unit-tests.test.js test/release-workflow.test.js test/independent-population.test.js test/why-missed.test.js test/independent-scoring.test.js test/evidence-bundle.test.js test/obligation-evidence-pack.test.js test/policy-bundle.test.js test/discovery-memory.test.js test/mttr.test.js test/license-policy.test.js test/aibom.test.js test/sbom.test.js test/api-inventory.test.js test/iam-policy.test.js test/container.test.js test/container-runtime.test.js test/image-packages.test.js test/kev.test.js test/dep-confusion.test.js test/sca-deprecated.test.js test/sca-batch.test.js test/composite-risk.test.js test/epss-enrich.test.js test/sca-coverage.test.js test/gradle-deps.test.js test/sca-route-reachable.test.js test/sca-policy.test.js test/sca-verdict.test.js test/install-script.test.js test/sca-linked-findings.test.js test/packs.test.js test/flow-narration.test.js test/regression-test-gen.test.js test/deterministic-fix.test.js test/falsification.test.js test/verification-separation.test.js test/logic-claims.test.js test/attestation.test.js test/verify-attestation-cli.test.js test/comparison.test.js test/determinism-cross-machine.test.js test/fix-honesty-gate.test.js test/model-routing.test.js test/root-cause-sweep.test.js test/entrypoint-inventory.test.js test/relevance.test.js test/untrusted.test.js test/agent-hardening.test.js test/rule-synthesis.test.js test/policy-gate.test.js test/agents-memory.test.js test/cve-lookup.test.js test/cve-alert-daemon.test.js test/fix-verify-loop.test.js test/fix-verify-tests.test.js test/fix-acceptance.test.js test/exploitability-probability.test.js test/history-scan.test.js test/viral-features.test.js test/viral-v074.test.js test/state-dir.test.js test/ignore-pragma.test.js test/license-graph.test.js test/secret-live-check.test.js test/attack-taxonomy.test.js test/triage-memory.test.js test/pr-augment.test.js test/chat-batch2.test.js test/chat-batch3.test.js test/chat-batch4.test.js test/chat-batch5.test.js test/chat-batch6.test.js test/risk-scenario-disclosure.test.js test/egress-policy.test.js test/egress-policy-completeness.test.js test/egress-policy-integration.test.js test/router.test.js test/legacy-alias-redirect.test.js test/cache-economics.test.js test/coverage-report.test.js test/corpus-status.test.js test/provenance.test.js test/secret-history.test.js test/execution-proof.test.js test/fix-metrics.test.js test/corpus-enroll.test.js test/prove-findings.test.js test/corpus-match.test.js test/corpus-provenance.test.js test/learning-quorum.test.js test/llm-cache-integrity.test.js test/proof-artifact.test.js test/providers.test.js test/fleet.test.js test/autopilot.test.js test/autopilot-cli.test.js test/verifier-independence.test.js test/integrity-legacy-key.test.js test/suppression-visibility.test.js test/cost-ceiling.test.js test/local-endpoint.test.js test/model-trust.test.js test/vuln-archaeology.test.js test/scan-checkpoint.test.js test/llm-redact.test.js test/world-class-batch2.test.js test/world-class-modules.test.js test/privacy-ir-adapter.test.js test/privacy-taxonomy.test.js test/privacy-sink-policy.test.js test/privacy-governance.test.js test/privacy-inventory.test.js test/integration-end-to-end.test.js test/streak-cli-wiring.test.js test/stack-playbook.test.js test/machine-output-flag.test.js test/stdout-flush.test.js test/format-determinism.test.js test/only-flag-channels.test.js test/confidence.test.js test/security-trend.test.js test/calibration-drift.test.js test/validator-metrics.test.js test/clustering-ir-taint-line.test.js test/concurrency-cwe.test.js test/compliance-mapping-liveness.test.js test/compliance-severity-threshold.test.js test/compliance-severity-policy.test.js test/compliance-evidence-binding.test.js test/compliance-evidence-signing.test.js test/compliance-file-contains.test.js test/label-isolation.test.js test/evidence-grade-wording.test.js test/llm-model-status.test.js test/egress-policy-constraints.test.js test/egress-redact.test.js test/egress-audit.test.js test/egress-approved-providers.test.js test/family-registry.test.js test/coverage-strength.test.js test/framework-provenance.test.js test/framework-provenance-controlrefs.test.js test/third-party-verification.test.js test/proof-coverage.test.js test/calibration-holdout.test.js test/independent-population-gate.test.js test/catalog-freshness.test.js test/incremental-parity.test.js test/surface-smoke.test.js test/fix-coverage.test.js test/raw-source-carveout.test.js test/mlbom-conformance.test.js test/deploy-gate-replay.test.js test/sbom-conformance.test.js test/unscored-claims.test.js test/mcp-rug-pull.test.js test/agent-boundary-taint.test.js test/confinement-adversarial.test.js test/comment-strip-cost.test.js test/reachability-claim.test.js test/entrypoint-breadth.test.js test/dep-file-admission.test.js test/custom-rules-freshness.test.js test/posture/provenance-schema.test.js test/posture/provenance-cache.test.js test/helpers/build-git-fixture.test.js test/posture/provenance-git-evidence.test.js test/posture/provenance-dag-walk.test.js test/posture/provenance-confidence.test.js test/posture/provenance-predicate-replay.test.js test/posture/provenance-origin-resolver.test.js test/posture/provenance-ai-authorship.test.js test/posture/provenance-branch-entry.test.js test/posture/provenance-evidence-attribution.test.js test/posture/provenance-lifecycle.test.js test/posture/provenance-missing-control-resolver.test.js test/posture/provenance-missing-control-wiring.test.js test/posture/provenance-coordinator.test.js test/posture/provenance-sca-origin.test.js test/posture/provenance-transitive-sca.test.js test/posture/provenance-coordinator-sca.test.js test/posture/provenance-providers.test.js test/posture/provenance-evidence-bundle.test.js test/posture/provenance-repo-lineage.test.js test/posture/provenance-secrets-logic.test.js test/cli/provenance-flags.test.js test/cli/attest-provenance.test.js test/cli/attest-obligations.test.js test/cli/compliance-walkthrough-lineage.test.js test/cli/dataflow-export-privacy.test.js test/cli/dataflow-export-briefing.test.js test/cli/lineage-snapshot-persist.test.js test/cli/dataflow-diff.test.js test/cli/dataflow-watch.test.js test/cli/dataflow-recipients.test.js test/cli/dataflow-coverage.test.js test/security/provenance-safety.test.js test/security/provenance-injection.test.js test/posture/remediation-ledger.test.js",
|
|
67
|
+
"test:posture": "node --test test/threat-model.test.js test/git-hardening.test.js test/privacy-framework.test.js test/material-change.test.js test/drift.test.js test/scorecard.test.js test/accuracy-scorecard.test.js test/scorecard-gate.test.js test/predeploy-gate.test.js test/release-check.test.js test/pre-push-gate.test.js test/dependency-currency.test.js test/package-contents-check.test.js test/gate-verdict-cache.test.js test/run-unit-tests.test.js test/release-workflow.test.js test/independent-population.test.js test/why-missed.test.js test/independent-scoring.test.js test/evidence-bundle.test.js test/obligation-evidence-pack.test.js test/policy-bundle.test.js test/discovery-memory.test.js test/mttr.test.js test/license-policy.test.js test/aibom.test.js test/sbom.test.js test/api-inventory.test.js test/iam-policy.test.js test/container.test.js test/container-runtime.test.js test/image-packages.test.js test/kev.test.js test/dep-confusion.test.js test/sca-deprecated.test.js test/sca-batch.test.js test/composite-risk.test.js test/epss-enrich.test.js test/sca-coverage.test.js test/gradle-deps.test.js test/sca-route-reachable.test.js test/sca-policy.test.js test/sca-verdict.test.js test/install-script.test.js test/sca-linked-findings.test.js test/packs.test.js test/flow-narration.test.js test/regression-test-gen.test.js test/deterministic-fix.test.js test/falsification.test.js test/verification-separation.test.js test/logic-claims.test.js test/attestation.test.js test/verify-attestation-cli.test.js test/comparison.test.js test/determinism-cross-machine.test.js test/fix-honesty-gate.test.js test/model-routing.test.js test/root-cause-sweep.test.js test/entrypoint-inventory.test.js test/relevance.test.js test/untrusted.test.js test/agent-hardening.test.js test/rule-synthesis.test.js test/policy-gate.test.js test/agents-memory.test.js test/cve-lookup.test.js test/cve-alert-daemon.test.js test/fix-verify-loop.test.js test/fix-verify-tests.test.js test/fix-acceptance.test.js test/exploitability-probability.test.js test/history-scan.test.js test/viral-features.test.js test/viral-v074.test.js test/state-dir.test.js test/ignore-pragma.test.js test/license-graph.test.js test/secret-live-check.test.js test/attack-taxonomy.test.js test/triage-memory.test.js test/pr-augment.test.js test/chat-batch2.test.js test/chat-batch3.test.js test/chat-batch4.test.js test/chat-batch5.test.js test/chat-batch6.test.js test/risk-scenario-disclosure.test.js test/egress-policy.test.js test/egress-policy-completeness.test.js test/egress-policy-integration.test.js test/router.test.js test/legacy-alias-redirect.test.js test/cache-economics.test.js test/coverage-report.test.js test/corpus-status.test.js test/provenance.test.js test/secret-history.test.js test/execution-proof.test.js test/fix-metrics.test.js test/corpus-enroll.test.js test/prove-findings.test.js test/corpus-match.test.js test/corpus-provenance.test.js test/learning-quorum.test.js test/llm-cache-integrity.test.js test/proof-artifact.test.js test/providers.test.js test/fleet.test.js test/autopilot.test.js test/autopilot-cli.test.js test/verifier-independence.test.js test/integrity-legacy-key.test.js test/suppression-visibility.test.js test/cost-ceiling.test.js test/local-endpoint.test.js test/model-trust.test.js test/vuln-archaeology.test.js test/scan-checkpoint.test.js test/llm-redact.test.js test/world-class-batch2.test.js test/world-class-modules.test.js test/privacy-ir-adapter.test.js test/privacy-taxonomy.test.js test/privacy-sink-policy.test.js test/privacy-governance.test.js test/privacy-inventory.test.js test/integration-end-to-end.test.js test/streak-cli-wiring.test.js test/stack-playbook.test.js test/machine-output-flag.test.js test/stdout-flush.test.js test/format-determinism.test.js test/only-flag-channels.test.js test/confidence.test.js test/security-trend.test.js test/calibration-drift.test.js test/validator-metrics.test.js test/clustering-ir-taint-line.test.js test/concurrency-cwe.test.js test/compliance-mapping-liveness.test.js test/module-artifact-liveness.test.js test/compliance-severity-threshold.test.js test/compliance-severity-policy.test.js test/compliance-evidence-binding.test.js test/compliance-evidence-signing.test.js test/compliance-file-contains.test.js test/label-isolation.test.js test/evidence-grade-wording.test.js test/llm-model-status.test.js test/egress-policy-constraints.test.js test/egress-redact.test.js test/egress-audit.test.js test/egress-approved-providers.test.js test/family-registry.test.js test/coverage-strength.test.js test/framework-provenance.test.js test/framework-provenance-controlrefs.test.js test/third-party-verification.test.js test/proof-coverage.test.js test/calibration-holdout.test.js test/independent-population-gate.test.js test/catalog-freshness.test.js test/incremental-parity.test.js test/surface-smoke.test.js test/fix-coverage.test.js test/raw-source-carveout.test.js test/mlbom-conformance.test.js test/deploy-gate-replay.test.js test/sbom-conformance.test.js test/unscored-claims.test.js test/mcp-rug-pull.test.js test/agent-boundary-taint.test.js test/confinement-adversarial.test.js test/comment-strip-cost.test.js test/reachability-claim.test.js test/entrypoint-breadth.test.js test/dep-file-admission.test.js test/custom-rules-freshness.test.js test/posture/provenance-schema.test.js test/posture/provenance-cache.test.js test/helpers/build-git-fixture.test.js test/posture/provenance-git-evidence.test.js test/posture/provenance-dag-walk.test.js test/posture/provenance-confidence.test.js test/posture/provenance-predicate-replay.test.js test/posture/provenance-origin-resolver.test.js test/posture/provenance-ai-authorship.test.js test/posture/provenance-branch-entry.test.js test/posture/provenance-evidence-attribution.test.js test/posture/provenance-lifecycle.test.js test/posture/provenance-missing-control-resolver.test.js test/posture/provenance-missing-control-wiring.test.js test/posture/provenance-coordinator.test.js test/posture/provenance-sca-origin.test.js test/posture/provenance-transitive-sca.test.js test/posture/provenance-coordinator-sca.test.js test/posture/provenance-providers.test.js test/posture/provenance-evidence-bundle.test.js test/posture/provenance-repo-lineage.test.js test/posture/provenance-secrets-logic.test.js test/cli/provenance-flags.test.js test/cli/attest-provenance.test.js test/cli/attest-obligations.test.js test/cli/compliance-walkthrough-lineage.test.js test/cli/dataflow-export-privacy.test.js test/cli/dataflow-export-briefing.test.js test/cli/lineage-snapshot-persist.test.js test/cli/dataflow-diff.test.js test/cli/dataflow-watch.test.js test/cli/dataflow-recipients.test.js test/cli/dataflow-coverage.test.js test/security/provenance-safety.test.js test/security/provenance-injection.test.js test/posture/remediation-ledger.test.js",
|
|
68
68
|
"test:dataflow": "node --test test/privacy-catalog.test.js test/privacy-deep-walker.test.js test/privacy-deep-e2e.test.js test/container-taint.test.js test/stored-taint-families.test.js test/py-annotation-sources.test.js test/fn-reach.test.js test/deep-taint.test.js test/calibration.test.js test/holdout-eval.test.js test/cross-lang-meta.test.js test/cross-lang-queues.test.js test/phase5-xlang.test.js test/phase5-coverage.test.js test/phase6-taint.test.js test/llm-validator-consistency.test.js test/llm-validator-default-on.test.js test/llm-validator-preset.test.js test/parser-py-cst.test.js test/chrome-probe.test.js test/parser-cs-kt.test.js test/parser-cs-annotations.test.js test/parser-cs-control-flow.test.js test/parser-kt-control-flow.test.js test/parser-js-annotations.test.js test/parser-java-annotations.test.js test/parser-java-control-flow.test.js test/parser-java-calls.test.js test/parser-go.test.js test/parser-php-rb.test.js test/parser-php-control-flow.test.js test/interproc-k2.test.js test/proven-clean.test.js test/backward-default.test.js test/incremental-cache.test.js test/string-regex-lattice.test.js test/closure-capture.test.js test/points-to.test.js test/type-stubs.test.js test/soft-taint.test.js test/ifds.test.js test/symbolic-exec-proof.test.js test/ifds-summary-edges.test.js test/stub-aware-filter.test.js test/cross-repo.test.js test/proof-gate.test.js test/layer-recall.test.js test/java-taint-flow.test.js test/kt-taint-flow.test.js test/sanitizer-typed-flow.test.js test/sanitizer-gate-unit.test.js test/proof-safe.test.js test/collection-taint.test.js test/kcfa-context.test.js test/kcfa-callstring.test.js test/flow-parity.test.js test/callgraph-resolve.test.js test/import-reachability.test.js test/ir-stats.test.js test/parser-cpp.test.js test/parser-js-decorators.test.js test/parser-js-if-else-cfg.test.js test/cpp-integration.test.js test/engine-reconnect.test.js test/phase2-scoping.test.js test/engine-recall.test.js test/catalog-annotation-source.test.js test/catalog-cs-p1.test.js test/catalog-expanded.test.js test/builtin-summaries.test.js test/interproc-mutation-crash.test.js test/mutated-param-taint.test.js test/return-sink-check.test.js test/higher-order-inline-callback.test.js test/interproc-findings-discard.test.js test/runscan-deep-option.test.js test/summary-cache-convergence.test.js test/parser-rb-calls.test.js test/parser-rb-module-level.test.js test/balanced-call.test.js test/destructuring-taint.test.js test/computed-member-taint.test.js test/string-interpolation-taint.test.js test/dataflow-deadcode-severity.test.js test/catalog-dotted-callee-lookup.test.js test/builtin-summary-family-blind-kill.test.js test/deep-mode-annotator-pipeline.test.js test/receiver-type-and-nested-calls.test.js test/member-write-and-loop-taint.test.js test/parser-py-module-level.test.js test/parser-php-module-level.test.js test/r14b-module-level-e2e.test.js test/annotation-taint-engine.test.js test/interproc-nested-call-taint.test.js test/catalog-xpath-injection.test.js test/catalog-ldap-injection.test.js test/catalog-xxe.test.js test/catalog-response-splitting.test.js test/catalog-code-injection.test.js test/parser-rb-control-flow.test.js test/catalog-ruby-p1.test.js test/callee-receiver-taint.test.js test/catalog-command-injection-p4.test.js test/catalog-xss-p4.test.js test/catalog-path-ssrf-p3.test.js test/catalog-ai-model-provider-precision.test.js test/catalog-orm-write.test.js test/dataflow/provenance-pipeline-integration.test.js",
|
|
69
69
|
"test:mcp": "node --test test/mcp.test.js test/mcp-protocol-smoke.test.js test/mcp-audit.test.js test/audit-cli.test.js test/mcp-scratchpad.test.js test/mcp-offload.test.js test/sca-upgrade.test.js test/lsp-server.test.js test/mcp-dataflow-tools.test.js test/cli/governance-propose-edit.test.js test/cli/remediation-open-update.test.js test/cli/remediation-verify-reopen.test.js test/cli/dataflow-observations.test.js test/cli/federate-declare-list.test.js",
|
|
70
70
|
"test:report": "node --test test/report-scan-invariants.test.js test/junit.test.js test/ci.test.js test/poc-generator.test.js test/verifier.test.js test/verifier-target.test.js test/annotator-errors.test.js test/scan-health.test.js test/finding-schema.test.js test/pipeline/finding-schema-provenance.test.js test/evidence-provenance.test.js test/report/provenance-output.test.js test/report/provenance-format-parity.test.js test/legacy-compat.test.js test/annotator-runner.test.js test/detector-runner.test.js test/detector-errors.test.js test/analyzer-supervisor.test.js test/cascade-worker-pool.test.js test/cascade-pool-wiring.test.js test/coverage-ledger.test.js test/coverage-ledger-completeness.test.js test/assurance-mode.test.js test/artifact-registry.test.js test/artifact-registry-completeness.test.js test/retention-policy.test.js test/state-lifecycle-report.test.js test/legal-hold.test.js test/production-feedback.test.js test/calibration-feedback.test.js test/encryption-provider.test.js test/grader-calibration.test.js test/pr-delta-gate.test.js test/vex.test.js test/report-render.test.js test/oscal-conformance.test.js test/cli-fix-apply.test.js test/apply-fix-service.test.js test/high-impact-approval-gate.test.js test/approver-registry.test.js test/suppression-exceptions.test.js test/fix-history.test.js test/producer-registry.test.js test/producer-collector.test.js test/enrichment-completion.test.js",
|
|
@@ -112,6 +112,7 @@
|
|
|
112
112
|
"bench:memory:update-baseline": "node ../bench/memory/runner.mjs --update-baseline",
|
|
113
113
|
"bench:self-scan": "node ../bench/self-scan/measure.mjs",
|
|
114
114
|
"bench:self-scan:check": "node ../bench/self-scan/check.mjs",
|
|
115
|
+
"bench:nist-800-171-labels:check": "node ../bench/nist-800-171-labels/check.mjs",
|
|
115
116
|
"bench:mutation:check": "node ../bench/mutation/runner.mjs",
|
|
116
117
|
"bench:protection-verdict:check": "node ../bench/protection-verdict/runner.mjs",
|
|
117
118
|
"bench:fix-correctness": "node ../bench/fix-correctness/runner.mjs",
|
package/src/engine.js
CHANGED
|
@@ -257,6 +257,7 @@ import { generateBundles as generateExploitBundles } from './posture/exploit-bun
|
|
|
257
257
|
import { buildMigrationPlan as buildPqcPlan, persistMigrationPlan as persistPqcPlan } from './posture/pqc-migration-plan.js';
|
|
258
258
|
import { analyzeLicenseGraph, loadLicenseGraphPolicy } from './posture/license-graph.js';
|
|
259
259
|
import { generateAttributions, persistAttributions } from './posture/license-attributions.js';
|
|
260
|
+
import { buildAIBOM, persistAIBOM } from './posture/aibom.js';
|
|
260
261
|
import { annotateAttackTaxonomy, summarizeTaxonomy } from './posture/attack-taxonomy.js';
|
|
261
262
|
import { suppressByPastDecisions } from './posture/triage-memory.js';
|
|
262
263
|
import { suppressByIntent } from './posture/intent-context.js';
|
|
@@ -10265,6 +10266,19 @@ function _deterministicFileTimings(timings) {
|
|
|
10265
10266
|
if (_attributions && _attributions.componentCount) persistAttributions(scanRoot, _attributions);
|
|
10266
10267
|
} catch (_) {}
|
|
10267
10268
|
}
|
|
10269
|
+
// AI-BOM: emit aibom.json (adversarial premortem Q2, 2026-09-07 — see
|
|
10270
|
+
// aibom.js's persistAIBOM header comment for why this was missing).
|
|
10271
|
+
// Previously only reachable via the CLI's --format aibom, which never
|
|
10272
|
+
// wrote it here, so module:aibom (eu-ai-act.json Art.11, nist-800-171-r3
|
|
10273
|
+
// .json 03.04.10, nist-ai-600-1.json MG-4.1-001) could never clear.
|
|
10274
|
+
if (process.env.AGENTIC_SECURITY_NO_AIBOM !== '1') {
|
|
10275
|
+
try {
|
|
10276
|
+
const _aibom = buildAIBOM({ components: annotatedComponents || [] }, fc, {});
|
|
10277
|
+
if (_aibom && (_aibom.models.length || _aibom.promptTemplates.length || _aibom.frameworks.length)) {
|
|
10278
|
+
persistAIBOM(scanRoot, _aibom);
|
|
10279
|
+
}
|
|
10280
|
+
} catch (_) {}
|
|
10281
|
+
}
|
|
10268
10282
|
// Attack taxonomy summary — aggregates ATT&CK / ATLAS / kill-chain
|
|
10269
10283
|
// distribution over all findings for the report layer.
|
|
10270
10284
|
if (process.env.AGENTIC_SECURITY_NO_ATTACK_TAX !== '1') {
|
|
@@ -51,6 +51,62 @@ function _isValidMode(mode) {
|
|
|
51
51
|
return ASSURANCE_MODES.includes(mode);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
// A real user hit this: `agentic-security ci <a directory downloaded as a
|
|
55
|
+
// GitHub zip, no .git present> --assurance strict` failed with the bare
|
|
56
|
+
// count this function used to produce alone — "1210 finding(s) have status
|
|
57
|
+
// outside [complete, uncommitted]" — with no indication that all 1210
|
|
58
|
+
// findings failed for the exact same, simple, fixable reason
|
|
59
|
+
// (`coordinator.js`'s `annotateGitProvenance` already knows and records it,
|
|
60
|
+
// in `finding.findingProvenance.limitations[0]`, but that reason never
|
|
61
|
+
// reached this message). A user reading "1210 problems" reasonably assumes
|
|
62
|
+
// their CODE has 1210 problems, not that their DIRECTORY isn't a git
|
|
63
|
+
// repository. This surfaces the dominant recorded reason instead of a bare
|
|
64
|
+
// count, and gives the two most common, fully-fixable reasons ("not a Git
|
|
65
|
+
// repository" from a zip download instead of `git clone`; a shallow CI
|
|
66
|
+
// checkout) a one-line, specific remedy — the same specificity the
|
|
67
|
+
// scanHealth branch above already gives for a stale-EPSS-cache failure.
|
|
68
|
+
function _provenanceFailureReason(badProvenance, totalFindings) {
|
|
69
|
+
const counts = new Map();
|
|
70
|
+
for (const f of badProvenance) {
|
|
71
|
+
const reason = f?.findingProvenance?.limitations?.[0] || f?.findingProvenance?.status || 'unknown';
|
|
72
|
+
counts.set(reason, (counts.get(reason) || 0) + 1);
|
|
73
|
+
}
|
|
74
|
+
const ranked = [...counts.entries()].sort((a, b) => b[1] - a[1]);
|
|
75
|
+
const [topReason, topCount] = ranked[0];
|
|
76
|
+
const allSameReason = ranked.length === 1;
|
|
77
|
+
const base = `strict mode requires complete finding provenance; ${badProvenance.length}/${totalFindings} finding(s) have status outside [complete, uncommitted]`;
|
|
78
|
+
|
|
79
|
+
if (topReason === 'not a Git repository' || topReason === 'repository state unavailable') {
|
|
80
|
+
return `${base} — reason: ${allSameReason ? 'all of them are' : `${topCount} of them are`} "${topReason}". ` +
|
|
81
|
+
`strict mode resolves finding provenance from git history, so it requires a real git repository ` +
|
|
82
|
+
`(a GitHub "Download ZIP" extracts without one). Run \`git init && git add -A && git commit -m init\` in ` +
|
|
83
|
+
`the scanned directory, point the scan at a real \`git clone\`, or drop --assurance strict for standard/advisory.`;
|
|
84
|
+
}
|
|
85
|
+
// engine.js's own comment on this branch: "unpinned_dep / no_lockfile and
|
|
86
|
+
// friends... describe the ABSENCE of a declaration, so 'which commit
|
|
87
|
+
// introduced this version' is not a question that has an answer to defer
|
|
88
|
+
// ... this is a known, disclosed limitation, not a bug... strict mode
|
|
89
|
+
// WILL fail on nearly any real project that has a package.json." That
|
|
90
|
+
// disclosure lived only in a source comment nobody hits this error reads —
|
|
91
|
+
// the README's own quickstart explicitly invites pointing --assurance
|
|
92
|
+
// strict at "your own project," where this is the single most likely
|
|
93
|
+
// outcome. Named here so the person who hits it learns it is expected and
|
|
94
|
+
// permanent, not something to keep investigating.
|
|
95
|
+
const supplyChainCount = ranked.filter(([r]) => r.startsWith('origin resolution does not apply to a')).reduce((s, [, n]) => s + n, 0);
|
|
96
|
+
if (supplyChainCount > 0 && supplyChainCount >= badProvenance.length / 2) {
|
|
97
|
+
return `${base} — ${supplyChainCount} of them describe an ABSENT dependency declaration ` +
|
|
98
|
+
`(an unpinned version, a missing lockfile) that has no origin commit to resolve, by design. This is a ` +
|
|
99
|
+
`known, permanent limitation: strict mode cannot pass while any are present, on any real project with ` +
|
|
100
|
+
`such a dependency. Fix the underlying SCA finding(s) (pin the version / add a lockfile) if you want ` +
|
|
101
|
+
`strict to pass, or use --assurance standard/advisory for a project you don't control the dependencies of.`;
|
|
102
|
+
}
|
|
103
|
+
if (allSameReason) {
|
|
104
|
+
return `${base} — all ${badProvenance.length} share the same reason: "${topReason}".`;
|
|
105
|
+
}
|
|
106
|
+
const breakdown = ranked.slice(0, 5).map(([reason, n]) => `${n}× "${reason}"`).join(', ');
|
|
107
|
+
return `${base} — breakdown: ${breakdown}${ranked.length > 5 ? ', …' : ''}.`;
|
|
108
|
+
}
|
|
109
|
+
|
|
54
110
|
/**
|
|
55
111
|
* @param {string} mode - one of ASSURANCE_MODES; invalid/missing degrades to the default.
|
|
56
112
|
* @param {object|null} scanHealth - the engine's computed scan.scanHealth (FR-206).
|
|
@@ -143,7 +199,7 @@ export function evaluateAssuranceMode(mode, scanHealth, findings = []) {
|
|
|
143
199
|
return {
|
|
144
200
|
ok: false,
|
|
145
201
|
mode: 'strict',
|
|
146
|
-
reason:
|
|
202
|
+
reason: _provenanceFailureReason(badProvenance, findings.length),
|
|
147
203
|
conditions,
|
|
148
204
|
};
|
|
149
205
|
}
|
|
@@ -151,4 +207,4 @@ export function evaluateAssuranceMode(mode, scanHealth, findings = []) {
|
|
|
151
207
|
return { ok: true, mode: 'strict', reason: null, conditions };
|
|
152
208
|
}
|
|
153
209
|
|
|
154
|
-
export const _internals = { _isValidMode };
|
|
210
|
+
export const _internals = { _isValidMode, _provenanceFailureReason };
|