@blamejs/exceptd-skills 0.19.25 → 0.19.27
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 +15 -15
- package/ARCHITECTURE.md +8 -8
- package/CHANGELOG.md +34 -0
- package/CONTEXT.md +10 -8
- package/README.md +15 -7
- package/data/_indexes/_meta.json +10 -10
- package/data/_indexes/activity-feed.json +29 -29
- package/data/_indexes/catalog-summaries.json +13 -13
- package/data/_indexes/chains.json +76206 -0
- package/data/_indexes/frequency.json +1 -0
- package/data/attack-techniques.json +332 -14
- package/data/cve-catalog.json +11271 -4
- package/data/cwe-catalog.json +138 -4
- package/data/framework-control-gaps.json +767 -7
- package/data/zeroday-lessons.json +10075 -2
- package/lib/collectors/citation-hygiene.js +12 -0
- package/lib/cve-enrich.js +47 -3
- package/lib/refresh-external.js +119 -31
- package/manifest.json +53 -53
- package/package.json +2 -2
- package/sbom.cdx.json +41 -41
- package/scripts/check-epss-consistency.js +6 -10
package/AGENTS.md
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
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
|
|
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).
|
|
4
4
|
|
|
5
5
|
Also read [CONTEXT.md](CONTEXT.md) for a complete orientation to the skill system.
|
|
6
6
|
|
|
7
7
|
## Hard Rules
|
|
8
8
|
|
|
9
|
-
Each rule below carries a **Forcing function** annotation declaring whether it is mechanically enforced by a script in the predeploy / CI gate sequence, or whether it is policy-only (reviewer trust). Policy-only rules are not weaker
|
|
9
|
+
Each rule below carries a **Forcing function** annotation declaring whether it is mechanically enforced by a script in the predeploy / CI gate sequence, or whether it is policy-only (reviewer trust). Policy-only rules are not weaker; they are auditable through reviewer judgment rather than through a script. Operators should know which class a given rule sits in.
|
|
10
10
|
|
|
11
|
-
1. **No stale threat intel** — Every CVE reference must include: CVSS score, KEV status, PoC availability, AI-discovery flag, active exploitation status, and patch/live-patch availability. No theoretical vulnerabilities without real-world grounding. When validating a CVE or RFC citation during security work, the canonical move is `exceptd cve <CVE-ID>` / `exceptd rfc <number>` — it resolves the citation and caches the result, so
|
|
11
|
+
1. **No stale threat intel** — Every CVE reference must include: CVSS score, KEV status, PoC availability, AI-discovery flag, active exploitation status, and patch/live-patch availability. No theoretical vulnerabilities without real-world grounding. When validating a CVE or RFC citation during security work, the canonical move is `exceptd cve <CVE-ID>` / `exceptd rfc <number>` — it resolves the citation and caches the result, so each id resolves once rather than being re-researched independently against NVD/the datatracker.
|
|
12
12
|
*Forcing function:* enforced by `lib/validate-cve-catalog.js` (predeploy gate).
|
|
13
13
|
|
|
14
14
|
2. **Framework lag is a first-class concept** — Every skill must explicitly declare which framework controls are insufficient for the threats it covers. Never imply a framework control is adequate when current TTPs bypass it.
|
|
15
15
|
*Forcing function:* enforced by `lib/lint-skills.js` (Framework Lag Declaration section is one of the seven required sections; predeploy gate).
|
|
16
16
|
|
|
17
17
|
3. **No CVSS-only risk scoring** — CVSS is a severity metric, not a risk metric. Every risk score uses the Real-World Exploit Priority (RWEP) model defined in `lib/scoring.js`. CVSS is reported alongside RWEP for compatibility, never as the sole score.
|
|
18
|
-
*Forcing function:* enforced by the RWEP forcing-function test
|
|
18
|
+
*Forcing function:* enforced by the RWEP forcing-function test (test suite gate).
|
|
19
19
|
|
|
20
20
|
4. **No orphaned controls** — Every control recommendation maps to a real attacker TTP in `data/atlas-ttps.json` or `data/cve-catalog.json`. Controls without a mapped threat are removed, not kept for completeness.
|
|
21
21
|
*Forcing function:* partial — `data/framework-control-gaps.json` requires `evidence_cves`, but skill-body recommendations are reviewer-checked, not lint-enforced.
|
|
@@ -30,7 +30,7 @@ Each rule below carries a **Forcing function** annotation declaring whether it i
|
|
|
30
30
|
*Forcing function:* enforced by `lib/lint-skills.js` (required-section list; predeploy gate).
|
|
31
31
|
|
|
32
32
|
8. **Compliance theater detection is mandatory** — Every skill that touches a compliance framework must include a compliance theater check: a specific question or test that distinguishes paper compliance from actual security.
|
|
33
|
-
*Forcing function:* enforced
|
|
33
|
+
*Forcing function:* enforced by a lint check asserting the Compliance Theater Check section is present in every framework-touching skill (predeploy gate).
|
|
34
34
|
|
|
35
35
|
9. **Ephemeral and AI-pipeline realities are first-class** — Never recommend controls that are architecturally impossible for serverless, container, or AI pipeline environments without providing an explicitly scoped alternative.
|
|
36
36
|
*Forcing function:* **policy only** — no CI gate enforces this; reviewers check during PR review.
|
|
@@ -50,10 +50,10 @@ Each rule below carries a **Forcing function** annotation declaring whether it i
|
|
|
50
50
|
|
|
51
51
|
The IETF RFC / Internet-Draft catalog lives at `data/rfc-references.json`; each entry tracks status, errata count, replaces / replaced-by, and `last_verified`.
|
|
52
52
|
|
|
53
|
-
13. **Skill integrity verification** — Every skill in `manifest.json` carries an Ed25519 `signature` (base64) and a `signed_at` timestamp covering its `skill.md` content. `lib/verify.js` checks each signature against the public key at `keys/public.pem` before
|
|
53
|
+
13. **Skill integrity verification** — Every skill in `manifest.json` carries an Ed25519 `signature` (base64) and a `signed_at` timestamp covering its `skill.md` content. `lib/verify.js` checks each signature against the public key at `keys/public.pem` before the orchestrator loads any skill. Tampered or unsigned skills are rejected. The private key at `.keys/private.pem` is gitignored and never enters the repo. Run `node lib/verify.js` (or `npm run verify`) before shipping; sign new or changed skills with `npm run bootstrap` for first-run, or `node lib/sign.js sign-all` after content changes.
|
|
54
54
|
*Forcing function:* enforced by `lib/verify.js` (predeploy gate, plus `scripts/verify-shipped-tarball.js` which re-runs verification on the extracted `npm pack` output).
|
|
55
55
|
|
|
56
|
-
14. **Primary-source IoC review** — Any CVE entry in `data/cve-catalog.json` whose `poc_available: true` AND whose exploit code is publicly available (published PoC repo, vendor advisory with attached payload, researcher blog with reproducer) must include `iocs` populated from a line-level cross-reference of the published source — not from secondary-source paraphrase. The `iocs` block records which IoC categories were extracted (`payload_artifacts`, `persistence_artifacts`, `credential_paths_scanned`, `c2_indicators`, `host_recon`, `behavioral`, `runtime_syscall`, `kernel_trace`, `livepatch_gap`, `destructive`, `payload_content_patterns`, `supply_chain_entry_vectors`), and each IoC must be traceable to a specific source URL or commit hash. v0.12.6 audit reviewed CVE-2026-45321 (Mini Shai-Hulud), CVE-2026-31431 (Copy Fail / Dirty Pipe / Dirty COW family), CVE-2026-43284 + CVE-2026-43500 (Dirty Frag pair), CVE-2025-53773 (Copilot YOLO mode), and CVE-2026-30615 (Windsurf MCP) against primary sources from Aikido, StepSecurity, Socket, Wiz, Datadog, Sysdig, Trail of Bits, Invariant Labs, Embrace the Red, NVD, MSRC.
|
|
56
|
+
14. **Primary-source IoC review** — Any CVE entry in `data/cve-catalog.json` whose `poc_available: true` AND whose exploit code is publicly available (published PoC repo, vendor advisory with attached payload, researcher blog with reproducer) must include `iocs` populated from a line-level cross-reference of the published source — not from secondary-source paraphrase. The `iocs` block records which IoC categories were extracted (`payload_artifacts`, `persistence_artifacts`, `credential_paths_scanned`, `c2_indicators`, `host_recon`, `behavioral`, `runtime_syscall`, `kernel_trace`, `livepatch_gap`, `destructive`, `payload_content_patterns`, `supply_chain_entry_vectors`), and each IoC must be traceable to a specific source URL or commit hash. v0.12.6 audit reviewed CVE-2026-45321 (Mini Shai-Hulud), CVE-2026-31431 (Copy Fail / Dirty Pipe / Dirty COW family), CVE-2026-43284 + CVE-2026-43500 (Dirty Frag pair), CVE-2025-53773 (Copilot YOLO mode), and CVE-2026-30615 (Windsurf MCP) against primary sources from Aikido, StepSecurity, Socket, Wiz, Datadog, Sysdig, Trail of Bits, Invariant Labs, Embrace the Red, NVD, MSRC. Skipping this audit is equivalent to shipping "untested security advice" — the IoC list is the operator-facing detection contract.
|
|
57
57
|
*Forcing function:* **policy only** — IoC presence is reviewer-audited per catalog change; no CI gate asserts every PoC-available CVE has an `iocs` block.
|
|
58
58
|
|
|
59
59
|
15. **Test coverage on every diff** — Every feature change (added, removed, or modified) must land with a covering test reference in the same PR. The shapes the gate enforces:
|
|
@@ -66,7 +66,7 @@ Each rule below carries a **Forcing function** annotation declaring whether it i
|
|
|
66
66
|
| New `phases.detect.indicators[].id` in a playbook | Quoted indicator id literal in `tests/e2e-scenarios/*/expect.json` or `tests/*.test.js` |
|
|
67
67
|
| New / changed `iocs` field on a CVE entry | CVE id and the word `iocs` in the same test file |
|
|
68
68
|
|
|
69
|
-
Mechanical enforcement lives in `scripts/check-test-coverage.js` and runs as the 13th gate of `npm run predeploy` (also the `Diff coverage` job in `ci.yml`). Docs (`*.md`), workflow YAML, and skill body changes are allowlisted — skill bodies are covered by the Ed25519 signature gate (Hard Rule #13)
|
|
69
|
+
Mechanical enforcement lives in `scripts/check-test-coverage.js` and runs as the 13th gate of `npm run predeploy` (also the `Diff coverage` job in `ci.yml`). Docs (`*.md`), workflow YAML, and skill body changes are allowlisted — skill bodies are covered by the Ed25519 signature gate (Hard Rule #13); workflows surface a manual-review flag rather than a hard finding. Whitespace-only diffs are ignored.
|
|
70
70
|
|
|
71
71
|
The gate is blocking: a covered surface change without a covering test reference fails the predeploy run and the `Diff coverage` CI job. Never bypass with `--no-verify` or `--warn-only` — add the covering test first. This rule is additive to Hard Rule #11 (no-MVP ban): a new playbook indicator or CLI surface that ships without a regression test is the same shape of incomplete-feature ship that #11 forbids, applied to the test layer.
|
|
72
72
|
*Forcing function:* enforced by `scripts/check-test-coverage.js` (predeploy gate plus the `Diff coverage` CI job).
|
|
@@ -79,7 +79,7 @@ exceptd ships investigation playbooks under `data/playbooks/*.json` (schema: `li
|
|
|
79
79
|
|
|
80
80
|
### The seven phases
|
|
81
81
|
|
|
82
|
-
1. **govern (exceptd)** — Runner emits jurisdiction obligations (
|
|
82
|
+
1. **govern (exceptd)** — Runner emits jurisdiction obligations (for example NIS2 24h, DORA 4h, GDPR 72h), theater fingerprints to test for, framework gap context, and `skill_preload` listing skills the AI must load into its session context before proceeding. The AI loads `skill_preload` and surfaces jurisdiction obligations to the operator **before** doing any investigation work.
|
|
83
83
|
2. **direct (exceptd)** — Runner emits `threat_context` (current real CVEs/TTPs with dates from `data/cve-catalog.json`), `rwep_threshold` (live-patch / urgent-patch / scheduled-patch bands), `framework_lag_declaration`, `skill_chain`, and `token_budget`. The AI uses this to plan its collection work — what to look for and why.
|
|
84
84
|
3. **look (AI)** — The AI collects typed artifacts per the playbook's `look.artifacts` spec using **native** tools (Bash, Read, Grep, Glob — no shelling back into exceptd for collection). When `_meta.air_gap_mode=true`, the AI honors each artifact's `air_gap_alternative` instead of the default collection method. Every artifact submission is structured as `artifacts: { <id>: { value, captured: true|false, reason?: string } }`. Failed collections are **never** silently dropped — they get `captured: false` with a `reason` string so the runner records the visibility gap.
|
|
85
85
|
4. **detect (AI)** — The AI evaluates the collected artifacts against `playbook.detect.indicators`. Pattern-matching (regex against raw artifact content, version range checks, presence/absence tests) happens in the AI — exceptd does not see the raw artifact content. The AI submits `signal_overrides: { <indicator_id>: 'hit' | 'miss' | 'inconclusive' }` plus any other signal values the playbook declares. If the indicator definition includes `false_positive_checks_required`, the AI MUST run those checks before declaring `hit`.
|
|
@@ -100,7 +100,7 @@ exceptd ships investigation playbooks under `data/playbooks/*.json` (schema: `li
|
|
|
100
100
|
### What the AI MUST NOT do
|
|
101
101
|
|
|
102
102
|
- **Do not duplicate exceptd's catalog data** in your own response. CVE metadata, ATLAS TTP IDs, framework control IDs, RFC numbers — always cross-reference live via the runner. Stale duplicates violate Hard Rule #1.
|
|
103
|
-
- **Do not skip close.** A finding without a close phase is not durable. Do not claim a finding is "complete" without an `evidence_package` emission. Open findings without close phase are tracked as IR-incomplete.
|
|
103
|
+
- **Do not skip close.** A finding without a close phase is not durable. Do not claim a finding is "complete" without an `evidence_package` emission. Open findings without a close phase are tracked as IR-incomplete.
|
|
104
104
|
- **Do not invent** CVE IDs, framework controls, jurisdiction obligations, ATLAS TTPs, or RFC references not present in the playbook output. If the playbook does not return it, it does not exist for this investigation.
|
|
105
105
|
- **Do not reorder the phases.** govern → direct → look → detect → analyze → validate → close. No exceptions, no shortcuts, no "we already know what's wrong so skip govern."
|
|
106
106
|
- **Do not auto-execute `notification_actions`** or auto-file tickets. The runner produces drafts; the operator reviews and dispatches. AI-initiated regulator notification is out of scope and out of policy.
|
|
@@ -163,16 +163,16 @@ Cross-cutting playbook `framework` is the natural correlation layer — many pla
|
|
|
163
163
|
| `exceptd run-all` | Multi-playbook batch run. `--scope <type>` filters. |
|
|
164
164
|
| `exceptd ci` | Top-level CI gate for a single playbook with exit-code semantics. Preferred over `run --ci`. |
|
|
165
165
|
| `exceptd discover` | Repo discovery — scans cwd and surfaces matching playbooks + collection hints. |
|
|
166
|
-
| `exceptd ask "<question>"` | Plain-English router: all arguments are joined into one question and routed to the most relevant playbook(s).
|
|
166
|
+
| `exceptd ask "<question>"` | Plain-English router: all arguments are joined into one question and routed to the most relevant playbook(s). This verb has no per-playbook Q&A mode — pass the question, not a playbook id. |
|
|
167
167
|
| `exceptd attest diff <sid>` | Replay analyze against a stored evidence bundle for drift detection. `--against <other-sid>` compares two sessions. `--playbook <id>` + `--since <ISO>` accepted with `--latest`. `exceptd reattest` remains a short-form alias — preserved (no removal scheduled). |
|
|
168
168
|
| `exceptd attest verify <sid>` | Verify a persisted attestation's signature + evidence hash. |
|
|
169
169
|
| `exceptd attest list` | Inventory `.exceptd/attestations/` — newest first. `--playbook <id>` filters. |
|
|
170
170
|
| `exceptd attest show <sid>` | Print the attestation body. |
|
|
171
171
|
| `exceptd doctor` | Health checks. `--signatures` verifies Ed25519 chains; `--cves` / `--rfcs` check catalog currency; `--fix` repairs recoverable state; `--ai-config` audits AI-assistant config-file permissions (`~/.claude`, `~/.cursor`, `~/.codeium`, `~/.aider`, `~/.continue`) and flags sensitive files not at mode `0o600` on POSIX (NEW-CTRL-050). |
|
|
172
172
|
| `exceptd cve <CVE-ID>` | Resolve a single CVE citation — returns status (`published`/`rejected`/`disputed`/`fabricated`/`nonexistent`/`unknown`) plus cvss/kev/product. Resolution order: curated catalog (offline) → resolved cache (`.cache/upstream/resolved/`, 7-day TTL) → one NVD lookup, then cached. `--air-gap`/`--no-network`/`EXCEPTD_AIR_GAP=1` force offline-only (returns `unknown` with a reason). Exit 2 when the citation won't stand up (rejected/fabricated/nonexistent/withdrawn). |
|
|
173
|
-
| `exceptd rfc <number>` | Resolve an RFC number → title + status from the local index (whole current series, offline). `--check "<title>"` reports `title_match` true/false, exit 2 on mismatch (catches
|
|
173
|
+
| `exceptd rfc <number>` | Resolve an RFC number → title + status from the local index (whole current series, offline). `--check "<title>"` reports `title_match` true/false, exit 2 on mismatch (catches, for example, RFC 9404 cited as the Sieve spec — it's JMAP Blob Management). Not-found numbers are likely obsoleted/historic or nonexistent; with network it disambiguates via the datatracker. |
|
|
174
174
|
| `exceptd lint` | Skill format lint — frontmatter completeness, required body sections, signature presence. |
|
|
175
|
-
| `exceptd refresh --check-advisories` | Poll 15 primary-source advisory feeds — 8 advisory/coordinated-disclosure venues (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories), 4 vendor security research blogs (Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red — added
|
|
175
|
+
| `exceptd refresh --check-advisories` | Poll 15 primary-source advisory feeds — 8 advisory/coordinated-disclosure venues (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories), 4 vendor security research blogs (Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red — added after DirtyDecrypt fell through the advisory-only set), and 3 tech-press and researcher-handle trackers (BleepingComputer security, The Hacker News, Nightmare-Eclipse GitLab activity-feed tracker, migrated from GitHub after the account was removed — closes the researcher-drop class anchored by MiniPlasma / YellowKey / GreenPlasma / UnDefend, NEW-CTRL-073). Pairs with `lib/cve-regression-watcher.js` (NEW-CTRL-074) which cross-checks poller diffs for historical-CVE references that may indicate silent vendor regression — the class anchored by MiniPlasma re-breaking CVE-2020-17103. Report-only; emits structured `diffs[]` without mutating the catalog. Route promising IDs through `refresh --advisory <CVE-ID> --apply` to enrich. |
|
|
176
176
|
| `exceptd watchlist` | Default: aggregate every skill's `forward_watch` entries. `--by-skill` inverts grouping. `--alerts` switches to CVE-catalog pattern alerts (5 patterns: `kernel_lpe_with_poc`, `supply_chain_family`, `ai_discovered_kev`, `active_exploitation_unpatched`, `recent_poc_no_kev_yet`); sorts critical-first, then by RWEP. `--org-scan --org <login>` probes GitHub Search for repos matching threat-actor naming patterns ("A Gift From TeamPCP", "Shai-Hulud", "TeamPCP"); custom patterns via repeatable `--pattern <s>`; set `GITHUB_TOKEN` for private-repo + rate-limit headroom (NEW-CTRL-052). |
|
|
177
177
|
|
|
178
178
|
All verbs support `--help` for per-verb usage. JSON output by default; `--pretty` for indented.
|
|
@@ -253,7 +253,7 @@ Recently added (use the IDs in skill prose and operator briefings; full text in
|
|
|
253
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
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. |
|
|
255
255
|
|
|
256
|
-
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
|
|
256
|
+
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
257
|
|
|
258
258
|
---
|
|
259
259
|
|
|
@@ -261,7 +261,7 @@ When you cite a `NEW-CTRL-*` ID in a skill body, the lint reads the upstream `ze
|
|
|
261
261
|
|
|
262
262
|
The toolkit ships with a `routine: exceptd-threat-intake` (claude.ai remote agent) that runs daily at 14:00 UTC. Sequence: `npm install` → `refresh --check-advisories` (poll the 15 primary-source feeds — 8 advisory venues, 4 vendor security blogs, 3 tech-press + researcher-handle trackers) → `watchlist --alerts` (5-pattern CVE-class scan) → cross-check historical-CVE references against the catalog via `lib/cve-regression-watcher.js` (NEW-CTRL-074, MiniPlasma class) → `refresh --apply` → `refresh --advisory <CVE-ID>` for up to 5 newly-disclosed IDs from the primary-source diff → re-sign + rebuild-indexes if the catalog mutated → commit on `intake/<YYYY-MM-DD>` branch with the full diff in the report.
|
|
263
263
|
|
|
264
|
-
The routine is operator-managed at <https://claude.ai/code/routines>.
|
|
264
|
+
The routine is operator-managed at <https://claude.ai/code/routines>. It closes the cadence gap between vendor disclosure (T+0) and NVD enrichment (T+10) — operators no longer depend on manual intake to surface ssh-keysign-pwn-class or Shai-Hulud-class events.
|
|
265
265
|
|
|
266
266
|
When working on a fresh checkout: do not invoke the daily routine ad-hoc — it commits + pushes a branch. For one-off triage, use `exceptd refresh --check-advisories` (report-only) followed by `exceptd refresh --advisory <CVE-ID>` for the specific IDs you want to enrich.
|
|
267
267
|
|
package/ARCHITECTURE.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
exceptd Security is a skills repository. Each skill is a `.md` file with YAML frontmatter that instructs an AI assistant how to perform a specific security analysis task with current threat intelligence.
|
|
6
6
|
|
|
7
|
-
The
|
|
7
|
+
The repository has three layers:
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
skills/ Instruction layer — tells the AI what to analyze, how to score, what to output
|
|
@@ -164,7 +164,7 @@ Schema per entry:
|
|
|
164
164
|
|
|
165
165
|
### `data/global-frameworks.json`
|
|
166
166
|
|
|
167
|
-
Maps jurisdiction to framework to current coverage and lag assessment. Currently covers 35 jurisdictions including EU member states, UK, AU, SG, IN, JP, CA, and major sectoral regulators (DORA, NIS2, EU AI Act, EU CRA at the EU layer; APRA CPS 234, MAS TRM, CERT-In, SEBI, OSFI B-10 at the national layer). See schema in
|
|
167
|
+
Maps jurisdiction to framework to current coverage and lag assessment. Currently covers 35 jurisdictions including EU member states, UK, AU, SG, IN, JP, CA, and major sectoral regulators (DORA, NIS2, EU AI Act, EU CRA at the EU layer; APRA CPS 234, MAS TRM, CERT-In, SEBI, OSFI B-10 at the national layer). See the schema in `data/global-frameworks.json`.
|
|
168
168
|
|
|
169
169
|
### `data/zeroday-lessons.json`
|
|
170
170
|
|
|
@@ -176,23 +176,23 @@ Tracks PoC status, weaponization stage, and AI-assist factor per CVE. Updated wh
|
|
|
176
176
|
|
|
177
177
|
### `data/cwe-catalog.json`
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
233 CWE entries pinned to **CWE v4.20**. Covers the Top 25 Most Dangerous Software Weaknesses (2024 release) plus AI- and supply-chain-relevant weakness classes (prompt-injection-as-trust-boundary failure, training data integrity, dependency confusion, untrusted artifact ingestion). Each entry records root-cause description, common consequences, mitigation patterns, and the CVEs in `cve-catalog.json` that instantiate the weakness. Skills cite CWE IDs in `cwe_refs` to anchor a finding to a stable weakness taxonomy rather than to a single CVE.
|
|
180
180
|
|
|
181
181
|
`_meta.cwe_version` pins the version; on a CWE release, audit IDs for renames or deprecations, bump `last_threat_review` on affected skills, and update `_meta`.
|
|
182
182
|
|
|
183
183
|
### `data/d3fend-catalog.json`
|
|
184
184
|
|
|
185
|
-
468 MITRE D3FEND defensive technique entries pinned to **D3FEND v1.3.0**. Each entry records the defensive technique ID (
|
|
185
|
+
468 MITRE D3FEND defensive technique entries pinned to **D3FEND v1.3.0**. Each entry records the defensive technique ID (for example, `D3-EAL` Executable Allowlisting), the tactic / artifact it defends, the offensive ATLAS / ATT&CK TTPs it counters, defense-in-depth layer position, least-privilege scope assumptions, zero-trust posture compatibility, and AI-pipeline applicability per Hard Rule #9. Skills cite D3FEND IDs in `d3fend_refs` to map offensive findings to a defensive countermeasure rather than to abstract control language. The `defensive-countermeasure-mapping` skill is the canonical consumer; any skill shipped on or after 2026-05-11 includes a Defensive Countermeasure Mapping section referencing this catalog.
|
|
186
186
|
|
|
187
187
|
`_meta.d3fend_version` pins the version; D3FEND ontology additions are tracked in skill `forward_watch` fields.
|
|
188
188
|
|
|
189
189
|
### `data/rfc-references.json`
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
8889 IETF RFC / Internet-Draft references — the full RFC index, including obsoleted and Historic entries so that a superseded RFC still resolves offline. Coverage spans the security-relevant standards skills depend on — authentication and authorization (OAuth 2.0 Security BCP RFC 9700, JWT BCP, FIDO/WebAuthn-related drafts), cryptography (TLS 1.3 RFC 8446, hybrid PQC drafts), disclosure (security.txt RFC 9116) — alongside the rest of the published RFC series. Each entry tracks: title, status (Internet Standard / Proposed Standard / Best Current Practice / Internet-Draft / Historic), errata count, replaces / replaced-by chains, IESG / IRTF stream, and a `last_verified` date. Skills cite RFC IDs in `rfc_refs`. Per Hard Rule #12, RFC references are version-pinned: when an RFC is obsoleted or a draft is published as an RFC, the catalog entry's `replaced_by` field is updated, `last_verified` is refreshed, and affected skills bump `last_threat_review`. Frameworks lag RFCs; RFCs lag attacker innovation — this catalog makes that middle layer auditable.
|
|
192
192
|
|
|
193
193
|
### `data/dlp-controls.json`
|
|
194
194
|
|
|
195
|
-
22 DLP control entries indexed along five axes: **channel** (where data flows — LLM prompt, RAG retrieval, MCP tool response, email, SaaS API, endpoint), **classifier** (how sensitive data is identified — regex, ML, embedding similarity, watermark), **surface** (where enforcement runs — endpoint, network proxy, API gateway, model gateway), **enforcement** mode (block, redact, warn, log-only), and **evidence** type (the audit artifact each control produces). The `dlp-gap-analysis` skill is the canonical consumer; other DLP-relevant skills cite control IDs in `dlp_refs`. Entries explicitly flag classical DLP controls that are architecturally inadequate for LLM/RAG channels (DR-1 framework-as-truth drift applied to DLP).
|
|
195
|
+
22 DLP control entries indexed along five axes: **channel** (where data flows — LLM prompt, RAG retrieval, MCP tool response, email, SaaS API, endpoint), **classifier** (how sensitive data is identified — regex, ML, embedding similarity, watermark), **surface** (where enforcement runs — endpoint, network proxy, API gateway, model gateway), **enforcement** mode (block, redact, warn, log-only), and **evidence** type (the audit artifact each control produces). The `dlp-gap-analysis` skill is the canonical consumer; other DLP-relevant skills cite control IDs in `dlp_refs`. Entries explicitly flag classical DLP controls that are architecturally inadequate for LLM/RAG channels (DR-1 framework-as-truth drift, AGENTS.md §Recurring Drift Rules, applied to DLP).
|
|
196
196
|
|
|
197
197
|
---
|
|
198
198
|
|
|
@@ -249,7 +249,7 @@ Packs the project with `npm pack`, extracts the tarball, and runs Ed25519 signat
|
|
|
249
249
|
|
|
250
250
|
### `tests/_helpers/cli.js`
|
|
251
251
|
|
|
252
|
-
Shared test harness for spawning the CLI under tempdir-isolated state. Tests that exercise verb dispatch should consume this helper rather than spawning subprocesses ad
|
|
252
|
+
Shared test harness for spawning the CLI under tempdir-isolated state. Tests that exercise verb dispatch should consume this helper rather than spawning subprocesses ad hoc — the helper enforces the "no mutation outside the tempdir" contract that prevents CI-vs-local state divergence.
|
|
253
253
|
|
|
254
254
|
---
|
|
255
255
|
|
|
@@ -273,7 +273,7 @@ Central skill registry. Each skill entry:
|
|
|
273
273
|
|
|
274
274
|
## Skill Composition
|
|
275
275
|
|
|
276
|
-
Skills can be composed.
|
|
276
|
+
Skills can be composed. `framework-gap-analysis` calls out to `threat-model-currency` context; `compliance-theater` uses `exploit-scoring` output; `zeroday-gap-learn` feeds back into `framework-gap-analysis` data.
|
|
277
277
|
|
|
278
278
|
Composition is explicit: skills declare which other skills they depend on in their frontmatter `skill_deps` field. Circular dependencies are not permitted.
|
|
279
279
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.19.27 — 2026-08-15
|
|
4
|
+
|
|
5
|
+
`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.
|
|
6
|
+
|
|
7
|
+
The branch-protection block specified an approval minimum of one against a live zero. On a single-maintainer project that minimum cannot be satisfied — the only person who could approve is the author — so applying it locks `main` against its own owner. The same block turned admin enforcement off, where it is on and is what carries the weight given there is no approval requirement, and it required two checks that no workflow produces. Those fields, and the code-owner and last-push settings beside them, now match the live protection, with the reason the count is zero written down so the next reader does not correct it back.
|
|
8
|
+
|
|
9
|
+
The Actions allowlist is a replace, not an append. The documented list named an action no workflow uses and omitted the two that publish the release and open the nightly data pull request, so applying it removed them — and a missing allowlist entry does not fail until the workflow that needs it next runs. It also admitted every action in the Marketplace verified-creator programme, which is the opposite of what an allowlist is for.
|
|
10
|
+
|
|
11
|
+
Tag protection moved to a ruleset some time ago; the documented command called the retired endpoint, which now answers 404. The ruleset is recorded instead, including its empty bypass list, because an admin exemption would make the protection advisory.
|
|
12
|
+
|
|
13
|
+
The verification section read a field the API does not return on that path — the write side takes `checks`, the read side answers `contexts` — so it reported an empty required-check list on a repository that had eight. And every command carried a leading slash on its endpoint, which a POSIX-style shell on Windows rewrites into a filesystem path, so the whole file was unrunnable there. Both are fixed, and the commands were run as written to confirm it.
|
|
14
|
+
|
|
15
|
+
Counts that had drifted from the catalogs they describe are corrected: the CWE and RFC totals in the architecture overview, the CVE, lesson and CWE rows in the context file's inventory table, and the playbook count, which said thirteen against thirty-three shipping. The playbook table now says it lists the thirteen keyed to a single attack class and points at `exceptd brief --all` for the rest, and the skill inventory says it describes seventeen of fifty-one rather than leaving a reader to assume it is complete. The data-catalog list was missing `attack-techniques.json` while claiming eleven catalogs; it now lists all eleven.
|
|
16
|
+
|
|
17
|
+
The CVE-addition issue template collected six of the eight factors the scoring module sums, with live-patch availability and reboot requirement folded into "Other", so a filer had nowhere to put two values the score depends on. All eight are named, in the order the module applies them.
|
|
18
|
+
|
|
19
|
+
The maintainer release runbook regenerated the SBOM before the indexes. The SBOM digests the shipped tree, so taking it first records hashes for files the next step rewrites, and the currency gate then fails on ordering rather than on anything wrong. It runs last, and the runbook points at the release orchestrator as the supported path.
|
|
20
|
+
|
|
21
|
+
## 0.19.26 — 2026-08-15
|
|
22
|
+
|
|
23
|
+
The catalog reaches 1,125 CVEs with 100 additions from the earliest CISA KEV listings. Ninety-seven were published between 2006 and 2022 — the client-side and appliance flaws that pre-date most vulnerability programmes: Adobe Reader, Acrobat and Flash Player, Microsoft Office, Internet Explorer and the Windows kernel, Oracle Java SE and Solaris, QNAP NAS appliances, Cisco small-business routers, and Zimbra. Twenty-three carry CISA's ransomware flag and 56 have an obtainable public exploit.
|
|
24
|
+
|
|
25
|
+
Age changes what remediation means, and these entries say so rather than defaulting to patch. Several products reached end of software maintenance without a fix for the flaw CISA lists: the Cisco RV016 and RV082 have no fixed firmware while their RV042 siblings do, so an estate recording "vendor patch applied" against the model family has repaired half of it and retired none of the rest. Where that is the situation the entry names removal as the terminal state, not an upgrade path that does not exist.
|
|
26
|
+
|
|
27
|
+
A patch that is installed is not always a patch that is running. The Reader and Flash entries separate the host reboot an operator schedules from the process restart the fix actually needs: the updated code stays inert until every browser hosting the plugin and every open Reader window has been closed, which on a workstation up for days is the step that gets skipped. A remediation record keyed to the deployed version reports those hosts as done while the pre-patch code is still executing.
|
|
28
|
+
|
|
29
|
+
Where sources disagree, the entries carry the disagreement instead of picking the convenient reading. A Metasploit module places Java 5 Update 23 outside the affected set for CVE-2010-0840 while Oracle's March 2010 advisory and NVD place it inside; the entry follows the vendor and records the conflict, because an operator scoping against the looser boundary leaves the update they believed safe in range. CVE-2012-1710 carries CISA's ransomware designation and records that no public vendor reporting ties a ransomware operation to it. CVE-2012-0151 records that Microsoft reported no exploitation at release and the reporting vendor found none across its own userbase, so its in-the-wild status rests on the KEV listing alone and the entry says which evidence it has. For CVE-2015-2425, MS15-065 credits three firms with the discovery while one of them stated publicly that the flaw they found carries a different identifier — so the entry records the credit and the contest rather than asserting a finder.
|
|
30
|
+
|
|
31
|
+
Every added entry declares the framework controls it defeats across all five jurisdictions, the ATT&CK techniques it maps to, indicators a defender can hunt on, and the controls its remediation requires, drawn from the existing control set rather than by minting new ones. Those requirements now reach the framework-gap analysis: 760 CVE references land across 55 controls, 296 across 56 ATT&CK techniques. CWE-244 joins the weakness catalog to carry the Cisco appliance heap-lifetime entry.
|
|
32
|
+
|
|
33
|
+
An EPSS refresh now writes the score, the percentile and the publication date together. The refresh compared each field against its own drift threshold, so a score that moved past the threshold was written while its percentile, having moved less, kept the previous day's value — leaving an entry whose two numbers describe different publications, both in range and both plausible. The percentile is the score's rank within its publication, so the pair is only meaningful read together. The threshold now decides whether an entry refreshes rather than which of its fields does; a row missing any of the three is not a publication and is refused outright; an entry holding one half of the pair is completed from a complete row even when nothing crossed the threshold; and the prose restatement carried on those entries is regenerated with the numbers instead of describing the publication before them.
|
|
34
|
+
|
|
35
|
+
The citation scanner stops reporting a rejected CVE record when an entry simply describes code rejecting input. "Reject" is the ordinary verb for what a parser does to a malformed document or a validator does to a traversal sequence, and a mechanism description that used it was read as a claim about the CVE's record status. The record sense names what was rejected or who rejected it, and the check now requires that before flagging.
|
|
36
|
+
|
|
3
37
|
## 0.19.25 — 2026-08-12
|
|
4
38
|
|
|
5
39
|
The release orchestrator distinguishes a failed publish from a failed question. Reading the publish workflow's conclusion treated an empty answer as a verdict, so a transient API error — or a run that had not yet settled — reported the release as unsuccessful while its jobs had all succeeded and the package was already on the registry. The conclusion is now read only from a run that reports itself completed, retried a few times before anything is concluded, and an unreadable answer says so in terms that distinguish it from a failure, because the two need different responses. A genuine non-success conclusion still stops the release.
|
package/CONTEXT.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# exceptd Security — AI Context
|
|
2
2
|
|
|
3
|
-
This file gives any AI assistant the context it needs to use this repository
|
|
3
|
+
This file gives any AI assistant the context it needs to use this repository. It assumes no particular assistant runtime.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ exceptd Security ships two interlocking surfaces grounded in mid-2026 threat rea
|
|
|
11
11
|
1. **Skills** — Markdown instruction files telling an AI assistant how to perform a specific security analysis (what questions to ask, what data to query, how to score risk, what output to produce).
|
|
12
12
|
2. **Playbooks** — JSON specifications of attack-class investigations executed by the CLI engine through a seven-phase contract (govern → direct → look → detect → analyze → validate → close).
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Every major compliance framework (NIST 800-53, ISO 27001, SOC 2, PCI-DSS) was written for environments that no longer describe how attacks happen. Both skills and playbooks explicitly map where framework coverage ends and real attacker capability begins.
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -69,9 +69,11 @@ Required 8th section for skills shipped on or after 2026-05-11 (pre-existing ski
|
|
|
69
69
|
|
|
70
70
|
## Playbooks and the Seven-Phase Contract
|
|
71
71
|
|
|
72
|
-
Playbooks live at `data/playbooks/<id>.json
|
|
72
|
+
Playbooks live at `data/playbooks/<id>.json`; the CLI engine executes them. Each playbook is an attack-class investigation that walks a govern → direct → look → detect → analyze → validate → close loop.
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
Thirty-three playbooks ship today. `exceptd brief --all` lists every one,
|
|
75
|
+
grouped by scope; the table below names the thirteen keyed to a single attack
|
|
76
|
+
class, which are the ones most investigations start from.
|
|
75
77
|
|
|
76
78
|
| Playbook | Attack class |
|
|
77
79
|
|---|---|
|
|
@@ -113,14 +115,14 @@ Skills and playbooks read from `data/`. Authoritative catalog inventory:
|
|
|
113
115
|
|
|
114
116
|
| File | Entries | Purpose |
|
|
115
117
|
|------|---------|---------|
|
|
116
|
-
| `cve-catalog.json` |
|
|
118
|
+
| `cve-catalog.json` | 1125 | CVEs with CVSS, RWEP score, EPSS estimates, CISA KEV flags, PoC and live-patch availability |
|
|
117
119
|
| `atlas-ttps.json` | 174 | MITRE ATLAS v2026.07 (August 2026) techniques with framework gap flags |
|
|
118
120
|
| `attack-techniques.json` | 794 | MITRE ATT&CK techniques with framework coverage mappings |
|
|
119
121
|
| `framework-control-gaps.json` | 194 | Framework control gap entries: designed-for vs. what each control misses |
|
|
120
122
|
| `exploit-availability.json` | 28 | Per-CVE PoC locations, weaponization stage, AI-acceleration factor, live-patch status |
|
|
121
123
|
| `global-frameworks.json` | 35 jurisdictions | Patch SLAs and notification windows across global regulatory regimes |
|
|
122
|
-
| `zeroday-lessons.json` |
|
|
123
|
-
| `cwe-catalog.json` |
|
|
124
|
+
| `zeroday-lessons.json` | 1125 | Learning-loop entries: zero-day → attack vector → control gap → framework gap → new control |
|
|
125
|
+
| `cwe-catalog.json` | 233 | CWE v4.20 entries (Top 25 2024 plus AI- and supply-chain-relevant weaknesses) |
|
|
124
126
|
| `d3fend-catalog.json` | 468 | MITRE D3FEND v1.3.0 defensive techniques for offensive → defensive mapping |
|
|
125
127
|
| `rfc-references.json` | 8889 | IETF RFC / Internet-Draft references with status, errata count, replaces / replaced-by, `last_verified` dates |
|
|
126
128
|
| `dlp-controls.json` | 22 | DLP control entries indexed by channel, classifier, surface, enforcement mode, evidence type |
|
|
@@ -235,7 +237,7 @@ The `researcher` **skill** (front-door dispatcher) and `threat-researcher` **age
|
|
|
235
237
|
- No code that executes automatically in your environment
|
|
236
238
|
- No outbound network calls; all data is local and static (the watchlist surface is read-only)
|
|
237
239
|
- No credentials or keys
|
|
238
|
-
- Skills are instruction text — the AI implements them;
|
|
240
|
+
- Skills are instruction text — the AI implements them; the CLI engine governs playbook execution
|
|
239
241
|
|
|
240
242
|
---
|
|
241
243
|
|
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
**Core premise:** Every major security and compliance tool on the market is still operating on stale threat models. NIST 800-53, ISO 27001, SOC 2, and PCI-DSS were written for network-centric, on-prem or early-cloud environments. They have no controls for AI pipeline integrity, MCP/agent tool trust boundaries, LLM prompt injection as an access control failure, page-cache exploitation bypassing filesystem integrity checks, or ephemeral infrastructure where traditional asset inventory is architecturally impossible.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Every skill explicitly flags where a compliance framework's control is insufficient for current attack patterns. The framework is often the problem, not the org.
|
|
30
30
|
|
|
31
31
|
## Status
|
|
32
32
|
|
|
@@ -36,6 +36,13 @@ Pre-1.0. Latest release lives on [GitHub Releases](https://github.com/blamejs/ex
|
|
|
36
36
|
|
|
37
37
|
## Skill Inventory
|
|
38
38
|
|
|
39
|
+
Seventeen of the fifty-one shipped skills are described below. Run `exceptd skill`
|
|
40
|
+
with no argument for the full list with one-line summaries, or `exceptd skill <name>`
|
|
41
|
+
for one skill's description, triggers and data dependencies; the body itself is
|
|
42
|
+
`skills/<name>/skill.md`. Skills named elsewhere in this file but absent here —
|
|
43
|
+
`pqc-first` and `security-maturity-tiers` among them — ship too; this section is a
|
|
44
|
+
selection, not the inventory.
|
|
45
|
+
|
|
39
46
|
### Triage & Dispatch
|
|
40
47
|
|
|
41
48
|
**[researcher](skills/researcher/skill.md)**
|
|
@@ -49,7 +56,7 @@ Assess Linux kernel local privilege escalation exposure. Covers Copy Fail (CVE-2
|
|
|
49
56
|
### AI-Specific Attack Surface
|
|
50
57
|
|
|
51
58
|
**[ai-attack-surface](skills/ai-attack-surface/skill.md)**
|
|
52
|
-
|
|
59
|
+
AI/ML attack surface assessment mapped to MITRE ATLAS v2026.07 with explicit gap flags. Covers prompt injection as enterprise RCE (CVE-2025-53773 CVSS 7.8, 85%+ bypass rate against SOTA defenses), MCP supply chain RCE (CVE-2026-30615, zero user interaction, 150M+ downloads), RAG exfiltration, model poisoning, AI-assisted exploit development (41% of 2025 zero-days), credential theft acceleration (160% increase).
|
|
53
60
|
|
|
54
61
|
**[mcp-agent-trust](skills/mcp-agent-trust/skill.md)**
|
|
55
62
|
Enumerate MCP (Model Context Protocol) trust boundary failures. Covers tool allowlisting gaps, unsigned server manifests, prompt injection via tool responses, supply chain compromise. CVE-2026-30615 (Windsurf, zero-interaction RCE). Generates: tool allowlist policy, server signing requirements, bearer auth config, output sanitization requirements.
|
|
@@ -152,11 +159,11 @@ Verify on npm: `npm view @blamejs/exceptd-skills@<version> dist.signatures` show
|
|
|
152
159
|
|
|
153
160
|
Air-gapped operation: run `exceptd refresh --prefetch` on a connected host, copy the resulting `.cache/upstream/` to the airgap, run `exceptd refresh --from-cache <path> --apply` over there. The vendored upstream snapshots replace every network call.
|
|
154
161
|
|
|
155
|
-
Fresh-disclosure workflow (v0.12.0): the nightly auto-PR job pulls KEV / NVD / EPSS / IETF / **GHSA** (added in v0.12.0) / **OSV** (added in v0.12.10). KEV typically takes days; NVD ~10 days; GHSA fires within hours of disclosure and covers npm + PyPI + Maven + Go + NuGet + …; OSV aggregates the OSSF Malicious Packages dataset (`MAL-*` keys) + Snyk + RustSec + Mageia + Ubuntu USN + Go Vuln DB + PYSEC + UVI on top of GHSA — useful for malicious-package compromises that don't have CVEs yet (`exceptd refresh --advisory MAL-2026-3083`). New IDs land as drafts (`_auto_imported: true`, `_draft: true`) that the catalog validator treats as warnings, not errors — operators get the fresh entry immediately, editorial review (framework gaps, IoCs, ATLAS/ATT&CK refs) follows via `exceptd refresh --curate <ID>`.
|
|
162
|
+
Fresh-disclosure workflow (v0.12.0): the nightly auto-PR job pulls KEV / NVD / EPSS / IETF / **GHSA** (added in v0.12.0) / **OSV** (added in v0.12.10). KEV typically takes days; NVD ~10 days; GHSA fires within hours of disclosure and covers npm + PyPI + Maven + Go + NuGet + …; OSV aggregates the OSSF Malicious Packages dataset (`MAL-*` keys) + Snyk + RustSec + Mageia + Ubuntu USN + Go Vuln DB + PYSEC + UVI on top of GHSA — useful for malicious-package compromises that don't have CVEs yet (`exceptd refresh --advisory MAL-2026-3083`). New IDs land as drafts (`_auto_imported: true`, `_draft: true`) that the catalog validator treats as warnings, not errors — operators get the fresh entry immediately, editorial review (framework gaps, IoCs, ATLAS/ATT&CK refs) follows via `exceptd refresh --curate <ID>`. To pull one advisory immediately: `exceptd refresh --advisory <CVE-or-GHSA-or-MAL-or-SNYK-or-RUSTSEC-ID> --apply`.
|
|
156
163
|
|
|
157
|
-
Primary-source advisory polling: `exceptd refresh --check-advisories` polls 15 vendor and coordinated-disclosure feeds — 8 advisory/coordinated-disclosure venues (Qualys TRU, Red Hat RHSA, Ubuntu USN, Zero Day Initiative, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories), 4 vendor security research blogs (Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red), and 3 more (BleepingComputer security, The Hacker News, and a researcher activity-feed tracker). Combined coverage publishes CVE IDs at T+0 to T+1 — typically 3–14 days ahead of NVD enrichment. The command is report-only: it returns a structured `diffs[]` listing each newly-seen CVE ID with its source attributions and advisory URLs, but does not mutate the catalog. A complementary silent-regression watcher (`lib/cve-regression-watcher.js`) cross-checks poller diffs for historical-CVE references (year ≤ currentYear − 2) and surfaces candidate silent-regression cases — historical CVEs re-broken by a new proof-of-concept without a new ID being assigned. Operators triage the output and route promising IDs through `exceptd refresh --advisory <CVE-ID> --apply`. Pairs
|
|
164
|
+
Primary-source advisory polling: `exceptd refresh --check-advisories` polls 15 vendor and coordinated-disclosure feeds — 8 advisory/coordinated-disclosure venues (Qualys TRU, Red Hat RHSA, Ubuntu USN, Zero Day Initiative, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories), 4 vendor security research blogs (Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red), and 3 more (BleepingComputer security, The Hacker News, and a researcher activity-feed tracker). Combined coverage publishes CVE IDs at T+0 to T+1 — typically 3–14 days ahead of NVD enrichment. The command is report-only: it returns a structured `diffs[]` listing each newly-seen CVE ID with its source attributions and advisory URLs, but does not mutate the catalog. A complementary silent-regression watcher (`lib/cve-regression-watcher.js`) cross-checks poller diffs for historical-CVE references (year ≤ currentYear − 2) and surfaces candidate silent-regression cases — historical CVEs re-broken by a new proof-of-concept without a new ID being assigned. Operators triage the output and route promising IDs through `exceptd refresh --advisory <CVE-ID> --apply`. Pairs with the daily scheduled remote agent below.
|
|
158
165
|
|
|
159
|
-
CVE-class alert surfacing: `exceptd watchlist --alerts` matches the live `cve-catalog.json` against five operational patterns (`kernel_lpe_with_poc`, `supply_chain_family`, `ai_discovered_kev`, `active_exploitation_unpatched`, `recent_poc_no_kev_yet`) and returns the matches sorted critical-severity-first, then by RWEP. Use
|
|
166
|
+
CVE-class alert surfacing: `exceptd watchlist --alerts` matches the live `cve-catalog.json` against five operational patterns (`kernel_lpe_with_poc`, `supply_chain_family`, `ai_discovered_kev`, `active_exploitation_unpatched`, `recent_poc_no_kev_yet`) and returns the matches sorted critical-severity-first, then by RWEP. Use it to triage a refreshed catalog without scanning every entry by hand.
|
|
160
167
|
|
|
161
168
|
GitHub repo-pattern monitoring: `exceptd watchlist --org-scan --org <login>` probes GitHub Search for repositories matching known threat-actor naming patterns ("A Gift From TeamPCP", "Shai-Hulud", "TeamPCP") scoped to one org. Custom patterns via repeatable `--pattern <s>`. Implements the canonical detection for the Shai-Hulud / TeamPCP supply-chain framework class — the attacker uses GitHub itself as the exfil channel. Set `GITHUB_TOKEN` for private-repo coverage and rate-limit headroom; public-repo search works without auth.
|
|
162
169
|
|
|
@@ -164,7 +171,7 @@ AI-assistant config-file audit: `exceptd doctor --ai-config` walks `~/.claude`,
|
|
|
164
171
|
|
|
165
172
|
Evidence-collection layer: `exceptd collect <playbook>` invokes a companion script under `lib/collectors/<playbook>.js` that walks cwd, applies the catalogued regex set, stats permissions, and emits the submission JSON in the same shape `exceptd run --evidence -` accepts. 14 of 33 playbooks have collectors today (`ai-api`, `cicd-pipeline-compromise`, `citation-hygiene`, `containers`, `cred-stores`, `crypto`, `crypto-codebase`, `hardening`, `kernel`, `library-author`, `mcp`, `runtime`, `sbom`, `secrets`); the remaining 19 are policy-skipped per AGENTS.md (judgement-shaped incident / governance / pure-analyze playbooks where AI-driven evidence collection is the design). Canonical operator pipe: `exceptd collect <pb> | exceptd run <pb> --evidence -`. `exceptd doctor --collectors` enumerates the layer; `exceptd discover` tags applicable playbooks with `[collector]` when one ships. `cicd-pipeline-compromise` requires `--attest-ownership` on the collect call (the playbook's `operator-owns-ci-fleet` precondition is opt-in to prevent unauthorized CI assessments).
|
|
166
173
|
|
|
167
|
-
Daily scheduled threat intake: a `routine: exceptd-threat-intake` (claude.ai remote agent) runs daily at 14:00 UTC. Sequence: `npm install` → `refresh --check-advisories` → `watchlist --alerts` → `refresh --apply` → `refresh --advisory <CVE-ID>` for up to 5 new CVE IDs from the primary-source feeds → re-sign + rebuild-indexes if the catalog mutated → commit on `intake/<YYYY-MM-DD>` branch with the full diff in the report.
|
|
174
|
+
Daily scheduled threat intake: a `routine: exceptd-threat-intake` (claude.ai remote agent) runs daily at 14:00 UTC. Sequence: `npm install` → `refresh --check-advisories` → `watchlist --alerts` → `refresh --apply` → `refresh --advisory <CVE-ID>` for up to 5 new CVE IDs from the primary-source feeds → re-sign + rebuild-indexes if the catalog mutated → commit on `intake/<YYYY-MM-DD>` branch with the full diff in the report. Fresh disclosures no longer wait for an operator to trigger an intake run. Operator-managed at <https://claude.ai/code/routines>.
|
|
168
175
|
|
|
169
176
|
Optional env vars for higher rate budgets:
|
|
170
177
|
|
|
@@ -623,6 +630,7 @@ To resolve a single citation rather than refresh the whole catalog, `exceptd cve
|
|
|
623
630
|
|
|
624
631
|
- `cve-catalog.json` — CVE metadata with RWEP scores, CISA KEV status, PoC availability, live-patch info
|
|
625
632
|
- `atlas-ttps.json` — MITRE ATLAS v2026.07 TTPs with gap flags and exploitation examples. Each TTP now carries a `cve_refs[]` back-edge — operators reading an ATLAS entry see the catalogued CVEs that cite it without grepping `cve-catalog.json`. The same back-edge is populated on `attack-techniques.json`, and each playbook carries a `_meta.fed_by[]` reverse field naming the upstream playbooks that chain into it.
|
|
633
|
+
- `attack-techniques.json` — MITRE ATT&CK enterprise and ICS techniques, each carrying the catalogued CVEs that cite it in `cve_refs[]`
|
|
626
634
|
- `framework-control-gaps.json` — Per-framework, per-control: what it was designed for vs. what it misses
|
|
627
635
|
- `exploit-availability.json` — PoC locations, weaponization status, AI-assist factor
|
|
628
636
|
- `global-frameworks.json` — All major global compliance frameworks (35 jurisdictions) with control inventories and lag scores
|
|
@@ -640,7 +648,7 @@ To resolve a single citation rather than refresh the whole catalog, `exceptd cve
|
|
|
640
648
|
|
|
641
649
|
**Framework lag is measured in months.** MITRE ATLAS v2026.07 (May 2026) is the most current AI threat framework available. It still lags real exploitation by 3-6 months. NIST AI RMF lags by years. ISO 27001:2022 has no AI-specific controls. These skills explicitly flag every place where framework coverage ends and real attacker capability begins.
|
|
642
650
|
|
|
643
|
-
**AI changed the exploit development timeline.**
|
|
651
|
+
**AI changed the exploit development timeline.** An AI system discovered Copy Fail in approximately one hour. 41% of 2025 zero-days involved AI-assisted reverse engineering on the attacker side. The time between vulnerability introduction and reliable exploitation is compressing faster than patch management processes can adapt. Risk scoring must reflect this.
|
|
644
652
|
|
|
645
653
|
**Every org has a compliance theater problem.** The question is not whether paper controls map to audit requirements. The question is whether those controls would actually detect or prevent an attack. These skills answer the second question.
|
|
646
654
|
|
package/data/_indexes/_meta.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.1.0",
|
|
3
|
-
"generated_at": "2026-08-
|
|
3
|
+
"generated_at": "2026-08-16T02:12:57.741Z",
|
|
4
4
|
"generator": "scripts/build-indexes.js",
|
|
5
5
|
"source_count": 64,
|
|
6
6
|
"source_hashes": {
|
|
7
|
-
"manifest.json": "
|
|
8
|
-
"README.md": "
|
|
7
|
+
"manifest.json": "1d3ee52ad114109f62c1c376711f1e90195fde813ae038e7f11b8cd87eba3807",
|
|
8
|
+
"README.md": "a757b8ed9923b7954518d00a768d338800460c9a90811094f050710fe9888615",
|
|
9
9
|
"data/atlas-ttps.json": "a14089671efcb4f06dd0f82d688fe49276c1370e167e4483d76e9c0a40ef41eb",
|
|
10
|
-
"data/attack-techniques.json": "
|
|
11
|
-
"data/cve-catalog.json": "
|
|
12
|
-
"data/cwe-catalog.json": "
|
|
10
|
+
"data/attack-techniques.json": "81344e19dc49470631026a4a82c87ac17f5c2b6bdfd229e7bb5a7b0681e6fe3d",
|
|
11
|
+
"data/cve-catalog.json": "6d548f5e80d58f5d40c9f207ab67bfc63cf5df4eaf35667911a8a23dd518b3ee",
|
|
12
|
+
"data/cwe-catalog.json": "eef5be77bd877af42ce848c9f320b702bc29fb9b085e3f4820523026e138c803",
|
|
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": "
|
|
16
|
+
"data/framework-control-gaps.json": "0d3936786bf4f03a37b83e39b5eda4dc0186dbab6362735a04cb7e6f9b7dc069",
|
|
17
17
|
"data/global-frameworks.json": "20b18a851b3ab82e57cd159b49476d69fe544f02523398b2015189ab81c7c3f8",
|
|
18
18
|
"data/rfc-references.json": "6e9017eca910ab7e4bee85ad7c23927fd6ec766f34be7fce49ebf020cec3381a",
|
|
19
|
-
"data/zeroday-lessons.json": "
|
|
19
|
+
"data/zeroday-lessons.json": "e13da4473fbfabb491b82efa690974a4238eadc977d29b045cf444961b53d448",
|
|
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":
|
|
105
|
-
"chains_cwe_entries":
|
|
104
|
+
"chains_cve_entries": 1112,
|
|
105
|
+
"chains_cwe_entries": 233,
|
|
106
106
|
"jurisdictions_indexed": 34,
|
|
107
107
|
"handoff_dag_nodes": 51,
|
|
108
108
|
"summary_cards": 51,
|
|
@@ -6,23 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"events": [
|
|
8
8
|
{
|
|
9
|
-
"date": "2026-08-
|
|
10
|
-
"type": "catalog_update",
|
|
11
|
-
"artifact": "data/zeroday-lessons.json",
|
|
12
|
-
"path": "data/zeroday-lessons.json",
|
|
13
|
-
"schema_version": "1.1.0",
|
|
14
|
-
"entry_count": 1025
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"date": "2026-08-08",
|
|
18
|
-
"type": "catalog_update",
|
|
19
|
-
"artifact": "data/atlas-ttps.json",
|
|
20
|
-
"path": "data/atlas-ttps.json",
|
|
21
|
-
"schema_version": "1.0.0",
|
|
22
|
-
"entry_count": 174
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"date": "2026-08-08",
|
|
9
|
+
"date": "2026-08-15",
|
|
26
10
|
"type": "catalog_update",
|
|
27
11
|
"artifact": "data/attack-techniques.json",
|
|
28
12
|
"path": "data/attack-techniques.json",
|
|
@@ -30,20 +14,44 @@
|
|
|
30
14
|
"entry_count": 794
|
|
31
15
|
},
|
|
32
16
|
{
|
|
33
|
-
"date": "2026-08-
|
|
17
|
+
"date": "2026-08-15",
|
|
34
18
|
"type": "catalog_update",
|
|
35
19
|
"artifact": "data/cve-catalog.json",
|
|
36
20
|
"path": "data/cve-catalog.json",
|
|
37
21
|
"schema_version": "1.0.0",
|
|
38
|
-
"entry_count":
|
|
22
|
+
"entry_count": 1125
|
|
39
23
|
},
|
|
40
24
|
{
|
|
41
|
-
"date": "2026-08-
|
|
25
|
+
"date": "2026-08-15",
|
|
42
26
|
"type": "catalog_update",
|
|
43
27
|
"artifact": "data/cwe-catalog.json",
|
|
44
28
|
"path": "data/cwe-catalog.json",
|
|
45
29
|
"schema_version": "1.0.0",
|
|
46
|
-
"entry_count":
|
|
30
|
+
"entry_count": 233
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"date": "2026-08-15",
|
|
34
|
+
"type": "catalog_update",
|
|
35
|
+
"artifact": "data/framework-control-gaps.json",
|
|
36
|
+
"path": "data/framework-control-gaps.json",
|
|
37
|
+
"schema_version": "1.0.0",
|
|
38
|
+
"entry_count": 194
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"date": "2026-08-15",
|
|
42
|
+
"type": "catalog_update",
|
|
43
|
+
"artifact": "data/zeroday-lessons.json",
|
|
44
|
+
"path": "data/zeroday-lessons.json",
|
|
45
|
+
"schema_version": "1.1.0",
|
|
46
|
+
"entry_count": 1125
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"date": "2026-08-08",
|
|
50
|
+
"type": "catalog_update",
|
|
51
|
+
"artifact": "data/atlas-ttps.json",
|
|
52
|
+
"path": "data/atlas-ttps.json",
|
|
53
|
+
"schema_version": "1.0.0",
|
|
54
|
+
"entry_count": 174
|
|
47
55
|
},
|
|
48
56
|
{
|
|
49
57
|
"date": "2026-08-05",
|
|
@@ -369,14 +377,6 @@
|
|
|
369
377
|
"path": "skills/email-security-anti-phishing/skill.md",
|
|
370
378
|
"note": "Email security + anti-phishing for mid-2026 — SPF/DKIM/DMARC/BIMI/ARC/MTA-STS/TLSRPT, AI-augmented phishing (vishing, deepfake video, hyperpersonalized email), Business Email Compromise, secure email gateways"
|
|
371
379
|
},
|
|
372
|
-
{
|
|
373
|
-
"date": "2026-05-18",
|
|
374
|
-
"type": "catalog_update",
|
|
375
|
-
"artifact": "data/framework-control-gaps.json",
|
|
376
|
-
"path": "data/framework-control-gaps.json",
|
|
377
|
-
"schema_version": "1.0.0",
|
|
378
|
-
"entry_count": 194
|
|
379
|
-
},
|
|
380
380
|
{
|
|
381
381
|
"date": "2026-05-15",
|
|
382
382
|
"type": "skill_review",
|