@blamejs/exceptd-skills 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +232 -0
- package/ARCHITECTURE.md +267 -0
- package/CHANGELOG.md +616 -0
- package/CONTEXT.md +203 -0
- package/LICENSE +200 -0
- package/NOTICE +82 -0
- package/README.md +307 -0
- package/SECURITY.md +73 -0
- package/agents/README.md +81 -0
- package/agents/report-generator.md +156 -0
- package/agents/skill-updater.md +102 -0
- package/agents/source-validator.md +119 -0
- package/agents/threat-researcher.md +149 -0
- package/bin/exceptd.js +183 -0
- package/data/_indexes/_meta.json +88 -0
- package/data/_indexes/activity-feed.json +362 -0
- package/data/_indexes/catalog-summaries.json +229 -0
- package/data/_indexes/chains.json +7135 -0
- package/data/_indexes/currency.json +359 -0
- package/data/_indexes/did-ladders.json +451 -0
- package/data/_indexes/frequency.json +2072 -0
- package/data/_indexes/handoff-dag.json +476 -0
- package/data/_indexes/jurisdiction-clocks.json +967 -0
- package/data/_indexes/jurisdiction-map.json +536 -0
- package/data/_indexes/recipes.json +319 -0
- package/data/_indexes/section-offsets.json +3656 -0
- package/data/_indexes/stale-content.json +14 -0
- package/data/_indexes/summary-cards.json +1736 -0
- package/data/_indexes/theater-fingerprints.json +381 -0
- package/data/_indexes/token-budget.json +2137 -0
- package/data/_indexes/trigger-table.json +1374 -0
- package/data/_indexes/xref.json +818 -0
- package/data/atlas-ttps.json +282 -0
- package/data/cve-catalog.json +496 -0
- package/data/cwe-catalog.json +1017 -0
- package/data/d3fend-catalog.json +738 -0
- package/data/dlp-controls.json +1039 -0
- package/data/exploit-availability.json +67 -0
- package/data/framework-control-gaps.json +1255 -0
- package/data/global-frameworks.json +2913 -0
- package/data/rfc-references.json +324 -0
- package/data/zeroday-lessons.json +377 -0
- package/keys/public.pem +3 -0
- package/lib/framework-gap.js +328 -0
- package/lib/job-queue.js +195 -0
- package/lib/lint-skills.js +536 -0
- package/lib/prefetch.js +372 -0
- package/lib/refresh-external.js +713 -0
- package/lib/schemas/cve-catalog.schema.json +151 -0
- package/lib/schemas/manifest.schema.json +106 -0
- package/lib/schemas/skill-frontmatter.schema.json +113 -0
- package/lib/scoring.js +149 -0
- package/lib/sign.js +197 -0
- package/lib/ttp-mapper.js +80 -0
- package/lib/validate-catalog-meta.js +198 -0
- package/lib/validate-cve-catalog.js +213 -0
- package/lib/validate-indexes.js +83 -0
- package/lib/validate-package.js +162 -0
- package/lib/validate-vendor.js +85 -0
- package/lib/verify.js +216 -0
- package/lib/worker-pool.js +84 -0
- package/manifest-snapshot.json +1833 -0
- package/manifest.json +2108 -0
- package/orchestrator/README.md +124 -0
- package/orchestrator/dispatcher.js +140 -0
- package/orchestrator/event-bus.js +146 -0
- package/orchestrator/index.js +874 -0
- package/orchestrator/pipeline.js +201 -0
- package/orchestrator/scanner.js +327 -0
- package/orchestrator/scheduler.js +137 -0
- package/package.json +113 -0
- package/sbom.cdx.json +158 -0
- package/scripts/audit-cross-skill.js +261 -0
- package/scripts/audit-perf.js +160 -0
- package/scripts/bootstrap.js +205 -0
- package/scripts/build-indexes.js +721 -0
- package/scripts/builders/activity-feed.js +79 -0
- package/scripts/builders/catalog-summaries.js +67 -0
- package/scripts/builders/currency.js +109 -0
- package/scripts/builders/cwe-chains.js +105 -0
- package/scripts/builders/did-ladders.js +149 -0
- package/scripts/builders/frequency.js +89 -0
- package/scripts/builders/jurisdiction-clocks.js +126 -0
- package/scripts/builders/recipes.js +159 -0
- package/scripts/builders/section-offsets.js +162 -0
- package/scripts/builders/stale-content.js +171 -0
- package/scripts/builders/summary-cards.js +166 -0
- package/scripts/builders/theater-fingerprints.js +198 -0
- package/scripts/builders/token-budget.js +96 -0
- package/scripts/check-manifest-snapshot.js +217 -0
- package/scripts/predeploy.js +267 -0
- package/scripts/refresh-manifest-snapshot.js +57 -0
- package/scripts/refresh-sbom.js +222 -0
- package/skills/age-gates-child-safety/skill.md +456 -0
- package/skills/ai-attack-surface/skill.md +282 -0
- package/skills/ai-c2-detection/skill.md +440 -0
- package/skills/ai-risk-management/skill.md +311 -0
- package/skills/api-security/skill.md +287 -0
- package/skills/attack-surface-pentest/skill.md +381 -0
- package/skills/cloud-security/skill.md +384 -0
- package/skills/compliance-theater/skill.md +365 -0
- package/skills/container-runtime-security/skill.md +379 -0
- package/skills/coordinated-vuln-disclosure/skill.md +473 -0
- package/skills/defensive-countermeasure-mapping/skill.md +300 -0
- package/skills/dlp-gap-analysis/skill.md +337 -0
- package/skills/email-security-anti-phishing/skill.md +206 -0
- package/skills/exploit-scoring/skill.md +331 -0
- package/skills/framework-gap-analysis/skill.md +374 -0
- package/skills/fuzz-testing-strategy/skill.md +313 -0
- package/skills/global-grc/skill.md +564 -0
- package/skills/identity-assurance/skill.md +272 -0
- package/skills/incident-response-playbook/skill.md +546 -0
- package/skills/kernel-lpe-triage/skill.md +303 -0
- package/skills/mcp-agent-trust/skill.md +326 -0
- package/skills/mlops-security/skill.md +325 -0
- package/skills/ot-ics-security/skill.md +340 -0
- package/skills/policy-exception-gen/skill.md +437 -0
- package/skills/pqc-first/skill.md +546 -0
- package/skills/rag-pipeline-security/skill.md +294 -0
- package/skills/researcher/skill.md +310 -0
- package/skills/sector-energy/skill.md +409 -0
- package/skills/sector-federal-government/skill.md +302 -0
- package/skills/sector-financial/skill.md +398 -0
- package/skills/sector-healthcare/skill.md +373 -0
- package/skills/security-maturity-tiers/skill.md +464 -0
- package/skills/skill-update-loop/skill.md +463 -0
- package/skills/supply-chain-integrity/skill.md +318 -0
- package/skills/threat-model-currency/skill.md +404 -0
- package/skills/threat-modeling-methodology/skill.md +312 -0
- package/skills/webapp-security/skill.md +281 -0
- package/skills/zeroday-gap-learn/skill.md +350 -0
- package/vendor/blamejs/LICENSE +201 -0
- package/vendor/blamejs/README.md +54 -0
- package/vendor/blamejs/_PROVENANCE.json +54 -0
- package/vendor/blamejs/retry.js +335 -0
- package/vendor/blamejs/worker-pool.js +418 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# exceptd Security — Development Standards
|
|
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).
|
|
4
|
+
|
|
5
|
+
Also read [CONTEXT.md](CONTEXT.md) for a complete orientation to the skill system.
|
|
6
|
+
|
|
7
|
+
## Hard Rules
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
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.
|
|
14
|
+
|
|
15
|
+
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.
|
|
16
|
+
|
|
17
|
+
5. **Global-first, not US-centric** — Every framework gap analysis includes at least EU (NIS2/DORA/EU AI Act), UK (CAF), AU (ISM/Essential 8), and ISO 27001:2022 alongside NIST references. US-only analysis is incomplete.
|
|
18
|
+
|
|
19
|
+
6. **Zero-day learning is live** — `data/zeroday-lessons.json` is updated whenever a new CVE in scope is added to `data/cve-catalog.json`. The learning loop (zero-day → attack vector → control gap → framework gap → new control requirement) runs completely, not partially.
|
|
20
|
+
|
|
21
|
+
7. **Skill files are instructions, not descriptions** — Each `skill.md` tells the AI assistant exactly how to perform the analysis: what questions to ask, what data to pull, how to score, what to output. Generic "assess security posture" language is not a skill.
|
|
22
|
+
|
|
23
|
+
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.
|
|
24
|
+
|
|
25
|
+
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.
|
|
26
|
+
|
|
27
|
+
10. **No placeholder data** — `data/*.json` files contain real CVE metadata, real ATLAS TTP IDs, real framework control IDs. Placeholder entries (`"tbd"`, `"coming soon"`, empty arrays where data exists) fail the pre-ship check.
|
|
28
|
+
|
|
29
|
+
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.
|
|
30
|
+
|
|
31
|
+
12. **External data version pinning** — Every reference to external data (MITRE ATLAS, 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, 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. Current pinned ATLAS version: v5.1.0 (November 2025). The IETF RFC / Internet-Draft catalog lives at `data/rfc-references.json`; each entry tracks status, errata count, replaces / replaced-by, and `last_verified`.
|
|
32
|
+
|
|
33
|
+
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 any skill is loaded by the orchestrator. 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.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Recurring Drift Rules
|
|
38
|
+
|
|
39
|
+
**DR-1: Framework-as-truth drift**
|
|
40
|
+
Wrong: "SOC 2 CC6.1 covers access control for this threat."
|
|
41
|
+
Right: "SOC 2 CC6.1 defines logical access controls for on-prem/cloud IAM. It does not cover prompt injection as an access control bypass vector, which achieves equivalent unauthorized access via the model's context window."
|
|
42
|
+
|
|
43
|
+
**DR-2: CVSS-as-risk drift**
|
|
44
|
+
Wrong: "CVSS 7.8 High — remediate within 30 days."
|
|
45
|
+
Right: "CVSS 7.8 / RWEP 90 — CISA KEV listed, PoC is 732 bytes with no race condition, AI-discovered, blast radius spans all Linux >= 4.14. 30-day window is inapplicable. Live kernel patch within 4 hours or isolate at network layer immediately."
|
|
46
|
+
|
|
47
|
+
**DR-3: Control existence drift**
|
|
48
|
+
Wrong: "Implement patch management per SI-2."
|
|
49
|
+
Right: "SI-2 requires timely patching. For Copy Fail class LPEs (deterministic, no race condition, public PoC), 'timely' must be operationalized as: live kernel patch within 4 hours, or document compensating controls (seccomp profile + namespace isolation + network isolation) with RWEP justification."
|
|
50
|
+
|
|
51
|
+
**DR-4: US-only framework drift**
|
|
52
|
+
Wrong: citing only NIST 800-53 and SOC 2 for a multi-jurisdictional org.
|
|
53
|
+
Right: the global-grc skill runs alongside any framework-gap-analysis for orgs operating in EU, UK, AU, SG, IN, or JP.
|
|
54
|
+
|
|
55
|
+
**DR-5: AI-as-future drift**
|
|
56
|
+
Wrong: "AI-assisted attacks are an emerging threat to monitor."
|
|
57
|
+
Right: "41% of 2025 zero-days were discovered by attackers using AI-assisted reverse engineering. Copy Fail was AI-discovered in ~1 hour. AI acceleration of the exploit development cycle is current operational reality, not a future consideration."
|
|
58
|
+
|
|
59
|
+
**DR-6: Placeholder propagation**
|
|
60
|
+
Wrong: adding a new CVE to `data/cve-catalog.json` without completing all required fields.
|
|
61
|
+
Right: every new entry requires all fields defined in the CVE catalog schema. Partial entries fail the schema validation in `lib/scoring.js`.
|
|
62
|
+
|
|
63
|
+
**DR-7: Stale ATLAS version**
|
|
64
|
+
The current pinned version is MITRE ATLAS v5.1.0 (November 2025). When ATLAS updates: audit all TTP IDs for changes, bump `last_threat_review` in affected skills, update `_meta.atlas_version` in data files. Never silently upgrade.
|
|
65
|
+
|
|
66
|
+
**DR-8: Missing zero-day learning loop**
|
|
67
|
+
Wrong: adding a new entry to `data/cve-catalog.json` without running the learning loop.
|
|
68
|
+
Right: every new CVE triggers a corresponding entry in `zeroday-lessons.json` mapping: attack vector → what control should have caught it → which framework covers that control → whether the control is adequate → what new control requirement the zero-day implies.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Skill File Format
|
|
73
|
+
|
|
74
|
+
Every `skills/*/skill.md` must have this frontmatter:
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
---
|
|
78
|
+
name: skill-name
|
|
79
|
+
version: "1.0.0"
|
|
80
|
+
description: One-line trigger description (used by AI assistant skill matching)
|
|
81
|
+
triggers:
|
|
82
|
+
- phrase patterns that invoke this skill
|
|
83
|
+
data_deps:
|
|
84
|
+
- cve-catalog.json
|
|
85
|
+
- atlas-ttps.json
|
|
86
|
+
atlas_refs:
|
|
87
|
+
- AML.T0xxx
|
|
88
|
+
attack_refs:
|
|
89
|
+
- Txxx
|
|
90
|
+
framework_gaps:
|
|
91
|
+
- NIST-800-53-SI-2
|
|
92
|
+
- ISO-27001-A.12.6.1
|
|
93
|
+
rfc_refs:
|
|
94
|
+
- RFC-8446 # or DRAFT-IETF-... for Internet-Drafts
|
|
95
|
+
cwe_refs:
|
|
96
|
+
- CWE-787 # root-cause weakness classes per data/cwe-catalog.json
|
|
97
|
+
d3fend_refs:
|
|
98
|
+
- D3-EAL # MITRE D3FEND defensive techniques per data/d3fend-catalog.json
|
|
99
|
+
dlp_refs:
|
|
100
|
+
- DLP-CHAN-LLM-PROMPT # DLP control IDs per data/dlp-controls.json (only for DLP-relevant skills)
|
|
101
|
+
forward_watch:
|
|
102
|
+
- Upcoming standards changes, new TTPs, RFC publications, CWE Top 25 revisions, or D3FEND ontology additions to monitor for skill update
|
|
103
|
+
last_threat_review: "YYYY-MM-DD"
|
|
104
|
+
---
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Required body sections (no skill ships without all of these):
|
|
108
|
+
- **Threat Context** — what's actually happening in mid-2026 relevant to this domain
|
|
109
|
+
- **Framework Lag Declaration** — per-framework statement of what each control misses
|
|
110
|
+
- **TTP Mapping** — ATLAS/ATT&CK IDs with gap flags
|
|
111
|
+
- **Exploit Availability Matrix** — PoC? KEV? AI-accelerated? Live-patchable?
|
|
112
|
+
- **Analysis Procedure** — step-by-step instructions for performing the analysis. Every Analysis Procedure must explicitly thread **defense in depth** (multi-layer control assumption), **least privilege** (per-principal scope), and **zero trust** (verify-not-assume posture). These three are foundational design principles, not optional considerations.
|
|
113
|
+
- **Output Format** — exact structure the skill should produce
|
|
114
|
+
- **Compliance Theater Check** — specific test distinguishing paper compliance from real posture
|
|
115
|
+
|
|
116
|
+
Optional 8th section (required for skills shipped on or after 2026-05-11; pre-existing skills are exempt until their next minor version bump):
|
|
117
|
+
- **Defensive Countermeasure Mapping** — maps the skill's offensive findings to MITRE D3FEND IDs from `data/d3fend-catalog.json`, with explicit defense-in-depth layer position, least-privilege scope, zero-trust posture, and AI-pipeline applicability per Hard Rule #9.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Adding a New Skill
|
|
122
|
+
|
|
123
|
+
1. Create `skills/<skill-name>/skill.md` with complete frontmatter — no empty arrays, no placeholder text.
|
|
124
|
+
2. Add all CVE references to `data/cve-catalog.json`.
|
|
125
|
+
3. Add all ATLAS/ATT&CK TTPs to `data/atlas-ttps.json`.
|
|
126
|
+
4. Add all framework control gaps to `data/framework-control-gaps.json`.
|
|
127
|
+
5. Register in `manifest.json` with all fields.
|
|
128
|
+
6. Sign the new skill: `node lib/sign.js sign-all` (or `npm run bootstrap` on first run) to add the Ed25519 `signature` and `signed_at` fields to `manifest.json`. Then run `node lib/verify.js` to confirm signatures verify.
|
|
129
|
+
7. Verify: compliance theater check present? Concrete output format? Exploit availability assessment?
|
|
130
|
+
8. Refresh the project SBOM so the `exceptd:skill:count` and `exceptd:catalog:count` properties in `sbom.cdx.json` track the live surface: `npm run refresh-sbom`. The predeploy SBOM-currency gate fails if `sbom.cdx.json` drifts from `manifest.json` skill count or `data/*.json` catalog count.
|
|
131
|
+
9. Update CHANGELOG.md.
|
|
132
|
+
|
|
133
|
+
## Adding a New CVE
|
|
134
|
+
|
|
135
|
+
1. Add entry to `data/cve-catalog.json` with all required fields (schema in `lib/scoring.js`).
|
|
136
|
+
2. Add corresponding entry to `data/zeroday-lessons.json` (attack vector → control gap → framework gap → new control requirement).
|
|
137
|
+
3. Update any skill files that reference the affected technology or attack class.
|
|
138
|
+
4. Update `data/exploit-availability.json` with `last_verified` date.
|
|
139
|
+
5. Bump `last_threat_review` in affected skill frontmatter.
|
|
140
|
+
6. Update CHANGELOG.md with the CVE addition and RWEP score.
|
|
141
|
+
|
|
142
|
+
## Updating Framework Mappings
|
|
143
|
+
|
|
144
|
+
When a framework publishes an update:
|
|
145
|
+
1. Update `data/framework-control-gaps.json` — mark gaps `"status": "closed"` with the update reference if addressed. Do not delete entries.
|
|
146
|
+
2. Update `data/global-frameworks.json`.
|
|
147
|
+
3. Audit all skills that reference the changed framework controls.
|
|
148
|
+
4. Update CHANGELOG.md.
|
|
149
|
+
|
|
150
|
+
## Updating External Data Versions
|
|
151
|
+
|
|
152
|
+
When ATLAS, NIST, or another external source releases a new version:
|
|
153
|
+
1. Check for breaking changes: renamed TTPs, removed controls, changed IDs.
|
|
154
|
+
2. Update `_meta` version fields in affected data files.
|
|
155
|
+
3. Audit all skill frontmatter `atlas_refs` and `attack_refs` against the new version.
|
|
156
|
+
4. Bump `last_threat_review` in all affected skills.
|
|
157
|
+
5. Update CHANGELOG.md with the version change and any ID migrations.
|
|
158
|
+
6. Re-sign any skills whose content changed: `node lib/sign.js sign-all`, then `node lib/verify.js` to confirm.
|
|
159
|
+
|
|
160
|
+
## Contributing Without Writing Code
|
|
161
|
+
|
|
162
|
+
Domain experts (DPOs, GRC analysts, pentesters, security researchers) can contribute by opening a GitHub Issue using the **Skill Request** template:
|
|
163
|
+
- Describe the threat scenario or compliance gap in plain language
|
|
164
|
+
- Include one or more CVEs, attack techniques, or framework control IDs
|
|
165
|
+
- Note the jurisdictions or industries most affected
|
|
166
|
+
|
|
167
|
+
Maintainers convert approved requests into skill files. The contributor is credited in CHANGELOG.md and the skill's frontmatter. You do not need to know how to write a `skill.md` to contribute threat intelligence.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Pre-Ship Checklist
|
|
172
|
+
|
|
173
|
+
- [ ] All new CVEs have complete `data/cve-catalog.json` entries
|
|
174
|
+
- [ ] All new CVEs have `data/zeroday-lessons.json` entries
|
|
175
|
+
- [ ] All skill `data_deps` resolve to existing files
|
|
176
|
+
- [ ] All ATLAS refs are valid v5.1.0 IDs (current pinned version)
|
|
177
|
+
- [ ] All framework control IDs resolve in `data/framework-control-gaps.json`
|
|
178
|
+
- [ ] No skill body contains placeholder language (TODO, TBD, coming soon, placeholder)
|
|
179
|
+
- [ ] No skill uses CVSS as sole risk metric
|
|
180
|
+
- [ ] No skill implies a framework control is adequate without checking the gap analysis
|
|
181
|
+
- [ ] No skill ships without all 7 required body sections
|
|
182
|
+
- [ ] `manifest.json` updated with new/changed skills
|
|
183
|
+
- [ ] Skill signatures verified: `node lib/verify.js` passes
|
|
184
|
+
- [ ] CHANGELOG.md updated with what changed, what CVEs were added, what gaps were closed or opened
|
|
185
|
+
- [ ] No partial skills — if it can't be completed now, branch it, don't merge it
|
|
186
|
+
- [ ] Global coverage: EU + UK + AU + ISO 27001 present in all framework gap analyses
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Quick Skill Reference
|
|
191
|
+
|
|
192
|
+
| Trigger | Skill |
|
|
193
|
+
|---------|-------|
|
|
194
|
+
| research this cve, triage threat, where do I start, which skill should I use | researcher |
|
|
195
|
+
| kernel lpe, copy fail, dirty frag | kernel-lpe-triage |
|
|
196
|
+
| ai attack surface, prompt injection | ai-attack-surface |
|
|
197
|
+
| mcp security, tool trust | mcp-agent-trust |
|
|
198
|
+
| compliance theater | compliance-theater |
|
|
199
|
+
| framework gap | framework-gap-analysis |
|
|
200
|
+
| rwep, exploit scoring | exploit-scoring |
|
|
201
|
+
| global grc, nis2, dora | global-grc |
|
|
202
|
+
| pqc, post-quantum | pqc-first |
|
|
203
|
+
| security maturity, mvp security | security-maturity-tiers |
|
|
204
|
+
| zero day lesson | zeroday-gap-learn |
|
|
205
|
+
| update skills | skill-update-loop |
|
|
206
|
+
| threat model currency | threat-model-currency |
|
|
207
|
+
| rag security | rag-pipeline-security |
|
|
208
|
+
| ai c2, sesameop | ai-c2-detection |
|
|
209
|
+
| policy exception | policy-exception-gen |
|
|
210
|
+
| attack surface, pen test, red team, tiber-eu | attack-surface-pentest |
|
|
211
|
+
| fuzz testing, oss-fuzz, syzkaller, libfuzzer, ai-assisted fuzz | fuzz-testing-strategy |
|
|
212
|
+
| dlp, data loss prevention, llm dlp, prompt dlp, rag exfil | dlp-gap-analysis |
|
|
213
|
+
| supply chain, slsa, sbom, vex, sigstore, in-toto, cyclonedx, spdx | supply-chain-integrity |
|
|
214
|
+
| defensive mapping, d3fend, blue team, defense in depth, least privilege, zero trust | defensive-countermeasure-mapping |
|
|
215
|
+
| identity assurance, aal, ial, fal, fido2, webauthn, passkey, oidc, saml | identity-assurance |
|
|
216
|
+
| ot security, ics security, scada, plc, iec 62443, nist 800-82, nerc cip | ot-ics-security |
|
|
217
|
+
| cvd, vdp, bug bounty, iso 29147, iso 30111, csaf, security.txt | coordinated-vuln-disclosure |
|
|
218
|
+
| threat model, stride, pasta, linddun, kill chain, diamond model, unified kill chain | threat-modeling-methodology |
|
|
219
|
+
| webapp security, owasp top 10, owasp asvs, xss, csrf, sqli, ssrf, path traversal, file upload, command injection, deserialization, broken access control | webapp-security |
|
|
220
|
+
| ai risk management, ai governance, iso 23894, iso 42001, nist ai rmf, ai impact assessment, eu ai act high-risk | ai-risk-management |
|
|
221
|
+
| healthcare security, hipaa, hitrust, hl7 fhir, phi, medical device, samd, eu mdr, clinical decision support | sector-healthcare |
|
|
222
|
+
| financial security, banking, dora, psd2 sca, swift cscf, nydfs, ffiec, mas trm, apra cps 234, tiber-eu, cbest | sector-financial |
|
|
223
|
+
| federal cyber, fedramp, cmmc, eo 14028, nist 800-171, cui, fisma, m-22-09 zero trust, omb m-24-04, cisa bod/ed | sector-federal-government |
|
|
224
|
+
| energy security, electric grid, nerc cip, tsa pipeline, awwa, nccs-g, aescsf, der security, inverter, smart meter | sector-energy |
|
|
225
|
+
| api security, owasp api top 10, bola, bfla, mass assignment, api gateway, graphql, grpc, websocket, mcp transport | api-security |
|
|
226
|
+
| cloud security, cspm, cwpp, cnapp, csa ccm, aws, azure, gcp, workload identity, cloud iam, multi-cloud | cloud-security |
|
|
227
|
+
| container security, kubernetes, cis k8s, pod security standards, kyverno, gatekeeper, falco, tetragon, admission policy | container-runtime-security |
|
|
228
|
+
| mlops security, model registry, training data integrity, mlflow, kubeflow, vertex ai, sagemaker, hugging face, model signing, drift detection | mlops-security |
|
|
229
|
+
| incident response, ir playbook, csirt, picerl, nist 800-61, iso 27035, breach notification, bec incident, ai incident | incident-response-playbook |
|
|
230
|
+
| email security, anti-phishing, dmarc, dkim, spf, bimi, arc, mta-sts, bec, vishing, deepfake phishing | email-security-anti-phishing |
|
|
231
|
+
| age gate, age verification, coppa, cipa, california aadc, uk children's code, kosa, gdpr article 8, dsa article 28, parental consent, csam, child safety, children's online safety | age-gates-child-safety |
|
|
232
|
+
| forward watch, watchlist, upcoming standards, horizon scan | `node orchestrator/index.js watchlist` (add `--by-skill` to invert) |
|
package/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
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
|
+
|
|
7
|
+
The platform has three layers:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
skills/ Instruction layer — tells the AI what to analyze, how to score, what to output
|
|
11
|
+
data/ Intelligence layer — CVE metadata, ATLAS TTPs, framework gap mappings
|
|
12
|
+
lib/ Logic layer — scoring algorithms, TTP mapper, framework gap analyzer
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Skill File Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
skills/
|
|
21
|
+
└── <skill-name>/
|
|
22
|
+
└── skill.md Single file per skill. Frontmatter + body.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Frontmatter
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
---
|
|
29
|
+
name: skill-name
|
|
30
|
+
version: "1.0.0"
|
|
31
|
+
description: One-line description used for skill matching and the manifest index
|
|
32
|
+
triggers:
|
|
33
|
+
- exact phrase
|
|
34
|
+
- partial phrase pattern
|
|
35
|
+
data_deps:
|
|
36
|
+
- cve-catalog.json # files in data/ this skill reads
|
|
37
|
+
- atlas-ttps.json
|
|
38
|
+
atlas_refs:
|
|
39
|
+
- AML.T0043 # MITRE ATLAS v5.1.0 TTP IDs
|
|
40
|
+
- AML.T0054
|
|
41
|
+
attack_refs:
|
|
42
|
+
- T1068 # MITRE ATT&CK TTP IDs
|
|
43
|
+
framework_gaps:
|
|
44
|
+
- NIST-800-53-SI-2 # control IDs documented as insufficient in this skill
|
|
45
|
+
- ISO-27001-A.12.6.1
|
|
46
|
+
last_threat_review: "2026-05-01"
|
|
47
|
+
---
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Required Body Sections
|
|
51
|
+
|
|
52
|
+
Every skill body must have these sections in order:
|
|
53
|
+
|
|
54
|
+
1. **Threat Context (mid-2026)** — What's actually happening. Specific CVEs, observed campaigns, statistics. Not theoretical.
|
|
55
|
+
2. **Framework Lag Declaration** — Per-framework table: control ID, what it was designed for, why it fails against current TTPs.
|
|
56
|
+
3. **TTP Mapping** — Table: ATLAS/ATT&CK ID, technique name, gap flag (covered/partial/missing), exploitation example.
|
|
57
|
+
4. **Exploit Availability Matrix** — Per-CVE: CVSS, RWEP, KEV, PoC, AI-accelerated, patch status, live-patch, reboot required.
|
|
58
|
+
5. **Analysis Procedure** — Numbered steps for the AI to follow when performing this analysis.
|
|
59
|
+
6. **Output Format** — Exact structure (tables, sections, score formats) the skill should produce.
|
|
60
|
+
7. **Compliance Theater Check** — Specific question or test that distinguishes paper compliance from actual security.
|
|
61
|
+
8. **Remediation Guidance** — Accounts for: live systems, patching windows, live kernel patching, ephemeral infra, AI pipelines.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Data Layer
|
|
66
|
+
|
|
67
|
+
### `data/cve-catalog.json`
|
|
68
|
+
|
|
69
|
+
Schema per entry:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"CVE-YYYY-NNNNN": {
|
|
74
|
+
"name": "Common name if applicable",
|
|
75
|
+
"type": "LPE | RCE | information-disclosure | supply-chain | ...",
|
|
76
|
+
"cvss_score": 7.8,
|
|
77
|
+
"cvss_vector": "CVSS:3.1/...",
|
|
78
|
+
"cisa_kev": true,
|
|
79
|
+
"cisa_kev_date": "YYYY-MM-DD",
|
|
80
|
+
"poc_available": true,
|
|
81
|
+
"poc_description": "Public PoC description — no direct exploit links",
|
|
82
|
+
"ai_discovered": false,
|
|
83
|
+
"ai_assisted_weaponization": false,
|
|
84
|
+
"active_exploitation": true,
|
|
85
|
+
"affected": "Human-readable scope description",
|
|
86
|
+
"affected_versions": ["kernel >= 4.14", "kernel < 6.8.10"],
|
|
87
|
+
"vector": "Attack vector description",
|
|
88
|
+
"complexity": "deterministic | race-condition | heap-spray | ...",
|
|
89
|
+
"patch_available": true,
|
|
90
|
+
"patch_required_reboot": true,
|
|
91
|
+
"live_patch_available": true,
|
|
92
|
+
"live_patch_tools": ["kpatch", "livepatch", "kGraft"],
|
|
93
|
+
"framework_control_gaps": {
|
|
94
|
+
"NIST-800-53-SI-2": "Why this control is insufficient for this CVE",
|
|
95
|
+
"ISO-27001-A.12.6.1": "Why this control is insufficient"
|
|
96
|
+
},
|
|
97
|
+
"atlas_refs": ["AML.T0043"],
|
|
98
|
+
"attack_refs": ["T1068"],
|
|
99
|
+
"rwep_score": 96,
|
|
100
|
+
"rwep_factors": {
|
|
101
|
+
"cisa_kev": 25,
|
|
102
|
+
"poc_available": 20,
|
|
103
|
+
"ai_assisted": 0,
|
|
104
|
+
"active_exploitation": 20,
|
|
105
|
+
"blast_radius": 15,
|
|
106
|
+
"patch_available": -7,
|
|
107
|
+
"live_patch": -5,
|
|
108
|
+
"reboot_required": 5
|
|
109
|
+
},
|
|
110
|
+
"last_updated": "YYYY-MM-DD"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### `data/atlas-ttps.json`
|
|
116
|
+
|
|
117
|
+
Schema per entry:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"AML.T0043": {
|
|
122
|
+
"name": "Craft Adversarial Data",
|
|
123
|
+
"tactic": "ML Attack Staging",
|
|
124
|
+
"atlas_version": "5.1.0",
|
|
125
|
+
"description": "...",
|
|
126
|
+
"framework_coverage": {
|
|
127
|
+
"NIST-800-53": {"covered": false, "nearest_control": null, "gap_description": "..."},
|
|
128
|
+
"ISO-27001-2022": {"covered": false, "nearest_control": null, "gap_description": "..."},
|
|
129
|
+
"NIS2": {"covered": false, "gap_description": "..."}
|
|
130
|
+
},
|
|
131
|
+
"exploitation_examples": ["CVE-2025-53773"],
|
|
132
|
+
"detection_methods": ["..."],
|
|
133
|
+
"last_updated": "2026-01-01"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `data/framework-control-gaps.json`
|
|
139
|
+
|
|
140
|
+
Schema per entry:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"NIST-800-53-SI-2": {
|
|
145
|
+
"framework": "NIST 800-53 Rev 5",
|
|
146
|
+
"control_id": "SI-2",
|
|
147
|
+
"control_name": "Flaw Remediation",
|
|
148
|
+
"designed_for": "Network-centric environments with predictable patch cycles (2013 original, 2020 rev5)",
|
|
149
|
+
"misses": [
|
|
150
|
+
"Deterministic LPEs with no race condition — 'timely' is undefined when exploit takes seconds",
|
|
151
|
+
"AI-assisted exploit development compressing weaponization timelines",
|
|
152
|
+
"Live kernel patching as a required compensating control for critical systems"
|
|
153
|
+
],
|
|
154
|
+
"real_requirement": "...",
|
|
155
|
+
"status": "open",
|
|
156
|
+
"opened_date": "2026-03-15",
|
|
157
|
+
"evidence_cves": ["CVE-2026-31431"]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### `data/global-frameworks.json`
|
|
163
|
+
|
|
164
|
+
Maps jurisdiction to framework to current coverage and lag assessment. Currently covers 22+ jurisdictions (expanding to 29+ as deferred jurisdiction agents land) 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 file.
|
|
165
|
+
|
|
166
|
+
### `data/zeroday-lessons.json`
|
|
167
|
+
|
|
168
|
+
The zero-day learning loop output. Each entry maps: CVE → attack vector → what control should have caught it → which framework covers that control → whether the control is adequate → what new control requirement the zero-day implies.
|
|
169
|
+
|
|
170
|
+
### `data/exploit-availability.json`
|
|
171
|
+
|
|
172
|
+
Tracks PoC status, weaponization stage, and AI-assist factor per CVE. Updated when PoC availability changes.
|
|
173
|
+
|
|
174
|
+
### `data/cwe-catalog.json`
|
|
175
|
+
|
|
176
|
+
30 CWE entries pinned to **CWE v4.17**. 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; the CWE provides the durable root-cause lens that survives across exploit generations.
|
|
177
|
+
|
|
178
|
+
`_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`.
|
|
179
|
+
|
|
180
|
+
### `data/d3fend-catalog.json`
|
|
181
|
+
|
|
182
|
+
21 MITRE D3FEND defensive technique entries pinned to **D3FEND v1.0.0**. Each entry records the defensive technique ID (e.g., `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.
|
|
183
|
+
|
|
184
|
+
`_meta.d3fend_version` pins the version; D3FEND ontology additions are tracked in skill `forward_watch` fields.
|
|
185
|
+
|
|
186
|
+
### `data/rfc-references.json`
|
|
187
|
+
|
|
188
|
+
19 IETF RFC / Internet-Draft references covering 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), and adjacent IETF standards skills depend on. Each entry tracks: title, status (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.
|
|
189
|
+
|
|
190
|
+
### `data/dlp-controls.json`
|
|
191
|
+
|
|
192
|
+
21 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).
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Logic Layer
|
|
197
|
+
|
|
198
|
+
### `lib/scoring.js`
|
|
199
|
+
|
|
200
|
+
RWEP (Real-World Exploit Priority) scoring engine.
|
|
201
|
+
|
|
202
|
+
- `score(cveId)` — Return RWEP score for a CVE in the catalog
|
|
203
|
+
- `scoreCustom(factors)` — Score a custom factor set (for CVEs not yet in catalog)
|
|
204
|
+
- `validate()` — Schema validation: check all skill data_deps resolve, all CVE entries are complete, all ATLAS refs are valid v5.1.0 IDs
|
|
205
|
+
- `compare(cveId)` — Return CVSS vs. RWEP comparison with explanation of the delta
|
|
206
|
+
|
|
207
|
+
RWEP factor weights:
|
|
208
|
+
```
|
|
209
|
+
cisa_kev +25 (binary)
|
|
210
|
+
poc_available +20 (binary)
|
|
211
|
+
ai_assisted_weapon +15 (binary)
|
|
212
|
+
active_exploitation +20 (binary)
|
|
213
|
+
blast_radius +15 (0–15 scaled)
|
|
214
|
+
patch_available -15 (binary)
|
|
215
|
+
live_patch_available -10 (binary: additional reduction if no reboot required)
|
|
216
|
+
reboot_required +5 (binary penalty: patch exists but requires reboot)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### `lib/ttp-mapper.js`
|
|
220
|
+
|
|
221
|
+
Maps compliance framework control IDs to ATLAS/ATT&CK TTPs and produces gap analysis.
|
|
222
|
+
|
|
223
|
+
- `map(controlId)` — Return TTPs relevant to a control ID and gap status
|
|
224
|
+
- `gapsFor(attackPattern)` — Return framework controls that fail to cover an attack pattern
|
|
225
|
+
- `coverage(frameworkId, ttpId)` — Return coverage status for a specific framework/TTP pair
|
|
226
|
+
|
|
227
|
+
### `lib/framework-gap.js`
|
|
228
|
+
|
|
229
|
+
Framework lag scoring and gap report generation.
|
|
230
|
+
|
|
231
|
+
- `lagScore(frameworkId)` — Return a 0–100 lag score for a framework against current threat landscape
|
|
232
|
+
- `gapReport(frameworkId, scope)` — Generate gap report for a framework within a scope (e.g., "kernel LPE", "AI attack surface")
|
|
233
|
+
- `theaterCheck(controlId, orgControls)` — Run compliance theater detection for a specific control
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## manifest.json
|
|
238
|
+
|
|
239
|
+
Central skill registry. Each skill entry:
|
|
240
|
+
|
|
241
|
+
```json
|
|
242
|
+
{
|
|
243
|
+
"name": "kernel-lpe-triage",
|
|
244
|
+
"version": "1.0.0",
|
|
245
|
+
"path": "skills/kernel-lpe-triage/skill.md",
|
|
246
|
+
"description": "...",
|
|
247
|
+
"triggers": ["..."],
|
|
248
|
+
"data_deps": ["cve-catalog.json"],
|
|
249
|
+
"last_threat_review": "2026-05-01"
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Skill Composition
|
|
256
|
+
|
|
257
|
+
Skills can be composed. The framework-gap-analysis skill calls out to threat-model-currency context. The compliance-theater skill uses exploit-scoring output. The zeroday-gap-learn skill feeds back into framework-gap-analysis data.
|
|
258
|
+
|
|
259
|
+
Composition is explicit: skills declare which other skills they depend on in their frontmatter `skill_deps` field. Circular dependencies are not permitted.
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
zeroday-gap-learn → framework-control-gaps.json (writes)
|
|
263
|
+
framework-gap-analysis → framework-control-gaps.json (reads)
|
|
264
|
+
compliance-theater → exploit-scoring (depends on RWEP)
|
|
265
|
+
threat-model-currency → atlas-ttps.json, cve-catalog.json (reads)
|
|
266
|
+
global-grc → global-frameworks.json, framework-control-gaps.json (reads)
|
|
267
|
+
```
|