@blamejs/exceptd-skills 0.13.2 → 0.13.4
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 +41 -4
- package/CHANGELOG.md +73 -0
- package/README.md +79 -13
- package/bin/exceptd.js +105 -1
- package/data/_indexes/_meta.json +47 -47
- package/data/_indexes/activity-feed.json +3 -3
- package/data/_indexes/catalog-summaries.json +3 -3
- package/data/_indexes/chains.json +125 -32
- package/data/_indexes/frequency.json +12 -0
- package/data/_indexes/handoff-dag.json +127 -57
- package/data/_indexes/section-offsets.json +541 -487
- package/data/_indexes/summary-cards.json +34 -34
- package/data/_indexes/token-budget.json +329 -299
- package/data/attack-techniques.json +2 -0
- package/data/cve-catalog.json +99 -146
- package/data/cwe-catalog.json +1 -0
- package/data/exploit-availability.json +0 -27
- package/data/framework-control-gaps.json +409 -0
- package/data/zeroday-lessons.json +71 -89
- package/lib/lint-skills.js +17 -13
- package/lib/schemas/playbook.schema.json +5 -0
- package/lib/source-advisories.js +26 -0
- package/manifest.json +82 -82
- package/orchestrator/index.js +147 -2
- package/package.json +1 -1
- package/sbom.cdx.json +61 -61
- package/skills/age-gates-child-safety/skill.md +2 -0
- package/skills/ai-attack-surface/skill.md +2 -0
- package/skills/ai-c2-detection/skill.md +2 -0
- package/skills/ai-risk-management/skill.md +2 -0
- package/skills/api-security/skill.md +16 -4
- package/skills/attack-surface-pentest/skill.md +2 -0
- package/skills/cloud-iam-incident/skill.md +1 -1
- package/skills/cloud-security/skill.md +2 -0
- package/skills/compliance-theater/skill.md +28 -2
- package/skills/container-runtime-security/skill.md +2 -0
- package/skills/coordinated-vuln-disclosure/skill.md +1 -1
- package/skills/defensive-countermeasure-mapping/skill.md +2 -0
- package/skills/dlp-gap-analysis/skill.md +2 -0
- package/skills/email-security-anti-phishing/skill.md +14 -4
- package/skills/exploit-scoring/skill.md +30 -1
- package/skills/framework-gap-analysis/skill.md +28 -1
- package/skills/fuzz-testing-strategy/skill.md +4 -2
- package/skills/global-grc/skill.md +2 -0
- package/skills/identity-assurance/skill.md +2 -0
- package/skills/kernel-lpe-triage/skill.md +2 -0
- package/skills/mcp-agent-trust/skill.md +4 -0
- package/skills/mlops-security/skill.md +2 -0
- package/skills/ot-ics-security/skill.md +2 -0
- package/skills/policy-exception-gen/skill.md +28 -1
- package/skills/pqc-first/skill.md +2 -0
- package/skills/rag-pipeline-security/skill.md +2 -0
- package/skills/researcher/skill.md +2 -0
- package/skills/sector-energy/skill.md +2 -0
- package/skills/sector-federal-government/skill.md +2 -0
- package/skills/sector-financial/skill.md +2 -0
- package/skills/sector-healthcare/skill.md +2 -0
- package/skills/security-maturity-tiers/skill.md +2 -0
- package/skills/skill-update-loop/skill.md +2 -0
- package/skills/supply-chain-integrity/skill.md +2 -0
- package/skills/threat-model-currency/skill.md +37 -1
- package/skills/threat-modeling-methodology/skill.md +2 -0
- package/skills/webapp-security/skill.md +2 -0
- package/skills/zeroday-gap-learn/skill.md +33 -1
package/AGENTS.md
CHANGED
|
@@ -156,7 +156,7 @@ Cross-cutting playbook `framework` is the natural correlation layer — many pla
|
|
|
156
156
|
|
|
157
157
|
| Verb | What it does |
|
|
158
158
|
|---|---|
|
|
159
|
-
| `exceptd brief --all` | Grouped-by-scope summary of all
|
|
159
|
+
| `exceptd brief --all` | Grouped-by-scope summary of all 20 playbooks. `--scope <type>` filters. `--directives` expands directive IDs/titles per playbook. `--flat` for non-grouped. `exceptd plan` was removed in v0.13.0; invoking it returns a structured `ok:false` refusal pointing at this command. |
|
|
160
160
|
| `exceptd brief <pb>` | Phase 2 threat-context briefing — threat context, RWEP thresholds, skill chain, token budget, jurisdiction obligations. |
|
|
161
161
|
| `exceptd run <pb> --evidence <file>` | Phases 5-7 (analyze + validate + close) from agent evidence. Auto-detect cwd when no playbook positional. `--vex <file>` drops CycloneDX/OpenVEX `not_affected` CVEs. `--diff-from-latest` for drift mode. `--force-stale` overrides currency hard-block. |
|
|
162
162
|
| `exceptd ai-run <pb>` | Streaming variant of `run` for AI agents; emits phase-by-phase NDJSON. |
|
|
@@ -164,12 +164,14 @@ Cross-cutting playbook `framework` is the natural correlation layer — many pla
|
|
|
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
166
|
| `exceptd ask <pb> <question>` | Read-only Q&A against a playbook's directives, indicators, and threat context. |
|
|
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`.
|
|
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
|
-
| `exceptd doctor` | Health checks. `--signatures` verifies Ed25519 chains; `--cves` / `--rfcs` check catalog currency; `--fix` repairs recoverable state. |
|
|
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 lint` | Skill format lint — frontmatter completeness, required body sections, signature presence. |
|
|
173
|
+
| `exceptd refresh --check-advisories` | Poll 8 primary-source advisory feeds (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories) for CVE IDs at T+0 to T+1 — typically 3-14 days ahead of NVD enrichment. Report-only; emits structured `diffs[]` without mutating the catalog. Route promising IDs through `refresh --advisory <CVE-ID> --apply` to enrich. |
|
|
174
|
+
| `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). |
|
|
173
175
|
|
|
174
176
|
All verbs support `--help` for per-verb usage. JSON output by default; `--pretty` for indented.
|
|
175
177
|
|
|
@@ -210,6 +212,37 @@ Right: every new CVE triggers a corresponding entry in `zeroday-lessons.json` ma
|
|
|
210
212
|
|
|
211
213
|
---
|
|
212
214
|
|
|
215
|
+
## New Control Requirements
|
|
216
|
+
|
|
217
|
+
When a zero-day surfaces a control class no existing framework covers, the learning loop produces a `NEW-CTRL-*` entry under `data/zeroday-lessons.json[<CVE-ID>].new_control_requirements[]`. These are the operator-actionable controls the framework set is missing. The IDs are stable — cite them in skill bodies, in operator reports, and in framework-gap analyses.
|
|
218
|
+
|
|
219
|
+
Recently added (use the IDs in skill prose and operator briefings; full text in `data/zeroday-lessons.json`):
|
|
220
|
+
|
|
221
|
+
| ID | Name | Surfacing zero-day | Coverage gap closed |
|
|
222
|
+
|---|---|---|---|
|
|
223
|
+
| `NEW-CTRL-048` | NPM-MAINTAINER-MFA-ENFORCEMENT / KERNEL-EXIT-RACE-CVE-CLASS-MONITORING | `MAL-2026-NODE-IPC-STEALER`, `CVE-2026-46333` | NIST-800-218 SSDF, NIST-800-53 IA-5/AU-2/SI-4, NIS2 Art.21 supply-chain |
|
|
224
|
+
| `NEW-CTRL-049` | LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT / SUID-MINIMIZATION-FOR-KERNEL-LPE-CARRIER-BINARIES | `MAL-2026-NODE-IPC-STEALER`, `CVE-2026-46333` | NIST-800-218 SSDF, EU CRA Art.13, SLSA Build L3, NIST-800-53 CM-6/AC-3 |
|
|
225
|
+
| `NEW-CTRL-050` | AI-ASSISTANT-CONFIG-FILE-PERMISSION-LOCKDOWN | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 AC-3/CM-6. Enforced operationally by `exceptd doctor --ai-config`. |
|
|
226
|
+
| `NEW-CTRL-051` | NPM-PUBLISH-TOKEN-WORKSTATION-ISOLATION | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 IA-5, NIST-800-218 SSDF PW.4 |
|
|
227
|
+
| `NEW-CTRL-052` | GITHUB-REPO-PATTERN-MONITORING-FOR-EXFIL-CHANNELS | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 SI-4. Enforced operationally by `exceptd watchlist --org-scan`. |
|
|
228
|
+
| `NEW-CTRL-053` | MCP-SERVER-CONFIG-ALLOWLIST | `CVE-2026-30623` (Anthropic MCP SDK stdio injection) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM05 |
|
|
229
|
+
| `NEW-CTRL-054` | BACKUP-TIER-NETWORK-ISOLATION | `CVE-2025-59389` (QNAP Hyper Data Protector preauth RCE) | ISO-27001-2022 A.8.13, NIS2 Art.21 business-continuity |
|
|
230
|
+
| `NEW-CTRL-055` | SECURITY-TOOL-INTEGRITY-VERIFICATION | `CVE-2025-11837` (QNAP Malware Remover code-injection) | NIST-800-53 SI-3, ISO-27001-2022 A.8.7, PCI-DSS 4.0 §5.1 |
|
|
231
|
+
|
|
232
|
+
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.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Operational threat-intake cadence
|
|
237
|
+
|
|
238
|
+
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 8 primary-source feeds) → `watchlist --alerts` (5-pattern CVE-class scan) → `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.
|
|
239
|
+
|
|
240
|
+
The routine is operator-managed at <https://claude.ai/code/routines>. 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.
|
|
241
|
+
|
|
242
|
+
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.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
213
246
|
## Skill File Format
|
|
214
247
|
|
|
215
248
|
Every `skills/*/skill.md` must have this frontmatter:
|
|
@@ -375,4 +408,8 @@ Maintainers convert approved requests into skill files. The contributor is credi
|
|
|
375
408
|
| cloud iam incident, aws account takeover, gcp account takeover, azure account takeover, cross-account assume-role, imds, access key leak, snowflake breach, scim, workload identity | cloud-iam-incident |
|
|
376
409
|
| email security, anti-phishing, dmarc, dkim, spf, bimi, arc, mta-sts, bec, vishing, deepfake phishing | email-security-anti-phishing |
|
|
377
410
|
| 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 |
|
|
378
|
-
| forward watch, watchlist, upcoming standards, horizon scan | `
|
|
411
|
+
| forward watch, watchlist, upcoming standards, horizon scan | `exceptd watchlist` (add `--by-skill` to invert) |
|
|
412
|
+
| CVE alert triage, kernel LPE PoC, supply-chain MAL, active exploitation | `exceptd watchlist --alerts` |
|
|
413
|
+
| github repo pattern scan, Shai-Hulud, TeamPCP, exfil-channel monitoring | `exceptd watchlist --org-scan --org <login>` |
|
|
414
|
+
| AI-assistant config permission audit, ~/.cursor, ~/.claude, ~/.codeium, MCP config lockdown | `exceptd doctor --ai-config` |
|
|
415
|
+
| primary-source advisory polling, Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org, oss-security, JFrog, CISA | `exceptd refresh --check-advisories` |
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,78 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.13.4 — 2026-05-18
|
|
4
|
+
|
|
5
|
+
Warning-cleanup pass + catalog hygiene + docs surfacing. The post-v0.13.3 state had ~43 skill lint warnings and 20 cosmetic playbook warnings that operators saw on every predeploy run; this release drives both to zero. README and AGENTS catch up with the v0.13.0 → v0.13.3 operator surface.
|
|
6
|
+
|
|
7
|
+
### Bugs
|
|
8
|
+
|
|
9
|
+
**Playbook `_meta.fed_by` is now schema-accepted.** v0.13.0 added the `_meta.fed_by[]` reverse-direction field to every playbook but never updated `lib/schemas/playbook.schema.json`; every playbook surfaced a cosmetic `unexpected property "fed_by"` warning. Schema now declares the field as an array of strings; warning count for `validate-playbooks` drops from 22 → 0. 20/20 playbooks now validate clean without warnings.
|
|
10
|
+
|
|
11
|
+
**Skill lint cleanup: 43 warnings → 0.** Two categories addressed:
|
|
12
|
+
|
|
13
|
+
- **Output Format section too short (32 skills):** the lint requires `## Output Format` carry ≥ 20 words of body text. Most skills had the section terminated early because H2 / H1 headings inside example-output code fences were detected as real headings by the lint's heading-finder. Each affected skill now carries 1-2 sentences of explanatory prose between the `## Output Format` heading and the first fenced code block — naming the report shape, the downstream consumers (compliance-theater, framework-gap-analysis, incident-response-playbook, global-grc, CSAF auditor bundles), and the load-bearing fields operators must preserve verbatim. Two skills (`mcp-agent-trust`, `fuzz-testing-strategy`) had analogous heading-collision issues in other sections; same fix pattern.
|
|
14
|
+
|
|
15
|
+
- **Missing Defensive Countermeasure Mapping section (6 skills):** the section is required for skills with `last_threat_review >= 2026-05-11`. Added to `framework-gap-analysis`, `compliance-theater`, `exploit-scoring`, `policy-exception-gen`, `threat-model-currency`, `zeroday-gap-learn`. Each section ships a 5-10 row table mapping offensive TTPs (ATLAS / ATT&CK) to D3FEND defensive technique IDs (all verified against `data/d3fend-catalog.json`), plus defense-in-depth posture, least-privilege scope, zero-trust posture, and AI-pipeline applicability notes per AGENTS.md Hard Rule #9. Updated `last_threat_review` to `2026-05-18`.
|
|
16
|
+
|
|
17
|
+
Final lint state: **42/42 skills passing, 0 warnings.**
|
|
18
|
+
|
|
19
|
+
**2 stuck-draft CVEs removed from catalog.** `MAL-2026-ANTHROPIC-MCP-STDIO` was a `_quarantine: true` duplicate of the verified `CVE-2026-30623` (Anthropic MCP SDK stdio command-injection). `CVE-2026-GTIG-AI-2FA` was a `_draft: true` placeholder for an embargoed/un-assigned CVE id. Both removed. Cross-references updated in `data/exploit-availability.json`, `data/framework-control-gaps.json` (inline text in `NIST-AI-RMF-MEASURE-2.7`), `data/_indexes/chains.json` (regenerated), `data/zeroday-lessons.json`. Catalog state now **38/38 verified, 0 drafts**.
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
**README.md catches up with v0.13.0 → v0.13.3 operator surface.** New documentation for: `exceptd watchlist --alerts` (CVE-class pattern matcher; 5 patterns), `exceptd watchlist --org-scan` (GitHub repo-pattern monitoring per NEW-CTRL-052; `--org`, `--pattern`, `GITHUB_TOKEN` env var), `exceptd doctor --ai-config` (file-mode audit per NEW-CTRL-050; walks ~/.claude / ~/.cursor / ~/.codeium / ~/.aider / ~/.continue), `exceptd refresh --check-advisories` (8-feed primary-source poller: Qualys / RHSA / USN / ZDI / kernel-org / oss-security / JFrog / CISA), and the daily scheduled `exceptd-threat-intake` remote agent. Playbook count updated 16 → 20 with the 4 v0.13.0 additions named. Legacy verb table split into "Removed in v0.13.0" (5 verbs) vs "Aliases — still functional, no removal scheduled" (10 verbs). Watchlist now has a first-class CLI block instead of the prior "no replacement yet" stub.
|
|
24
|
+
|
|
25
|
+
**AGENTS.md catches up.** Two new sections:
|
|
26
|
+
- **New Control Requirements** — table documenting NEW-CTRL-048 through NEW-CTRL-055 with name, surfacing zero-day, and coverage gap closed. Skill bodies should cite the IDs rather than paraphrase the upstream description.
|
|
27
|
+
- **Operational threat-intake cadence** — documents the daily `exceptd-threat-intake` routine, the sequence it runs (`refresh --check-advisories` → `watchlist --alerts` → `refresh --apply` → `refresh --advisory <CVE-ID>` for up to 5 new IDs → PR), and operator instructions for one-off triage.
|
|
28
|
+
|
|
29
|
+
CLI reference table extended: `exceptd brief --all` row updated 16 → 20 playbooks; `exceptd attest diff <sid>` row updated to describe `reattest` as a preserved short-form alias; `exceptd doctor` row added `--ai-config`; two new rows added for `exceptd refresh --check-advisories` and `exceptd watchlist`. Quick Skill Reference table replaced legacy `node orchestrator/index.js watchlist` invocation with `exceptd watchlist`.
|
|
30
|
+
|
|
31
|
+
### Internal
|
|
32
|
+
|
|
33
|
+
- 18 new tests: `tests/v0_13_4-fixes.test.js` (13 pins covering Phases A / C / E), `tests/doctor-ai-config-substantive.test.js` (5 fixture-driven tests, POSIX-only), `tests/watchlist-org-scan-substantive.test.js` (5 envelope-shape tests).
|
|
34
|
+
- Test-count baseline refreshed.
|
|
35
|
+
- Predeploy: 15/15 gates green; both `validate-playbooks` and `lint-skills` now run warning-free.
|
|
36
|
+
|
|
37
|
+
## 0.13.3 — 2026-05-18
|
|
38
|
+
|
|
39
|
+
Audit close-out continuation: the items the prior pass marked for follow-up. Workflow hardening, lint enforcement promoted from warning to hard error, two new operator-facing health checks for the Shai-Hulud lesson controls, and 4 more primary-source pollers covering kernel.org / oss-security / JFrog / CISA.
|
|
40
|
+
|
|
41
|
+
### Security
|
|
42
|
+
|
|
43
|
+
**`refresh.yml` split into two jobs — `refresh-data` (no write credentials) + `open-pr` (contents:write + pull-requests:write + issues:write scoped to PR creation only).** Pre-split a single `refresh` job carried write capability against the repo throughout the long-running data-parse + prefetch + apply + predeploy sequence; a compromise of any of those steps had repo-write access during the whole run. The new shape scopes write capability to the few-second PR-creation window. Data mutations flow between jobs via an upload-artifact / download-artifact bundle. The `refresh-data` checkout now uses `persist-credentials: false`.
|
|
44
|
+
|
|
45
|
+
**`lib/lint-skills.js` Hard Rule #1 body-scan flipped from warning to hard error.** v0.13.2 introduced the body-scan as a warning while the 2 pre-existing violations were triaged. Both are now resolved (`CVE-2024-21762` landed in the catalog with full Hard Rule #1 fields; the placeholder `CVE-2026-21370` reference was removed from `cloud-iam-incident`). The body-scan now errors when a skill cites a CVE not in the catalog. Draft references continue to surface as warnings.
|
|
46
|
+
|
|
47
|
+
### Features
|
|
48
|
+
|
|
49
|
+
**`exceptd doctor --ai-config` audits AI-assistant config-file permissions.** Implements NEW-CTRL-050 from the MAL-2026-SHAI-HULUD-OSS zeroday-lessons entry. Walks `~/.claude`, `~/.cursor`, `~/.codeium`, `~/.aider`, `~/.continue` for sensitive files (`settings.json`, `mcp.json`, `*.mcp_config.json`, `api_key*`, `*.token`, `*.credentials`) and reports any not at mode 0600 on POSIX. On Windows the mode bits aren't load-bearing; each sensitive file is flagged with an info-level "manual ACL review" note. Opt-in via `--ai-config`; doesn't run as part of the default no-flag doctor pass.
|
|
50
|
+
|
|
51
|
+
**`exceptd watchlist --org-scan` probes GitHub for threat-actor repo naming patterns.** Implements NEW-CTRL-052 from the MAL-2026-SHAI-HULUD-OSS zeroday-lessons entry. Queries the GitHub Search API for repos matching the canonical Shai-Hulud / TeamPCP patterns ("A Gift From TeamPCP", "Shai-Hulud", "TeamPCP") scoped to `--org <login>`. Custom patterns via repeatable `--pattern <s>`. Set `GITHUB_TOKEN` env var for private-repo coverage and higher rate limit; without it, public-repo search only.
|
|
52
|
+
|
|
53
|
+
**4 more primary-source advisory pollers.** `lib/source-advisories.js` `FEEDS` grew 4 → 8:
|
|
54
|
+
- `kernel-org` — torvalds/linux master commits atom feed. Catches the CVE-2026-46333 / ssh-keysign-pwn class at T+0, the moment the upstream fix lands. The v0.13.1 post-mortem identified this as the exact venue we missed.
|
|
55
|
+
- `oss-security` — openwall.com `oss-security` mailing list atom feed. Coordinated-disclosure venue; many distro advisories announce CVEs here days before NVD enrichment.
|
|
56
|
+
- `jfrog` — JFrog SecOps research blog feed. npm / PyPI / Maven supply-chain disclosures with CVE assignments (TanStack / Mini Shai-Hulud class).
|
|
57
|
+
- `cisa-current` — CISA cybersecurity advisories feed (federal-vendor coordinated disclosures, separate from KEV which captures only exploited-in-the-wild items).
|
|
58
|
+
|
|
59
|
+
### Bugs
|
|
60
|
+
|
|
61
|
+
**`CVE-2024-21762` (Fortinet FortiOS SSL-VPN preauth RCE) added to catalog.** Was cited in skill prose without a backing catalog entry — surfaced by the v0.13.2 Hard Rule #1 body-scan. Full Hard Rule #1 fields (CVSS 9.8, CISA KEV 2024-02-09, public PoC, confirmed mass exploitation across multiple APT clusters, FortiOS patch versions 7.6.2 / 7.4.7 / 7.2.11 / 7.0.17 / 6.4.16). RWEP 85. Includes the 2025-04 follow-up advisory documenting symlink persistence that survives firmware patching.
|
|
62
|
+
|
|
63
|
+
**`CVE-2026-21370` placeholder reference removed from `skills/cloud-iam-incident/skill.md`.** No record of CVE-2026-21370 in any source; was a class-marker parenthetical for the Azure managed-identity token-replay attack class. Rewritten as "design-class issue, not a single CVE" so the prose still accurately describes the IMDS-token-theft pattern without inventing threat intel.
|
|
64
|
+
|
|
65
|
+
**12 framework-gap forward-orphan references closed.** Each pre-existing orphan got a real gap entry with theater_test per Hard Rule #6: `CIS-Kubernetes-Benchmark-4.2.13`, `CIS-Kubernetes-Benchmark-5.3`, `CIS-Controls-v8-Control6`, `ISO-27001-2022-A.5.15`, `ISO-27001-2022-A.8.13`, `NIST-800-53-IA-2`, `NIST-AI-RMF-MEASURE-2.7`, `OWASP-ML-Top-10-2023-ML06`, `NIS2-Art21-network-security`, `NIS2-Art21-business-continuity`, `PCI-DSS-4.0-5.1`, `AU-ISM-1808`. Gap catalog 130 → 142 entries; orphan count for `framework-control-gaps.json` is now 0.
|
|
66
|
+
|
|
67
|
+
**2 empty-`data_deps` skills fixed.** `api-security` and `email-security-anti-phishing` previously had empty `data_deps` because the bodies referenced no catalog file by name. Each now carries 6 catalog references (atlas-ttps, attack-techniques, cwe-catalog / dlp-controls, d3fend-catalog, framework-control-gaps, rfc-references) threaded through the body in 4 new prose passages each. Every cited ID resolves to a real entry in its respective catalog. `last_threat_review` bumped to 2026-05-18.
|
|
68
|
+
|
|
69
|
+
### Internal
|
|
70
|
+
|
|
71
|
+
- 8 new tests in `tests/v0_13_3-fixes.test.js` covering all 5 phases.
|
|
72
|
+
- Test-count baseline refreshed to match the new test surface.
|
|
73
|
+
- ADVISORIES_SOURCE test-fixture extended to include the 4 new feeds.
|
|
74
|
+
- `tests/source-advisories.test.js` `FEEDS: exactly N feeds` pin updated 4 → 8.
|
|
75
|
+
|
|
3
76
|
## 0.13.2 — 2026-05-18
|
|
4
77
|
|
|
5
78
|
Audit close-out: the remaining v0.13 deferrals from the original 6-domain audit + the v0.13.1 post-mortem follow-ups. Patch-class — additive across CI hardening, lint enforcement, CLI UX, predeploy gates, catalog data cleanup, and skill metadata.
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ This platform surfaces what is actually happening right now. Every skill explici
|
|
|
30
30
|
|
|
31
31
|
## Status
|
|
32
32
|
|
|
33
|
-
Pre-1.0. Latest release lives on [GitHub Releases](https://github.com/blamejs/exceptd-skills/releases) and on npm as [`@blamejs/exceptd-skills`](https://www.npmjs.com/package/@blamejs/exceptd-skills) with signed npm provenance attestation and Ed25519-signed skill bodies. The package ships 42 skills across kernel LPE, MCP supply chain, AI-as-C2, prompt injection, post-quantum crypto, SBOM integrity, identity-incident response, and 35 other AI/security domains, plus 10 intelligence catalogs (CVE / ATLAS / ATT&CK / CWE / D3FEND / DLP / RFC / framework gaps / global frameworks / zero-day lessons) covering 35 jurisdictions, a CLI for discovery and seven-phase investigation runs (`govern → direct → look → detect → analyze → validate → close`), and a nightly auto-refresh job that pulls KEV / NVD / EPSS / GHSA / OSV / IETF deltas into auto-PRs for editorial review.
|
|
33
|
+
Pre-1.0. Latest release lives on [GitHub Releases](https://github.com/blamejs/exceptd-skills/releases) and on npm as [`@blamejs/exceptd-skills`](https://www.npmjs.com/package/@blamejs/exceptd-skills) with signed npm provenance attestation and Ed25519-signed skill bodies. The package ships 42 skills across kernel LPE, MCP supply chain, AI-as-C2, prompt injection, post-quantum crypto, SBOM integrity, identity-incident response, and 35 other AI/security domains, plus 10 intelligence catalogs (CVE / ATLAS / ATT&CK / CWE / D3FEND / DLP / RFC / framework gaps / global frameworks / zero-day lessons) covering 35 jurisdictions, 20 investigation playbooks (kernel, MCP, AI-API, framework, SBOM, runtime, hardening, secrets, cred-stores, containers, crypto, plus `webhook-callback-abuse`, `cicd-pipeline-compromise`, `identity-sso-compromise`, `llm-tool-use-exfil`, and more), a CLI for discovery and seven-phase investigation runs (`govern → direct → look → detect → analyze → validate → close`), and a nightly auto-refresh job that pulls KEV / NVD / EPSS / GHSA / OSV / IETF deltas plus primary-source advisories (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org, oss-security, JFrog, CISA) into auto-PRs for editorial review.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -154,6 +154,16 @@ Air-gapped operation: run `exceptd refresh --prefetch` on a connected host, copy
|
|
|
154
154
|
|
|
155
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>`. For "I want this advisory today, not tomorrow": `exceptd refresh --advisory <CVE-or-GHSA-or-MAL-or-SNYK-or-RUSTSEC-ID> --apply`.
|
|
156
156
|
|
|
157
|
+
Primary-source advisory polling: `exceptd refresh --check-advisories` polls 8 vendor and coordinated-disclosure feeds (Qualys TRU, Red Hat RHSA, Ubuntu USN, Zero Day Initiative, kernel.org commits, oss-security mailing list, JFrog SecOps, CISA current advisories) that publish 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. Operators triage the output and route promising IDs through `exceptd refresh --advisory <CVE-ID> --apply`. Pairs naturally with the daily scheduled remote agent below.
|
|
158
|
+
|
|
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 as a fast operational triage on a refreshed catalog without scanning every entry by hand.
|
|
160
|
+
|
|
161
|
+
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
|
+
|
|
163
|
+
AI-assistant config-file audit: `exceptd doctor --ai-config` walks `~/.claude`, `~/.cursor`, `~/.codeium`, `~/.aider`, and `~/.continue`, flagging sensitive files (`settings.json`, `mcp.json`, `*.mcp_config.json`, `api_key*`, `*.token`, `*.credentials`) not at mode 0600 on POSIX. On Windows the mode bits aren't load-bearing; each finding is surfaced with an info-level "manual ACL review" note. Catches the AI-config-credential-exfil class that the Shai-Hulud framework targets. Opt-in — does not run as part of the default no-flag `doctor` pass.
|
|
164
|
+
|
|
165
|
+
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. Closes the cadence gap that previously left fresh disclosures dependent on operator-triggered intake. Operator-managed at <https://claude.ai/code/routines>.
|
|
166
|
+
|
|
157
167
|
Optional env vars for higher rate budgets:
|
|
158
168
|
|
|
159
169
|
| Variable | Purpose |
|
|
@@ -270,6 +280,16 @@ exceptd doctor One-shot health check.
|
|
|
270
280
|
--currency Only skill currency report.
|
|
271
281
|
--cves Only CVE catalog drift check.
|
|
272
282
|
--rfcs Only RFC catalog drift check.
|
|
283
|
+
--ai-config Audit AI-assistant config-file permissions
|
|
284
|
+
across ~/.claude, ~/.cursor, ~/.codeium,
|
|
285
|
+
~/.aider, ~/.continue. Flags sensitive
|
|
286
|
+
files (settings.json, mcp.json,
|
|
287
|
+
*.mcp_config.json, api_key*, *.token,
|
|
288
|
+
*.credentials) not at mode 0600 on POSIX;
|
|
289
|
+
surfaces an info-level "manual ACL review"
|
|
290
|
+
note for each sensitive file on Windows.
|
|
291
|
+
Opt-in; not part of the default doctor
|
|
292
|
+
pass.
|
|
273
293
|
|
|
274
294
|
exceptd ci One-shot CI gate. Exits 2 on detected or
|
|
275
295
|
rwep ≥ rwep_threshold.escalate.
|
|
@@ -302,12 +322,56 @@ exceptd refresh Refresh upstream catalogs + indexes.
|
|
|
302
322
|
--curate <CVE-ID> (v0.12.0) Emit editorial questions + ranked
|
|
303
323
|
candidates (ATLAS/ATT&CK/CWE/framework) for
|
|
304
324
|
a draft catalog entry.
|
|
325
|
+
--check-advisories Poll 8 primary-source advisory feeds
|
|
326
|
+
(Qualys TRU, Red Hat RHSA, Ubuntu USN,
|
|
327
|
+
ZDI, kernel.org commits, oss-security
|
|
328
|
+
mailing list, JFrog SecOps, CISA current
|
|
329
|
+
advisories) for CVE IDs disclosed at T+0
|
|
330
|
+
to T+1 — days ahead of NVD enrichment.
|
|
331
|
+
Report-only: emits structured diffs[]
|
|
332
|
+
with {cve_id, sources[], advisory_urls[],
|
|
333
|
+
disclosed_at, title}; does NOT mutate the
|
|
334
|
+
catalog. Route promising IDs through
|
|
335
|
+
`refresh --advisory <CVE-ID>` to enrich.
|
|
305
336
|
--indexes-only Rebuild data/_indexes/*.json only.
|
|
306
337
|
|
|
307
|
-
Sources (default = all): kev | epss | nvd | rfc | pins | ghsa
|
|
308
|
-
GHSA covers npm, PyPI, Maven, Go, NuGet, etc
|
|
309
|
-
|
|
310
|
-
|
|
338
|
+
Sources (default = all): kev | epss | nvd | rfc | pins | ghsa | osv.
|
|
339
|
+
GHSA covers npm, PyPI, Maven, Go, NuGet, etc.; OSV layers Snyk, RustSec,
|
|
340
|
+
Mageia, Ubuntu USN, Go Vuln DB, PYSEC, UVI, plus the OSSF Malicious
|
|
341
|
+
Packages dataset (`MAL-*` keys). New IDs land as drafts that the catalog
|
|
342
|
+
validator treats as warnings, not errors — editorial review (framework
|
|
343
|
+
gaps, IoCs, ATLAS/ATT&CK refs) is still required.
|
|
344
|
+
|
|
345
|
+
exceptd watchlist Default mode: aggregate every skill's
|
|
346
|
+
forward_watch entries (upcoming standards,
|
|
347
|
+
RFC publications, new TTPs to monitor).
|
|
348
|
+
`--by-skill` inverts the grouping.
|
|
349
|
+
--alerts Switch to CVE-catalog pattern alerts.
|
|
350
|
+
Five patterns ship:
|
|
351
|
+
- kernel_lpe_with_poc (high) — kernel
|
|
352
|
+
LPE class with public PoC + blast
|
|
353
|
+
radius >= 25
|
|
354
|
+
- supply_chain_family (high) — MAL-*
|
|
355
|
+
entries or `type: malicious-*`
|
|
356
|
+
- ai_discovered_kev (high) — AI-
|
|
357
|
+
discovered AND CISA KEV-listed
|
|
358
|
+
- active_exploitation_unpatched
|
|
359
|
+
(critical) — confirmed in-the-wild
|
|
360
|
+
+ no patch available
|
|
361
|
+
- recent_poc_no_kev_yet (medium) —
|
|
362
|
+
public PoC verified within 14 days,
|
|
363
|
+
not yet KEV-listed
|
|
364
|
+
Sorted critical-severity first, then by
|
|
365
|
+
RWEP descending. JSON or human output.
|
|
366
|
+
--org-scan --org <login> Probe GitHub Search for repositories
|
|
367
|
+
matching known threat-actor naming
|
|
368
|
+
patterns ("A Gift From TeamPCP",
|
|
369
|
+
"Shai-Hulud", "TeamPCP") scoped to one
|
|
370
|
+
org. Custom patterns via repeatable
|
|
371
|
+
`--pattern <s>`. Set GITHUB_TOKEN for
|
|
372
|
+
private-repo coverage + higher rate
|
|
373
|
+
limit; without it, public-repo search
|
|
374
|
+
only.
|
|
311
375
|
|
|
312
376
|
exceptd skill <name> Show context for one skill.
|
|
313
377
|
exceptd framework-gap <FW> <ref> One framework + one CVE/scenario, JSON
|
|
@@ -319,31 +383,33 @@ exceptd help This help.
|
|
|
319
383
|
exceptd <verb> --help Per-verb usage with flag descriptions.
|
|
320
384
|
```
|
|
321
385
|
|
|
322
|
-
### Legacy v0.10.x verbs
|
|
386
|
+
### Legacy v0.10.x verbs
|
|
323
387
|
|
|
324
|
-
|
|
388
|
+
Five verbs removed in v0.13.0 after deprecation since v0.11.0. Invoking any of these now returns a structured `ok:false` refusal pointing at the replacement; pre-v0.13 scripts must migrate.
|
|
325
389
|
|
|
326
|
-
|
|
|
390
|
+
| Removed verb | Replacement |
|
|
327
391
|
|---|---|
|
|
328
392
|
| `plan` | `brief --all` |
|
|
329
393
|
| `govern <pb>` | `brief <pb> --phase govern` |
|
|
330
394
|
| `direct <pb>` | `brief <pb> --phase direct` |
|
|
331
395
|
| `look <pb>` | `brief <pb> --phase look` |
|
|
396
|
+
| `ingest` | `run` |
|
|
397
|
+
|
|
398
|
+
The remaining v0.10.x verbs are aliases — still functional, no banner, no removal scheduled:
|
|
399
|
+
|
|
400
|
+
| Alias | Canonical |
|
|
401
|
+
|---|---|
|
|
332
402
|
| `scan` | `discover --scan-only` |
|
|
333
403
|
| `dispatch` | `discover` |
|
|
334
404
|
| `currency` | `doctor --currency` |
|
|
335
405
|
| `verify` | `doctor --signatures` |
|
|
336
406
|
| `validate-cves` | `doctor --cves` |
|
|
337
407
|
| `validate-rfcs` | `doctor --rfcs` |
|
|
338
|
-
| `ingest` | `run` |
|
|
339
408
|
| `reattest <sid>` | `attest diff <sid>` |
|
|
340
409
|
| `list-attestations` | `attest list` |
|
|
341
|
-
| `watchlist` | (no replacement yet — kept) |
|
|
342
410
|
| `prefetch` | `refresh --no-network` |
|
|
343
411
|
| `build-indexes` | `refresh --indexes-only` |
|
|
344
412
|
|
|
345
|
-
Suppress the deprecation banner: `EXCEPTD_DEPRECATION_SHOWN=1`.
|
|
346
|
-
|
|
347
413
|
## Invoking a skill from your AI assistant
|
|
348
414
|
|
|
349
415
|
Once your assistant has loaded `AGENTS.md`, type a trigger phrase or skill name:
|
|
@@ -399,7 +465,7 @@ The `agents/` directory ships markdown role cards documenting authoring conventi
|
|
|
399
465
|
All skills pull from `data/`. Cross-validated against canonical upstream sources via `exceptd refresh` / `exceptd doctor --cves` / `exceptd doctor --rfcs`.
|
|
400
466
|
|
|
401
467
|
- `cve-catalog.json` — CVE metadata with RWEP scores, CISA KEV status, PoC availability, live-patch info
|
|
402
|
-
- `atlas-ttps.json` — MITRE ATLAS v5.4.0 TTPs with gap flags and exploitation examples
|
|
468
|
+
- `atlas-ttps.json` — MITRE ATLAS v5.4.0 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.
|
|
403
469
|
- `framework-control-gaps.json` — Per-framework, per-control: what it was designed for vs. what it misses
|
|
404
470
|
- `exploit-availability.json` — PoC locations, weaponization status, AI-assist factor
|
|
405
471
|
- `global-frameworks.json` — All major global compliance frameworks (35 jurisdictions) with control inventories and lag scores
|
package/bin/exceptd.js
CHANGED
|
@@ -5205,16 +5205,24 @@ function cmdDoctor(runner, args, runOpts, pretty) {
|
|
|
5205
5205
|
|
|
5206
5206
|
// Selective subchecks. If any of the four flags is passed, run only those.
|
|
5207
5207
|
// If none are passed, run all four plus signing-status.
|
|
5208
|
+
// v0.13.3: --ai-config audits AI-assistant config-file permissions per
|
|
5209
|
+
// NEW-CTRL-050 (from the MAL-2026-SHAI-HULUD-OSS zeroday-lessons entry).
|
|
5210
|
+
// It's a separate flag because the check is opt-in — most operators
|
|
5211
|
+
// don't want their AI-config state probed by default.
|
|
5208
5212
|
const onlySigs = !!args.signatures;
|
|
5209
5213
|
const onlyCurrency = !!args.currency;
|
|
5210
5214
|
const onlyCves = !!args.cves;
|
|
5211
5215
|
const onlyRfcs = !!args.rfcs;
|
|
5212
|
-
const
|
|
5216
|
+
const onlyAiConfig = !!args["ai-config"];
|
|
5217
|
+
const anySelected = onlySigs || onlyCurrency || onlyCves || onlyRfcs || onlyAiConfig;
|
|
5213
5218
|
const runSigs = !anySelected || onlySigs;
|
|
5214
5219
|
const runCurrency = !anySelected || onlyCurrency;
|
|
5215
5220
|
const runCves = !anySelected || onlyCves;
|
|
5216
5221
|
const runRfcs = !anySelected || onlyRfcs;
|
|
5217
5222
|
const runSigning = !anySelected;
|
|
5223
|
+
// --ai-config is opt-in — never runs as part of the default no-flag
|
|
5224
|
+
// doctor pass. Operators ask for it explicitly.
|
|
5225
|
+
const runAiConfig = onlyAiConfig;
|
|
5218
5226
|
|
|
5219
5227
|
const checks = {};
|
|
5220
5228
|
const issues = [];
|
|
@@ -5453,6 +5461,102 @@ function cmdDoctor(runner, args, runOpts, pretty) {
|
|
|
5453
5461
|
}
|
|
5454
5462
|
}
|
|
5455
5463
|
|
|
5464
|
+
// v0.13.3 — AI-assistant config-file permission audit per NEW-CTRL-050
|
|
5465
|
+
// (from the MAL-2026-SHAI-HULUD-OSS zeroday-lessons entry). Walks
|
|
5466
|
+
// ~/.claude/, ~/.cursor/, ~/.codeium/, ~/.aider/, ~/.continue/ for
|
|
5467
|
+
// sensitive config files (settings.json, mcp.json, *.mcp_config.json,
|
|
5468
|
+
// api_key*, *.token, *.credentials) and reports any not at mode 0600.
|
|
5469
|
+
// The MAL-2026-SHAI-HULUD-OSS framework reads these files at
|
|
5470
|
+
// unprivileged-process scope; tightening to 0600 forces npm/node-spawned
|
|
5471
|
+
// processes that don't share UID to fail the read.
|
|
5472
|
+
//
|
|
5473
|
+
// Opt-in only — never runs as part of the default no-flag doctor pass.
|
|
5474
|
+
// Operators request it via `exceptd doctor --ai-config`.
|
|
5475
|
+
if (runAiConfig) {
|
|
5476
|
+
const os = require('os');
|
|
5477
|
+
const HOME = os.homedir();
|
|
5478
|
+
const AI_CONFIG_DIRS = [
|
|
5479
|
+
{ dir: '.claude', display: '~/.claude' },
|
|
5480
|
+
{ dir: '.cursor', display: '~/.cursor' },
|
|
5481
|
+
{ dir: '.codeium', display: '~/.codeium' },
|
|
5482
|
+
{ dir: '.aider', display: '~/.aider' },
|
|
5483
|
+
{ dir: '.continue', display: '~/.continue' },
|
|
5484
|
+
];
|
|
5485
|
+
// Files within those dirs that warrant the strict-mode check.
|
|
5486
|
+
const SENSITIVE_PATTERNS = [
|
|
5487
|
+
/^settings\.json$/,
|
|
5488
|
+
/^mcp\.json$/,
|
|
5489
|
+
/\.mcp_config\.json$/,
|
|
5490
|
+
/^api_key/,
|
|
5491
|
+
/\.token$/,
|
|
5492
|
+
/\.credentials$/,
|
|
5493
|
+
];
|
|
5494
|
+
const findings = [];
|
|
5495
|
+
let scannedDirs = 0;
|
|
5496
|
+
let scannedFiles = 0;
|
|
5497
|
+
function walk(absDir, displayRoot, rel) {
|
|
5498
|
+
if (!fs.existsSync(absDir)) return;
|
|
5499
|
+
let entries;
|
|
5500
|
+
try { entries = fs.readdirSync(absDir, { withFileTypes: true }); }
|
|
5501
|
+
catch { return; }
|
|
5502
|
+
for (const e of entries) {
|
|
5503
|
+
const childAbs = path.join(absDir, e.name);
|
|
5504
|
+
const childRel = rel ? rel + '/' + e.name : e.name;
|
|
5505
|
+
if (e.isDirectory()) {
|
|
5506
|
+
walk(childAbs, displayRoot, childRel);
|
|
5507
|
+
} else if (e.isFile()) {
|
|
5508
|
+
scannedFiles++;
|
|
5509
|
+
if (!SENSITIVE_PATTERNS.some((re) => re.test(e.name))) continue;
|
|
5510
|
+
let st;
|
|
5511
|
+
try { st = fs.statSync(childAbs); } catch { continue; }
|
|
5512
|
+
if (process.platform === 'win32') {
|
|
5513
|
+
// Windows POSIX mode bits don't carry meaningful ACL info.
|
|
5514
|
+
// Flag every sensitive file with a manual-review note rather
|
|
5515
|
+
// than emit a noisy permission claim that's likely wrong.
|
|
5516
|
+
findings.push({
|
|
5517
|
+
path: `${displayRoot}/${childRel}`,
|
|
5518
|
+
mode: null,
|
|
5519
|
+
severity: 'info',
|
|
5520
|
+
issue: 'win32_acl_check_not_implemented',
|
|
5521
|
+
hint: 'On Windows the POSIX mode bits are not load-bearing. Use icacls to confirm only the current user has read access. Tracked for v0.14+.',
|
|
5522
|
+
});
|
|
5523
|
+
continue;
|
|
5524
|
+
}
|
|
5525
|
+
const mode = st.mode & 0o777;
|
|
5526
|
+
if ((mode & 0o077) !== 0) {
|
|
5527
|
+
findings.push({
|
|
5528
|
+
path: `${displayRoot}/${childRel}`,
|
|
5529
|
+
mode: '0' + mode.toString(8),
|
|
5530
|
+
severity: 'warn',
|
|
5531
|
+
issue: 'group_or_other_readable',
|
|
5532
|
+
hint: `chmod 600 '${childAbs}' # NEW-CTRL-050: AI-assistant configs holding MCP tokens / API keys must be 0600 to defeat unprivileged exfil`,
|
|
5533
|
+
});
|
|
5534
|
+
}
|
|
5535
|
+
}
|
|
5536
|
+
}
|
|
5537
|
+
}
|
|
5538
|
+
for (const d of AI_CONFIG_DIRS) {
|
|
5539
|
+
const abs = path.join(HOME, d.dir);
|
|
5540
|
+
if (fs.existsSync(abs)) {
|
|
5541
|
+
scannedDirs++;
|
|
5542
|
+
walk(abs, d.display, '');
|
|
5543
|
+
}
|
|
5544
|
+
}
|
|
5545
|
+
const errorFindings = findings.filter((f) => f.severity === 'warn');
|
|
5546
|
+
checks.ai_config = {
|
|
5547
|
+
ok: errorFindings.length === 0,
|
|
5548
|
+
severity: errorFindings.length > 0 ? 'warn' : 'info',
|
|
5549
|
+
scanned_dirs: scannedDirs,
|
|
5550
|
+
scanned_files: scannedFiles,
|
|
5551
|
+
directories_inspected: AI_CONFIG_DIRS.map((d) => d.display),
|
|
5552
|
+
sensitive_patterns: ['settings.json', 'mcp.json', '*.mcp_config.json', 'api_key*', '*.token', '*.credentials'],
|
|
5553
|
+
findings,
|
|
5554
|
+
platform: process.platform,
|
|
5555
|
+
control_reference: 'NEW-CTRL-050 (MAL-2026-SHAI-HULUD-OSS lesson)',
|
|
5556
|
+
};
|
|
5557
|
+
if (errorFindings.length > 0) issues.push('ai_config');
|
|
5558
|
+
}
|
|
5559
|
+
|
|
5456
5560
|
// Walk every check and split: errors (severity error/missing/fail) vs warnings
|
|
5457
5561
|
// (severity warn). all_green is true ONLY when zero errors AND zero warnings.
|
|
5458
5562
|
const warnList = [];
|
package/data/_indexes/_meta.json
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.1.0",
|
|
3
|
-
"generated_at": "2026-05-
|
|
3
|
+
"generated_at": "2026-05-18T04:13:12.063Z",
|
|
4
4
|
"generator": "scripts/build-indexes.js",
|
|
5
5
|
"source_count": 54,
|
|
6
6
|
"source_hashes": {
|
|
7
|
-
"manifest.json": "
|
|
7
|
+
"manifest.json": "0d7cc1e5a718515519e81b973126f0fe316ad8252e4c8e04f54934ea575a9b80",
|
|
8
8
|
"data/atlas-ttps.json": "2b021f47355365d1ba59078dfa582397c7a64c2b4ebea4657ea260a66b76daf6",
|
|
9
|
-
"data/attack-techniques.json": "
|
|
10
|
-
"data/cve-catalog.json": "
|
|
11
|
-
"data/cwe-catalog.json": "
|
|
9
|
+
"data/attack-techniques.json": "76461dbec048c5e072435d57e3a04b780e3992dab9f316b1b52608e0a997e355",
|
|
10
|
+
"data/cve-catalog.json": "4b8c05074744f9e099c776e0f9c3afd2b978fc52d702bc8805c3b5bfecdbafcb",
|
|
11
|
+
"data/cwe-catalog.json": "4a0036f9ec17af29e0df111ac77b94f8be6a52742bfd89ff3583096d23b75e35",
|
|
12
12
|
"data/d3fend-catalog.json": "a1fc2827ceb344669e148d55197dbf1b0e5b20bcc618e90517639c17d67ee82d",
|
|
13
13
|
"data/dlp-controls.json": "d2406c482dddd30e49203879999dc4b3a7fd4d0494d6a61d86b91ee76415df19",
|
|
14
|
-
"data/exploit-availability.json": "
|
|
15
|
-
"data/framework-control-gaps.json": "
|
|
14
|
+
"data/exploit-availability.json": "ec2656f0d9a893610e27b43eb6035fe9b18e057c9f6dfaac7e7d4959bbcbb795",
|
|
15
|
+
"data/framework-control-gaps.json": "994bf3203f3a2c80fe21194d00f67ecffa77b80193ba3f4b046e9d38e7b09f0f",
|
|
16
16
|
"data/global-frameworks.json": "9ba563a85f7f8d6c3c957de64945e20925a89d0ed6ea6fc561cf093811acf558",
|
|
17
17
|
"data/rfc-references.json": "e253a548c8a829d178d5aea601e268724b85c936ccbfa51c2e5d80c5f8efe2b0",
|
|
18
|
-
"data/zeroday-lessons.json": "
|
|
19
|
-
"skills/kernel-lpe-triage/skill.md": "
|
|
20
|
-
"skills/ai-attack-surface/skill.md": "
|
|
21
|
-
"skills/mcp-agent-trust/skill.md": "
|
|
22
|
-
"skills/framework-gap-analysis/skill.md": "
|
|
23
|
-
"skills/compliance-theater/skill.md": "
|
|
24
|
-
"skills/exploit-scoring/skill.md": "
|
|
25
|
-
"skills/rag-pipeline-security/skill.md": "
|
|
26
|
-
"skills/ai-c2-detection/skill.md": "
|
|
27
|
-
"skills/policy-exception-gen/skill.md": "
|
|
28
|
-
"skills/threat-model-currency/skill.md": "
|
|
29
|
-
"skills/global-grc/skill.md": "
|
|
30
|
-
"skills/zeroday-gap-learn/skill.md": "
|
|
31
|
-
"skills/pqc-first/skill.md": "
|
|
32
|
-
"skills/skill-update-loop/skill.md": "
|
|
33
|
-
"skills/security-maturity-tiers/skill.md": "
|
|
34
|
-
"skills/researcher/skill.md": "
|
|
35
|
-
"skills/attack-surface-pentest/skill.md": "
|
|
36
|
-
"skills/fuzz-testing-strategy/skill.md": "
|
|
37
|
-
"skills/dlp-gap-analysis/skill.md": "
|
|
38
|
-
"skills/supply-chain-integrity/skill.md": "
|
|
39
|
-
"skills/defensive-countermeasure-mapping/skill.md": "
|
|
40
|
-
"skills/identity-assurance/skill.md": "
|
|
41
|
-
"skills/ot-ics-security/skill.md": "
|
|
42
|
-
"skills/coordinated-vuln-disclosure/skill.md": "
|
|
43
|
-
"skills/threat-modeling-methodology/skill.md": "
|
|
44
|
-
"skills/webapp-security/skill.md": "
|
|
45
|
-
"skills/ai-risk-management/skill.md": "
|
|
46
|
-
"skills/sector-healthcare/skill.md": "
|
|
47
|
-
"skills/sector-financial/skill.md": "
|
|
48
|
-
"skills/sector-federal-government/skill.md": "
|
|
49
|
-
"skills/sector-energy/skill.md": "
|
|
18
|
+
"data/zeroday-lessons.json": "3d4c18977f2100f200e209dc55331931a5d0adc54af35879fc58f1b43deac56f",
|
|
19
|
+
"skills/kernel-lpe-triage/skill.md": "08b3e9815ba481c57c80f5fc0ccbf5bb7cbb41f570c235ba6ff9596b8c07354d",
|
|
20
|
+
"skills/ai-attack-surface/skill.md": "d1361c53c8360999e1ec6a403bcbfaa53d0afc11689e8781d26081196dd079d4",
|
|
21
|
+
"skills/mcp-agent-trust/skill.md": "19a6b54375808e59143070011328d8c936836845bca4a484108738bbef290694",
|
|
22
|
+
"skills/framework-gap-analysis/skill.md": "04e841fc426f92f20c254497b3b92b54d603062a0e6a617f3e9d607d6115c097",
|
|
23
|
+
"skills/compliance-theater/skill.md": "42babdc846b3e91af6be4698c7b5e876d9dd5cdb214d1aa2b4faceb6773e4ed1",
|
|
24
|
+
"skills/exploit-scoring/skill.md": "9f50b4d52c470d5616fc1626589843a5b2602d209436ded08cc9cc9885df770c",
|
|
25
|
+
"skills/rag-pipeline-security/skill.md": "4a64b4bc317141a219bcba40593f1994f791103381fd91c17ce23d06b0f6bc4e",
|
|
26
|
+
"skills/ai-c2-detection/skill.md": "490511ad517a0c3ad64f6a951c36cffb3109fed2c5da6376b5efc50e799e02a9",
|
|
27
|
+
"skills/policy-exception-gen/skill.md": "1e758322d74386f5c48d5bf5d7a4b4adfcef29553aca6d7c610845953beb8228",
|
|
28
|
+
"skills/threat-model-currency/skill.md": "38dc4369132fd199d10cebf3287ed8e35ffb0cf3eefbb98ec17d57027a5df7f1",
|
|
29
|
+
"skills/global-grc/skill.md": "57ca729034e9d33c527d869c1c4aa82fe37e496878a3cbcd9e5043cb62b7105d",
|
|
30
|
+
"skills/zeroday-gap-learn/skill.md": "adcb681f90ab3c58a98c7935fd8bad102d7ed16b6db6235661483ec1be6cf410",
|
|
31
|
+
"skills/pqc-first/skill.md": "07b38278b60d2437603a541c1ee954999abfe3a192f94b43cd384023738a0c1f",
|
|
32
|
+
"skills/skill-update-loop/skill.md": "eb67e2466230e143784b6e741c6ce7ea3e0c0e4385e5ab21b81b8de04f0168e2",
|
|
33
|
+
"skills/security-maturity-tiers/skill.md": "c1e699e4d48a7f89c32fbc9f2fe64c721a61603624eb93afae7148348cc4637d",
|
|
34
|
+
"skills/researcher/skill.md": "959aeba706eea43a69136561968d7942dcd981d0a6c3da7db47673c51943b6df",
|
|
35
|
+
"skills/attack-surface-pentest/skill.md": "e845c4e08adef038888a025bf920a042c851df41ca53f41aa5fc11ec02a37fbb",
|
|
36
|
+
"skills/fuzz-testing-strategy/skill.md": "1088d1ef5a0b4b2e50b356e3ff766a3ba6c66ba3435caf394d7c9c493d45b17e",
|
|
37
|
+
"skills/dlp-gap-analysis/skill.md": "6aa0960d85465006cdffcce3478dc790a14fd1cc95c73e124d5809836c26a4c4",
|
|
38
|
+
"skills/supply-chain-integrity/skill.md": "aea9c61c09e1ec714e129a6000d7b91ddbc74db52a64aa8bc95d3c698bf4ece6",
|
|
39
|
+
"skills/defensive-countermeasure-mapping/skill.md": "331a0248dd8ed3b509b759c41a9a4d6d8d6dc67fb732ad31d1a4c2d9a0865054",
|
|
40
|
+
"skills/identity-assurance/skill.md": "f3c29ce17aaa426b65b58238e5bc9ccabcda23a8d350e597840e5d6d664aa102",
|
|
41
|
+
"skills/ot-ics-security/skill.md": "33d3d82c87ed8708839f5211bb7b59a924c2e3d9c5d915dc2cc101c53176145e",
|
|
42
|
+
"skills/coordinated-vuln-disclosure/skill.md": "6c85b8761e557069ae0623400a2218a81356e5426f0a4e3ddebdc2a569735c9b",
|
|
43
|
+
"skills/threat-modeling-methodology/skill.md": "ba175224737571f9c6148e4cbe47b9ebaa762592cc659b7fb2cf0e9a6b3679c0",
|
|
44
|
+
"skills/webapp-security/skill.md": "135ca1cd01476b4df9ba7fbba2f194d0cac521480b51d479d60045d9abfc0350",
|
|
45
|
+
"skills/ai-risk-management/skill.md": "686f53c2aee3a44108d1fa3e5f52fc7d971edc00946cfc1f082e4658af25fddc",
|
|
46
|
+
"skills/sector-healthcare/skill.md": "9f3164def71c1f6f78b074ffc452bd02d8b71b313f2feb1554289bd5a099b4e9",
|
|
47
|
+
"skills/sector-financial/skill.md": "4c4c6fb95c6c2fd6cad3fec8ab8e08076fd4ddfa89ad5f00de017e546e01044d",
|
|
48
|
+
"skills/sector-federal-government/skill.md": "91e3eecdc18d108c669d49db1221ac89041a43c8294c8be65d4397cd149d75d0",
|
|
49
|
+
"skills/sector-energy/skill.md": "efc7681d62b23aaad277e9018687362717bb1fcfb29d7ada844dfb7196870c78",
|
|
50
50
|
"skills/sector-telecom/skill.md": "59193e39c2fd73fdd7fede38a956bc730bbe4b712d7d6020788bb4d85f001ad8",
|
|
51
|
-
"skills/api-security/skill.md": "
|
|
52
|
-
"skills/cloud-security/skill.md": "
|
|
53
|
-
"skills/container-runtime-security/skill.md": "
|
|
54
|
-
"skills/mlops-security/skill.md": "
|
|
51
|
+
"skills/api-security/skill.md": "8a79a28b7b1c3088672bc09017a0d2481e45fb1c0f89768e87642268b62d4808",
|
|
52
|
+
"skills/cloud-security/skill.md": "84844b369f3195eae06115b392b4ceb41d96c1b3fda254f82c37cd8165858e7f",
|
|
53
|
+
"skills/container-runtime-security/skill.md": "d608fc7cc9e7c89640101078623490596b1610f7020eecde0d696e5c5084f932",
|
|
54
|
+
"skills/mlops-security/skill.md": "44fc3a4a6118e764a4bef840358c98d01b87f6e47bac9dd88e2df7633573414a",
|
|
55
55
|
"skills/incident-response-playbook/skill.md": "2017515d899c1b2bcb878bc6731e4059623ac52345b2cebbd92204583657bf60",
|
|
56
56
|
"skills/ransomware-response/skill.md": "2e4fc488f86ed1ba7791ab0e7021160d8ca5ad33a02cdf92a5b916c8afecaa54",
|
|
57
|
-
"skills/email-security-anti-phishing/skill.md": "
|
|
58
|
-
"skills/age-gates-child-safety/skill.md": "
|
|
59
|
-
"skills/cloud-iam-incident/skill.md": "
|
|
57
|
+
"skills/email-security-anti-phishing/skill.md": "250f266908f51f99a4cb3aec0d5dacfcf91fac9f3d95e5a117429a40ed2ff45a",
|
|
58
|
+
"skills/age-gates-child-safety/skill.md": "51ffbbc0743daa26d6c7fe55ff6ec223dccb2087ddca981e06ab7133230e9ec5",
|
|
59
|
+
"skills/cloud-iam-incident/skill.md": "5ec3800a0049b2123aff67bfab4ff28491a86d2daeb712283e5e88b10c3d5d7b",
|
|
60
60
|
"skills/idp-incident-response/skill.md": "e67a2576e7f1c3bf89f499f5c977bc470ef29e8b3e3e45f4cb5bd45a82674282"
|
|
61
61
|
},
|
|
62
62
|
"skill_count": 42,
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"handoff_dag_nodes": 42,
|
|
79
79
|
"summary_cards": 42,
|
|
80
80
|
"section_offsets_skills": 42,
|
|
81
|
-
"token_budget_total_approx":
|
|
81
|
+
"token_budget_total_approx": 416983,
|
|
82
82
|
"recipes": 8,
|
|
83
83
|
"jurisdiction_clocks": 29,
|
|
84
84
|
"did_ladders": 8,
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"artifact": "data/exploit-availability.json",
|
|
56
56
|
"path": "data/exploit-availability.json",
|
|
57
57
|
"schema_version": "1.1.0",
|
|
58
|
-
"entry_count":
|
|
58
|
+
"entry_count": 28
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"date": "2026-05-15",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"artifact": "data/framework-control-gaps.json",
|
|
64
64
|
"path": "data/framework-control-gaps.json",
|
|
65
65
|
"schema_version": "1.0.0",
|
|
66
|
-
"entry_count":
|
|
66
|
+
"entry_count": 142
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
"date": "2026-05-15",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"artifact": "data/cve-catalog.json",
|
|
103
103
|
"path": "data/cve-catalog.json",
|
|
104
104
|
"schema_version": "1.0.0",
|
|
105
|
-
"entry_count":
|
|
105
|
+
"entry_count": 38
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
"date": "2026-05-13",
|