@blamejs/exceptd-skills 0.9.1
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/AGENTS.md +232 -0
- package/ARCHITECTURE.md +267 -0
- package/CHANGELOG.md +616 -0
- package/CONTEXT.md +203 -0
- package/LICENSE +200 -0
- package/NOTICE +82 -0
- package/README.md +307 -0
- package/SECURITY.md +73 -0
- package/agents/README.md +81 -0
- package/agents/report-generator.md +156 -0
- package/agents/skill-updater.md +102 -0
- package/agents/source-validator.md +119 -0
- package/agents/threat-researcher.md +149 -0
- package/bin/exceptd.js +183 -0
- package/data/_indexes/_meta.json +88 -0
- package/data/_indexes/activity-feed.json +362 -0
- package/data/_indexes/catalog-summaries.json +229 -0
- package/data/_indexes/chains.json +7135 -0
- package/data/_indexes/currency.json +359 -0
- package/data/_indexes/did-ladders.json +451 -0
- package/data/_indexes/frequency.json +2072 -0
- package/data/_indexes/handoff-dag.json +476 -0
- package/data/_indexes/jurisdiction-clocks.json +967 -0
- package/data/_indexes/jurisdiction-map.json +536 -0
- package/data/_indexes/recipes.json +319 -0
- package/data/_indexes/section-offsets.json +3656 -0
- package/data/_indexes/stale-content.json +14 -0
- package/data/_indexes/summary-cards.json +1736 -0
- package/data/_indexes/theater-fingerprints.json +381 -0
- package/data/_indexes/token-budget.json +2137 -0
- package/data/_indexes/trigger-table.json +1374 -0
- package/data/_indexes/xref.json +818 -0
- package/data/atlas-ttps.json +282 -0
- package/data/cve-catalog.json +496 -0
- package/data/cwe-catalog.json +1017 -0
- package/data/d3fend-catalog.json +738 -0
- package/data/dlp-controls.json +1039 -0
- package/data/exploit-availability.json +67 -0
- package/data/framework-control-gaps.json +1255 -0
- package/data/global-frameworks.json +2913 -0
- package/data/rfc-references.json +324 -0
- package/data/zeroday-lessons.json +377 -0
- package/keys/public.pem +3 -0
- package/lib/framework-gap.js +328 -0
- package/lib/job-queue.js +195 -0
- package/lib/lint-skills.js +536 -0
- package/lib/prefetch.js +372 -0
- package/lib/refresh-external.js +713 -0
- package/lib/schemas/cve-catalog.schema.json +151 -0
- package/lib/schemas/manifest.schema.json +106 -0
- package/lib/schemas/skill-frontmatter.schema.json +113 -0
- package/lib/scoring.js +149 -0
- package/lib/sign.js +197 -0
- package/lib/ttp-mapper.js +80 -0
- package/lib/validate-catalog-meta.js +198 -0
- package/lib/validate-cve-catalog.js +213 -0
- package/lib/validate-indexes.js +83 -0
- package/lib/validate-package.js +162 -0
- package/lib/validate-vendor.js +85 -0
- package/lib/verify.js +216 -0
- package/lib/worker-pool.js +84 -0
- package/manifest-snapshot.json +1833 -0
- package/manifest.json +2108 -0
- package/orchestrator/README.md +124 -0
- package/orchestrator/dispatcher.js +140 -0
- package/orchestrator/event-bus.js +146 -0
- package/orchestrator/index.js +874 -0
- package/orchestrator/pipeline.js +201 -0
- package/orchestrator/scanner.js +327 -0
- package/orchestrator/scheduler.js +137 -0
- package/package.json +113 -0
- package/sbom.cdx.json +158 -0
- package/scripts/audit-cross-skill.js +261 -0
- package/scripts/audit-perf.js +160 -0
- package/scripts/bootstrap.js +205 -0
- package/scripts/build-indexes.js +721 -0
- package/scripts/builders/activity-feed.js +79 -0
- package/scripts/builders/catalog-summaries.js +67 -0
- package/scripts/builders/currency.js +109 -0
- package/scripts/builders/cwe-chains.js +105 -0
- package/scripts/builders/did-ladders.js +149 -0
- package/scripts/builders/frequency.js +89 -0
- package/scripts/builders/jurisdiction-clocks.js +126 -0
- package/scripts/builders/recipes.js +159 -0
- package/scripts/builders/section-offsets.js +162 -0
- package/scripts/builders/stale-content.js +171 -0
- package/scripts/builders/summary-cards.js +166 -0
- package/scripts/builders/theater-fingerprints.js +198 -0
- package/scripts/builders/token-budget.js +96 -0
- package/scripts/check-manifest-snapshot.js +217 -0
- package/scripts/predeploy.js +267 -0
- package/scripts/refresh-manifest-snapshot.js +57 -0
- package/scripts/refresh-sbom.js +222 -0
- package/skills/age-gates-child-safety/skill.md +456 -0
- package/skills/ai-attack-surface/skill.md +282 -0
- package/skills/ai-c2-detection/skill.md +440 -0
- package/skills/ai-risk-management/skill.md +311 -0
- package/skills/api-security/skill.md +287 -0
- package/skills/attack-surface-pentest/skill.md +381 -0
- package/skills/cloud-security/skill.md +384 -0
- package/skills/compliance-theater/skill.md +365 -0
- package/skills/container-runtime-security/skill.md +379 -0
- package/skills/coordinated-vuln-disclosure/skill.md +473 -0
- package/skills/defensive-countermeasure-mapping/skill.md +300 -0
- package/skills/dlp-gap-analysis/skill.md +337 -0
- package/skills/email-security-anti-phishing/skill.md +206 -0
- package/skills/exploit-scoring/skill.md +331 -0
- package/skills/framework-gap-analysis/skill.md +374 -0
- package/skills/fuzz-testing-strategy/skill.md +313 -0
- package/skills/global-grc/skill.md +564 -0
- package/skills/identity-assurance/skill.md +272 -0
- package/skills/incident-response-playbook/skill.md +546 -0
- package/skills/kernel-lpe-triage/skill.md +303 -0
- package/skills/mcp-agent-trust/skill.md +326 -0
- package/skills/mlops-security/skill.md +325 -0
- package/skills/ot-ics-security/skill.md +340 -0
- package/skills/policy-exception-gen/skill.md +437 -0
- package/skills/pqc-first/skill.md +546 -0
- package/skills/rag-pipeline-security/skill.md +294 -0
- package/skills/researcher/skill.md +310 -0
- package/skills/sector-energy/skill.md +409 -0
- package/skills/sector-federal-government/skill.md +302 -0
- package/skills/sector-financial/skill.md +398 -0
- package/skills/sector-healthcare/skill.md +373 -0
- package/skills/security-maturity-tiers/skill.md +464 -0
- package/skills/skill-update-loop/skill.md +463 -0
- package/skills/supply-chain-integrity/skill.md +318 -0
- package/skills/threat-model-currency/skill.md +404 -0
- package/skills/threat-modeling-methodology/skill.md +312 -0
- package/skills/webapp-security/skill.md +281 -0
- package/skills/zeroday-gap-learn/skill.md +350 -0
- package/vendor/blamejs/LICENSE +201 -0
- package/vendor/blamejs/README.md +54 -0
- package/vendor/blamejs/_PROVENANCE.json +54 -0
- package/vendor/blamejs/retry.js +335 -0
- package/vendor/blamejs/worker-pool.js +418 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kernel-lpe-triage
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: Assess Linux kernel LPE exposure — Copy Fail, Dirty Frag, live-patch vs. reboot remediation paths, framework gap declarations
|
|
5
|
+
triggers:
|
|
6
|
+
- kernel lpe
|
|
7
|
+
- privilege escalation
|
|
8
|
+
- copy fail
|
|
9
|
+
- dirty frag
|
|
10
|
+
- cve-2026-31431
|
|
11
|
+
- cve-2026-43284
|
|
12
|
+
- linux root
|
|
13
|
+
- kernel patch
|
|
14
|
+
- live kernel patch
|
|
15
|
+
data_deps:
|
|
16
|
+
- cve-catalog.json
|
|
17
|
+
- exploit-availability.json
|
|
18
|
+
atlas_refs: []
|
|
19
|
+
attack_refs:
|
|
20
|
+
- T1068
|
|
21
|
+
- T1548.001
|
|
22
|
+
framework_gaps:
|
|
23
|
+
- NIST-800-53-SI-2
|
|
24
|
+
- ISO-27001-2022-A.8.8
|
|
25
|
+
- PCI-DSS-4.0-6.3.3
|
|
26
|
+
- NIS2-Art21-patch-management
|
|
27
|
+
- NIST-800-53-SC-8
|
|
28
|
+
- CIS-Controls-v8-Control7
|
|
29
|
+
rfc_refs:
|
|
30
|
+
- RFC-4301
|
|
31
|
+
- RFC-4303
|
|
32
|
+
- RFC-7296
|
|
33
|
+
cwe_refs:
|
|
34
|
+
- CWE-125
|
|
35
|
+
- CWE-362
|
|
36
|
+
- CWE-416
|
|
37
|
+
- CWE-672
|
|
38
|
+
- CWE-787
|
|
39
|
+
d3fend_refs:
|
|
40
|
+
- D3-ASLR
|
|
41
|
+
- D3-EAL
|
|
42
|
+
- D3-PHRA
|
|
43
|
+
- D3-PSEP
|
|
44
|
+
last_threat_review: "2026-05-01"
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
# Kernel LPE Triage
|
|
48
|
+
|
|
49
|
+
## Threat Context (mid-2026)
|
|
50
|
+
|
|
51
|
+
### Copy Fail — CVE-2026-31431
|
|
52
|
+
|
|
53
|
+
**Classification:** Local Privilege Escalation | CISA KEV | AI-Discovered
|
|
54
|
+
**CVSS:** 7.8 (High) | **RWEP:** 90/100
|
|
55
|
+
|
|
56
|
+
An AI system discovered this vulnerability in approximately one hour. It is a page-cache copy-on-write (CoW) primitive in the Linux kernel affecting all major distributions since kernel 4.14 (2017). Every major Linux distribution is affected: RHEL 7–9, Ubuntu 18.04–24.04, Debian 9–12, CentOS, Fedora, Amazon Linux 2/2023, SUSE 12/15, Alpine, and derivatives.
|
|
57
|
+
|
|
58
|
+
Key characteristics that make this exceptional:
|
|
59
|
+
- **Deterministic exploitation** — no race condition, no heap spray, no timing sensitivity
|
|
60
|
+
- **Single-stage** — 732-byte script achieves root from unprivileged user in one step
|
|
61
|
+
- **No privileges required** — accessible from any unprivileged container or local user
|
|
62
|
+
- **No user interaction** — fully automated
|
|
63
|
+
- **CISA KEV listed** — active exploitation confirmed in the wild
|
|
64
|
+
|
|
65
|
+
The attack abuses a write primitive in the copy-on-write path of the page cache. An attacker with any local code execution can reliably escalate to root. In containerized environments without proper namespace isolation, this means container escape.
|
|
66
|
+
|
|
67
|
+
**What SI-2 says:** "Identify, report, and correct information system flaws; install security-relevant software updates within organizationally defined time periods."
|
|
68
|
+
**Why SI-2 fails here:** The control is operationalized as a patch cycle (typically 30 days for High, 7 days for Critical). Copy Fail has a public PoC, is CISA KEV listed, and takes 732 bytes and zero expertise to exploit. The 30-day window is not a security window — it is an exploitation window.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### Dirty Frag — CVE-2026-43284 + CVE-2026-43500
|
|
73
|
+
|
|
74
|
+
**Classification:** Local Privilege Escalation Chain | Breaks IPsec Mitigations
|
|
75
|
+
**CVSS:** 7.8 (High) | **RWEP:** 38/100
|
|
76
|
+
|
|
77
|
+
Discovered by Hyunwoo Kim. A two-CVE chain exploiting page-cache write primitives in:
|
|
78
|
+
- ESP/IPsec subsystem (CVE-2026-43284)
|
|
79
|
+
- RxRPC subsystem (CVE-2026-43500)
|
|
80
|
+
|
|
81
|
+
Key characteristics:
|
|
82
|
+
- **Disclosed before patches existed** — no coordinated disclosure window observed
|
|
83
|
+
- **Single command** — root access via one-line invocation
|
|
84
|
+
- **Breaks IPsec** — the exploit path runs through the IPsec subsystem, meaning the exploit actively compromises the IPsec subsystem as it runs. Controls that rely on IPsec for network isolation cannot be considered mitigating controls for this vulnerability.
|
|
85
|
+
- **Chained primitive** — more sophisticated than Copy Fail; requires kernel version fingerprinting to select the right gadget chain
|
|
86
|
+
|
|
87
|
+
The IPsec dimension is critical: organizations with network segmentation controls implemented via IPsec tunnels cannot claim those controls mitigate Dirty Frag exposure. The exploitation path breaks those controls.
|
|
88
|
+
|
|
89
|
+
**What SC-8 (Transmission Confidentiality and Integrity) says:** Implement cryptographic mechanisms to prevent unauthorized disclosure during transmission.
|
|
90
|
+
**Why SC-8 fails here:** Dirty Frag exploits the IPsec implementation itself. SC-8 compliance via IPsec does not mitigate an LPE that runs through the IPsec subsystem.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Framework Lag Declaration
|
|
95
|
+
|
|
96
|
+
| Framework | Control | Designed For | Fails Because |
|
|
97
|
+
|---|---|---|---|
|
|
98
|
+
| NIST 800-53 Rev 5 | SI-2 Flaw Remediation | Network-centric patch cycles, 2013–2020 era | "Timely" is undefined for instant-root deterministic LPEs with public PoC. 30-day window = exploitation window. |
|
|
99
|
+
| NIST 800-53 Rev 5 | SC-8, SC-28 | Network/storage encryption via standard protocols | Dirty Frag exploits IPsec implementation — SC-8 controls via IPsec are not compensating controls for CVE-2026-43284 |
|
|
100
|
+
| ISO 27001:2022 | A.8.8 Management of technical vulnerabilities | Patch management timelines defined by risk classification | No framework for kernel-specific live patching vs. reboot requirement. "Appropriate timescales" undefined for CISA KEV + public PoC. |
|
|
101
|
+
| PCI DSS 4.0 | 6.3.3 | Critical patches within 1 month, all others within 3 months | 1-month window for a 732-byte public PoC is operationally indefensible. No guidance for live kernel patching on PCI-scoped systems. |
|
|
102
|
+
| NIS2 Directive | Art. 21 (vulnerability handling) | Systematic patch management for essential/important entities | No guidance on live kernel patching as a required capability. "Appropriate measures" undefined for CISA KEV LPEs. |
|
|
103
|
+
| CIS Controls v8 | Control 7 (Continuous Vulnerability Management) | Regular vulnerability scanning and patching | IG1/IG2/IG3 all recommend "remediate within one month" for critical — same problem as PCI. No live-patch framework. |
|
|
104
|
+
| ASD Essential 8 | Patch Operating Systems (Maturity 1–3) | Maturity 3: "within 48 hours" for critical with public exploit | Closest to adequate. ML3 "48 hours" with public exploit is approaching the right frame. Still no live-patch operationalization. |
|
|
105
|
+
|
|
106
|
+
**Spec layer vs. implementation layer.** Dirty Frag (CVE-2026-43284, CVE-2026-43500) exploits the Linux kernel's IPsec ESP implementation, not the underlying protocol specifications. The spec layer is defined by RFC 4301 (IPsec architecture), RFC 4303 (ESP datagram format), and RFC 7296 (IKEv2) — see `data/rfc-references.json` for status and errata. NIST 800-53 SC-8 and equivalent transmission-confidentiality controls implicitly cite this RFC family but do not operationalize the gap between *spec compliance* and *kernel-implementation safety*: an IPsec deployment can be fully RFC-conformant and still expose root via the ESP path. Auditors evaluating IPsec controls must ask whether the kernel is patched against CVE-2026-43284/-43500, not just whether the spec is followed.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## TTP Mapping (MITRE ATT&CK Enterprise, mid-2026)
|
|
111
|
+
|
|
112
|
+
Each CVE class in this skill maps to ATT&CK technique IDs declared in frontmatter (`T1068`, `T1548.001`). Gap flags identify which standard controls fail against the specific TTP variant — these are the controls a compliance-passing org will rely on, and which the exploit walks past.
|
|
113
|
+
|
|
114
|
+
| CVE Class | ATT&CK Technique | Sub-Technique / Variant | Gap Flag (Controls That Fail) |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| CVE-2026-31431 (Copy Fail) | T1068 — Exploitation for Privilege Escalation | Page-cache CoW write primitive; deterministic, single-stage; no race | NIST 800-53 SI-2 30-day SLA (exploitation window for 732-byte public PoC); ISO 27001:2022 A.8.8 "appropriate timescales" undefined for CISA KEV; PCI DSS 4.0 6.3.3 1-month critical window is indefensible; CIS Controls v8 Control 7 IG3 "within one month" identical failure |
|
|
117
|
+
| CVE-2026-31431 (Copy Fail — container escape variant) | T1611 — Escape to Host | Privileged container or shared host namespace + Copy Fail = host root | NIST 800-53 SC-39 (Process Isolation) assumes kernel boundary is intact; Copy Fail breaks it. No framework requires kernel CVE status be tracked as a precondition for container isolation claims. |
|
|
118
|
+
| CVE-2026-43284 (Dirty Frag — ESP/IPsec) | T1068 — Exploitation for Privilege Escalation | Chained page-cache write through ESP/IPsec; requires kernel fingerprinting | NIST 800-53 SC-8 (Transmission Confidentiality) when implemented via IPsec — control runs through the vulnerable subsystem and cannot be claimed as compensating; NIS2 Art. 21 "appropriate measures" silent on crypto-subsystem-CVE → control-degradation linkage |
|
|
119
|
+
| CVE-2026-43500 (Dirty Frag — RxRPC) | T1068 — Exploitation for Privilege Escalation | Chain component via RxRPC subsystem | ISO 27001:2022 A.8.8 — no requirement to inventory loaded kernel modules against active CVE chains; ASD Essential 8 ML3 48h-with-exploit window still long for chained public PoC |
|
|
120
|
+
| Both classes (post-exploit token abuse) | T1548.001 — Abuse Elevation Control Mechanism: Setuid and Setgid | Setuid binary or capability abuse following LPE foothold | NIST 800-53 AC-6 (Least Privilege) assumes UID boundary holds; after T1068 root, AC-6 audit trail shows legitimate root actions — control surface is gone |
|
|
121
|
+
| Both classes (detection gap) | T1068 (detection) | auditd/eBPF coverage for `userfaultfd`, `/proc/self/mem` writes, unprivileged-userns-clone | Missing entirely — no framework (NIST, ISO, PCI, NIS2, CIS, Essential 8) requires kernel-LPE exploitation-pattern detection rules. Detection-as-compensating-control claims are unverifiable without these rules. |
|
|
122
|
+
|
|
123
|
+
Note: ATLAS refs are intentionally empty in frontmatter — these are Linux kernel LPEs, not AI/ML TTPs. Cross-cutting AI-discovery context (Copy Fail was AI-found in ~1h) is captured in the Threat Context section, not via an ATLAS TTP ID.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Exploit Availability Matrix
|
|
128
|
+
|
|
129
|
+
| CVE | CVSS | RWEP | CISA KEV | PoC Public | AI-Discovered | Active Exploitation | Patch Available | Live Patch | Reboot Required |
|
|
130
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
131
|
+
| CVE-2026-31431 (Copy Fail) | 7.8 | 90 | Yes (2026-03-15) | Yes — 732-byte script | Yes | Confirmed | Yes | Yes (kpatch/livepatch/kGraft) | Yes |
|
|
132
|
+
| CVE-2026-43284 (Dirty Frag ESP) | 7.8 | 38 | No | Yes | No | Suspected | Yes | No (kpatch RHEL-only) | Yes |
|
|
133
|
+
| CVE-2026-43500 (Dirty Frag RxRPC) | 7.6 | 81 | No | Yes (chain component) | No | Suspected | Yes | Partial (kpatch) | Yes if no live patch |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Analysis Procedure
|
|
138
|
+
|
|
139
|
+
When a user invokes this skill, perform this assessment in order:
|
|
140
|
+
|
|
141
|
+
### Step 1: Inventory the environment
|
|
142
|
+
|
|
143
|
+
Ask for or assess:
|
|
144
|
+
- Linux distribution and version
|
|
145
|
+
- Kernel version (`uname -r`)
|
|
146
|
+
- Deployment model: bare metal / VM / container / serverless
|
|
147
|
+
- Existing live-patching capability: kpatch (RHEL), livepatch (Ubuntu), kGraft (SUSE), or none
|
|
148
|
+
- Whether IPsec is used for any network segmentation or encryption controls
|
|
149
|
+
- Current patch management SLA (how many days for Critical/High CVEs)
|
|
150
|
+
- Whether systems can tolerate a reboot (and when)
|
|
151
|
+
|
|
152
|
+
### Step 2: Determine exposure
|
|
153
|
+
|
|
154
|
+
**Copy Fail (CVE-2026-31431):**
|
|
155
|
+
```
|
|
156
|
+
Exposed if: kernel >= 4.14 AND kernel < [patched version for distribution]
|
|
157
|
+
Patched versions:
|
|
158
|
+
RHEL 8/9: kernel-4.18.0-553.xx.el8 / kernel-5.14.0-427.xx.el9
|
|
159
|
+
Ubuntu 22.04: linux-image-5.15.0-xxx (check USN-7xxx)
|
|
160
|
+
Ubuntu 24.04: linux-image-6.8.0-xxx (check USN-7xxx)
|
|
161
|
+
Debian 12: 6.1.xxx (check DSA-5xxx)
|
|
162
|
+
Amazon Linux 2: kernel 5.10.xxx (check ALAS-2026-xxx)
|
|
163
|
+
SUSE 15: kernel 5.14.xxx (check SUSE-SU-2026:xxx)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Dirty Frag (CVE-2026-43284/43500):**
|
|
167
|
+
```
|
|
168
|
+
Exposed if: IPsec or RxRPC modules loaded AND kernel < patched version
|
|
169
|
+
Check: lsmod | grep -E 'esp|xfrm|rxrpc'
|
|
170
|
+
Additional exposure: any IPsec-based network control becomes unreliable
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Step 3: Score exposure level
|
|
174
|
+
|
|
175
|
+
| Condition | Exposure Level |
|
|
176
|
+
|---|---|
|
|
177
|
+
| Kernel unpatched + no live patch + public internet access | Critical |
|
|
178
|
+
| Kernel unpatched + no live patch + internal only | High |
|
|
179
|
+
| Kernel unpatched + live patch deployed | Medium (verify live patch applied: `kpatch list` or `canonical-livepatch status`) |
|
|
180
|
+
| Kernel patched but reboot pending | Medium |
|
|
181
|
+
| Kernel patched + rebooted | Low |
|
|
182
|
+
| Containerized + privileged mode or host PID namespace | Add one severity level |
|
|
183
|
+
| IPsec used for network controls + CVE-2026-43284 unpatched | Add: "IPsec controls not compensating for Dirty Frag" |
|
|
184
|
+
|
|
185
|
+
### Step 4: Generate remediation path
|
|
186
|
+
|
|
187
|
+
**If live patching is available and system cannot tolerate reboot:**
|
|
188
|
+
1. Deploy live kernel patch immediately (kpatch/livepatch/kGraft)
|
|
189
|
+
2. Verify patch applied: `kpatch list` / `canonical-livepatch status`
|
|
190
|
+
3. Schedule reboot at next maintenance window to apply full kernel update
|
|
191
|
+
4. Document: "Live patch deployed YYYY-MM-DD; full patch pending reboot at [maintenance window]"
|
|
192
|
+
|
|
193
|
+
**If no live patching available and system cannot tolerate reboot:**
|
|
194
|
+
1. Compensating controls (reduce blast radius, do not eliminate exposure):
|
|
195
|
+
- Seccomp profile restricting `userfaultfd`, `TIOCCONS`, and page-cache-adjacent syscalls
|
|
196
|
+
- User namespace restrictions (`sysctl -w kernel.unprivileged_userns_clone=0` where supported)
|
|
197
|
+
- Network-level isolation of affected hosts
|
|
198
|
+
- Enhanced monitoring: eBPF/auditd rules for exploitation patterns (see detection section)
|
|
199
|
+
2. Document as open risk with compensating controls and reboot timeline
|
|
200
|
+
3. CISA KEV listing requires documented remediation or mitigation with timeline
|
|
201
|
+
|
|
202
|
+
**If system can tolerate reboot:**
|
|
203
|
+
1. Apply kernel update immediately
|
|
204
|
+
2. Reboot to load new kernel
|
|
205
|
+
3. Verify: `uname -r` shows patched version
|
|
206
|
+
|
|
207
|
+
**For containerized workloads:**
|
|
208
|
+
- The container host kernel determines exposure — container image patching is irrelevant
|
|
209
|
+
- Privileged containers with Copy Fail exposed = host root exposure
|
|
210
|
+
- Apply host kernel patch or live patch
|
|
211
|
+
- Remove `--privileged` and shared host namespaces from containers where possible
|
|
212
|
+
|
|
213
|
+
### Step 5: Compliance theater check
|
|
214
|
+
|
|
215
|
+
Run this check for any org claiming patch management compliance:
|
|
216
|
+
|
|
217
|
+
> "Your patch management control (SI-2 / A.8.8 / PCI 6.3.3) documents a 30-day remediation window for Critical/High CVEs. CVE-2026-31431 (Copy Fail) is CISA KEV listed with a public 732-byte exploit script requiring no privileges. What is the actual time between CISA KEV listing (2026-03-15) and confirmed patch-or-mitigate? If it exceeds 72 hours without live patching as a deployed capability, the patch management control is theater for CISA KEV class vulnerabilities."
|
|
218
|
+
|
|
219
|
+
### Step 6: Assess IPsec dependency
|
|
220
|
+
|
|
221
|
+
If the organization uses IPsec for any of the following, flag explicitly:
|
|
222
|
+
- Network segmentation between security zones
|
|
223
|
+
- Encryption of inter-host traffic
|
|
224
|
+
- VPN tunnels for site-to-site connectivity
|
|
225
|
+
- Compliance with SC-8 or equivalent
|
|
226
|
+
|
|
227
|
+
Flag: "Dirty Frag (CVE-2026-43284) exploits the IPsec implementation. Network controls relying on IPsec cannot be claimed as compensating controls for this vulnerability. These controls should be noted in the risk assessment as providing reduced assurance until CVE-2026-43284 is fully patched."
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Output Format
|
|
232
|
+
|
|
233
|
+
Produce this structure:
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
## Kernel LPE Exposure Assessment
|
|
237
|
+
|
|
238
|
+
**Assessment Date:** YYYY-MM-DD
|
|
239
|
+
**Kernel Version:** x.x.x
|
|
240
|
+
**Distribution:** [name + version]
|
|
241
|
+
|
|
242
|
+
### Exposure Summary
|
|
243
|
+
| CVE | Status | Severity |
|
|
244
|
+
|-----|--------|----------|
|
|
245
|
+
| CVE-2026-31431 (Copy Fail) | [Exposed / Live-patched / Patched] | [Critical/High/Medium/Low] |
|
|
246
|
+
| CVE-2026-43284 (Dirty Frag ESP) | [Exposed / Patched] | [Critical/High/Medium/Low] |
|
|
247
|
+
| CVE-2026-43500 (Dirty Frag RxRPC) | [Exposed / Patched] | [Critical/High/Medium/Low] |
|
|
248
|
+
|
|
249
|
+
### IPsec Control Impact
|
|
250
|
+
[If applicable: which network controls are affected by Dirty Frag]
|
|
251
|
+
|
|
252
|
+
### Remediation Path
|
|
253
|
+
[Live patch or full patch instructions for this specific distro/version]
|
|
254
|
+
|
|
255
|
+
### Compensating Controls (if no-reboot required)
|
|
256
|
+
[Specific sysctl settings, seccomp profiles, monitoring rules]
|
|
257
|
+
|
|
258
|
+
### Framework Gap Declaration
|
|
259
|
+
[Per-framework statement of what the org's patch management control covers and where it falls short]
|
|
260
|
+
|
|
261
|
+
### Compliance Theater Check Result
|
|
262
|
+
[Date of CISA KEV listing vs. date of remediation — theater flag if > 72h without live patch capability]
|
|
263
|
+
|
|
264
|
+
### RWEP Scores
|
|
265
|
+
CVE-2026-31431: CVSS 7.8 / RWEP 90 — immediate action required (4h)
|
|
266
|
+
CVE-2026-43284: CVSS 7.8 / RWEP 38 — remediate within 7 days; disable RxRPC/IPsec chain if not required
|
|
267
|
+
CVE-2026-43500: CVSS 7.6 / RWEP 32 — remediate within 7 days; consider disabling RxRPC module
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Detection Rules
|
|
273
|
+
|
|
274
|
+
If patching is delayed, deploy these detection rules:
|
|
275
|
+
|
|
276
|
+
**auditd — Copy Fail exploitation pattern:**
|
|
277
|
+
```
|
|
278
|
+
-a always,exit -F arch=b64 -S userfaultfd -k lpe_attempt
|
|
279
|
+
-a always,exit -F arch=b64 -S process_vm_writev -k lpe_attempt
|
|
280
|
+
-w /proc/self/mem -p w -k lpe_mem_write
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**sysctl hardening (reduce attack surface, not a full mitigation):**
|
|
284
|
+
```
|
|
285
|
+
kernel.unprivileged_userns_clone = 0
|
|
286
|
+
kernel.perf_event_paranoid = 3
|
|
287
|
+
kernel.kptr_restrict = 2
|
|
288
|
+
vm.unprivileged_userfaultfd = 0
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Monitoring alert:** Any unprivileged process writing to `/proc/[pid]/mem` or invoking `userfaultfd` outside of a known application allowlist should be treated as a potential LPE attempt.
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Hand-Off / Related Skills
|
|
296
|
+
|
|
297
|
+
After producing the kernel LPE triage output, the operator should chain into the following skills. Each entry names a downstream or sibling skill and the specific reason to invoke it from this finding.
|
|
298
|
+
|
|
299
|
+
- **`exploit-scoring`** — recalculate RWEP when any of the inputs that drive the score change post-triage: a new CISA KEV listing for Dirty Frag, a public PoC for CVE-2026-43500's RxRPC leg, or an AI-discovery flag flip. RWEP, not CVSS, is the prioritisation signal — re-run scoring rather than re-reading the static value in the matrix above.
|
|
300
|
+
- **`defensive-countermeasure-mapping`** — map each kernel LPE finding to D3FEND counters (D3-EAL for executable allowlisting at the kernel-module layer, D3-ASLR for address-space layout randomisation hardening, D3-PSEP for process self-modification prevention, D3-PHRA for process hardening / runtime attestation) and produce the defence-in-depth, least-privilege, zero-trust layered remediation plan rather than a single-control patch ticket.
|
|
301
|
+
- **`attack-surface-pentest`** — verify that the kernel LPE class is in the organisation's pen-test scope (TIBER-EU / DORA TLPT for EU financial-sector orgs, CBEST for UK financial, or the equivalent red-team programme). Most 2025-vintage pen-test scopes are perimeter / web-app focused and do not exercise local LPE primitives against the patched-kernel claim.
|
|
302
|
+
- **`compliance-theater`** — test whether the org's SI-2 / A.8.8 / PCI 6.3.3 patch-management evidence is CVSS-anchored theater for a KEV-listed, AI-discovered, 732-byte deterministic LPE. The 30-day window is the exploitation window; if the org cannot show live-patch-within-4-hours capability or documented compensating controls, the patch-management control is theater for this CVE class.
|
|
303
|
+
- **`policy-exception-gen`** — generate a defensible exception for ephemeral container workloads where the 30-day patch window is architecturally impossible (per AGENTS.md rule #9): immutable image fleets, short-lived serverless functions, and Knative-style scale-to-zero workloads cannot accept a runtime patch and must instead document the compensating controls (host-kernel patched, seccomp profile, namespace isolation, unprivileged-userns disabled) as the exception evidence.
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mcp-agent-trust
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: Enumerate MCP trust boundary failures — tool allowlisting, signed manifests, bearer auth, zero-interaction RCE
|
|
5
|
+
triggers:
|
|
6
|
+
- mcp security
|
|
7
|
+
- model context protocol
|
|
8
|
+
- agent trust
|
|
9
|
+
- tool trust
|
|
10
|
+
- mcp rce
|
|
11
|
+
- cve-2026-30615
|
|
12
|
+
- cursor security
|
|
13
|
+
- windsurf security
|
|
14
|
+
- claude code security
|
|
15
|
+
- ai agent security
|
|
16
|
+
data_deps:
|
|
17
|
+
- cve-catalog.json
|
|
18
|
+
- atlas-ttps.json
|
|
19
|
+
- framework-control-gaps.json
|
|
20
|
+
atlas_refs:
|
|
21
|
+
- AML.T0010
|
|
22
|
+
- AML.T0016
|
|
23
|
+
- AML.T0096
|
|
24
|
+
attack_refs:
|
|
25
|
+
- T1195.001
|
|
26
|
+
- T1059
|
|
27
|
+
- T1190
|
|
28
|
+
framework_gaps:
|
|
29
|
+
- ALL-MCP-TOOL-TRUST
|
|
30
|
+
- ISO-27001-2022-A.8.30
|
|
31
|
+
- NIST-800-53-CM-7
|
|
32
|
+
- NIST-800-53-SA-12
|
|
33
|
+
- OWASP-LLM-Top-10-2025-LLM06
|
|
34
|
+
- SOC2-CC9-vendor-management
|
|
35
|
+
- SWIFT-CSCF-v2026-1.1
|
|
36
|
+
rfc_refs:
|
|
37
|
+
- RFC-6749
|
|
38
|
+
- RFC-7519
|
|
39
|
+
- RFC-8446
|
|
40
|
+
- RFC-8725
|
|
41
|
+
- RFC-9114
|
|
42
|
+
- RFC-9421
|
|
43
|
+
- RFC-9700
|
|
44
|
+
cwe_refs:
|
|
45
|
+
- CWE-22
|
|
46
|
+
- CWE-345
|
|
47
|
+
- CWE-352
|
|
48
|
+
- CWE-434
|
|
49
|
+
- CWE-494
|
|
50
|
+
- CWE-77
|
|
51
|
+
- CWE-918
|
|
52
|
+
- CWE-94
|
|
53
|
+
d3fend_refs:
|
|
54
|
+
- D3-CBAN
|
|
55
|
+
- D3-CSPP
|
|
56
|
+
- D3-EAL
|
|
57
|
+
- D3-EHB
|
|
58
|
+
- D3-MFA
|
|
59
|
+
last_threat_review: "2026-05-01"
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
# MCP Agent Trust Assessment
|
|
63
|
+
|
|
64
|
+
## Threat Context (mid-2026)
|
|
65
|
+
|
|
66
|
+
The Model Context Protocol (MCP) is an open protocol for connecting AI assistants to external tools and data sources. It is now the standard integration layer for AI coding assistants: Cursor, VS Code + GitHub Copilot, Windsurf, Claude Code, and Gemini CLI all support MCP servers.
|
|
67
|
+
|
|
68
|
+
MCP creates an architectural trust problem that no existing security framework addresses.
|
|
69
|
+
|
|
70
|
+
### The Trust Boundary Failure
|
|
71
|
+
|
|
72
|
+
An MCP server is a process that exposes tools (functions the AI can call) and resources (data the AI can read). When an AI assistant decides to call an MCP tool, it does so based on:
|
|
73
|
+
1. The tool's description (provided by the MCP server)
|
|
74
|
+
2. The prompt context (which may contain adversarial instructions)
|
|
75
|
+
3. The model's own judgment
|
|
76
|
+
|
|
77
|
+
There is no mandatory:
|
|
78
|
+
- Code signing requirement for MCP server packages
|
|
79
|
+
- Tool allowlist (the client allows all tools by default)
|
|
80
|
+
- Authentication requirement between the AI client and the MCP server
|
|
81
|
+
- Output sanitization before returning tool results to the model
|
|
82
|
+
- Permission model for what the MCP server process can access on the host
|
|
83
|
+
|
|
84
|
+
This means: a malicious or compromised MCP server can execute arbitrary code by simply returning adversarial instructions in tool responses, which the AI model then follows.
|
|
85
|
+
|
|
86
|
+
### CVE-2026-30615 — Windsurf MCP Zero-Interaction RCE
|
|
87
|
+
|
|
88
|
+
**CVSS:** 9.8 | **RWEP:** 94/100
|
|
89
|
+
|
|
90
|
+
A vulnerability in the Windsurf MCP client that allows a malicious MCP server to achieve remote code execution without any user interaction. The user does not click anything, approve anything, or trigger any visible action. The AI assistant autonomously calls the malicious tool and the code executes.
|
|
91
|
+
|
|
92
|
+
**Affected:** Windsurf (all versions before patch), and by architectural similarity: Cursor, VS Code MCP extension, Claude Code, Gemini CLI (each has its own vulnerability profile; CVE-2026-30615 is specific to Windsurf's implementation but the attack surface is identical across clients).
|
|
93
|
+
|
|
94
|
+
**Scale:** 150M+ combined downloads across affected AI coding assistants.
|
|
95
|
+
|
|
96
|
+
**Attack path:**
|
|
97
|
+
1. Attacker publishes malicious MCP server to npm or creates a typosquatting package
|
|
98
|
+
2. Developer installs the package (or a legitimate package is compromised via supply chain)
|
|
99
|
+
3. AI assistant starts, connects to MCP server, receives tool list
|
|
100
|
+
4. At any future point: AI assistant calls a tool on the malicious server (possibly triggered by a prompt injection in a code comment, PR description, or documentation)
|
|
101
|
+
5. MCP server returns a response containing adversarial instructions
|
|
102
|
+
6. AI assistant follows the instructions — executes code, exfiltrates files, persists backdoor
|
|
103
|
+
|
|
104
|
+
No user interaction required after installation.
|
|
105
|
+
|
|
106
|
+
### Supply Chain Attack Surface
|
|
107
|
+
|
|
108
|
+
Every MCP server listed in popular registries (MCP Hub, npm `@modelcontextprotocol/*`) is a potential supply chain target. Unlike npm packages where exploitation requires running arbitrary code in the package lifecycle hooks, MCP servers are explicitly *designed* to run code on behalf of the AI model. The attack surface is the entire intended functionality.
|
|
109
|
+
|
|
110
|
+
**Observed patterns:**
|
|
111
|
+
- Typosquatting of popular MCP servers (e.g., `@mcp/filesystem` vs `@mcpfilesystem`)
|
|
112
|
+
- Legitimate servers with delayed malicious payloads (time-bomb or condition-based activation)
|
|
113
|
+
- Dependency confusion attacks targeting MCP servers in private registries
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Framework Lag Declaration
|
|
118
|
+
|
|
119
|
+
| Framework | Control | Why It Fails for MCP |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| NIST 800-53 | SA-12 (Supply Chain Protection) | Designed for software procurement and vendor management in enterprise contexts. No guidance for developer-installed AI tool plugins that execute code on behalf of AI models. SA-12's "supply chain risk management plan" does not contemplate MCP server provenance or trust. |
|
|
122
|
+
| NIST 800-53 | CM-7 (Least Functionality) | "Configure systems to provide only essential capabilities." Does not address the inverted trust model where the AI assistant decides which tools to call based on model judgment, not an allowlist. |
|
|
123
|
+
| NIST 800-53 | CM-11 (User-Installed Software) | User-installed software policy. MCP servers are installed by developers as part of their workflow. CM-11 doesn't distinguish between a code editor plugin and an MCP server that has RCE capability. |
|
|
124
|
+
| ISO 27001:2022 | A.8.30 (Outsourced development) | Third-party development supplier controls. MCP servers are not "outsourced development" — they are runtime tool providers that execute in the context of the AI session. Requires new control category. |
|
|
125
|
+
| ISO 27001:2022 | A.5.19 (Information security in supplier relationships) | Supplier risk management. Does not contemplate AI tool plugin supply chains or MCP server trust. |
|
|
126
|
+
| SOC 2 | CC9 (Risk Mitigation — vendor management) | Vendor review processes. SOC 2 vendor management reviews are designed for SaaS providers with data access, not MCP servers that run local code. Audit evidence does not cover MCP server signing or allowlisting. |
|
|
127
|
+
| CIS Controls v8 | Control 2 (Inventory and Control of Software Assets) | Software inventory and allowlisting. Does not explicitly cover MCP servers. AI coding assistant MCP configs are not in scope for most enterprise software inventory processes. |
|
|
128
|
+
| PCI DSS 4.0 | 12.3.4 | Review and manage third-party service providers. Scoped to service providers with access to cardholder data. An MCP server running on a developer workstation accessing a PCI-scoped codebase is not clearly in scope and would not appear in vendor management reviews. |
|
|
129
|
+
| SWIFT CSCF v2026 | 1.1 (SWIFT Environment Protection — allowlisted software inside the secure zone) | Mandates allowlisted software and protected operator-PC posture for the SWIFT secure zone. The control's allowlist concept is the closest existing analogue to MCP tool allowlisting, but CSCF 1.1 was written for traditional middleware and does not contemplate MCP servers, agent-mediated tool calls, or model-judgment-as-authorization on operator workstations adjacent to the SWIFT zone. |
|
|
130
|
+
|
|
131
|
+
**Fundamental gap:** No current framework has a control category for "AI tool trust boundaries" — the concept that an AI model can be the authorization mechanism for code execution, and that this creates a new class of supply chain and access control risk.
|
|
132
|
+
|
|
133
|
+
**Underlying RFC stack and its gaps.** MCP HTTP transport rides on RFC 9114 (HTTP/3) and/or RFC 9112 (HTTP/1.1). Server-to-agent authenticity claims rely on bearer tokens defined by RFC 7519 (JWT) — and MUST follow RFC 8725 (BCP 225, JWT Best Current Practices) to avoid `alg=none`, `kid` traversal, and audience-confusion attack classes. OAuth 2.0 (RFC 6749) is the typical authorization layer; operators should track RFC 9700 (OAuth 2.0 Security Best Current Practice, January 2025) rather than the original RFC 6749 threat model. For per-request integrity, RFC 9421 (HTTP Message Signatures, published 2024-02) is the current standard, but the MCP specification does not yet mandate it — a documented gap that lets a network-positioned attacker tamper with or replay tool responses even when the transport is TLS-terminated at a reverse proxy. Reference `data/rfc-references.json` rather than restating content here.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## TTP Mapping
|
|
138
|
+
|
|
139
|
+
| ATLAS/ATT&CK ID | Technique | MCP Relevance | Gap |
|
|
140
|
+
|---|---|---|---|
|
|
141
|
+
| AML.T0010 | ML Supply Chain Compromise | Direct: malicious MCP server in public registry compromises AI assistant's tool execution | ATLAS covers this conceptually; no framework has a technical control |
|
|
142
|
+
| AML.T0054 | Craft Adversarial Data — NLP | Indirect: adversarial prompt in tool response triggers AI to call next malicious action | No framework control |
|
|
143
|
+
| AML.T0096 | LLM Integration Abuse | AI assistant is the integration point being abused — MCP tool calls are the mechanism | Not in ATT&CK; only in ATLAS v5.1.0 |
|
|
144
|
+
| T1195.001 | Supply Chain Compromise: Compromise Software Dependencies | MCP server package as supply chain attack target | ATT&CK covers but enterprise controls don't reach developer MCP configs |
|
|
145
|
+
| T1059 | Command and Script Interpreter | MCP server causes shell command execution via model-mediated tool call | Standard SI-3/EDR doesn't attribute this to the MCP server as origin |
|
|
146
|
+
| T1190 | Exploit Public-Facing Application | CVE-2026-30615: MCP client vulnerability exploited by server | Standard vuln management covers client; MCP server trust is unaddressed |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Exploit Availability Matrix
|
|
151
|
+
|
|
152
|
+
Sourced from `data/cve-catalog.json` and `data/exploit-availability.json` as of 2026-05-11.
|
|
153
|
+
|
|
154
|
+
| Threat | CVSS | RWEP | PoC Public? | CISA KEV? | AI-Accelerated Weaponization? | Patch Available? | Reboot / Version Bump Required? |
|
|
155
|
+
|---|---|---|---|---|---|---|---|
|
|
156
|
+
| CVE-2026-30615 (Windsurf MCP zero-interaction RCE) | 9.8 | 35 | Partial — conceptual exploit demonstrated; weaponization stage `partial` | No (architectural class; not in KEV catalog as of 2026-05) | No direct AI-assisted weaponization recorded; the attack vector itself rides on the AI agent's tool-call autonomy | Yes — vendor IDE update | IDE update / version bump required (no reboot); `live_patch_available: true` via vendor channel |
|
|
157
|
+
| MCP supply chain compromise — typosquatting / dependency confusion (ATLAS AML.T0010) | N/A (technique, not vendor CVE) | N/A | Yes — public typosquatting incidents in `@modelcontextprotocol/*` namespace observed | No (technique class) | Yes — AI assistants accelerate writing of convincing malicious tool descriptions | Mitigation only: pin versions, verify npm provenance attestation, enforce allowlist | Re-install / pin to known-good version |
|
|
158
|
+
| Adversarial tool response → indirect prompt injection (ATLAS AML.T0054 in MCP context) | N/A (technique, not vendor CVE) | N/A | Yes — public research demonstrations; weaponizable wherever output is unsanitized | No | Yes — adversarial instruction crafting is a documented AI-accelerated capability | Mitigation only: output sanitization, system-prompt authority hierarchy, tool allowlisting | Client configuration change; no version bump strictly required |
|
|
159
|
+
| AML.T0096 — MCP tool call as covert C2 conduit | N/A (technique) | N/A | Yes — SesameOp-class techniques apply when an MCP tool call is the relay | No | Yes — see `data/atlas-ttps.json` AML.T0096 real-world instances | Mitigation only: process-level AI/MCP egress monitoring | Configuration / monitoring change |
|
|
160
|
+
|
|
161
|
+
**Interpretation:** CVE-2026-30615 has a vendor patch and live-update path — verify Windsurf clients are on the patched version. The remaining rows are technique classes with no vendor CVE; mitigation is configurational (signed manifests, tool allowlists, bearer auth, output sanitization, version pinning) and cannot be "patched away" by a single vendor release.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Analysis Procedure
|
|
166
|
+
|
|
167
|
+
### Step 1: Inventory installed MCP servers
|
|
168
|
+
|
|
169
|
+
For each developer workstation or shared AI system:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# AI coding assistant MCP configs (check all that are installed):
|
|
173
|
+
cat ~/.claude/settings.json | jq '.mcpServers'
|
|
174
|
+
cat ~/.cursor/mcp.json
|
|
175
|
+
cat ~/.windsurf/mcp.json
|
|
176
|
+
cat ~/.gemini/settings.json
|
|
177
|
+
cat ~/.vscode/settings.json | grep -A 20 '"mcp"'
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
For each server found, record:
|
|
181
|
+
- Package name and version
|
|
182
|
+
- Installation source (npm, local path, custom registry)
|
|
183
|
+
- What tools it exposes
|
|
184
|
+
- What filesystem/network/process permissions it requires
|
|
185
|
+
- Whether an explicit tool allowlist exists
|
|
186
|
+
|
|
187
|
+
### Step 2: Verify package provenance
|
|
188
|
+
|
|
189
|
+
For each npm-installed MCP server:
|
|
190
|
+
```bash
|
|
191
|
+
npm pack --dry-run <package-name>
|
|
192
|
+
npm audit <package-name>
|
|
193
|
+
# Check: is the package signed? (npm provenance)
|
|
194
|
+
npm view <package-name> dist.integrity
|
|
195
|
+
# Check: does it match the expected hash?
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Red flags:
|
|
199
|
+
- Recent publication (< 30 days) with high download counts
|
|
200
|
+
- Package name close to a well-known server (typosquatting)
|
|
201
|
+
- Dependencies with postinstall scripts
|
|
202
|
+
- No npm provenance attestation
|
|
203
|
+
|
|
204
|
+
### Step 3: Assess trust configuration
|
|
205
|
+
|
|
206
|
+
For each MCP client configuration, check:
|
|
207
|
+
|
|
208
|
+
**Tool allowlisting:**
|
|
209
|
+
- Is there an explicit `allowed_tools` list? (restricts which tools the AI can call)
|
|
210
|
+
- If no allowlist: the AI can call any tool the server exposes, including tools added after installation
|
|
211
|
+
- Risk: server can add new malicious tools in an update, no re-consent required
|
|
212
|
+
|
|
213
|
+
**Authentication:**
|
|
214
|
+
- Does the MCP server require authentication (bearer token, mTLS)?
|
|
215
|
+
- If no auth: any local process can connect to the MCP server and impersonate the AI client
|
|
216
|
+
- Applies particularly to MCP servers that listen on a local port
|
|
217
|
+
|
|
218
|
+
**Output trust:**
|
|
219
|
+
- Are MCP server responses treated as trusted (passed directly to model context)?
|
|
220
|
+
- If yes: adversarial instructions in tool responses execute in model context
|
|
221
|
+
|
|
222
|
+
**Process isolation:**
|
|
223
|
+
- Does the MCP server process run with the same privileges as the AI client?
|
|
224
|
+
- Does it have filesystem access beyond its stated scope?
|
|
225
|
+
- Does it have network access?
|
|
226
|
+
|
|
227
|
+
### Step 4: Score MCP trust posture
|
|
228
|
+
|
|
229
|
+
| Factor | Risk Score |
|
|
230
|
+
|---|---|
|
|
231
|
+
| No tool allowlist | +High |
|
|
232
|
+
| No package signing verification | +High |
|
|
233
|
+
| No authentication required by server | +Medium |
|
|
234
|
+
| Server has filesystem read/write access | +High |
|
|
235
|
+
| Server has shell/process execution access | +Critical |
|
|
236
|
+
| Server has network access | +Medium |
|
|
237
|
+
| Outputs not sanitized | +High |
|
|
238
|
+
| Server was installed from public registry without audit | +Medium |
|
|
239
|
+
| Server version was auto-updated | +Medium |
|
|
240
|
+
| No MCP server activity logging | +High |
|
|
241
|
+
|
|
242
|
+
### Step 5: Generate remediation
|
|
243
|
+
|
|
244
|
+
**Immediate (regardless of risk posture):**
|
|
245
|
+
1. Audit all installed MCP servers — full inventory
|
|
246
|
+
2. Remove any servers that cannot be verified by provenance
|
|
247
|
+
3. Pin all MCP server versions (no auto-update)
|
|
248
|
+
4. Enable logging for all MCP tool calls (what tool was called, what arguments, what response)
|
|
249
|
+
|
|
250
|
+
**Configuration hardening:**
|
|
251
|
+
```json
|
|
252
|
+
{
|
|
253
|
+
"mcpServers": {
|
|
254
|
+
"filesystem": {
|
|
255
|
+
"command": "npx",
|
|
256
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem@1.2.3"],
|
|
257
|
+
"allowed_tools": ["read_file", "list_directory"],
|
|
258
|
+
"env": {}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Trust tier model:**
|
|
265
|
+
- Tier 0 (no install): MCP servers with shell/process execution, network exfil capability, unsigned
|
|
266
|
+
- Tier 1 (audited, pinned, allowlisted): Standard workspace MCP servers (filesystem, git, DB read-only)
|
|
267
|
+
- Tier 2 (monitored): Any server with write access — every tool call logged and alertable
|
|
268
|
+
|
|
269
|
+
**For organizational deployments:**
|
|
270
|
+
- Maintain an approved MCP server registry (name, version, hash, approved scopes)
|
|
271
|
+
- Distribute approved MCP configs via MDM/endpoint management
|
|
272
|
+
- Block unapproved MCP server installations on managed workstations
|
|
273
|
+
- Monitor for new MCP server additions in endpoint config files
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Output Format
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
## MCP Trust Assessment
|
|
281
|
+
|
|
282
|
+
**Assessment Date:** YYYY-MM-DD
|
|
283
|
+
**Scope:** [workstations / AI systems assessed]
|
|
284
|
+
|
|
285
|
+
### Installed MCP Server Inventory
|
|
286
|
+
| Server | Version | Source | Tools Exposed | Filesystem | Network | Shell | Auth Required | Allowlist |
|
|
287
|
+
|--------|---------|--------|---------------|------------|---------|-------|---------------|-----------|
|
|
288
|
+
|
|
289
|
+
### CVE-2026-30615 Exposure
|
|
290
|
+
[Windsurf version check — patched/unpatched]
|
|
291
|
+
|
|
292
|
+
### Trust Posture Score
|
|
293
|
+
[Per server: Critical/High/Medium/Low with factor breakdown]
|
|
294
|
+
|
|
295
|
+
### Immediate Actions Required
|
|
296
|
+
[Servers to remove, versions to pin, configs to lock]
|
|
297
|
+
|
|
298
|
+
### Hardened Configuration
|
|
299
|
+
[Ready-to-use JSON config for each AI client in scope]
|
|
300
|
+
|
|
301
|
+
### Framework Gap Declaration
|
|
302
|
+
[Per-framework: what control nominally applies, why it doesn't cover MCP trust, what a real control requires]
|
|
303
|
+
|
|
304
|
+
### Organizational Policy Requirements
|
|
305
|
+
[If org-level deployment: approved registry, MDM config, monitoring requirements]
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Hand-Off / Related Skills
|
|
311
|
+
|
|
312
|
+
After producing the MCP trust assessment output, the operator should chain into the following skills. Each entry is specific to a finding class this skill produces.
|
|
313
|
+
|
|
314
|
+
- **`supply-chain-integrity`** — MCP servers are software supply chain artifacts. For every server in the inventory, produce SLSA-level attestation, Sigstore signature verification, and in-toto provenance. The MCP ecosystem ships overwhelmingly via npm without provenance; this is the artefact-level control that the vendor-management gap above implicitly delegates to.
|
|
315
|
+
- **`defensive-countermeasure-mapping`** — map MCP trust failures to D3FEND counters: D3-EHB (hash-based executable allowlisting for the MCP server binary), D3-CBAN (certificate-based authentication between client and server), D3-MFA (multi-factor authentication on the MCP control plane where remote), D3-CSPP (client-server payload profiling on tool call / tool response shapes). The trust-tier model in Step 5 above is operationalised through these counters.
|
|
316
|
+
- **`attack-surface-pentest`** — explicitly include each installed MCP server in the in-scope target list for pen-testing and adversary emulation. 2025-vintage pen-test scopes overwhelmingly omit MCP servers; this is the single biggest assumed-out-of-scope gap discovered during this skill's analysis.
|
|
317
|
+
- **`dlp-gap-analysis`** — MCP tool arguments are a DLP egress channel. Verify that SDK-level prompt logging captures tool-arg egress (filenames, file contents, credential strings passed as arguments) and that DLP classifiers run on the tool-call payload, not just on file/email egress. Without this, an MCP server with filesystem read access is a fully invisible exfiltration path.
|
|
318
|
+
- **`framework-gap-analysis`** — when the MCP trust gap fails a specific framework control (NIST-800-53-CM-7 / ISO-27001-2022-A.8.30 / SOC2-CC9 vendor management), invoke this skill to produce the formal gap declaration tied to the organisation's compliance scope and jurisdiction, including the EU NIS2 / DORA / AU Essential 8 mappings per AGENTS.md rule #5.
|
|
319
|
+
|
|
320
|
+
For ephemeral / serverless AI-pipeline contexts (per AGENTS.md rule #9): live SLSA-attestation verification at runtime is architecturally impossible for inline-pulled MCP servers in serverless functions. The scoped alternative is build-time attestation pinning baked into the function image, with the runtime fetch path disabled at the network layer.
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Compliance Theater Check
|
|
325
|
+
|
|
326
|
+
> "Your vendor management control (CC9 / SA-12 / A.5.19) documents a review process for third-party software with access to sensitive systems. Enumerate the MCP servers installed on developer workstations that have access to production codebases or credentials. How many of those MCP servers went through your vendor review process? If the answer is zero, the vendor management control is theater for the attack surface where AI-assisted supply chain attacks are actually occurring."
|