@blamejs/exceptd-skills 0.16.22 → 0.16.24
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/ARCHITECTURE.md +2 -2
- package/CHANGELOG.md +42 -0
- package/CONTEXT.md +9 -9
- package/README.md +3 -3
- package/agents/report-generator.md +2 -2
- package/agents/skill-updater.md +1 -1
- package/agents/source-validator.md +3 -4
- package/agents/threat-researcher.md +1 -1
- package/bin/exceptd.js +91 -32
- package/data/_indexes/_meta.json +10 -10
- package/data/_indexes/activity-feed.json +12 -12
- package/data/_indexes/chains.json +70435 -4026
- package/data/_indexes/frequency.json +492 -163
- package/data/_indexes/section-offsets.json +51 -51
- package/data/_indexes/summary-cards.json +272 -106
- package/data/_indexes/token-budget.json +10 -10
- package/data/_indexes/trigger-table.json +15 -6
- package/data/_indexes/xref.json +218 -26
- package/data/cve-catalog.json +10 -10
- package/data/cwe-catalog.json +1 -0
- package/lib/auto-discovery.js +39 -1
- package/lib/collectors/ai-api.js +112 -7
- package/lib/collectors/citation-hygiene.js +27 -0
- package/lib/collectors/crypto-codebase.js +25 -0
- package/lib/collectors/kernel.js +32 -2
- package/lib/collectors/library-author.js +30 -0
- package/lib/collectors/runtime.js +38 -3
- package/lib/collectors/sbom.js +21 -2
- package/lib/collectors/scan-excludes.js +4 -1
- package/lib/collectors/secrets.js +125 -0
- package/lib/cve-cli.js +9 -1
- package/lib/cve-curation.js +8 -1
- package/lib/cve-regression-watcher.js +5 -2
- package/lib/exit-codes.js +2 -0
- package/lib/flag-suggest.js +1 -1
- package/lib/lint-skills.js +70 -0
- package/lib/playbook-runner.js +75 -14
- package/lib/prefetch.js +24 -1
- package/lib/refresh-external.js +32 -3
- package/lib/rfc-cli.js +8 -1
- package/lib/scoring.js +36 -8
- package/lib/validate-cve-catalog.js +36 -14
- package/lib/validate-package.js +8 -0
- package/lib/validate-playbooks.js +42 -0
- package/lib/verify.js +4 -3
- package/manifest-snapshot.json +4 -2
- package/manifest-snapshot.sha256 +1 -1
- package/manifest.json +57 -54
- package/orchestrator/README.md +1 -1
- package/orchestrator/index.js +65 -7
- package/orchestrator/scanner.js +53 -5
- package/package.json +1 -1
- package/sbom.cdx.json +110 -110
- package/scripts/build-indexes.js +42 -8
- package/scripts/builders/cwe-chains.js +1 -0
- package/scripts/builders/section-offsets.js +10 -2
- package/scripts/builders/token-budget.js +3 -3
- package/scripts/check-changelog-extract.js +38 -1
- package/scripts/check-sbom-currency.js +72 -0
- package/scripts/check-version-tags.js +5 -0
- package/scripts/release.js +22 -15
- package/skills/exploit-scoring/skill.md +8 -8
package/orchestrator/scanner.js
CHANGED
|
@@ -517,12 +517,60 @@ function probeTls(target) {
|
|
|
517
517
|
return match ? match[1] : null;
|
|
518
518
|
}
|
|
519
519
|
|
|
520
|
+
// Key names that signal a credential value, matched case-insensitively at any
|
|
521
|
+
// nesting depth. MCP server configs place real secrets inside `env` and
|
|
522
|
+
// `headers` sub-objects (e.g. env.OPENAI_API_KEY, headers.Authorization), so a
|
|
523
|
+
// top-level-only sweep leaks them into emitted findings.
|
|
524
|
+
const SECRET_KEY_RE = /token|key|secret|password|credential|auth|bearer|api[-_]?key|access[-_]?key/i;
|
|
525
|
+
|
|
526
|
+
// Value shapes that look like live credentials even under an innocuous key name
|
|
527
|
+
// (e.g. args: ['--token', 'sk-...'] or a positional bearer string).
|
|
528
|
+
const SECRET_VALUE_RES = [
|
|
529
|
+
/\bsk-[A-Za-z0-9_-]{8,}/, // OpenAI-style keys
|
|
530
|
+
/\bAKIA[0-9A-Z]{12,}/, // AWS access key id
|
|
531
|
+
/\bASIA[0-9A-Z]{12,}/, // AWS temporary access key id
|
|
532
|
+
/\bgh[pousr]_[A-Za-z0-9]{20,}/, // GitHub tokens
|
|
533
|
+
/\bxox[baprs]-[A-Za-z0-9-]{10,}/, // Slack tokens
|
|
534
|
+
/\bBearer\s+[A-Za-z0-9._-]{8,}/i, // Authorization: Bearer ...
|
|
535
|
+
/eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+/ // JWT
|
|
536
|
+
];
|
|
537
|
+
|
|
538
|
+
function looksLikeSecretValue(value) {
|
|
539
|
+
if (typeof value !== 'string') return false;
|
|
540
|
+
return SECRET_VALUE_RES.some((re) => re.test(value));
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Recursively redact credential-shaped data so nothing emitted to stdout or
|
|
544
|
+
// persisted carries an operator's live secrets. Redacts values of secret-named
|
|
545
|
+
// keys at any depth and any standalone string value that matches a known
|
|
546
|
+
// credential shape. Cycles are guarded with a seen-set.
|
|
547
|
+
function redactDeep(value, seen) {
|
|
548
|
+
if (value === null || typeof value !== 'object') {
|
|
549
|
+
return looksLikeSecretValue(value) ? '[REDACTED]' : value;
|
|
550
|
+
}
|
|
551
|
+
if (seen.has(value)) return '[CIRCULAR]';
|
|
552
|
+
seen.add(value);
|
|
553
|
+
|
|
554
|
+
if (Array.isArray(value)) {
|
|
555
|
+
return value.map((item) => redactDeep(item, seen));
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
const out = {};
|
|
559
|
+
for (const key of Object.keys(value)) {
|
|
560
|
+
if (SECRET_KEY_RE.test(key)) {
|
|
561
|
+
out[key] = '[REDACTED]';
|
|
562
|
+
} else {
|
|
563
|
+
out[key] = redactDeep(value[key], seen);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return out;
|
|
567
|
+
}
|
|
568
|
+
|
|
520
569
|
function sanitizeConfig(obj) {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
if (/token|key|secret|password|credential/i.test(key)) safe[key] = '[REDACTED]';
|
|
570
|
+
if (obj === null || typeof obj !== 'object') {
|
|
571
|
+
return looksLikeSecretValue(obj) ? '[REDACTED]' : obj;
|
|
524
572
|
}
|
|
525
|
-
return
|
|
573
|
+
return redactDeep(obj, new Set());
|
|
526
574
|
}
|
|
527
575
|
|
|
528
576
|
function loadJson(filename) {
|
|
@@ -533,4 +581,4 @@ function loadJson(filename) {
|
|
|
533
581
|
}
|
|
534
582
|
}
|
|
535
583
|
|
|
536
|
-
module.exports = { scan, scanDomain };
|
|
584
|
+
module.exports = { scan, scanDomain, sanitizeConfig };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blamejs/exceptd-skills",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.24",
|
|
4
4
|
"description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (439 CVEs / 177 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-security",
|