@blamejs/exceptd-skills 0.12.2 → 0.12.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -32,6 +32,8 @@ Also read [CONTEXT.md](CONTEXT.md) for a complete orientation to the skill syste
32
32
 
33
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
34
 
35
+ 14. **Primary-source IoC review** — Any CVE entry in `data/cve-catalog.json` whose `poc_available: true` AND whose exploit code is publicly available (published PoC repo, vendor advisory with attached payload, researcher blog with reproducer) must include `iocs` populated from a line-level cross-reference of the published source — not from secondary-source paraphrase. The `iocs` block records which IoC categories were extracted (`payload_artifacts`, `persistence_artifacts`, `credential_paths_scanned`, `c2_indicators`, `host_recon`, `behavioral`, `runtime_syscall`, `kernel_trace`, `livepatch_gap`, `destructive`, `payload_content_patterns`, `supply_chain_entry_vectors`), and each IoC must be traceable to a specific source URL or commit hash. v0.12.6 audit reviewed CVE-2026-45321 (Mini Shai-Hulud), CVE-2026-31431 (Copy Fail / Dirty Pipe / Dirty COW family), CVE-2026-43284 + CVE-2026-43500 (Dirty Frag pair), CVE-2025-53773 (Copilot YOLO mode), and CVE-2026-30615 (Windsurf MCP) against primary sources from Aikido, StepSecurity, Socket, Wiz, Datadog, Sysdig, Trail of Bits, Invariant Labs, Embrace the Red, NVD, MSRC. Catalog updates landed in v0.12.6 changelog. Skipping this audit is equivalent to shipping "untested security advice" — the IoC list IS the operator-facing detection contract.
36
+
35
37
  ---
36
38
 
37
39
  ## Seven-phase playbook contract
package/CHANGELOG.md CHANGED
@@ -1,5 +1,161 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.6 — 2026-05-13
4
+
5
+ **Patch: primary-source IoC audit across the catalog — five CVEs reviewed line-level against published exploit source. AGENTS.md Hard Rule #14 added.**
6
+
7
+ Five research agents dispatched in parallel to cross-reference our IoC list for each catalogued CVE against published exploit source / vendor advisories / researcher writeups. Roughly 60 IoCs added, one major CVSS correction, two CVEs gained an `iocs` block where they previously had `null`.
8
+
9
+ ### CVE-2025-53773 (Copilot YOLO mode) — major correction
10
+
11
+ The catalog entry was directionally right (prompt-injection RCE in an AI tool) but factually wrong on the specifics defenders need:
12
+ - **CVSS corrected 9.6 → 7.8** (AV:N → AV:L). The attack is local-vector via developer-side IDE interaction; the attacker doesn't reach in over the network. NVD authoritative.
13
+ - **Vector corrected** from "PR descriptions" to **`.vscode/settings.json:chat.tools.autoApprove` write coerced by any agent-readable content** (source comments, README, issue bodies, MCP tool responses).
14
+ - **iocs populated** (was null) with primary post-exploitation indicator: `.vscode/settings.json` containing `"chat.tools.autoApprove": true`. Workspace AND user-global. Includes invisible Unicode Tag-block (U+E0000–U+E007F) variant detection.
15
+ - **affected_versions** specified: Visual Studio 2022 `>=17.14.0, <17.14.12` + Copilot Chat extension predating August 2025 Patch Tuesday.
16
+ - **CWE-77** added.
17
+ - **Worm propagation** documented (Rehberger demonstrated git-commit + push of malicious settings file).
18
+
19
+ Source: Embrace the Red (Rehberger, August 2025), NVD, MSRC, Wiz vulnerability database.
20
+
21
+ ### CVE-2026-45321 (Mini Shai-Hulud) — expanded from 4 to 8 IoC categories
22
+
23
+ Added: payload SHA-256 hashes (`ab4fcadaec49c0...` for router_init.js, `2ec78d556d696...` for tanstack_runner.js), attacker fork commit (`79ac49eedf774dd...`), tarball-size anomaly threshold (~3.7× = ~900KB vs ~190KB), `gh-token-monitor` daemon family (LaunchAgent label is `com.user.gh-token-monitor`, NOT `com.tanstack.*` as previously cataloged), three C2 channels (`git-tanstack.com`, `filev2.getsession.org`, `api.masscan.cloud`), GitHub dead-drop description strings (`A Mini Shai-Hulud has Appeared`, `Sha1-Hulud: The Second Coming.`, `Shai-Hulud Migration`), full credential-search-path corpus (~/.aws, ~/.ssh, ~/.kube, ~/.claude.json, crypto wallets), env-var harvest list, worm-propagated workflow signature (`.github/workflows/codeql_analysis.yml`), ransom string (`IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner` — zero-FP campaign signature).
24
+
25
+ Source: Aikido / StepSecurity / Socket / Wiz / Datadog / Sysdig / Pulsedive primary writeups on the original September 2025 Shai-Hulud worm and the May 2026 Mini variant.
26
+
27
+ ### CVE-2026-31431 (Copy Fail) — iocs added (was missing)
28
+
29
+ Catalog had no `iocs` field. Added: `/etc/passwd` multiple-uid-zero post-exploit signal; setuid binary drift via `rpm -Va` / `debsums -c`; runtime syscall indicators (splice from RO fd into pipe — Dirty Pipe primitive; userfaultfd from unprivileged when sysctl permits; ptrace POKEDATA against /proc/<pid>/mem); kernel-trace indicators (ftrace `splice_write`, eBPF kprobe on `copy_page_to_iter`, auditd `splice_unpriv` rule, dmesg BUG in mm/filemap.c+mm/memory.c+fs/splice.c); behavioral (process Uid transition without setuid-execve = DirtyCred signal; root shell with non-suid parent); livepatch-evasion-window gap (kernel in affected range + `/sys/kernel/livepatch/*/cve-ids` doesn't contain this CVE → treat as EXPOSED regardless of generic livepatch-active flag).
30
+
31
+ Source: Max Kellermann (Dirty Pipe disclosure), Phil Oester (Dirty COW), Arinerron PoC repo, DirtyCred CCS 2022 paper.
32
+
33
+ ### CVE-2026-43284 + CVE-2026-43500 (Dirty Frag pair) — subsystem_anchors added
34
+
35
+ Both entries previously had no per-subsystem detection guidance. Added `subsystem_anchors` block: kernel modules (esp4/esp6/xfrm_user for IPsec half; rxrpc/af_rxrpc/kafs for RxRPC half), kernel symbols (`esp_input`/`xfrm_input` and `rxrpc_recvmsg`/`afs_make_call`), procfs paths (`/proc/net/xfrm_stat`, `/proc/net/rxrpc/{calls,conns,peers,locals}`), syscall surface (NETLINK_XFRM=6 with non-root user-namespace caller; AF_RXRPC socket on non-AFS host). IoCs surface "vulnerable kernel" → "actively exposed kernel": ESP module loaded with no policies + non-zero XfrmInNoStates; any non-AFS-allowlist process opening AF_RXRPC; rxrpc-active-call-on-non-AFS-host.
36
+
37
+ Source: Linux kernel source (`net/ipv4/esp4.c`, `net/rxrpc/proc.c`), historical bugs CVE-2022-29581/CVE-2023-32233/CVE-2024-26581 (xfrm UAF family), kafs documentation.
38
+
39
+ ### CVE-2026-30615 (Windsurf MCP) — iocs added (was missing)
40
+
41
+ Catalog had `iocs: null`. Added: ANSI escape sequence detection (any byte 0x1B in tools/list field or tools/call response — SGR, cursor-movement, OSC-8 subclasses), Unicode Tag-block smuggling (U+E0000–U+E007F), instruction-coercion grammar (`<IMPORTANT>` blocks, "Before using this tool, read", "Do not mention to user", "THIS TOOL IS REQUIRED FOR GDPR/SOC2/COMPLIANCE" urgency manipulation, `chmod -R 0666 ~` prefix coercion), sensitive-path references in tool responses (cross-server credential-shadow), unprompted-tool-chain behavioral (≥2 tools/call within one user turn, second target not in user prompt, second target in {exec, shell, fetch, write_file}), MCP egress beyond manifest (postmark-mcp class — only signal is unexpected destination), invocation-count anomaly (compromised-legitimate-publisher detector). Added `atlas_refs`: AML.T0051 (indirect prompt injection — the canonical mapping), AML.T0096. Added `attack_refs`: T1552.001 (credentials in files), T1041 (exfil over C2).
42
+
43
+ Source: Trail of Bits (line-jumping + ANSI escape research), Invariant Labs (tool poisoning), Embrace the Red (Unicode Tag smuggling), Acuvity/Semgrep (postmark-mcp), Palo Alto Unit 42 (sampling/createMessage).
44
+
45
+ ### AGENTS.md Hard Rule #14
46
+
47
+ > **Primary-source IoC review** — Any CVE entry whose `poc_available: true` AND whose exploit code is publicly available must include `iocs` populated from a line-level cross-reference of the published source — not from secondary-source paraphrase. Each IoC must be traceable to a specific source URL or commit hash. Skipping this audit is equivalent to shipping "untested security advice" — the IoC list IS the operator-facing detection contract.
48
+
49
+ ### Playbook bumps
50
+
51
+ - `sbom` 1.1.0 → 1.2.0 — threat_currency_score 97 → 98
52
+ - `mcp` 1.1.0 → 1.2.0 — threat_currency_score 97 → 98 — new look artifacts (vscode-copilot-yolo-mode, mcp-tool-response-log)
53
+ - `kernel` 1.0.0 → 1.1.0 — threat_currency_score 92 → 95
54
+
55
+ All three `last_threat_review: 2026-05-13`.
56
+
57
+ ### Method
58
+
59
+ Five parallel researcher agents dispatched via the project's multi-agent pattern (CLAUDE.md "Parallel agent dispatch for large patches"). Each agent owned one CVE; each returned a structured gap report with category, pattern, source citation (URL + quote), and ready-to-paste JSON. Main thread integrated. Hard Rule #14 codifies the pattern for every subsequent catalog addition.
60
+
61
+ ## 0.12.5 — 2026-05-13
62
+
63
+ **Patch: root cause of the signature regression — a test was generating a fresh keypair mid-suite.**
64
+
65
+ ### The actual bug
66
+
67
+ `tests/operator-bugs.test.js:#87 doctor --fix is registered (smoke)` invoked `exceptd doctor --fix` directly. On any host where `.keys/private.pem` was missing (every CI run, every fresh clone), `--fix` synchronously spawned `lib/sign.js generate-keypair`, which OVERWRITES `keys/public.pem` with a fresh Ed25519 public key.
68
+
69
+ After that point in the test suite:
70
+ - `keys/public.pem` = new key generated by the test
71
+ - `manifest.json` skill signatures = unchanged, still reference the COMMITTED private key
72
+ - Every subsequent step ran against a state where signatures cover content signed by Key-A but the public key on disk is Key-B
73
+ - `npm pack` shipped the new public.pem + the old (committed) manifest signatures
74
+ - `verify` on the published tarball failed 0/38 because the keys don't match
75
+
76
+ The reason it was invisible across v0.11.x and v0.12.x:
77
+ - The CI verify gate (predeploy gate 1) ran BEFORE the test that overwrote the key
78
+ - The local maintainer always had `.keys/private.pem` present, so `--fix` was a no-op locally → local verify always passed
79
+ - npm-installed operators ran `exceptd doctor --signatures` and saw 0/38, but no CI gate caught the broken tarball before publish
80
+ - The new `verify-shipped-tarball` gate (v0.12.3) caught the symptom but the forensic logging in v0.12.4 was the first time we saw HEAD's public.pem fingerprint differ from the source-tree pubkey 19 seconds later in the same CI run
81
+
82
+ ### The fix
83
+
84
+ Pre-stage a dummy `.keys/private.pem` before invoking `doctor --fix` in the test, so `lib/sign.js generate-keypair` sees "private key already present" and exits before any key write. Restore the pre-test state in `finally{}`. The test still asserts the verb is registered + emits JSON, which is the only thing the smoke check needs to verify.
85
+
86
+ ### Why v0.12.3 and v0.12.4 didn't fix it
87
+
88
+ v0.12.3 added the `verify-shipped-tarball` gate which correctly BLOCKED the broken publish. v0.12.4 added per-file forensic logging which surfaced the exact divergence (source-tree fingerprint at gate 1 vs. gate 14). Neither release attempted to fix the root cause because we hadn't yet localized it to `doctor --fix` invocation inside a test. v0.12.5 is the actual fix.
89
+
90
+ ### Operator impact
91
+
92
+ This release SHOULD publish cleanly — the test no longer mutates `keys/public.pem` during the suite, so the post-test source tree matches the pre-test source tree, the packed tarball signatures verify against the packed public key, and the gate passes. Operators running `exceptd doctor --signatures` on v0.12.5 should see `38/38 skills passed Ed25519 verification` for the first time since v0.11.0.
93
+
94
+ ### Lessons codified in CLAUDE.md
95
+
96
+ - "Tests that invoke a real CLI verb that mutates filesystem state outside the test's tempdir are a CI-vs-local divergence engine." Always sandbox key-writing CLI invocations.
97
+ - "Smoke tests should not exercise mutating code paths." A test named `*is registered (smoke)` should only verify dispatch, not run the verb's side effects.
98
+
99
+ ## 0.12.4 — 2026-05-13
100
+
101
+ **Patch: forensic instrumentation for the signature-regression gate. v0.12.3 publish was blocked by the gate; v0.12.4 adds the diagnostic data needed to pinpoint the root cause on the next CI run.**
102
+
103
+ The v0.12.3 release was blocked at the new `verify-shipped-tarball` gate — exactly the behavior intended (better blocked publish than silent broken tarball). But the gate didn't log enough detail to pinpoint WHICH files diverge between source-tree and npm-packed tarball in CI. v0.12.4 adds per-file forensics + a working-tree drift dump.
104
+
105
+ ### What's new
106
+
107
+ - `scripts/verify-shipped-tarball.js`: on signature-fail, logs the size + sha256 of both the tarball-extracted content AND the source-tree content, plus whether the bytes are equal. Local pass-paths unchanged.
108
+ - `.github/workflows/release.yml`: new "Forensic — working-tree drift since checkout" step (runs `if: always()` so it fires even when prior gates fail). Dumps `git status --porcelain` + `git diff --stat HEAD` + `ls -la` of the case-mixed skill directory. The next CI failure surfaces the exact file-level divergence.
109
+
110
+ ### Why this isn't the root-cause fix
111
+
112
+ The bug is platform-specific: local `npm pack` on Windows produces a tarball that verifies 38/38. CI's `npm pack` on Ubuntu produces a tarball that verifies 0/38 — even though pubkey fingerprints match between source and tarball. The content drift has to be in a file the manifest signatures cover, but the signed bytes match between Windows and Linux (`.gitattributes` LF-normalizes). Forensics on the next run should make it obvious; this release ships the instrumentation, not the underlying fix.
113
+
114
+ ### Operator impact
115
+
116
+ v0.12.2 remains the latest npm-published version. Operators who ran `npm install -g @blamejs/exceptd-skills` see 0/38 verify on `exceptd doctor --signatures`. Until v0.12.4 (or later) publishes successfully, the integrity gate is open. Mitigations:
117
+
118
+ - `exceptd run`, `exceptd ci`, etc. do NOT block on signature verification — they continue to function with the catalog content as installed. The skill bytes themselves are intact (npm has its own tarball integrity check; only the per-skill Ed25519 attestation layer is broken).
119
+ - For audit purposes: the supply-chain trust anchor through npm provenance (OIDC + sigstore via `npm publish --provenance`) is unaffected. Confirm with `npm view @blamejs/exceptd-skills attestations`.
120
+
121
+ ### Shai-Hulud source audit (open question, not in this release)
122
+
123
+ The original Shai-Hulud campaign (2024) and Mini Shai-Hulud (CVE-2026-45321, 2026-05-11) are documented in public security research. v0.11.15 added CVE-2026-45321 to the catalog based on the description of the attack, not from a line-by-line reading of the published payload. Cross-referencing the actual payload source for IoCs we may have missed is scoped for v0.12.5:
124
+
125
+ - Walk the published worm source line-by-line; enumerate every credential path, every persistence vector, every C2 indicator.
126
+ - Compare against `data/cve-catalog.json:CVE-2026-45321.iocs` and the seven detect indicators in `data/playbooks/sbom.json` we ship.
127
+ - Add any missing patterns as additional indicators; update CHANGELOG with the line-level diff.
128
+
129
+ Same audit pattern should be applied to Copy Fail (CVE-2026-31431) and other open-sourced CVEs the catalog references — currently every CVE entry was assembled from secondary sources (advisories, NVD descriptions) rather than primary-source code review. v0.12.5 codifies the "primary-source review required before catalog entry" rule in AGENTS.md Hard Rule #14.
130
+
131
+ ## 0.12.3 — 2026-05-13
132
+
133
+ **Patch: critical signature-verification regression fix + 14th predeploy gate to prevent recurrence.**
134
+
135
+ ### The critical bug
136
+
137
+ Every release from v0.11.x through v0.12.2 shipped a tarball whose `keys/public.pem` did not match the Ed25519 signatures inside `manifest.json`. The result: `node lib/verify.js` against a fresh `npm install` reported `0/38 skills passed Ed25519 verification` and every skill listed as `TAMPERED`. Verification was silently bypassed by `exceptd run`, `exceptd ci`, etc. (which load skills without re-verifying), so the surface was only visible to operators running `exceptd doctor --signatures`.
138
+
139
+ ### What broke
140
+
141
+ The CI release workflow's `verify` step ran against the SOURCE tree (which had matching signatures + public key). It passed `38/38`. But the tarball that `npm publish` actually uploaded ended up with a different `public.pem` than the source tree. Verifying-on-source-tree is not the same as verifying-on-shipped-tarball. The mismatch went undetected for the entire v0.11.x and v0.12.x series.
142
+
143
+ ### The fix
144
+
145
+ - `scripts/verify-shipped-tarball.js` — packs the package via `npm pack`, extracts the tarball to a temp dir, and runs Ed25519 verify against the **extracted tree**. Catches any divergence between source-tree state and shipped-tarball state. Logs both fingerprints (source vs. tarball) so any future mismatch is forensically obvious.
146
+ - Wired in as **the 14th predeploy gate** so local maintainers + CI both run it. A release that produces a broken tarball now blocks before `npm publish` instead of shipping silently.
147
+ - v0.12.3 re-signs every skill against the current public key, then runs the new gate to confirm the round-trip is clean.
148
+
149
+ ### Other fixes
150
+
151
+ - **#137**: help text bumped from `v0.11.0 canonical surface` → `v0.12.0 canonical surface`.
152
+ - **#136 (text part)**: legacy-verb removal target moved from v0.12 → v0.13 in help text and deprecation banner. Actually removing the verbs is scope for a future release.
153
+ - **#135 (the run-with-no-evidence exit-0 case)**: deferred to v0.12.4. The fix is straightforward (have `run` exit 3 when classification: inconclusive AND no observations submitted, matching `ci`'s semantic) but changes the `run` verb's contract, which deserves a focused release that also documents the behavior change.
154
+
155
+ ### Lesson codified in CLAUDE.md
156
+
157
+ "Verify-on-source-tree is not verify-on-shipped-tarball." Any project that signs artifacts must verify the EXACT bytes that downstream consumers receive, after `npm pack` (or equivalent packaging step). The next-easiest place to lose integrity is the file-set transformation between `git checkout` and the registry upload — and that transformation runs in CI, where the maintainer has the least visibility.
158
+
3
159
  ## 0.12.2 — 2026-05-13
4
160
 
5
161
  **Patch: end-to-end scenario gate — staged-IoC harness in release workflow.**
package/bin/exceptd.js CHANGED
@@ -110,7 +110,7 @@ const PLAYBOOK_VERBS = new Set([
110
110
  // v0.11.0 canonical surface:
111
111
  "brief", "run", "ai-run", "attest", "discover", "doctor", "ci", "ask",
112
112
  "verify-attestation", "run-all", "lint",
113
- // v0.10.x legacy verbs — kept as aliases with deprecation banner, removed in v0.12+:
113
+ // v0.10.x legacy verbs — kept as aliases with deprecation banner, scheduled for removal in v0.13:
114
114
  "plan", "govern", "direct", "look", "ingest", "reattest", "list-attestations",
115
115
  ]);
116
116
 
@@ -176,7 +176,7 @@ function printHelp() {
176
176
  Usage: exceptd <command> [args]
177
177
  npx @blamejs/exceptd-skills <command> [args]
178
178
 
179
- v0.11.0 canonical surface
179
+ v0.12.0 canonical surface
180
180
  ─────────────────────────
181
181
 
182
182
  brief [playbook] Unified info doc — jurisdictions + threat context
@@ -267,7 +267,7 @@ v0.11.0 canonical surface
267
267
  Sources: kev|epss|nvd|rfc|pins|ghsa (v0.12.0).
268
268
  ghsa drafts pass validator as warnings.
269
269
 
270
- v0.10.x compatibility (will be removed in v0.12)
270
+ v0.10.x compatibility (will be removed in v0.13)
271
271
  ────────────────────────────────────────────────
272
272
 
273
273
  These verbs still work but emit a one-time deprecation banner. The
@@ -394,7 +394,7 @@ function main() {
394
394
  (haveBrief
395
395
  ? `Prefer \`${LEGACY_VERB_REPLACEMENTS[cmd]}\` (available in this install, v${ver}). `
396
396
  : `Upgrade to v0.11.0+ then use \`${LEGACY_VERB_REPLACEMENTS[cmd]}\` (currently installed: v${ver}). `) +
397
- `Legacy verbs remain functional through this release; they will be removed in v0.12. ` +
397
+ `Legacy verbs remain functional through this release; they will be removed in v0.13. ` +
398
398
  `Suppress: export EXCEPTD_DEPRECATION_SHOWN=1.\n`
399
399
  );
400
400
  process.env.EXCEPTD_DEPRECATION_SHOWN = "1";
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-13T02:49:16.936Z",
3
+ "generated_at": "2026-05-13T03:59:25.652Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 49,
6
6
  "source_hashes": {
7
- "manifest.json": "c607b3254ea45ed898b325a4bacbfc1076d2669e813e2d4dcbbd9d6ab0cf73ec",
7
+ "manifest.json": "75ef49df2cf2bba6dc2326e19ede997e251820fdcb6392c65fe6244aa34e66da",
8
8
  "data/atlas-ttps.json": "1500b5830dab070c4252496964a8c0948e1052a656e2c7c6e1efaf0350645e13",
9
- "data/cve-catalog.json": "e9a3a4ce988caa051e50a467f1cd9c0dcbf9e8f6f3e9522610baf196217b7bdc",
9
+ "data/cve-catalog.json": "a2557e66c00334f9b2b07f7d1320a27fb0f82243f2ff199c4a39bf2933be5216",
10
10
  "data/cwe-catalog.json": "c3367d469b4b3d31e4c56397dd7a8305a0be338ecd85afa27804c0c9ce12157b",
11
11
  "data/d3fend-catalog.json": "b5cd14669e2a931d0df81bb8402f3c8ac08b0d2613e595eaecd8cc4631a57587",
12
12
  "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
@@ -689,12 +689,12 @@
689
689
  }
690
690
  },
691
691
  "CVE-2025-53773": {
692
- "name": "GitHub Copilot Prompt Injection RCE",
693
- "rwep": 42,
694
- "cvss": 9.6,
692
+ "name": "GitHub Copilot / VS Code 'YOLO mode' Prompt Injection RCE",
693
+ "rwep": 30,
694
+ "cvss": 7.8,
695
695
  "cisa_kev": false,
696
- "epss_score": 0.32,
697
- "epss_percentile": 0.92,
696
+ "epss_score": 0.046,
697
+ "epss_percentile": 0.893,
698
698
  "referencing_skills": [
699
699
  "ai-attack-surface",
700
700
  "mcp-agent-trust",