@blamejs/exceptd-skills 0.19.27 → 0.19.29

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 CHANGED
@@ -1,6 +1,12 @@
1
1
  # exceptd Security — Development Standards
2
2
 
3
- > **This is the canonical development guide and the only project-rules file shipped in this repo.** It is AI-system-agnostic — internal citations throughout the repo all reference `AGENTS.md` (this file). The project does not ship per-vendor mirrors; tool users configure their tool to load `AGENTS.md`. Multiple tools auto-load `AGENTS.md` directly under the cross-vendor convention (OpenAI Codex CLI, Sourcegraph amp, Aider, Continue, Cline, Roo Code, Q Developer). Cursor (`.cursorrules`), GitHub Copilot (`.github/copilot-instructions.md`), and Windsurf (`.windsurfrules`) get small pointer stubs that reference this file. Claude Code / Gemini CLI / JetBrains AI / Replit Agent users should add `AGENTS.md` to their tool's context manually (Claude Code: `@AGENTS.md`, or symlink their own local `~/.claude/CLAUDE.md` to it).
3
+ > **This is the canonical development guide and the only project-rules file shipped in this repo.** It is AI-system-agnostic — internal citations throughout the repo all reference `AGENTS.md` (this file). The project does not ship per-vendor mirrors; tool users configure their tool to load `AGENTS.md`.
4
+
5
+ | How it loads | Tools | Mechanism |
6
+ |---|---|---|
7
+ | Automatically | OpenAI Codex CLI, Sourcegraph amp, Aider, Continue, Cline, Roo Code, Q Developer | auto-loads `AGENTS.md` directly under the cross-vendor convention |
8
+ | Via a pointer stub | Cursor (`.cursorrules`), GitHub Copilot (`.github/copilot-instructions.md`), Windsurf (`.windsurfrules`) | small pointer stub that references this file |
9
+ | Manually | Claude Code, Gemini CLI, JetBrains AI, Replit Agent | add `AGENTS.md` to the tool's context (Claude Code: `@AGENTS.md`, or symlink their own local `~/.claude/CLAUDE.md` to it) |
4
10
 
5
11
  Also read [CONTEXT.md](CONTEXT.md) for a complete orientation to the skill system.
6
12
 
@@ -41,7 +47,15 @@ Each rule below carries a **Forcing function** annotation declaring whether it i
41
47
  11. **No-MVP ban** — A half-implemented skill is worse than no skill. Every shipped skill has: complete frontmatter, all required body sections, real data deps populated, a compliance theater check, and a concrete output format. Partial skills are not merged — they are finished or removed.
42
48
  *Forcing function:* covered by `lib/lint-skills.js` (required-section list) plus Hard Rule #15 (diff coverage); predeploy gate.
43
49
 
44
- 12. **External data version pinning** — Every reference to external data (MITRE ATLAS, MITRE ATT&CK, NIST frameworks, CISA KEV, IETF RFCs and Internet-Drafts) must pin to a specific version. When a new version is released: (a) audit for breaking changes (renamed TTPs, tactic-split moves, replaced RFCs, deprecated controls), (b) bump `last_threat_review` in all affected skills, (c) update `_meta` version fields in the relevant `data/*.json` file, (d) update `last_verified` on affected `data/rfc-references.json` entries, (e) never silently inherit version changes. Frameworks lag RFCs; RFCs lag attacker innovation — skills must track lag at every layer.
50
+ 12. **External data version pinning** — Every reference to external data (MITRE ATLAS, MITRE ATT&CK, NIST frameworks, CISA KEV, IETF RFCs and Internet-Drafts) must pin to a specific version. When a new version is released:
51
+
52
+ (a) audit for breaking changes (renamed TTPs, tactic-split moves, replaced RFCs, deprecated controls),
53
+ (b) bump `last_threat_review` in all affected skills,
54
+ (c) update `_meta` version fields in the relevant `data/*.json` file,
55
+ (d) update `last_verified` on affected `data/rfc-references.json` entries,
56
+ (e) never silently inherit version changes.
57
+
58
+ Frameworks lag RFCs; RFCs lag attacker innovation — skills must track lag at every layer.
45
59
  *Forcing function:* `_meta` version fields are schema-required; reviewer-checked for cross-file version consistency.
46
60
 
47
61
  **Pinned ATLAS version: v2026.07 (released 2026-08-07), Secure AI v2 layer (May 2026). Audit cadence: monthly** (ATLAS now ships monthly per CTID; the Secure AI v2 layered set and per-technique maturity classification are tracked separately in `data/atlas-ttps.json` via the `secure_ai_v2_layer` and `maturity` fields).
@@ -107,7 +121,17 @@ exceptd ships investigation playbooks under `data/playbooks/*.json` (schema: `li
107
121
 
108
122
  ### Worked example (kernel playbook)
109
123
 
110
- Operator asks: "is this host vulnerable to Copy Fail?" AI invokes `node lib/playbook-runner.js data/playbooks/kernel.json`. **govern** returns NIS2 24h incident notification + DORA 4h major-ICT-incident notification obligations and preloads `kernel-lpe-triage`, `exploit-scoring`, `global-grc`; AI surfaces both deadlines to the operator. **direct** emits threat_context anchored on real 2026 kernel CVEs and rwep_threshold bands 90 (live-patch) / 70 (urgent) / 30 (scheduled). **look** directs the AI to capture `uname -r` and `/etc/os-release`; AI uses Bash to read both and submits `artifacts: { kernel_version: { value: "5.15.0-101-generic", captured: true }, os_release: { value: "Ubuntu 22.04.4 LTS", captured: true } }`. **detect** evaluates the `kver-in-affected-range` indicator; AI confirms 5.15.0 falls in the affected range and submits `signal_overrides: { 'kver-in-affected-range': 'hit' }` after running its false-positive checks; the playbook classifies the host as "detected". **analyze** matches three catalogued CVEs (including CVE-2026-31431, KEV-listed, RWEP 90), computes `blast_radius_score=3`, runs the theater check and returns `verdict=theater` (paper SI-2 compliance does not address sub-hour live-patch reality). **validate** selects remediation path `live-patch-deploy` (priority 1) over `kernel-upgrade` (priority 2), returns validation_tests and a residual_risk_statement. **close** emits a signed CSAF-2.0 evidence_package, draft NIS2 (24h from operator-confirmed detection time) and DORA (4h from same anchor) notification text, and a learning_loop lesson queued for `data/zeroday-lessons.json`. AI shows the operator both notification drafts and asks whether to persist the evidence_package — does not auto-send either.
124
+ Operator asks: "is this host vulnerable to Copy Fail?" AI invokes `node lib/playbook-runner.js data/playbooks/kernel.json`.
125
+
126
+ 1. **govern** returns NIS2 24h incident notification + DORA 4h major-ICT-incident notification obligations and preloads `kernel-lpe-triage`, `exploit-scoring`, `global-grc`; AI surfaces both deadlines to the operator.
127
+ 2. **direct** emits threat_context anchored on real 2026 kernel CVEs and rwep_threshold bands 90 (live-patch) / 70 (urgent) / 30 (scheduled).
128
+ 3. **look** directs the AI to capture `uname -r` and `/etc/os-release`; AI uses Bash to read both and submits `artifacts: { kernel_version: { value: "5.15.0-101-generic", captured: true }, os_release: { value: "Ubuntu 22.04.4 LTS", captured: true } }`.
129
+ 4. **detect** evaluates the `kver-in-affected-range` indicator; AI confirms 5.15.0 falls in the affected range and submits `signal_overrides: { 'kver-in-affected-range': 'hit' }` after running its false-positive checks; the playbook classifies the host as "detected".
130
+ 5. **analyze** matches three catalogued CVEs (including CVE-2026-31431, KEV-listed, RWEP 90), computes `blast_radius_score=3`, runs the theater check and returns `verdict=theater` (paper SI-2 compliance does not address sub-hour live-patch reality).
131
+ 6. **validate** selects remediation path `live-patch-deploy` (priority 1) over `kernel-upgrade` (priority 2), returns validation_tests and a residual_risk_statement.
132
+ 7. **close** emits a signed CSAF-2.0 evidence_package, draft NIS2 (24h from operator-confirmed detection time) and DORA (4h from same anchor) notification text, and a learning_loop lesson queued for `data/zeroday-lessons.json`.
133
+
134
+ AI shows the operator both notification drafts and asks whether to persist the evidence_package — does not auto-send either.
111
135
 
112
136
  ### CLI invocation
113
137
 
@@ -220,38 +244,38 @@ When a zero-day surfaces a control class no existing framework covers, the learn
220
244
 
221
245
  Recently added (use the IDs in skill prose and operator briefings; full text in `data/zeroday-lessons.json`):
222
246
 
223
- | ID | Name | Surfacing zero-day | Coverage gap closed |
224
- |---|---|---|---|
225
- | `NEW-CTRL-048` | NPM-MAINTAINER-MFA-ENFORCEMENT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, NIST-800-53 IA-5, NIS2 Art.21 supply-chain |
226
- | `NEW-CTRL-049` | LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, EU CRA Art.13, SLSA Build L3 |
227
- | `NEW-CTRL-141` | KERNEL-EXIT-RACE-CVE-CLASS-MONITORING | `CVE-2026-46333` | NIST-800-53 AU-2/SI-4 |
228
- | `NEW-CTRL-142` | SUID-MINIMIZATION-FOR-KERNEL-LPE-CARRIER-BINARIES | `CVE-2026-46333` | NIST-800-53 CM-6/AC-3 |
229
- | `NEW-CTRL-050` | AI-ASSISTANT-CONFIG-FILE-PERMISSION-LOCKDOWN | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 AC-3/CM-6. Enforced operationally by `exceptd doctor --ai-config`. |
230
- | `NEW-CTRL-051` | NPM-PUBLISH-TOKEN-WORKSTATION-ISOLATION | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 IA-5, NIST-800-218 SSDF PW.4 |
231
- | `NEW-CTRL-052` | GITHUB-REPO-PATTERN-MONITORING-FOR-EXFIL-CHANNELS | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 SI-4. Enforced operationally by `exceptd watchlist --org-scan`. |
232
- | `NEW-CTRL-053` | MCP-SERVER-CONFIG-ALLOWLIST | `CVE-2026-30623` (Anthropic MCP SDK stdio injection) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM05 |
233
- | `NEW-CTRL-054` | BACKUP-TIER-NETWORK-ISOLATION | `CVE-2025-59389` (QNAP Hyper Data Protector preauth RCE) | ISO-27001-2022 A.8.13, NIS2 Art.21 business-continuity |
234
- | `NEW-CTRL-055` | SECURITY-TOOL-INTEGRITY-VERIFICATION | `CVE-2025-11837` (QNAP Malware Remover code-injection) | NIST-800-53 SI-3, ISO-27001-2022 A.8.7, PCI-DSS 4.0 §5.1 |
235
- | `NEW-CTRL-056` | MOBILE-ENDPOINT-MDM-ENFORCED-KEV-SLA | `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-24201` / `CVE-2025-43300` | NIST-800-53 SI-2, ISO-27001-2022 A.8.8, CIS Benchmarks mobile-OS profiles |
236
- | `NEW-CTRL-057` | BROWSER-MANAGED-UPDATE-NO-DEFERRAL | `CVE-2025-10585` / `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-4919` | NIST-800-53 SI-2, CISA KEV SLA, vendor-channel security-release contracts |
237
- | `NEW-CTRL-058` | CLOUD-CONTROL-PLANE-CROSS-TENANT-CLAIM-VALIDATION | `CVE-2025-55241` (Entra ID Actor-token impersonation) | NIST-800-53 AC-2/AU-2/AC-16, ISO-27001-2022 A.5.16, CIS Cloud Foundations |
238
- | `NEW-CTRL-059` | SENSITIVE-DATA-IN-LOGS-LINT | `CVE-2025-21085` (Cisco Duo credential leakage) | NIST-800-53 AU-9/SI-12, ISO-27001-2022 A.8.15, PCI-DSS 4.0 §10.5 |
239
- | `NEW-CTRL-060` | DATABASE-SERVER-SIDE-SCRIPTING-DEFAULT-DENY | `CVE-2025-49844` (Redis RediShell Lua UAF) | NIST-800-53 CM-6/CM-7, ISO-27001-2022 A.8.9, vendor secure-baseline profiles |
240
- | `NEW-CTRL-061` | IN-MEMORY-DATASTORE-MEMORY-DISCLOSURE-NETWORK-EXPOSURE-AUDIT | `CVE-2025-14847` (MongoBleed) | NIST-800-53 SC-7/SC-28, PCI-DSS 4.0 §1.4, ISO-27001-2022 A.8.20 |
241
- | `NEW-CTRL-062` | HTTP2-STREAM-RESET-ACCOUNTING | `CVE-2025-8671` (MadeYouReset) | NIST-800-53 SC-5, ISO-27001-2022 A.8.6, vendor HTTP/2 secure-default profiles |
242
- | `NEW-CTRL-063` | MULTIMODAL-INFERENCE-INPUT-DECODER-ISOLATION | `CVE-2026-22778` (vLLM heap-overflow RCE) | NIST AI RMF MANAGE 4.1, NIST-800-53 SC-39, OWASP LLM Top 10 2025 LLM10 |
243
- | `NEW-CTRL-064` | LLM-OUTPUT-DESERIALIZATION-TRUST-ZONE | `CVE-2025-68664` (LangChain LangGrinch) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM03/LLM08, NIST-800-53 SI-10 |
244
- | `NEW-CTRL-065` | AI-MODEL-SERVER-DEFAULT-AUTHENTICATION | `CVE-2026-7482` (Ollama Bleeding Llama) | NIST-800-53 IA-2/AC-3, ISO-27001-2022 A.8.5, NIST AI RMF GOVERN 5.1 |
245
- | `NEW-CTRL-066` | AGENTIC-IDE-HOST-EXECUTION-SANDBOX | `CVE-2025-55319` (VSCode agentic-AI command-injection) | NIST AI RMF MANAGE 4.1, ISO/IEC 42001 §6.1.4, NIST-800-53 SC-39 |
246
- | `NEW-CTRL-067` | AI-PLATFORM-CONTROL-PLANE-RBAC-OVERLAY-AUDIT | `CVE-2025-10725` (OpenShift AI privilege escalation) | NIST-800-53 AC-2/AC-6, CIS Kubernetes Benchmark §5, NIST AI RMF GOVERN 1.5 |
247
- | `NEW-CTRL-068` | HYPERVISOR-VM-ESCAPE-TENANCY-ASSUMPTION | `CVE-2025-22224` / `CVE-2025-22225` / `CVE-2025-22226` (VMSA-2025-0004 ESXi chain) | NIST-800-53 SC-7/SI-2, ISO-27001-2022 A.8.20, CIS VMware ESXi Benchmark |
248
- | `NEW-CTRL-069` | ECOSYSTEM-PACKAGE-TEMPORAL-TRUST-DRIFT-DETECTION | `MAL-2026-RUBYGEMS-BUFFERZONECORP-SLEEPER` | NIST-800-218 SSDF PW.4, EU CRA Annex I §1(2)(b), SLSA Build L3 |
249
- | `NEW-CTRL-070` | TYPOSQUAT-INSTALL-TIME-NAME-CONFUSION-GUARD | `MAL-2025-PYPI-COLORAMA-SOLANA-STEALER` | NIST-800-218 SSDF PW.4, NIST-800-53 SI-7, EU CRA Annex I §1(2)(c) |
250
- | `NEW-CTRL-071` | AI-DISCOVERY-CREDIT-IN-COMPLIANCE-EVIDENCE | `MAL-2025-AI-FOUND-FFMPEG-BIGSLEEP` + `CVE-2025-6965` + `CVE-2025-0133` + ZeroPath quartet | NIST AI RMF MEASURE 2.7, ISO/IEC 42001 §6.1.4 (records of AI use), EU AI Act Art.12 (record-keeping) |
251
- | `NEW-CTRL-072` | PRIMARY-SOURCE-INTAKE-VENDOR-BLOG-COVERAGE | `CVE-2026-31635` (DirtyDecrypt) | NIST-800-53 SI-5 (security alerts / advisories), ISO-27001-2022 A.5.7 (threat intelligence), CIS Controls v8 7.1 |
252
- | `NEW-CTRL-073` | RESEARCHER-HANDLE-ACTIVITY-TRACKER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) + Nightmare-Eclipse cluster | NIST-800-53 SI-5, ISO-27001-2022 A.5.7, CIS Controls v8 7.1. Enforced operationally by `lib/source-advisories.js#FEEDS[nightmare-eclipse-gitlab]` (gitlab-activity kind). |
253
- | `NEW-CTRL-074` | CVE-REGRESSION-WATCHER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) | NIST-800-53 CM-3 (configuration-change control), NIST-800-53 SI-2, ISO-27001-2022 A.8.8 (vulnerability management). Enforced operationally by `lib/cve-regression-watcher.js` — surfaces historical-CVE references in poller diffs as candidate silent-regression cases. |
254
- | `NEW-CTRL-075` | AV-AGENT-CURRENCY-CROSS-VERIFICATION | `BUG-2026-NIGHTMARE-ECLIPSE-UNDEFEND` (UnDefend) | NIST-800-53 SI-3 + SI-4, ISO-27001-2022 A.8.7. Independent control-plane cross-check (Defender for Endpoint cloud telemetry / Intune compliance / SCCM inventory) for AV / EDR signature + platform currency; alert on drift > 7 days. |
247
+ | ID | Name | Surfacing zero-day | Coverage gap closed | Enforced operationally by |
248
+ |---|---|---|---|---|
249
+ | `NEW-CTRL-048` | NPM-MAINTAINER-MFA-ENFORCEMENT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, NIST-800-53 IA-5, NIS2 Art.21 supply-chain | |
250
+ | `NEW-CTRL-049` | LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, EU CRA Art.13, SLSA Build L3 | |
251
+ | `NEW-CTRL-050` | AI-ASSISTANT-CONFIG-FILE-PERMISSION-LOCKDOWN | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 AC-3/CM-6. | Enforced operationally by `exceptd doctor --ai-config`. |
252
+ | `NEW-CTRL-051` | NPM-PUBLISH-TOKEN-WORKSTATION-ISOLATION | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 IA-5, NIST-800-218 SSDF PW.4 | |
253
+ | `NEW-CTRL-052` | GITHUB-REPO-PATTERN-MONITORING-FOR-EXFIL-CHANNELS | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 SI-4. | Enforced operationally by `exceptd watchlist --org-scan`. |
254
+ | `NEW-CTRL-053` | MCP-SERVER-CONFIG-ALLOWLIST | `CVE-2026-30623` (Anthropic MCP SDK stdio injection) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM05 | |
255
+ | `NEW-CTRL-054` | BACKUP-TIER-NETWORK-ISOLATION | `CVE-2025-59389` (QNAP Hyper Data Protector preauth RCE) | ISO-27001-2022 A.8.13, NIS2 Art.21 business-continuity | |
256
+ | `NEW-CTRL-055` | SECURITY-TOOL-INTEGRITY-VERIFICATION | `CVE-2025-11837` (QNAP Malware Remover code-injection) | NIST-800-53 SI-3, ISO-27001-2022 A.8.7, PCI-DSS 4.0 §5.1 | |
257
+ | `NEW-CTRL-056` | MOBILE-ENDPOINT-MDM-ENFORCED-KEV-SLA | `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-24201` / `CVE-2025-43300` | NIST-800-53 SI-2, ISO-27001-2022 A.8.8, CIS Benchmarks mobile-OS profiles | |
258
+ | `NEW-CTRL-057` | BROWSER-MANAGED-UPDATE-NO-DEFERRAL | `CVE-2025-10585` / `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-4919` | NIST-800-53 SI-2, CISA KEV SLA, vendor-channel security-release contracts | |
259
+ | `NEW-CTRL-058` | CLOUD-CONTROL-PLANE-CROSS-TENANT-CLAIM-VALIDATION | `CVE-2025-55241` (Entra ID Actor-token impersonation) | NIST-800-53 AC-2/AU-2/AC-16, ISO-27001-2022 A.5.16, CIS Cloud Foundations | |
260
+ | `NEW-CTRL-059` | SENSITIVE-DATA-IN-LOGS-LINT | `CVE-2025-21085` (Cisco Duo credential leakage) | NIST-800-53 AU-9/SI-12, ISO-27001-2022 A.8.15, PCI-DSS 4.0 §10.5 | |
261
+ | `NEW-CTRL-060` | DATABASE-SERVER-SIDE-SCRIPTING-DEFAULT-DENY | `CVE-2025-49844` (Redis RediShell Lua UAF) | NIST-800-53 CM-6/CM-7, ISO-27001-2022 A.8.9, vendor secure-baseline profiles | |
262
+ | `NEW-CTRL-061` | IN-MEMORY-DATASTORE-MEMORY-DISCLOSURE-NETWORK-EXPOSURE-AUDIT | `CVE-2025-14847` (MongoBleed) | NIST-800-53 SC-7/SC-28, PCI-DSS 4.0 §1.4, ISO-27001-2022 A.8.20 | |
263
+ | `NEW-CTRL-062` | HTTP2-STREAM-RESET-ACCOUNTING | `CVE-2025-8671` (MadeYouReset) | NIST-800-53 SC-5, ISO-27001-2022 A.8.6, vendor HTTP/2 secure-default profiles | |
264
+ | `NEW-CTRL-063` | MULTIMODAL-INFERENCE-INPUT-DECODER-ISOLATION | `CVE-2026-22778` (vLLM heap-overflow RCE) | NIST AI RMF MANAGE 4.1, NIST-800-53 SC-39, OWASP LLM Top 10 2025 LLM10 | |
265
+ | `NEW-CTRL-064` | LLM-OUTPUT-DESERIALIZATION-TRUST-ZONE | `CVE-2025-68664` (LangChain LangGrinch) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM03/LLM08, NIST-800-53 SI-10 | |
266
+ | `NEW-CTRL-065` | AI-MODEL-SERVER-DEFAULT-AUTHENTICATION | `CVE-2026-7482` (Ollama Bleeding Llama) | NIST-800-53 IA-2/AC-3, ISO-27001-2022 A.8.5, NIST AI RMF GOVERN 5.1 | |
267
+ | `NEW-CTRL-066` | AGENTIC-IDE-HOST-EXECUTION-SANDBOX | `CVE-2025-55319` (VSCode agentic-AI command-injection) | NIST AI RMF MANAGE 4.1, ISO/IEC 42001 §6.1.4, NIST-800-53 SC-39 | |
268
+ | `NEW-CTRL-067` | AI-PLATFORM-CONTROL-PLANE-RBAC-OVERLAY-AUDIT | `CVE-2025-10725` (OpenShift AI privilege escalation) | NIST-800-53 AC-2/AC-6, CIS Kubernetes Benchmark §5, NIST AI RMF GOVERN 1.5 | |
269
+ | `NEW-CTRL-068` | HYPERVISOR-VM-ESCAPE-TENANCY-ASSUMPTION | `CVE-2025-22224` / `CVE-2025-22225` / `CVE-2025-22226` (VMSA-2025-0004 ESXi chain) | NIST-800-53 SC-7/SI-2, ISO-27001-2022 A.8.20, CIS VMware ESXi Benchmark | |
270
+ | `NEW-CTRL-069` | ECOSYSTEM-PACKAGE-TEMPORAL-TRUST-DRIFT-DETECTION | `MAL-2026-RUBYGEMS-BUFFERZONECORP-SLEEPER` | NIST-800-218 SSDF PW.4, EU CRA Annex I §1(2)(b), SLSA Build L3 | |
271
+ | `NEW-CTRL-070` | TYPOSQUAT-INSTALL-TIME-NAME-CONFUSION-GUARD | `MAL-2025-PYPI-COLORAMA-SOLANA-STEALER` | NIST-800-218 SSDF PW.4, NIST-800-53 SI-7, EU CRA Annex I §1(2)(c) | |
272
+ | `NEW-CTRL-071` | AI-DISCOVERY-CREDIT-IN-COMPLIANCE-EVIDENCE | `MAL-2025-AI-FOUND-FFMPEG-BIGSLEEP` + `CVE-2025-6965` + `CVE-2025-0133` + ZeroPath quartet | NIST AI RMF MEASURE 2.7, ISO/IEC 42001 §6.1.4 (records of AI use), EU AI Act Art.12 (record-keeping) | |
273
+ | `NEW-CTRL-072` | PRIMARY-SOURCE-INTAKE-VENDOR-BLOG-COVERAGE | `CVE-2026-31635` (DirtyDecrypt) | NIST-800-53 SI-5 (security alerts / advisories), ISO-27001-2022 A.5.7 (threat intelligence), CIS Controls v8 7.1 | |
274
+ | `NEW-CTRL-073` | RESEARCHER-HANDLE-ACTIVITY-TRACKER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) + Nightmare-Eclipse cluster | NIST-800-53 SI-5, ISO-27001-2022 A.5.7, CIS Controls v8 7.1. | Enforced operationally by `lib/source-advisories.js#FEEDS[nightmare-eclipse-gitlab]` (gitlab-activity kind). |
275
+ | `NEW-CTRL-074` | CVE-REGRESSION-WATCHER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) | NIST-800-53 CM-3 (configuration-change control), NIST-800-53 SI-2, ISO-27001-2022 A.8.8 (vulnerability management). | Enforced operationally by `lib/cve-regression-watcher.js` — surfaces historical-CVE references in poller diffs as candidate silent-regression cases. |
276
+ | `NEW-CTRL-075` | AV-AGENT-CURRENCY-CROSS-VERIFICATION | `BUG-2026-NIGHTMARE-ECLIPSE-UNDEFEND` (UnDefend) | NIST-800-53 SI-3 + SI-4, ISO-27001-2022 A.8.7. | Independent control-plane cross-check (Defender for Endpoint cloud telemetry / Intune compliance / SCCM inventory) for AV / EDR signature + platform currency; alert on drift > 7 days. |
277
+ | `NEW-CTRL-141` | KERNEL-EXIT-RACE-CVE-CLASS-MONITORING | `CVE-2026-46333` | NIST-800-53 AU-2/SI-4 | |
278
+ | `NEW-CTRL-142` | SUID-MINIMIZATION-FOR-KERNEL-LPE-CARRIER-BINARIES | `CVE-2026-46333` | NIST-800-53 CM-6/AC-3 | |
255
279
 
256
280
  When you cite a `NEW-CTRL-*` ID in a skill body, the lint reads the upstream `zeroday-lessons.json` entry as the authoritative source for the requirement text — do not paraphrase the description in the skill body; link to the ID instead.
257
281
 
@@ -404,6 +428,8 @@ A new playbook **should not** ship a collector when:
404
428
 
405
429
  When in doubt, ship the playbook without a collector and open the gap as a follow-up.
406
430
 
431
+ ---
432
+
407
433
  ## Pre-Ship Checklist
408
434
 
409
435
  - [ ] All new CVEs have complete `data/cve-catalog.json` entries
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19.29 — 2026-08-17
4
+
5
+ The catalog reaches 1,222 CVEs with 97 additions drawn from CISA KEV, weighted towards the recent end of the backlog: 19 from 2022, 20 from 2021, 18 from 2019, and a long tail back to 2007. Microsoft accounts for 30, Apple 9, Adobe 7 and Google 5, with the rest spread across Cisco, VMware, Kaseya, QNAP, Zyxel, D-Link and the router and storage-appliance vendors whose products dominate the older listings. Twenty carry CISA's ransomware designation and 63 have an obtainable public exploit.
6
+
7
+ For fourteen of them CISA's required action is not "patch" but "disconnect": the product is end-of-life and the terminal state is removal. Six have no vendor fix at all. Those entries name removal as the remediation rather than describing an upgrade path that does not exist, and where a vendor published nothing the entry cites the distribution or coordinating advisory that did — Ubuntu's for the Debian-specific Redis packaging flaw, Red Hat's for Dirty Pipe, Kaseya's own bulletin for the ConnectWise integration that shipped on its server.
8
+
9
+ Fifty-seven of the additions need a restart before the fix is running, and the entries separate that from the update being installed. A kernel extension or a graphics driver keeps serving the vulnerable code until the process or the machine restarts, so a remediation record keyed to the deployed version reports hosts as done while the pre-patch code is still executing. Where the restart is the step users defer, the entry says so and tells you to verify against the running build.
10
+
11
+ Where sources disagree, the entries carry the disagreement rather than choosing the convenient reading. For CVE-2022-26904 Microsoft records the flaw as not exploited while CISA added it to KEV thirteen days later, and the entry states both. NVD's CPE list for CVE-2022-22954 names vRealize Automation 7.6 while VMware's own advisory records it as unaffected, so the entry scopes vRealize Automation out of that CVE and keeps it in scope for CVE-2022-22960. Adobe withdrew Flash Player 11.x for Windows and macOS from its CVE-2015-0313 advisory in February 2015, on the grounds that those builds do not support the affected functionality — and the entry records that the withdrawal does not carry to the Linux line, which Adobe's own patch bulletin and NVD both still place in scope below 11.2.202.442.
12
+
13
+ Public-exploit availability is recorded as a finding in both directions. A negative is earned by searching Exploit-DB, the Metasploit module tree, the Nuclei templates and public repositories and saying what was checked, because that flag drives a fifth of the priority score. Several entries record a near miss explicitly — a Metasploit module that belongs to an adjacent CVE, a research write-up with no code, an exploit whose author withheld it — so the absence can be re-checked rather than taken on trust.
14
+
15
+ CWE-193, CWE-281 and CWE-665 join the weakness catalog to carry the off-by-one, permission-preservation and uninitialised-memory entries among these additions, taking it to 236.
16
+
17
+ ## 0.19.28 — 2026-08-16
18
+
19
+ The project-rules file opens with a table instead of a seven-sentence paragraph. Which assistants load `AGENTS.md` on their own, which take a pointer stub, and which need it added by hand was written as running prose, so the reader had to parse three categories out of one block to find their own tool. The rows carry the same tool names and config paths as before.
20
+
21
+ Two more places in that file put a procedure where a reader can follow it. The external-data pinning rule listed its five steps inside a paragraph, which is the one rule in the file that has to be executed in order; the steps are now a list. The seven-phase worked example ran all seven phases together in a single block directly below a numbered list of those same phases; it is now seven numbered blocks, in the same order, with every artifact literal unchanged.
22
+
23
+ The control-requirements table sorts by its own key again — two rows sat out of sequence, so looking up an ID meant scanning past them. It also gained a column: five rows were appending how the requirement is enforced in this codebase to a column headed "Coverage gap closed", which promises framework references. The enforcement notes moved to a column of their own, and rows without one are blank rather than filled in.
24
+
25
+ `SECURITY.md` answers a reporter's first two questions first. Supported versions sat four sections below the reporting address, under the threat model; it now follows the response targets directly. The bug-report template no longer interrupts its general path with a threat-intelligence block a filer with an ordinary CLI bug cannot answer — that section moved to the end, next to the free-text prompts.
26
+
27
+ Comments that shipped in the tarball named internal work cycles — "Cycle 20 A P1", "cycle 15 security F2", "the cycle 20 audit B flagged" — which identify nothing a reader can look up. They describe why the current code is the way it is instead. One comment pointed at a test file under the wrong name, so anyone checking whether the manifest cache is guarded against drift would have found no such file and concluded it was unguarded; it names the real test, and says which fields that test does and does not cover.
28
+
3
29
  ## 0.19.27 — 2026-08-15
4
30
 
5
31
  `docs/REPO-SETTINGS.md` describes the repository it is applied to. It is the recovery path for the branch protection, tag protection and Actions allowlist, and it had drifted from all three, so re-applying it would have changed the repository rather than restored it.
package/CONTEXT.md CHANGED
@@ -232,7 +232,7 @@ The `researcher` **skill** (front-door dispatcher) and `threat-researcher` **age
232
232
  - Individual skill files — 15–40 KB each; load on match, not preemptively
233
233
  - Playbook JSON — load on demand via `exceptd brief <playbook>` (or `--phase look` for just the artifact spec); the engine handles phase orchestration
234
234
 
235
- ### What This Repo Does Not Contain
235
+ ### What This Repository Does Not Contain
236
236
 
237
237
  - No code that executes automatically in your environment
238
238
  - No outbound network calls; all data is local and static (the watchlist surface is read-only)
package/SECURITY.md CHANGED
@@ -25,6 +25,12 @@ Include:
25
25
  | Medium (incorrect framework gap mapping, wrong control ID) | 7d | 14d | 30d |
26
26
  | Low (missing data, incomplete entries) | 14d | 30d | next minor |
27
27
 
28
+ ## Supported Versions
29
+
30
+ Pre-1.0: Latest patch on the most recent minor receives data updates (CVE catalog, framework gap updates, new ATLAS TTPs). All versions receive critical accuracy corrections.
31
+
32
+ Once 1.0: 18-month data update support after each major version.
33
+
28
34
  ## Threat Model
29
35
 
30
36
  ### What This Repo Defends
@@ -54,12 +60,6 @@ CVE catalog entries and RWEP scores are not authoritative sources — they are a
54
60
 
55
61
  For critical security decisions, verify CISA KEV status directly. RWEP scores are a prioritization heuristic, not a compliance instrument.
56
62
 
57
- ## Supported Versions
58
-
59
- Pre-1.0: Latest patch on the most recent minor receives data updates (CVE catalog, framework gap updates, new ATLAS TTPs). All versions receive critical accuracy corrections.
60
-
61
- Once 1.0: 18-month data update support after each major version.
62
-
63
63
  ## Supply Chain
64
64
 
65
65
  This repository has no npm runtime dependencies. The library code in `lib/` is self-contained. Skills and data files are plain text/JSON.
package/bin/exceptd.js CHANGED
@@ -735,8 +735,10 @@ function main() {
735
735
  // piping through `jq` get one consistent shape across the CLI surface.
736
736
  // emitError() sets exitCode + returns rather than calling process.exit()
737
737
  // so the stderr JSON drains before teardown; promote the exit code to
738
- // UNKNOWN_COMMAND (10) afterwards. Cycle 9 split this away from
739
- // DETECTED_ESCALATE (2) — the two semantics had collided since v0.12.24.
738
+ // UNKNOWN_COMMAND (10) afterwards. This code is deliberately distinct
739
+ // from DETECTED_ESCALATE (2): an unknown verb and a detected finding are
740
+ // different outcomes, and sharing one code made them indistinguishable to
741
+ // a caller branching on the exit status.
740
742
  //
741
743
  // add a did-you-mean suggestion when the
742
744
  // unknown verb is within Levenshtein-1 of a real verb (catches the
@@ -1041,8 +1043,8 @@ function readEvidence(evidenceFlag, opts = {}) {
1041
1043
  // operator accidentally passing a multi-gigabyte file (binary, log, or
1042
1044
  // adversarial JSON bomb). 32 MB is well beyond any legitimate
1043
1045
  // submission and still drains in a single read on modern hardware.
1044
- // v0.12.35 (cycle 15 security F1): apply the SAME cap to the stdin
1045
- // branch. Pre-fix `--evidence -` was uncapped — an attacker piping
1046
+ // The SAME cap applies to the stdin branch. Previously `--evidence -`
1047
+ // was uncapped — an attacker piping
1046
1048
  // multi-GB JSON would OOM the runner. Read in 1 MB chunks and bail
1047
1049
  // at the limit rather than letting Node grow the heap unbounded.
1048
1050
  const MAX_EVIDENCE_BYTES = 32 * 1024 * 1024;
@@ -5673,8 +5675,9 @@ function cmdReattest(runner, args, runOpts, pretty) {
5673
5675
  const suffix = i === 0 ? "" : "-" + crypto.randomBytes(3).toString("hex");
5674
5676
  const candidate = path.join(dir, replayBaseName + suffix + ".json");
5675
5677
  try {
5676
- // v0.12.38 cycle 18 P1 F2: mode 0o600 + Windows ACL hardening
5677
- // (matches the primary attestation write site).
5678
+ // mode 0o600 + Windows ACL hardening, matching the primary
5679
+ // attestation write site — a replay file carries the same evidence
5680
+ // and must not be readable by other local accounts.
5678
5681
  fs.writeFileSync(candidate, JSON.stringify(replayBody, null, 2), { flag: "wx", mode: 0o600 });
5679
5682
  try {
5680
5683
  const { restrictWindowsAcl } = require(path.join(PKG_ROOT, "lib", "sign.js"));
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-08-16T02:12:57.741Z",
3
+ "generated_at": "2026-08-18T00:40:31.568Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 64,
6
6
  "source_hashes": {
7
- "manifest.json": "1d3ee52ad114109f62c1c376711f1e90195fde813ae038e7f11b8cd87eba3807",
7
+ "manifest.json": "4d4b46566e0bd850f5a0d11198c88531bb8a5f4b88facb5a07c9bbf4e16a48eb",
8
8
  "README.md": "a757b8ed9923b7954518d00a768d338800460c9a90811094f050710fe9888615",
9
9
  "data/atlas-ttps.json": "a14089671efcb4f06dd0f82d688fe49276c1370e167e4483d76e9c0a40ef41eb",
10
- "data/attack-techniques.json": "81344e19dc49470631026a4a82c87ac17f5c2b6bdfd229e7bb5a7b0681e6fe3d",
11
- "data/cve-catalog.json": "6d548f5e80d58f5d40c9f207ab67bfc63cf5df4eaf35667911a8a23dd518b3ee",
12
- "data/cwe-catalog.json": "eef5be77bd877af42ce848c9f320b702bc29fb9b085e3f4820523026e138c803",
10
+ "data/attack-techniques.json": "fc1addff406771bf183b8ccae411b583fd9a3da62cb753e6e67bdb50a6160ee2",
11
+ "data/cve-catalog.json": "b55dd412109456bb74d68f6e0b3152debf83ae6352fd867d72add231714d8079",
12
+ "data/cwe-catalog.json": "e94700cbd1e6b2670efd694587c2b889f58e50b2f574f8a2c954eb879f08a570",
13
13
  "data/d3fend-catalog.json": "9a4a356a1446d7db8be8b6684fa789802405a96cdaf769f06db4136bd07db6ac",
14
14
  "data/dlp-controls.json": "791f6a46b19b0c0fa2f46630ac8b398afb7ec9c2f2019056828c8820fe255f19",
15
15
  "data/exploit-availability.json": "7139702266a8d5ba8b235ab76518b8a84deaa31fdb912e81cb124121cf3e9930",
16
- "data/framework-control-gaps.json": "0d3936786bf4f03a37b83e39b5eda4dc0186dbab6362735a04cb7e6f9b7dc069",
16
+ "data/framework-control-gaps.json": "51563f5ee3b85a1c155be9cf9aac629bf69d4d54dfeefb7d90c7eade366af4be",
17
17
  "data/global-frameworks.json": "20b18a851b3ab82e57cd159b49476d69fe544f02523398b2015189ab81c7c3f8",
18
18
  "data/rfc-references.json": "6e9017eca910ab7e4bee85ad7c23927fd6ec766f34be7fce49ebf020cec3381a",
19
- "data/zeroday-lessons.json": "e13da4473fbfabb491b82efa690974a4238eadc977d29b045cf444961b53d448",
19
+ "data/zeroday-lessons.json": "44ca23d11ef8fa7fd35a1bd4094ec215d7b2ffb8797922e6d6453bd2ad11f11d",
20
20
  "skills/kernel-lpe-triage/skill.md": "0f79c641cef6e5f4a942eb94f43c460562bf83dfb67ae112d146c39c6b320fb0",
21
21
  "skills/ai-attack-surface/skill.md": "c97335e14cd34bd1cd3c9d2cbd397f33569a07292b2f2f7721483575eb4459f7",
22
22
  "skills/mcp-agent-trust/skill.md": "6195c93a6cadb213051214742890fa2bf4e39bae377a654d4195f0c90bd8b896",
@@ -101,8 +101,8 @@
101
101
  "dlp_refs": 0
102
102
  },
103
103
  "trigger_table_entries": 688,
104
- "chains_cve_entries": 1112,
105
- "chains_cwe_entries": 233,
104
+ "chains_cve_entries": 1209,
105
+ "chains_cwe_entries": 236,
106
106
  "jurisdictions_indexed": 34,
107
107
  "handoff_dag_nodes": 51,
108
108
  "summary_cards": 51,
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "events": [
8
8
  {
9
- "date": "2026-08-15",
9
+ "date": "2026-08-18",
10
10
  "type": "catalog_update",
11
11
  "artifact": "data/attack-techniques.json",
12
12
  "path": "data/attack-techniques.json",
@@ -14,23 +14,15 @@
14
14
  "entry_count": 794
15
15
  },
16
16
  {
17
- "date": "2026-08-15",
17
+ "date": "2026-08-18",
18
18
  "type": "catalog_update",
19
19
  "artifact": "data/cve-catalog.json",
20
20
  "path": "data/cve-catalog.json",
21
21
  "schema_version": "1.0.0",
22
- "entry_count": 1125
22
+ "entry_count": 1222
23
23
  },
24
24
  {
25
- "date": "2026-08-15",
26
- "type": "catalog_update",
27
- "artifact": "data/cwe-catalog.json",
28
- "path": "data/cwe-catalog.json",
29
- "schema_version": "1.0.0",
30
- "entry_count": 233
31
- },
32
- {
33
- "date": "2026-08-15",
25
+ "date": "2026-08-18",
34
26
  "type": "catalog_update",
35
27
  "artifact": "data/framework-control-gaps.json",
36
28
  "path": "data/framework-control-gaps.json",
@@ -38,12 +30,20 @@
38
30
  "entry_count": 194
39
31
  },
40
32
  {
41
- "date": "2026-08-15",
33
+ "date": "2026-08-18",
42
34
  "type": "catalog_update",
43
35
  "artifact": "data/zeroday-lessons.json",
44
36
  "path": "data/zeroday-lessons.json",
45
37
  "schema_version": "1.1.0",
46
- "entry_count": 1125
38
+ "entry_count": 1222
39
+ },
40
+ {
41
+ "date": "2026-08-17",
42
+ "type": "catalog_update",
43
+ "artifact": "data/cwe-catalog.json",
44
+ "path": "data/cwe-catalog.json",
45
+ "schema_version": "1.0.0",
46
+ "entry_count": 236
47
47
  },
48
48
  {
49
49
  "date": "2026-08-08",
@@ -31,7 +31,7 @@
31
31
  "path": "data/attack-techniques.json",
32
32
  "purpose": null,
33
33
  "schema_version": "1.0.0",
34
- "last_updated": "2026-08-15",
34
+ "last_updated": "2026-08-18",
35
35
  "tlp": "CLEAR",
36
36
  "source_confidence_default": "A1",
37
37
  "freshness_policy": {
@@ -53,7 +53,7 @@
53
53
  "path": "data/cve-catalog.json",
54
54
  "purpose": "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.",
55
55
  "schema_version": "1.0.0",
56
- "last_updated": "2026-08-15",
56
+ "last_updated": "2026-08-18",
57
57
  "tlp": "CLEAR",
58
58
  "source_confidence_default": "A1",
59
59
  "freshness_policy": {
@@ -62,20 +62,20 @@
62
62
  "rebuild_after_days": 365,
63
63
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
64
64
  },
65
- "entry_count": 1125,
65
+ "entry_count": 1222,
66
66
  "sample_keys": [
67
- "CVE-2006-2492",
68
- "CVE-2007-5659",
69
- "CVE-2008-0655",
70
- "CVE-2009-0557",
71
- "CVE-2009-0563"
67
+ "CVE-2007-3010",
68
+ "CVE-2014-0160",
69
+ "CVE-2014-0322",
70
+ "CVE-2014-0780",
71
+ "CVE-2014-4113"
72
72
  ]
73
73
  },
74
74
  "cwe-catalog.json": {
75
75
  "path": "data/cwe-catalog.json",
76
76
  "purpose": "MITRE CWE entries used by the project (subset with skill citations), with severity hint and category. Pinned to a CWE catalog version.",
77
77
  "schema_version": "1.0.0",
78
- "last_updated": "2026-08-15",
78
+ "last_updated": "2026-08-17",
79
79
  "tlp": "CLEAR",
80
80
  "source_confidence_default": "A1",
81
81
  "freshness_policy": {
@@ -84,7 +84,7 @@
84
84
  "rebuild_after_days": 365,
85
85
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
86
86
  },
87
- "entry_count": 233,
87
+ "entry_count": 236,
88
88
  "sample_keys": [
89
89
  "CWE-20",
90
90
  "CWE-22",
@@ -163,7 +163,7 @@
163
163
  "path": "data/framework-control-gaps.json",
164
164
  "purpose": "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.",
165
165
  "schema_version": "1.0.0",
166
- "last_updated": "2026-08-15",
166
+ "last_updated": "2026-08-18",
167
167
  "tlp": "CLEAR",
168
168
  "source_confidence_default": "A1",
169
169
  "freshness_policy": {
@@ -229,7 +229,7 @@
229
229
  "path": "data/zeroday-lessons.json",
230
230
  "purpose": "Distilled lessons from notable zero-days and campaigns (SesameOp, Copy Fail, Dirty Frag, Copilot RCE, Windsurf MCP). Each entry: technique, distinguishing characteristic, what it means for the framework lag.",
231
231
  "schema_version": "1.1.0",
232
- "last_updated": "2026-08-15",
232
+ "last_updated": "2026-08-18",
233
233
  "tlp": "CLEAR",
234
234
  "source_confidence_default": "B2",
235
235
  "freshness_policy": {
@@ -238,7 +238,7 @@
238
238
  "rebuild_after_days": 365,
239
239
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
240
240
  },
241
- "entry_count": 1125,
241
+ "entry_count": 1222,
242
242
  "sample_keys": [
243
243
  "CVE-2026-31431",
244
244
  "CVE-2025-53773",