@blamejs/exceptd-skills 0.19.39 → 0.20.0

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.
Files changed (60) hide show
  1. package/AGENTS.md +3 -3
  2. package/ARCHITECTURE.md +3 -3
  3. package/CHANGELOG.md +12 -0
  4. package/CONTEXT.md +1 -1
  5. package/README.md +4 -4
  6. package/data/_indexes/_meta.json +39 -39
  7. package/data/_indexes/activity-feed.json +122 -122
  8. package/data/_indexes/catalog-summaries.json +2 -2
  9. package/data/_indexes/chains.json +2866 -2866
  10. package/data/_indexes/currency.json +66 -66
  11. package/data/_indexes/recipes.json +1 -1
  12. package/data/_indexes/section-offsets.json +231 -231
  13. package/data/_indexes/summary-cards.json +34 -34
  14. package/data/_indexes/token-budget.json +100 -100
  15. package/data/atlas-ttps.json +34 -34
  16. package/data/framework-control-gaps.json +3 -3
  17. package/data/playbooks/mcp.json +1 -1
  18. package/data/playbooks/sbom.json +1 -1
  19. package/manifest-snapshot.json +2 -2
  20. package/manifest-snapshot.sha256 +1 -1
  21. package/manifest.json +122 -122
  22. package/package.json +2 -2
  23. package/sbom.cdx.json +121 -106
  24. package/scripts/builders/catalog-summaries.js +1 -1
  25. package/scripts/builders/recipes.js +1 -1
  26. package/scripts/check-atlas-catalog-currency.js +256 -0
  27. package/scripts/predeploy.js +11 -0
  28. package/skills/age-gates-child-safety/skill.md +3 -3
  29. package/skills/ai-attack-surface/skill.md +10 -10
  30. package/skills/ai-c2-detection/skill.md +5 -5
  31. package/skills/api-security/skill.md +2 -2
  32. package/skills/attack-surface-pentest/skill.md +6 -6
  33. package/skills/cloud-security/skill.md +3 -3
  34. package/skills/compliance-theater/skill.md +8 -8
  35. package/skills/container-runtime-security/skill.md +3 -3
  36. package/skills/coordinated-vuln-disclosure/skill.md +2 -2
  37. package/skills/dlp-gap-analysis/skill.md +5 -5
  38. package/skills/exploit-scoring/skill.md +3 -3
  39. package/skills/framework-gap-analysis/skill.md +7 -7
  40. package/skills/fuzz-testing-strategy/skill.md +2 -2
  41. package/skills/global-grc/skill.md +3 -3
  42. package/skills/incident-response-playbook/skill.md +2 -2
  43. package/skills/mcp-agent-trust/skill.md +3 -3
  44. package/skills/mlops-security/skill.md +4 -4
  45. package/skills/ot-ics-security/skill.md +3 -3
  46. package/skills/policy-exception-gen/skill.md +5 -5
  47. package/skills/rag-pipeline-security/skill.md +4 -4
  48. package/skills/ransomware-response/skill.md +2 -2
  49. package/skills/researcher/skill.md +4 -4
  50. package/skills/sector-energy/skill.md +2 -2
  51. package/skills/sector-federal-government/skill.md +2 -2
  52. package/skills/sector-financial/skill.md +4 -4
  53. package/skills/sector-healthcare/skill.md +3 -3
  54. package/skills/security-maturity-tiers/skill.md +4 -4
  55. package/skills/skill-update-loop/skill.md +5 -5
  56. package/skills/supply-chain-integrity/skill.md +4 -4
  57. package/skills/threat-model-currency/skill.md +10 -10
  58. package/skills/threat-modeling-methodology/skill.md +2 -2
  59. package/skills/webapp-security/skill.md +2 -2
  60. package/skills/zeroday-gap-learn/skill.md +3 -3
@@ -11,7 +11,7 @@ const path = require("path");
11
11
  const CATALOG_PURPOSES = {
12
12
  "cve-catalog.json": "Per-CVE record (CVSS, EPSS, CISA KEV, RWEP, AI-discovery, vendor advisories, framework gaps, ATLAS/ATT&CK mappings). Cross-validated against NVD + CISA KEV + FIRST EPSS via validate-cves.",
13
13
  "cwe-catalog.json": "MITRE CWE entries used by the project (subset with skill citations), with severity hint and category. Pinned to a CWE catalog version.",
14
- "atlas-ttps.json": "MITRE ATLAS TTPs (AML.T0xxx) cited by skills, with tactic, name, description. Pinned to ATLAS v2026.07 (May 2026).",
14
+ "atlas-ttps.json": "MITRE ATLAS TTPs (AML.T0xxx) cited by skills, with tactic, name, description. Pinned to ATLAS v2026.09 (September 2026).",
15
15
  "d3fend-catalog.json": "MITRE D3FEND countermeasures (D3-xxx) keyed by id, with tactic + name. Pinned to D3FEND v1.3.0 release.",
16
16
  "framework-control-gaps.json": "Per-control framework gap declarations: SI-2, A.8.8, PCI 6.3.3, etc. Each entry names the control, the lag, the evidence CVE, and remediation guidance.",
17
17
  "global-frameworks.json": "Multi-jurisdiction framework registry: per-jurisdiction applicable frameworks × patch_sla / notification_sla / critical_controls / framework_gaps (jurisdiction count is reported by entry_count, not duplicated here). Cross-cutting authority for jurisdiction-clocks index.",
@@ -14,7 +14,7 @@ const RECIPES = [
14
14
  when_to_use: "Before scoping or executing a red-team engagement against a model, agentic system, or AI feature.",
15
15
  typical_jurisdictions: ["US", "EU", "UK", "GLOBAL"],
16
16
  steps: [
17
- { skill: "ai-attack-surface", why: "Comprehensive attack-surface inventory mapped to ATLAS v2026.07 with gap flags." },
17
+ { skill: "ai-attack-surface", why: "Comprehensive attack-surface inventory mapped to ATLAS v2026.09 with gap flags." },
18
18
  { skill: "ai-c2-detection", why: "Detection coverage for AI-as-C2 (PROMPTFLUX / SesameOp / AI-API egress) before testing." },
19
19
  { skill: "mcp-agent-trust", why: "MCP server trust boundary for the engineering toolchain side of the surface." },
20
20
  { skill: "rag-pipeline-security", why: "RAG ingestion provenance + prompt-injection chain coverage." },
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Checks data/atlas-ttps.json against the ATLAS release it claims to be pinned to.
5
+ *
6
+ * Every other check treats the catalog as ground truth: check-ttp-references.js
7
+ * resolves ids used elsewhere in the repo against it, and nothing compares it to
8
+ * MITRE. An id can therefore carry a name MITRE gives to a different technique,
9
+ * or name a sub-technique that does not exist, and every gate stays green.
10
+ *
11
+ * Three things are compared, for the release named in `_meta.atlas_version`:
12
+ * 1. every AML id in the catalog exists upstream
13
+ * 2. every catalog name is the name upstream gives that id
14
+ * 3. every AML sub-technique id named inside a `subtechniques` list exists
15
+ *
16
+ * Divergences recorded in tests/.atlas-divergence-baseline.json are reported and
17
+ * allowed, so known work in progress does not block a release while any NEW
18
+ * divergence does. An entry that has been repaired and is still in the baseline
19
+ * is also an error, so the file shrinks instead of going stale.
20
+ *
21
+ * Two naming conventions are accepted without a baseline entry, because they
22
+ * render the same technique rather than a different one: a sub-technique may be
23
+ * written "Parent: Child" where upstream stores only "Child", and a name may
24
+ * carry a parenthetical qualifier.
25
+ *
26
+ * The release data is fetched over the network and cached under
27
+ * .cache/upstream/atlas/. A tagged release is immutable, so the cache is only
28
+ * ever written once per pin. With no cache and no network the check reports
29
+ * that it could not verify and exits non-zero: not having checked is not the
30
+ * same as having passed.
31
+ *
32
+ * Usage: node scripts/check-atlas-catalog-currency.js [--json]
33
+ */
34
+
35
+ const fs = require("node:fs");
36
+ const path = require("node:path");
37
+ const https = require("node:https");
38
+
39
+ const ROOT = path.resolve(__dirname, "..");
40
+ const CATALOG = path.join(ROOT, "data", "atlas-ttps.json");
41
+ const BASELINE = path.join(ROOT, "tests", ".atlas-divergence-baseline.json");
42
+ const CACHE_DIR = path.join(ROOT, ".cache", "upstream", "atlas");
43
+ const JSON_OUT = process.argv.includes("--json");
44
+
45
+ const AML_ID = /^AML\.(?:TA|T|M|CS)[0-9]+(?:\.[0-9]+)?$/;
46
+
47
+ function emit(line) {
48
+ if (!JSON_OUT) process.stdout.write(line + "\n");
49
+ }
50
+
51
+ function fetchText(url, redirects = 0) {
52
+ return new Promise((resolve, reject) => {
53
+ if (redirects > 5) return reject(new Error("too many redirects"));
54
+ const req = https.get(url, { headers: { "user-agent": "exceptd-atlas-currency" } }, (res) => {
55
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
56
+ res.resume();
57
+ return resolve(fetchText(res.headers.location, redirects + 1));
58
+ }
59
+ if (res.statusCode !== 200) {
60
+ res.resume();
61
+ return reject(new Error(`HTTP ${res.statusCode} for ${url}`));
62
+ }
63
+ let body = "";
64
+ res.setEncoding("utf8");
65
+ res.on("data", (c) => { body += c; });
66
+ res.on("end", () => resolve(body));
67
+ });
68
+ req.setTimeout(30000, () => req.destroy(new Error("timed out")));
69
+ req.on("error", reject);
70
+ });
71
+ }
72
+
73
+ // The pin is read from a file and then becomes part of a URL and a path, so it
74
+ // is constrained to the calendar-version shape ATLAS publishes before either.
75
+ const PIN_SHAPE = /^[0-9]{4}\.[0-9]{2}(?:\.[0-9]+)?$/;
76
+
77
+ async function loadRelease(pin) {
78
+ if (!PIN_SHAPE.test(pin)) {
79
+ throw new Error(`_meta.atlas_version ${JSON.stringify(pin)} is not a YYYY.MM release`);
80
+ }
81
+ const cached = path.join(CACHE_DIR, `ATLAS-${pin}.yaml`);
82
+ // Read and handle absence, rather than asking whether it exists and then
83
+ // reading: between the two answers the file can change.
84
+ let cachedText = null;
85
+ try { cachedText = fs.readFileSync(cached, "utf8"); }
86
+ catch (e) { if (e.code !== "ENOENT") throw e; }
87
+ if (cachedText !== null && cachedText.includes(`version: '${pin}'`)) {
88
+ return { text: cachedText, source: "cache" };
89
+ }
90
+ const url = `https://raw.githubusercontent.com/mitre-atlas/atlas-data/v${pin}/dist/v6/ATLAS-${pin}.yaml`;
91
+ const text = await fetchText(url);
92
+ if (!text.includes(`version: '${pin}'`)) {
93
+ throw new Error(`the file at ${url} does not declare version ${pin}`);
94
+ }
95
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
96
+ fs.writeFileSync(cached, text);
97
+ return { text, source: "network" };
98
+ }
99
+
100
+ // Format 6 keys each object by its id, with name as the first child key.
101
+ function parseNames(text) {
102
+ const re = /\n {2}(AML\.(?:TA|T|M|CS)[0-9.]+):\n {4}name:\s*(?:"([^"]*)"|'([^']*)'|([^\n]*))/g;
103
+ const out = new Map();
104
+ let m;
105
+ while ((m = re.exec(text)) !== null) {
106
+ const name = (m[2] !== undefined ? m[2] : m[3] !== undefined ? m[3] : (m[4] || "")).trim();
107
+ if (!out.has(m[1])) out.set(m[1], name);
108
+ }
109
+ return out;
110
+ }
111
+
112
+ // "Use Alternate Authentication Material: Web Session Cookie" renders upstream's
113
+ // "Web Session Cookie" with its parent; "AI Agent (as Attacker Asset)" qualifies
114
+ // upstream's "AI Agent". Neither names a different technique. The "Parent: Child"
115
+ // form is accepted only for a sub-technique, and only when the prefix is the
116
+ // upstream name of that sub-technique's parent.
117
+ function isRenderingOf(ours, theirs, parentName) {
118
+ if (!theirs) return false;
119
+ const bare = ours.replace(/\s*\([^)]*\)\s*$/, "").trim();
120
+ if (bare === theirs) return true;
121
+ const i = ours.lastIndexOf(": ");
122
+ if (i <= 0 || !parentName) return false;
123
+ return ours.slice(0, i).trim() === parentName && ours.slice(i + 2).trim() === theirs;
124
+ }
125
+
126
+ // The upstream name of a sub-technique's parent, or null for a technique.
127
+ function parentNameOf(id, upstream) {
128
+ const m = /^(AML\.T\d+)\.\d+$/.exec(id);
129
+ return m ? upstream.get(m[1]) || null : null;
130
+ }
131
+
132
+ function readBaseline() {
133
+ if (!fs.existsSync(BASELINE)) return { names: {}, missing_ids: [], missing_subtechniques: [] };
134
+ try {
135
+ const j = JSON.parse(fs.readFileSync(BASELINE, "utf8"));
136
+ return {
137
+ names: j.names || {},
138
+ missing_ids: j.missing_ids || [],
139
+ missing_subtechniques: j.missing_subtechniques || [],
140
+ };
141
+ } catch (e) {
142
+ process.stderr.write(`[check-atlas-catalog-currency] cannot read the baseline: ${e.message}\n`);
143
+ return null;
144
+ }
145
+ }
146
+
147
+ async function main() {
148
+ const catalog = JSON.parse(fs.readFileSync(CATALOG, "utf8"));
149
+ const pin = catalog._meta && catalog._meta.atlas_version;
150
+ if (!pin) {
151
+ process.stderr.write("[check-atlas-catalog-currency] data/atlas-ttps.json has no _meta.atlas_version\n");
152
+ process.exitCode = 1;
153
+ return;
154
+ }
155
+
156
+ const baseline = readBaseline();
157
+ if (!baseline) { process.exitCode = 1; return; }
158
+
159
+ let release;
160
+ try {
161
+ release = await loadRelease(pin);
162
+ } catch (e) {
163
+ process.stderr.write(
164
+ `[check-atlas-catalog-currency] COULD NOT VERIFY: ${e.message}\n` +
165
+ "The catalog was not compared to anything, which is not the same as passing. " +
166
+ `Re-run with network access, or place the release file under ${path.relative(ROOT, CACHE_DIR)}.\n`
167
+ );
168
+ process.exitCode = 2;
169
+ return;
170
+ }
171
+
172
+ const upstream = parseNames(release.text);
173
+ emit(`[check-atlas-catalog-currency] ATLAS ${pin} (${release.source}): ${upstream.size} objects`);
174
+
175
+ const ids = Object.keys(catalog).filter((k) => !k.startsWith("_"));
176
+ const missing = [];
177
+ const misnamed = [];
178
+ const missingSub = [];
179
+
180
+ for (const id of ids) {
181
+ if (!AML_ID.test(id)) continue;
182
+ const ours = String(catalog[id].name || "").trim();
183
+ if (!upstream.has(id)) { missing.push({ id, ours }); continue; }
184
+ const theirs = upstream.get(id);
185
+ if (ours !== theirs && !isRenderingOf(ours, theirs, parentNameOf(id, upstream))) misnamed.push({ id, ours, theirs });
186
+ }
187
+
188
+ for (const id of ids) {
189
+ const subs = catalog[id] && catalog[id].subtechniques;
190
+ if (!Array.isArray(subs)) continue;
191
+ for (const s of subs) {
192
+ const m = String(s).match(/AML\.T[0-9]+\.[0-9]+/);
193
+ if (m && !upstream.has(m[0])) missingSub.push({ id, sub: m[0] });
194
+ }
195
+ }
196
+
197
+ // Each allowance covers exactly one finding. A recorded name does not excuse a
198
+ // sub-technique id, and a recorded sub-technique id does not excuse its
199
+ // siblings, so a new bad id under an entry that already diverges still fails.
200
+ const allowedName = new Set(Object.keys(baseline.names));
201
+ const allowedMissing = new Set(baseline.missing_ids);
202
+ const allowedSub = new Set(baseline.missing_subtechniques);
203
+
204
+ const newMisnamed = misnamed.filter((x) => !(allowedName.has(x.id) && baseline.names[x.id] === x.ours));
205
+ const newMissing = missing.filter((x) => !allowedMissing.has(x.id));
206
+ const newMissingSub = missingSub.filter((x) => !allowedSub.has(x.sub));
207
+
208
+ const acceptedName = misnamed.filter((x) => allowedName.has(x.id) && baseline.names[x.id] === x.ours);
209
+ const acceptedSub = missingSub.filter((x) => allowedSub.has(x.sub));
210
+ const staleNames = [...allowedName].filter((id) => !misnamed.some((x) => x.id === id));
211
+ const staleMissing = [...allowedMissing].filter((id) => !missing.some((x) => x.id === id));
212
+ const staleSubs = [...allowedSub].filter((sub) => !missingSub.some((x) => x.sub === sub));
213
+
214
+ emit(` ids checked: ${ids.length}`);
215
+ emit(` recorded divergences still present: ${acceptedName.length} name(s), ${acceptedSub.length} sub-technique id(s)`);
216
+
217
+ const problems = [];
218
+ for (const x of newMisnamed) problems.push(`${x.id} is named ${JSON.stringify(x.ours)}; ATLAS ${pin} names it ${JSON.stringify(x.theirs)}`);
219
+ for (const x of newMissing) problems.push(`${x.id} (${JSON.stringify(x.ours)}) does not exist in ATLAS ${pin}`);
220
+ for (const x of newMissingSub) problems.push(`${x.id} names sub-technique ${x.sub}, which does not exist in ATLAS ${pin}`);
221
+ for (const id of staleNames) problems.push(`${id} is recorded as a name divergence but now agrees with upstream; remove it from ${path.relative(ROOT, BASELINE)}`);
222
+ for (const id of staleMissing) problems.push(`${id} is recorded as absent upstream but now resolves; remove it from ${path.relative(ROOT, BASELINE)}`);
223
+ for (const sub of staleSubs) problems.push(`${sub} is recorded as absent upstream but is no longer named or now resolves; remove it from ${path.relative(ROOT, BASELINE)}`);
224
+
225
+ if (JSON_OUT) {
226
+ process.stdout.write(JSON.stringify({
227
+ ok: problems.length === 0, pin, source: release.source,
228
+ checked: ids.length, problems,
229
+ accepted: { names: acceptedName.length, missing_subtechniques: missingSub.length - newMissingSub.length },
230
+ }, null, 2) + "\n");
231
+ }
232
+
233
+ if (problems.length) {
234
+ process.stderr.write(`[check-atlas-catalog-currency] FAIL — ${problems.length} problem(s) against ATLAS ${pin}:\n`);
235
+ for (const p of problems) process.stderr.write(` - ${p}\n`);
236
+ process.stderr.write(
237
+ "\nEither correct data/atlas-ttps.json to match the pinned release, or, if the divergence is " +
238
+ `deliberate and tracked, record it in ${path.relative(ROOT, BASELINE)} with the issue that will close it.\n`
239
+ );
240
+ process.exitCode = 1;
241
+ return;
242
+ }
243
+
244
+ emit(`[check-atlas-catalog-currency] PASS — every id and name agrees with ATLAS ${pin}, or is a recorded divergence`);
245
+ }
246
+
247
+ if (require.main === module) {
248
+ main().catch((e) => {
249
+ process.stderr.write(`[check-atlas-catalog-currency] ${e.stack || e.message}\n`);
250
+ process.exitCode = 2;
251
+ });
252
+ }
253
+
254
+ // Only the pieces that carry judgment are exported; `main` is the CLI and is
255
+ // reached through the guard above.
256
+ module.exports = { parseNames, isRenderingOf, parentNameOf };
@@ -198,6 +198,17 @@ const GATES = [
198
198
  args: [path.join(ROOT, "scripts", "check-version-bump.js")],
199
199
  ciJobName: "Data integrity (catalog + manifest snapshot)",
200
200
  },
201
+ {
202
+ // Every other check reads data/atlas-ttps.json as ground truth, so an id
203
+ // can carry a name MITRE gives to a different technique and stay green.
204
+ // This compares the catalog to the ATLAS release it pins. It reaches the
205
+ // network on a cold cache; a tagged release is immutable, so the fetch
206
+ // happens once per pin.
207
+ name: "ATLAS catalog currency (catalog vs. the release it pins)",
208
+ command: process.execPath,
209
+ args: [path.join(ROOT, "scripts", "check-atlas-catalog-currency.js")],
210
+ ciJobName: "Data integrity (catalog + manifest snapshot)",
211
+ },
201
212
  ];
202
213
 
203
214
  function runGate(gate) {
@@ -58,7 +58,7 @@ forward_watch:
58
58
  - AI product age policy enforcement — Character.ai litigation (2024 child-suicide complaint) testing duty-of-care for AI companion apps; ChatGPT / Claude / Gemini under-13 / under-18 enforcement evolving via FTC + state AG actions
59
59
  - France SREN (Securing and Regulating the Digital Space) Act 2024 — ARCOM age-verification referential for adult content services; double-anonymity model under deployment
60
60
  - US state adult-site age-verification laws — 19+ states by mid-2026 (TX HB 18 upheld by SCOTUS June 2025 in Free Speech Coalition v. Paxton); track ongoing challenges in remaining states
61
- last_threat_review: "2026-06-10"
61
+ last_threat_review: "2026-09-18"
62
62
  discovery_mode: "standalone" # operator-reached via `exceptd brief age-gates-child-safety` or `exceptd ask`; not chained into any playbook's direct.skill_chain by design
63
63
  ---
64
64
 
@@ -125,13 +125,13 @@ Classical security and privacy frameworks (NIST 800-53 r5, ISO/IEC 27001:2022, S
125
125
 
126
126
  ## TTP Mapping
127
127
 
128
- This skill is primarily a compliance + privacy-engineering skill rather than a technical-exploit skill. There are no ATLAS-catalogued AI-attack TTPs that are child-specific as of v2026.07, and most relevant attacker activity intersects general ATT&CK techniques rather than child-targeted novel TTPs. The relevant mapping is therefore narrower and explicitly flagged as such — `atlas_refs` is empty by design, not omission.
128
+ This skill is primarily a compliance + privacy-engineering skill rather than a technical-exploit skill. There are no ATLAS-catalogued AI-attack TTPs that are child-specific as of v2026.09, and most relevant attacker activity intersects general ATT&CK techniques rather than child-targeted novel TTPs. The relevant mapping is therefore narrower and explicitly flagged as such — `atlas_refs` is empty by design, not omission.
129
129
 
130
130
  | ID | Source | Technique | Child-Safeguarding Relevance | Gap Flag |
131
131
  |---|---|---|---|---|
132
132
  | T1078 | ATT&CK Enterprise | Valid Accounts | Account takeover targeting child accounts (compromised parental controls; sextortion via stolen accounts; grooming via account hijack) — child accounts are under-protected because MFA roll-out lags adult user populations. | NIST 800-53 AC-2 + COPPA / AADC / Children's Code silent on MFA-for-child requirement; the AC-2 gap entry in `data/framework-control-gaps.json` covers AI-service-principals not child identities. Hand off to `identity-assurance` for AAL2+ on child accounts where vendor terms permit. |
133
133
  | T1567 | ATT&CK Enterprise | Exfiltration Over Web Service | Child PI exfiltrated via AI-tool / SaaS egress — additional liability under COPPA (no behavioral-ad use of under-13 PI), AADC (DPIA failure), GDPR Art. 8 (no lawful basis), DPDPA (default-VPC bypass), CN PIPL Art. 31 (child PI = sensitive PI requiring separate consent). | Hand off to `dlp-gap-analysis` for child-PI as a protected data class; COPPA / AADC / Children's Code do not name DLP technical controls; the SOC2-CC7 anomaly-detection gap entry applies. |
134
- | AI-generated CSAM creation / distribution | Not catalogued in ATLAS or ATT&CK as of v2026.07 | Generative-AI image / video synthesis depicting children | Direct criminal exposure under 18 U.S.C. §§2251, 2252, 2252A, 2256 (Protect Act / Mash-Up Act framework); mandatory NCMEC reporting per §2258A. Multiple 2024-2025 prosecutions (US v. Anderegg WD-Wis 2024 — first federal AI-CSAM prosecution; UK National Crime Agency campaign 2024-2025). | No formal TTP class. Evidence stream: NCMEC CyberTipline reports + EU IWF reports. Hand off to `ai-attack-surface` for generative-model content-policy red-team and to `incident-response-playbook` for reporting workflow. |
134
+ | AI-generated CSAM creation / distribution | Not catalogued in ATLAS or ATT&CK as of v2026.09 | Generative-AI image / video synthesis depicting children | Direct criminal exposure under 18 U.S.C. §§2251, 2252, 2252A, 2256 (Protect Act / Mash-Up Act framework); mandatory NCMEC reporting per §2258A. Multiple 2024-2025 prosecutions (US v. Anderegg WD-Wis 2024 — first federal AI-CSAM prosecution; UK National Crime Agency campaign 2024-2025). | No formal TTP class. Evidence stream: NCMEC CyberTipline reports + EU IWF reports. Hand off to `ai-attack-surface` for generative-model content-policy red-team and to `incident-response-playbook` for reporting workflow. |
135
135
  | AI chatbot grooming / harmful-content engagement with children | Not catalogued | Long-context AI chatbot interactions with children steering toward harm | Research and litigation evidence: Character.ai litigation 2024 (FL wrongful-death suit alleging companion-chatbot contribution to minor suicide; additional 2024-2025 complaints); UK NCA campaign 2024 documenting grooming attempts via AI chatbots; ESRC / RAND research 2024-2025. | No formal TTP class. EU DSA Art. 28 + UK OSA + AU OSA + KOSA-if-enacted all frame this as a platform duty-of-care obligation. Hand off to `ai-risk-management` for AI-product age policy enforcement. |
136
136
 
137
137
  **Honest scope statement (no fabricated TTP IDs).** This skill does not invent TTP IDs to fill gaps in the ATLAS or ATT&CK matrices. AI-generated CSAM and AI-chatbot-mediated harm to children are real-world threat classes documented through prosecution records, NCMEC / IWF reporting, and litigation — not novel ATLAS techniques. Citation is to the evidence stream, not to a TTP ID.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ai-attack-surface
3
3
  version: "1.0.0"
4
- description: Comprehensive AI/ML attack surface assessment mapped to MITRE ATLAS v2026.07 with explicit framework gap flags
4
+ description: Comprehensive AI/ML attack surface assessment mapped to MITRE ATLAS v2026.09 with explicit framework gap flags
5
5
  triggers:
6
6
  - ai attack surface
7
7
  - prompt injection
@@ -59,7 +59,7 @@ forward_watch:
59
59
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — Chroma vector DB CWE-190 + CWE-362 chain by haehae; impacts RAG vector store integrity; track patch and downstream RAG advisory
60
60
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — NVIDIA Megatron Bridge overly permissive allowed list by Satoki Tsuji; AI training-stack supply-chain exposure; track patch and SBOM advisory
61
61
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — NVIDIA Megatron Bridge path traversal by haehae; AI training-stack file-system trust boundary; track patch and SBOM advisory
62
- last_threat_review: "2026-06-10"
62
+ last_threat_review: "2026-09-18"
63
63
  ---
64
64
 
65
65
  # AI Attack Surface Assessment
@@ -88,7 +88,7 @@ The Model Context Protocol (MCP) introduced an architectural vulnerability affec
88
88
 
89
89
  This is a supply chain attack surface. Every MCP server a user installs is a potential RCE vector. Trust boundaries that exist for npm packages do not exist for MCP servers because most MCP clients do not enforce signed manifests or tool allowlists.
90
90
 
91
- **ATLAS ref:** AML.T0010 (ML Supply Chain Compromise)
91
+ **ATLAS ref:** AML.T0010 (AI Supply Chain Compromise)
92
92
 
93
93
  ### 3. AI-Assisted Exploit Development
94
94
 
@@ -128,7 +128,7 @@ Attackers manipulating vector embeddings to force retrieval mechanisms to surfac
128
128
 
129
129
  Training pipeline targeting has moved beyond data injection to directly biasing model behavior. Supply chain logistics and classification systems that use ML models for decisions are at risk of subtle model poisoning that influences decisions in the attacker's favor over time.
130
130
 
131
- **ATLAS ref:** AML.T0020 (Poison Training Data)
131
+ **ATLAS ref:** AML.T0020 (Training Data Poisoning)
132
132
 
133
133
  ### 9. AI-Speed Reconnaissance
134
134
 
@@ -140,7 +140,7 @@ AI-assisted reconnaissance is observed at 36,000 probes per second per campaign.
140
140
 
141
141
  ### 11. AI-Discovered + AI-Weaponized Supply-Chain Worms
142
142
 
143
- **CVE-2026-45321** — Mini Shai-Hulud TanStack npm worm (CVSS 9.6, ~150M weekly downloads across 42 @tanstack/* packages, CISA KEV pending). Disclosed 2026-05-11. The attack chain — Pwn-Request via `pull_request_target` on TanStack's bundle-size workflow, pnpm-store cache poisoning under the `actions/cache` key, and OIDC-token theft on the next main push — is engineering-grade and weaponizes three independently-benign primitives. While attribution (TeamPCP) records no AI-assisted exploit development for this specific instance, the worm pattern is exactly what AML.T0016-class capability-development now produces at AI cadence: chained CI/CD primitives that no individual component owner recognises as exploitable. Treat the @tanstack/* surface as an exemplar of the broader AML.T0010 (ML Supply Chain Compromise) threat applied to JS toolchains that the AI assistant ecosystem depends on.
143
+ **CVE-2026-45321** — Mini Shai-Hulud TanStack npm worm (CVSS 9.6, ~150M weekly downloads across 42 @tanstack/* packages, CISA KEV pending). Disclosed 2026-05-11. The attack chain — Pwn-Request via `pull_request_target` on TanStack's bundle-size workflow, pnpm-store cache poisoning under the `actions/cache` key, and OIDC-token theft on the next main push — is engineering-grade and weaponizes three independently-benign primitives. While attribution (TeamPCP) records no AI-assisted exploit development for this specific instance, the worm pattern is exactly what AML.T0016-class capability-development now produces at AI cadence: chained CI/CD primitives that no individual component owner recognises as exploitable. Treat the @tanstack/* surface as an exemplar of the broader AML.T0010 (AI Supply Chain Compromise) threat applied to JS toolchains that the AI assistant ecosystem depends on.
144
144
 
145
145
  ---
146
146
 
@@ -156,7 +156,7 @@ AI-assisted reconnaissance is observed at 36,000 probes per second per campaign.
156
156
  | SOC 2 | CC6 (Logical and Physical Access) | Access control via IAM, authentication, authorization. Prompt injection is an access control failure that routes around CC6 entirely — the authorized model account takes the action, not the attacker. Audit trails show the model's service account performed the action. |
157
157
  | SOC 2 | CC7 (System Operations) | Anomaly detection for system operations. No guidance for AI API baseline, AI C2 detection, or PROMPTFLUX behavioral patterns. |
158
158
  | PCI DSS 4.0 | 6.4.1 | Web application protection (WAF). WAFs operate on HTTP request/response patterns. They have no semantic understanding of prompt injection embedded in JSON `message` fields. |
159
- | MITRE ATT&CK | Enterprise | Does not include prompt injection as a technique. AI-as-C2 (SesameOp) is not in ATT&CK as of mid-2026. ATLAS v2026.07 covers these but is not part of SOC detection engineering programs that are ATT&CK-mapped. |
159
+ | MITRE ATT&CK | Enterprise | Does not include prompt injection as a technique. AI-as-C2 (SesameOp) is not in ATT&CK as of mid-2026. ATLAS v2026.09 covers these but is not part of SOC detection engineering programs that are ATT&CK-mapped. |
160
160
  | NIST AI RMF | MEASURE 2.5 | Measure AI risks during operation. Provides a framework for thinking about AI risk but no specific controls for prompt injection, MCP supply chain, or AI-as-C2. |
161
161
  | EU NIS2 | Art. 21(2)(d) (supply-chain security) + Art. 21(2)(e) (security in acquisition, development and maintenance) | "Appropriate and proportionate" supply-chain language. Member-state transpositions (BSI IT-SiG 2.0, ANSSI) do not enumerate MCP servers or LLM API providers as in-scope supply-chain components. An essential entity can meet NIS2 supplier-management obligations with traditional SaaS vendor reviews while having zero coverage of AI-assistant tool ecosystems. |
162
162
  | EU DORA | Art. 8 (ICT asset management) + Art. 28 (ICT third-party register) + Art. 30 (key contractual provisions) | Financial-entity ICT third-party language scoped to traditional ICT providers. LLM API providers acting as data processors for prompt content and developer-environment MCP servers are not enumerated as ICT third-party service providers. ESAs RTS on subcontracting (JC 2024/53) is silent on AI/ML SaaS dependency classes. |
@@ -170,19 +170,19 @@ AI-assisted reconnaissance is observed at 36,000 probes per second per campaign.
170
170
 
171
171
  ---
172
172
 
173
- ## TTP Mapping (MITRE ATLAS v2026.07)
173
+ ## TTP Mapping (MITRE ATLAS v2026.09)
174
174
 
175
175
  | ATLAS ID | Technique | Framework Coverage | Gap Description | Exploitation Example |
176
176
  |---|---|---|---|---|
177
177
  | AML.T0054 | LLM Jailbreak | Missing in all major frameworks | No control covers adversarial-instruction injection that bypasses guardrails and coerces the model into attacker-chosen actions | CVE-2025-53773 (GitHub Copilot YOLO-mode RCE) |
178
- | AML.T0010 | ML Supply Chain Compromise | Partial (ISO A.8.30) | A.8.30 covers outsourced development; does not cover MCP server trust, package signing for AI tools | CVE-2026-30615 (Windsurf MCP) |
178
+ | AML.T0010 | AI Supply Chain Compromise | Partial (ISO A.8.30) | A.8.30 covers outsourced development; does not cover MCP server trust, package signing for AI tools | CVE-2026-30615 (Windsurf MCP) |
179
179
  | AML.T0096 | LLM Integration Abuse (C2) | Missing in all major frameworks | No framework has a control for AI API traffic as C2 channel | SesameOp campaign |
180
- | AML.T0020 | Poison Training Data | Partial (NIST AI RMF) | NIST AI RMF identifies the risk; no specific technical control | Supply chain logistics model poisoning |
180
+ | AML.T0020 | Training Data Poisoning | Partial (NIST AI RMF) | NIST AI RMF identifies the risk; no specific technical control | Supply chain logistics model poisoning |
181
181
  | AML.T0043 | Craft Adversarial Data | Partial (SI-10) | SI-10 covers web input validation; not semantic injection in LLM prompts | RAG vector manipulation |
182
182
  | AML.T0051 | LLM Prompt Injection | Missing in all major frameworks | Zero controls in NIST, ISO, SOC 2, PCI for prompt injection | CVE-2025-53773, indirect injection via retrieved docs |
183
183
  | AML.T0017 | Discover ML Model Ontology | Partial (awareness only) | No framework requires monitoring for adversary mapping of deployed model family, guardrail surface, or system-prompt structure via inference-API probing | Reconnaissance step preceding PROMPTSTEAL-class targeting; AML-model registry exposure |
184
184
  | AML.T0016 | Obtain Capabilities: Develop Capabilities | Missing (misuse dimension) | Frameworks don't address adversary AI-assisted exploit development or use of public AI APIs to craft malware/phishing payloads | Copy Fail AI discovery (41% of 2025 0-days), PROMPTFLUX, PROMPTSTEAL, phishing generation |
185
- | AML.T0018 | Backdoor ML Model | Partial (NIST AI RMF) | No technical control requirements for model integrity verification | Training pipeline poisoning |
185
+ | AML.T0018 | Manipulate AI Model | Partial (NIST AI RMF) | No technical control requirements for model integrity verification | Training pipeline poisoning |
186
186
 
187
187
  ---
188
188
 
@@ -49,7 +49,7 @@ d3fend_refs:
49
49
  - D3-NI
50
50
  - D3-NTA
51
51
  - D3-NTPM
52
- last_threat_review: "2026-06-10"
52
+ last_threat_review: "2026-09-18"
53
53
  ---
54
54
 
55
55
  # AI C2 Detection
@@ -330,13 +330,13 @@ level: medium
330
330
 
331
331
  ---
332
332
 
333
- ## TTP Mapping (MITRE ATLAS v2026.07 + MITRE ATT&CK)
333
+ ## TTP Mapping (MITRE ATLAS v2026.09 + MITRE ATT&CK)
334
334
 
335
335
  | ID | Source | Technique | C2 Relevance | Gap Flag — Which Detection Control Fails |
336
336
  |---|---|---|---|---|
337
- | AML.T0096 | ATLAS v2026.07 | LLM API as covert C2 / LLM Integration Abuse | Direct: SesameOp encodes commands and exfiltrated data in prompt and completion fields against api.openai.com, api.anthropic.com, generativelanguage.googleapis.com. AI provider domain is the relay, not the attacker C2 endpoint. | NIST-800-53-SC-7 (Boundary Protection) — AI provider domains are allowlisted in most enterprise egress for legitimate developer and product use, so boundary inspection cannot distinguish benign developer prompts from C2-encoded prompts. See SC-7 entry in `data/framework-control-gaps.json` — real requirement is SDK-level prompt logging with identity binding, anomaly detection on prompt-shape and token-volume, and an allowlist that enumerates the sanctioned business reason per identity. Boundary-only SC-7 evidence is incomplete for any org with AI API access in production. |
338
- | AML.T0017 | ATLAS v2026.07 | Discover ML Model Ontology — adversary maps the deployed LLM's family, system-prompt structure, guardrail surface via inference-API probing | PROMPTFLUX queries public LLMs to generate per-execution evasion code; PROMPTSTEAL uses LLMs to prioritise exfiltration targets — both depend on first discovering what the target model will answer. The inference API is the discovery surface. | NIST-800-53-SI-3 fails — there is no static signature for code generated per-event by a public LLM. NIST-800-53-SI-4 fails as commonly deployed — no AI-API behavioural baseline per process/identity. |
339
- | AML.T0016 | ATLAS v2026.07 | Obtain Capabilities: Develop Capabilities — adversary use of inference APIs to generate / refine malware, evasion, phishing payloads | PROMPTFLUX and PROMPTSTEAL both consume public LLMs as a real-time capability-development service. The inference API is doing weaponization work for the adversary. | NIST-800-53-SI-3 fails for the same reason. SC-7 boundary control treats the AI provider as allowlisted SaaS. |
337
+ | AML.T0096 | ATLAS v2026.09 | LLM API as covert C2 / LLM Integration Abuse | Direct: SesameOp encodes commands and exfiltrated data in prompt and completion fields against api.openai.com, api.anthropic.com, generativelanguage.googleapis.com. AI provider domain is the relay, not the attacker C2 endpoint. | NIST-800-53-SC-7 (Boundary Protection) — AI provider domains are allowlisted in most enterprise egress for legitimate developer and product use, so boundary inspection cannot distinguish benign developer prompts from C2-encoded prompts. See SC-7 entry in `data/framework-control-gaps.json` — real requirement is SDK-level prompt logging with identity binding, anomaly detection on prompt-shape and token-volume, and an allowlist that enumerates the sanctioned business reason per identity. Boundary-only SC-7 evidence is incomplete for any org with AI API access in production. |
338
+ | AML.T0017 | ATLAS v2026.09 | Discover ML Model Ontology — adversary maps the deployed LLM's family, system-prompt structure, guardrail surface via inference-API probing | PROMPTFLUX queries public LLMs to generate per-execution evasion code; PROMPTSTEAL uses LLMs to prioritise exfiltration targets — both depend on first discovering what the target model will answer. The inference API is the discovery surface. | NIST-800-53-SI-3 fails — there is no static signature for code generated per-event by a public LLM. NIST-800-53-SI-4 fails as commonly deployed — no AI-API behavioural baseline per process/identity. |
339
+ | AML.T0016 | ATLAS v2026.09 | Obtain Capabilities: Develop Capabilities — adversary use of inference APIs to generate / refine malware, evasion, phishing payloads | PROMPTFLUX and PROMPTSTEAL both consume public LLMs as a real-time capability-development service. The inference API is doing weaponization work for the adversary. | NIST-800-53-SI-3 fails for the same reason. SC-7 boundary control treats the AI provider as allowlisted SaaS. |
340
340
  | T1071 | ATT&CK | Application Layer Protocol (C2) | AI C2 traffic is standard HTTPS REST to api.openai.com or equivalent. Application-protocol C2 detection that looks for DGA, unusual TLS, or beaconing does not fire. | SC-7 boundary control sees only the destination domain (allowlisted) — no protocol anomaly to alert on. Detection requires identity-bound prompt content inspection, which SC-7 as written does not require. |
341
341
  | T1102 | ATT&CK | Web Service (C2 via legitimate web service) | AI API endpoints are exactly the "legitimate web service used as C2" pattern that T1102 describes — but at scale and pre-allowlisted in nearly every enterprise. | SOC 2 CC7 anomaly-detection control: AI API traffic shares the SaaS blind spot — typically not baselined per process or identity. ISO 27001 A.8.16 monitoring activities: no guidance for AI-API-shaped traffic. |
342
342
  | T1568 | ATT&CK | Dynamic Resolution | AI provider responses can carry encoded instructions that dynamically determine the next-hop behaviour for the malware (effectively model-mediated dynamic resolution of the next attacker instruction). | No standard DNS-tunnelling or DGA detection applies — the "resolution" happens inside an HTTPS payload to a trusted endpoint. SC-7 cannot see it without SDK-level prompt + response logging. |
@@ -67,7 +67,7 @@ forward_watch:
67
67
  - NGINX Rift CVE-2026-42945 (disclosed 2026-05-13, source depthfirst) — KEV-watch predicted CISA KEV listing by 2026-05-29; track for active-exploitation confirmation and patch advisory affecting API gateway / reverse-proxy deployments
68
68
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — LiteLLM 3-bug SSRF + Code Injection chain by k3vg3n; LLM-proxy API surface; track upstream patch and CVE assignments
69
69
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — LiteLLM full SSRF + Code Injection by Out Of Bounds (Byung Young Yi); duplicate-class with the k3vg3n entry; track unified patch advisory
70
- last_threat_review: "2026-06-10"
70
+ last_threat_review: "2026-09-18"
71
71
  ---
72
72
 
73
73
  # API Security Assessment
@@ -126,7 +126,7 @@ APIs are now the integration substrate of every non-trivial system. The mid-2026
126
126
 
127
127
  ---
128
128
 
129
- ## TTP Mapping (MITRE ATT&CK Enterprise + ATLAS v2026.07)
129
+ ## TTP Mapping (MITRE ATT&CK Enterprise + ATLAS v2026.09)
130
130
 
131
131
  | TTP ID | Technique | API Manifestation | CWE Root-Causes | Framework Coverage |
132
132
  |---|---|---|---|---|
@@ -60,7 +60,7 @@ d3fend_refs:
60
60
  - D3-CSPP
61
61
  - D3-EAL
62
62
  - D3-NTA
63
- last_threat_review: "2026-06-10"
63
+ last_threat_review: "2026-09-18"
64
64
  ---
65
65
 
66
66
  # Attack Surface Management + Penetration Testing
@@ -79,7 +79,7 @@ Every enterprise now has outbound HTTPS to one or more LLM providers (OpenAI, An
79
79
 
80
80
  ### 3. MCP servers as RCE surface
81
81
 
82
- CVE-2026-30615 (Windsurf MCP, CVSS 8.0 / AV:L / RWEP 35) is the canonical example: a malicious MCP server drives code execution in the AI assistant's context via attacker-controlled HTML processed by the MCP client. 150M+ combined downloads across MCP-capable assistants share the architectural surface. Every developer workstation with an MCP-aware client (Cursor, VS Code + Copilot, Windsurf, Claude Code, Gemini CLI) is potentially a network of unsigned-package RCE vectors that no traditional asset inventory enumerates. ATLAS AML.T0010 (ML Supply Chain Compromise).
82
+ CVE-2026-30615 (Windsurf MCP, CVSS 8.0 / AV:L / RWEP 35) is the canonical example: a malicious MCP server drives code execution in the AI assistant's context via attacker-controlled HTML processed by the MCP client. 150M+ combined downloads across MCP-capable assistants share the architectural surface. Every developer workstation with an MCP-aware client (Cursor, VS Code + Copilot, Windsurf, Claude Code, Gemini CLI) is potentially a network of unsigned-package RCE vectors that no traditional asset inventory enumerates. ATLAS AML.T0010 (AI Supply Chain Compromise).
83
83
 
84
84
  ### 4. Prompt-injection footprint
85
85
 
@@ -115,21 +115,21 @@ A pen test scoped to layers 1 and (partly) 7 — i.e. "web app + network + nomin
115
115
  | CBEST (Bank of England / PRA / FCA) | Whole framework | UK equivalent to TIBER-EU for systemically important financial firms. Same lag pattern as TIBER-EU. CBEST-certified providers are not required to demonstrate competence in AI-surface attack emulation as of mid-2026. |
116
116
  | Australian ISM (Information Security Manual) + ACSC Essential 8 | ISM controls on penetration testing; Essential 8 Maturity Level 3 testing requirements | Essential 8 mandates regular testing of mitigation strategies (patching, app control, MFA, etc.). The testing requirements do not extend to AI-API egress as C2, MCP trust, or RAG poisoning. ISM control set is network/endpoint centric. |
117
117
  | ISO/IEC 27001:2022 | A.5.34 (Privacy and protection of PII) — note: the actually relevant clause for independent review is **A.5.35 (Independent review of information security)** and **A.8.29 (Security testing in development and acceptance)** | A.5.35 requires independent review of the information security approach at planned intervals or when significant changes occur. The clause is methodology-agnostic — auditors accept a network/web pen test as evidence even when AI surfaces are in production. A.8.29 mandates security testing of new and changed information systems, but does not define what an adequate test of an AI system looks like. |
118
- | MITRE ATT&CK Enterprise (v19.2) | Whole matrix | The enterprise matrix does not contain prompt-injection as a technique. AI-as-C2 (SesameOp pattern) is absent from ATT&CK as of mid-2026. Adversary emulation programs that are ATT&CK-only and not ATLAS-extended will not include the mid-2026 dominant new tradecraft in their playbooks. ATLAS v2026.07 covers it — but ATLAS is not yet a standard requirement for pen testing certification or scoping. |
118
+ | MITRE ATT&CK Enterprise (v19.2) | Whole matrix | The enterprise matrix does not contain prompt-injection as a technique. AI-as-C2 (SesameOp pattern) is absent from ATT&CK as of mid-2026. Adversary emulation programs that are ATT&CK-only and not ATLAS-extended will not include the mid-2026 dominant new tradecraft in their playbooks. ATLAS v2026.09 covers it — but ATLAS is not yet a standard requirement for pen testing certification or scoping. |
119
119
 
120
120
  > Global coverage note: the above table spans US (NIST 800-115, ATT&CK), EU (NIS2, TIBER-EU under DORA), UK (CBEST), AU (ISM/Essential 8), and ISO 27001:2022. US-only pen test scoping is incomplete.
121
121
 
122
122
  ---
123
123
 
124
- ## TTP Mapping (MITRE ATLAS v2026.07 + MITRE ATT&CK v19.2)
124
+ ## TTP Mapping (MITRE ATLAS v2026.09 + MITRE ATT&CK v19.2)
125
125
 
126
126
  Pen testers must emulate both classical and AI-class chains. The table below maps the kill-chain phases a mid-2026 adversary emulation engagement must cover.
127
127
 
128
- | Phase | Classical TTP (ATT&CK v19.2) | AI-Class TTP (ATLAS v2026.07) | Framework Gap Flag |
128
+ | Phase | Classical TTP (ATT&CK v19.2) | AI-Class TTP (ATLAS v2026.09) | Framework Gap Flag |
129
129
  |---|---|---|---|
130
130
  | Reconnaissance | T1595 (Active Scanning) — implied by T1190 setup | AML.TA0002 (Reconnaissance tactic) — model card / dataset / API endpoint discovery, system-prompt probing | NIST 800-115 §3.x recon guidance is network-only |
131
131
  | Initial Access | T1190 (Exploit Public-Facing Application) | AML.T0051 (LLM Prompt Injection) — entered via PR description, support ticket, retrieved doc | OWASP WSTG covers webapp; not prompt-injection as entry vector |
132
- | Initial Access | T1133 (External Remote Services) | AML.T0010 (ML Supply Chain Compromise) — malicious MCP server installed by developer | PTES scoping templates do not require MCP server enumeration |
132
+ | Initial Access | T1133 (External Remote Services) | AML.T0010 (AI Supply Chain Compromise) — malicious MCP server installed by developer | PTES scoping templates do not require MCP server enumeration |
133
133
  | Execution | T1059 (Command and Scripting Interpreter) | AML.T0051 → tool-use call invoking shell/code execution in agent context | NIS2 Art.21 patch-mgmt language assumes binary exploit; semantic-input exploit lives outside |
134
134
  | Persistence | T1078 (Valid Accounts) | AML.T0018 / AML.T0010 — poisoned dependency planting valid creds | TIBER-EU scenario libraries lag this by 12–18 months |
135
135
  | Command and Control | T1071 (Application Layer Protocol) | AML.T0096 (LLM Integration Abuse — AI API as C2, SesameOp pattern) | No major framework defines a control for AI-API egress as C2 |
@@ -70,7 +70,7 @@ forward_watch:
70
70
  - AWS Bedrock, Azure OpenAI, GCP Vertex AI shared-responsibility documentation drift — each major CSP refreshes the AI-service responsibility line every 6–12 months; track for control-mapping breakage
71
71
  - eBPF-based runtime detection coverage of confidential-computing enclaves (AWS Nitro Enclaves, Azure Confidential VMs, GCP Confidential Space) — partial visibility is a tracked detection gap
72
72
  - CISA KEV additions for cloud-control-plane CVEs (IMDSv1 abuses, federation token mishandling, cross-tenant boundary failures); CISA Cybersecurity Advisories for cross-cloud advisories
73
- last_threat_review: "2026-06-10"
73
+ last_threat_review: "2026-09-18"
74
74
  ---
75
75
 
76
76
  # Cloud Security (mid-2026)
@@ -131,8 +131,8 @@ Cloud is where AI runs. Every consequential AI service — OpenAI, Anthropic, Go
131
131
  | Cloud data exfiltration | T1530 — Data from Cloud Storage Object | ATT&CK Enterprise | Public S3 / GCS / Blob storage discovery via Wiz-style external attack-surface scan; legitimate IAM principal exfil via federated workload; cross-tenant boundary failure on SaaS | NIST 800-53 SC-28 (encryption at rest) does not address access-policy errors; CWE-200, CWE-732, CWE-862 |
132
132
  | Cloud-facing application | T1190 — Exploit Public-Facing Application | ATT&CK Enterprise | API Gateway / Load Balancer / managed-WAF-bypass; managed-database exposure (RDS / SQL DB / Cloud SQL public IP); container-registry public image abuse; Lambda / Cloud Functions / Azure Functions endpoint exploit | NIST 800-53 SC-7 perimeter assumption inadequate; CSA CCM AIS-04 and IVS-08 partial; CWE-1188 (Insecure Default Initialization) |
133
133
  | Cloud-credential exposure | T1552 — Unsecured Credentials (incl. T1552.001 Files, T1552.005 Cloud Instance Metadata API, T1552.007 Container API) | ATT&CK Enterprise | IMDSv1 SSRF on EC2 / GCE; static cloud credentials in git / images / env vars; container API and kubeconfig theft; workload-identity-federation trust-policy abuse | CWE-798 (hardcoded credentials), CWE-200; NIST 800-53 IA-5 method-neutral |
134
- | AI model registry / cloud-hosted model | AML.T0010 — ML Supply Chain Compromise | ATLAS v2026.07 | Bedrock / SageMaker custom model from poisoned upstream; Azure ML model registry tampering; Vertex Model Garden mirror tampering; HF model pulled into Bedrock / SageMaker / Vertex with weights backdoor | CSA CCM CCC-09 (vendor / supply chain) silent on model-supply-chain specifics; SLSA / in-toto / Sigstore for models still maturing |
135
- | Cloud inference API abuse / model extraction | AML.T0017 — Discover ML Model Ontology (inference-API probing for system-prompt, guardrail, model-family signal against cloud-hosted endpoints); AML.T0016 — Obtain Capabilities: Develop Capabilities (downstream weaponization) | ATLAS v2026.07 | Programmatic query of Bedrock / Azure OpenAI / Vertex endpoint to extract model behaviour, training-data inference, system-prompt leakage | No cloud-specific ATLAS control mapping for inference-API rate-limit / anomaly detection; chain to `ai-attack-surface` |
134
+ | AI model registry / cloud-hosted model | AML.T0010 — AI Supply Chain Compromise | ATLAS v2026.09 | Bedrock / SageMaker custom model from poisoned upstream; Azure ML model registry tampering; Vertex Model Garden mirror tampering; HF model pulled into Bedrock / SageMaker / Vertex with weights backdoor | CSA CCM CCC-09 (vendor / supply chain) silent on model-supply-chain specifics; SLSA / in-toto / Sigstore for models still maturing |
135
+ | Cloud inference API abuse / model extraction | AML.T0017 — Discover ML Model Ontology (inference-API probing for system-prompt, guardrail, model-family signal against cloud-hosted endpoints); AML.T0016 — Obtain Capabilities: Develop Capabilities (downstream weaponization) | ATLAS v2026.09 | Programmatic query of Bedrock / Azure OpenAI / Vertex endpoint to extract model behaviour, training-data inference, system-prompt leakage | No cloud-specific ATLAS control mapping for inference-API rate-limit / anomaly detection; chain to `ai-attack-surface` |
136
136
 
137
137
  **Note on ATT&CK Enterprise cloud-platform sub-techniques.** ATT&CK Enterprise has cloud-platform-specific matrices (IaaS, SaaS, Office 365, Azure AD / Entra ID, Google Workspace). T1078.004 (Cloud Accounts), T1552.005 (Cloud Instance Metadata API), T1552.007 (Container API), T1190 with cloud-service variants, T1530 with managed-storage variants are the most operationally relevant. The frontmatter pins the parent IDs; analysis should descend to the sub-technique appropriate to the cloud(s) in scope.
138
138
 
@@ -21,7 +21,7 @@ framework_gaps:
21
21
  - ALL-PROMPT-INJECTION-ACCESS-CONTROL
22
22
  - FedRAMP-Rev5-Moderate
23
23
  - CMMC-2.0-Level-2
24
- last_threat_review: "2026-06-10"
24
+ last_threat_review: "2026-09-18"
25
25
  ---
26
26
 
27
27
  # Compliance Theater Detection
@@ -78,7 +78,7 @@ The pre-analyzed gaps for these controls live in the framework-gap-analysis skil
78
78
 
79
79
  ---
80
80
 
81
- ## TTP Mapping (MITRE ATLAS v2026.07 and ATT&CK)
81
+ ## TTP Mapping (MITRE ATLAS v2026.09 and ATT&CK)
82
82
 
83
83
  Each theater pattern below maps to one or more attacker TTPs in `data/atlas-ttps.json` and MITRE ATT&CK Enterprise. The mapping is what distinguishes theater from genuine compliance: a control claimed as compensating must map to a TTP it actually disrupts.
84
84
 
@@ -87,12 +87,12 @@ Each theater pattern below maps to one or more attacker TTPs in `data/atlas-ttps
87
87
  | Patch Management Theater (Pattern 1) | T1068 (Exploitation for Privilege Escalation), T1203 (Exploitation for Client Execution) | Public PoC + KEV + AI-accelerated weaponization compresses the exploitation window inside the SLA |
88
88
  | Network Segmentation Theater — IPsec (Pattern 2) | T1190 (Exploit Public-Facing Application) targeting the IPsec kernel subsystem | The control's cryptographic mechanism is the attack surface |
89
89
  | Access Control Theater — AI Agents (Pattern 3) | AML.T0051 (LLM Prompt Injection), AML.T0054 (LLM Jailbreak), T1059 (Command and Scripting Interpreter) | Authorized service account executes attacker-chosen actions; no identity boundary is crossed |
90
- | Incident Response Theater — AI Pipeline (Pattern 4) | AML.T0020 (Poison Training Data), AML.T0096 (LLM Integration Abuse as C2), AML.T0010 (ML Supply Chain Compromise) | Detection triggers do not exist, so documented IR procedures have no input |
91
- | Change Management Theater — AI Models (Pattern 5) | AML.T0018 (Backdoor ML Model), AML.T0020 | Externally-managed model updates bypass operator change control entirely |
92
- | Vendor/Third-Party Risk Theater — AI APIs (Pattern 6) | AML.T0010 (ML Supply Chain Compromise) | MCP servers and LLM APIs sit outside the vendor-management scope |
90
+ | Incident Response Theater — AI Pipeline (Pattern 4) | AML.T0020 (Training Data Poisoning), AML.T0096 (LLM Integration Abuse as C2), AML.T0010 (AI Supply Chain Compromise) | Detection triggers do not exist, so documented IR procedures have no input |
91
+ | Change Management Theater — AI Models (Pattern 5) | AML.T0018 (Manipulate AI Model), AML.T0020 | Externally-managed model updates bypass operator change control entirely |
92
+ | Vendor/Third-Party Risk Theater — AI APIs (Pattern 6) | AML.T0010 (AI Supply Chain Compromise) | MCP servers and LLM APIs sit outside the vendor-management scope |
93
93
  | Security Awareness Theater — AI Phishing (Pattern 7) | T1566 (Phishing), AML.T0016 (Obtain Capabilities: Develop Capabilities — misuse of public AI APIs for payload crafting) | AI-generated content evades grammar/style heuristics and template-matching detectors |
94
94
 
95
- Source-of-truth TTP catalog: `data/atlas-ttps.json` (pinned to MITRE ATLAS v2026.07, May 2026). Any theater claim in an assessment must cite at least one TTP ID from that catalog or an ATT&CK Enterprise ID — claims without a mapped TTP are orphaned controls and are rejected.
95
+ Source-of-truth TTP catalog: `data/atlas-ttps.json` (pinned to MITRE ATLAS v2026.09, September 2026). Any theater claim in an assessment must cite at least one TTP ID from that catalog or an ATT&CK Enterprise ID — claims without a mapped TTP are orphaned controls and are rejected.
96
96
 
97
97
  ---
98
98
 
@@ -395,8 +395,8 @@ This skill produces theater findings, not control prescriptions. The mapping bel
395
395
  | 2 Network Segmentation (IPsec compromised subsystem) | T1190 (Exploit Public-Facing Application) | `D3-NI` | Network Isolation (non-IPsec data path) | `framework-gap-analysis` (SC-8 / SC-28 lag) |
396
396
  | 3 Access Control (AI agent prompt injection) | AML.T0051 (LLM Prompt Injection) | `D3-IOPR` + `D3-CSPP` | Input/Output Profiling + Client-server Payload Profiling | `ai-attack-surface` |
397
397
  | 4 Incident Response (AI-specific playbook absence) | AML.T0096 (LLM Integration Abuse — C2), AML.T0051 | `D3-NTA` + `D3-IOPR` | Network Traffic Analysis + Input/Output Profiling | `ai-c2-detection` + `incident-response-playbook` |
398
- | 5 Change Management (Model version drift) | AML.T0018 (Backdoor ML Model), AML.T0020 (Poison Training Data) | `D3-FAPA` + `D3-EFA` | File Access Pattern Analysis + Executable File Analysis | `mlops-security` |
399
- | 6 Vendor Management (AI APIs + MCP servers without DPA) | AML.T0010 (ML Supply Chain Compromise) | `D3-EAL` + `D3-EFA` | Executable Allowlisting + Executable File Analysis | `mcp-agent-trust` + `supply-chain-integrity` |
398
+ | 5 Change Management (Model version drift) | AML.T0018 (Manipulate AI Model), AML.T0020 (Training Data Poisoning) | `D3-FAPA` + `D3-EFA` | File Access Pattern Analysis + Executable File Analysis | `mlops-security` |
399
+ | 6 Vendor Management (AI APIs + MCP servers without DPA) | AML.T0010 (AI Supply Chain Compromise) | `D3-EAL` + `D3-EFA` | Executable Allowlisting + Executable File Analysis | `mcp-agent-trust` + `supply-chain-integrity` |
400
400
  | 7 Security Awareness (AI-generated phishing absent from simulations) | AML.T0016 (Develop Capabilities — payload generation), T1566 (Phishing) | `D3-MFA` + `D3-CSPP` | Multi-factor Authentication (passkey class) + Client-server Payload Profiling (gateway) | `email-security-anti-phishing` + `identity-assurance` |
401
401
 
402
402
  **Defense-in-depth posture:** every theater finding produced by this skill must cite the downstream skill that owns the remediation. A theater finding with no routing target is incomplete — the operator receives a gap with no closure path. Where a theater pattern names multiple D3FEND techniques, the downstream skill is the authority on which combinations satisfy defence-in-depth for the operator's environment.
@@ -57,7 +57,7 @@ d3fend_refs:
57
57
  - D3-IOPR
58
58
  forward_watch:
59
59
  - Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — NVIDIA Container Toolkit container escape ($50K award) by chompie / IBM X-Force XOR; high-severity container/hypervisor boundary break; track patch and KEV add post-embargo
60
- last_threat_review: "2026-06-10"
60
+ last_threat_review: "2026-09-18"
61
61
  ---
62
62
 
63
63
  # Container + Kubernetes Runtime Security (mid-2026)
@@ -124,9 +124,9 @@ State of standards baselines:
124
124
  | Container escape to host | T1611 — Escape to Host | ATT&CK Enterprise | Kernel LPE (Copy Fail CVE-2026-31431, Dirty Frag CVE-2026-43284 family); historical runc CVE-2024-21626 LeakyVessels family; cgroup v1 release_agent legacy abuses; abuse of overly permissive capabilities (`CAP_SYS_ADMIN`, `CAP_SYS_MODULE`) | NIST 800-190 predates kernel-LPE-as-container-escape as the dominant vector. Defense requires kernel patching cadence (hand off to `kernel-lpe-triage`) plus seccomp default profile, capability drops, read-only rootfs, and runtime detection. None of these are framework-mandated. |
125
125
  | Privilege escalation within the container | T1068 — Exploitation for Privilege Escalation | ATT&CK Enterprise | In-container kernel LPE (yields host root via T1611 chain); abuse of writable hostPath; abuse of mounted Docker socket | Method-neutral framework controls; the actual control is seccomp + dropped capabilities + read-only rootfs + non-root runAsUser, all enforced by PSS-Restricted profile |
126
126
  | Exploit public-facing K8s component | T1190 — Exploit Public-Facing Application | ATT&CK Enterprise | Exposed kube-apiserver (rare but seen on self-managed clusters); exposed kubelet read-only port (10255) or read/write port (10250) without authentication; exposed Kubernetes Dashboard with no auth; exposed Argo CD or Jenkins on the cluster; ingress controller CVEs (ingress-nginx CVE-2025 family) | NSA/CISA Hardening Guide v1.2 addresses control-plane exposure; managed services close this by default; self-managed clusters in CI/government still expose these |
127
- | Compromised container image at a public/private registry | AML.T0010 — ML Supply Chain Compromise (umbrella) | ATLAS v2026.07 | Poisoned base image; backdoored model-serving image; typosquatted MCP server in a sidecar; AI-pipeline-specific (KServe / vLLM / Triton image with embedded malicious payload) | ATLAS classifies; no framework mandates signature verification at admission. Hand off the build-side provenance to `supply-chain-integrity`; the container-runtime control is `ClusterImagePolicy` enforcement |
127
+ | Compromised container image at a public/private registry | AML.T0010 — AI Supply Chain Compromise (umbrella) | ATLAS v2026.09 | Poisoned base image; backdoored model-serving image; typosquatted MCP server in a sidecar; AI-pipeline-specific (KServe / vLLM / Triton image with embedded malicious payload) | ATLAS classifies; no framework mandates signature verification at admission. Hand off the build-side provenance to `supply-chain-integrity`; the container-runtime control is `ClusterImagePolicy` enforcement |
128
128
 
129
- ATT&CK Containers matrix (sub-matrix, since 2021) and ATT&CK for Kubernetes (Microsoft's threat matrix, 2020, since absorbed conceptually into ATT&CK Containers) are both relevant prior art. The Enterprise IDs above are canonical in ATLAS v2026.07 alignment and pass the linter regex `^T\d{4}(\.\d{3})?$`.
129
+ ATT&CK Containers matrix (sub-matrix, since 2021) and ATT&CK for Kubernetes (Microsoft's threat matrix, 2020, since absorbed conceptually into ATT&CK Containers) are both relevant prior art. The Enterprise IDs above are canonical in ATLAS v2026.09 alignment and pass the linter regex `^T\d{4}(\.\d{3})?$`.
130
130
 
131
131
  CWE cross-walk (see `data/cwe-catalog.json`):
132
132