hackmyagent 0.10.1 → 0.11.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/README.md +108 -272
- package/dist/arp/index.d.ts +5 -1
- package/dist/arp/index.d.ts.map +1 -1
- package/dist/arp/index.js +38 -1
- package/dist/arp/index.js.map +1 -1
- package/dist/arp/monitors/skill-capability-monitor.d.ts +119 -0
- package/dist/arp/monitors/skill-capability-monitor.d.ts.map +1 -0
- package/dist/arp/monitors/skill-capability-monitor.js +258 -0
- package/dist/arp/monitors/skill-capability-monitor.js.map +1 -0
- package/dist/arp/telemetry/forwarder.d.ts +62 -0
- package/dist/arp/telemetry/forwarder.d.ts.map +1 -0
- package/dist/arp/telemetry/forwarder.js +106 -0
- package/dist/arp/telemetry/forwarder.js.map +1 -0
- package/dist/arp/telemetry/gtin.d.ts +87 -0
- package/dist/arp/telemetry/gtin.d.ts.map +1 -0
- package/dist/arp/telemetry/gtin.js +239 -0
- package/dist/arp/telemetry/gtin.js.map +1 -0
- package/dist/arp/telemetry/index.d.ts +6 -0
- package/dist/arp/telemetry/index.d.ts.map +1 -0
- package/dist/arp/telemetry/index.js +17 -0
- package/dist/arp/telemetry/index.js.map +1 -0
- package/dist/arp/types.d.ts +10 -0
- package/dist/arp/types.d.ts.map +1 -1
- package/dist/attack/index.d.ts +1 -1
- package/dist/attack/index.d.ts.map +1 -1
- package/dist/attack/index.js +5 -1
- package/dist/attack/index.js.map +1 -1
- package/dist/attack/payloads/context-window.d.ts +7 -0
- package/dist/attack/payloads/context-window.d.ts.map +1 -0
- package/dist/attack/payloads/context-window.js +110 -0
- package/dist/attack/payloads/context-window.js.map +1 -0
- package/dist/attack/payloads/index.d.ts +5 -1
- package/dist/attack/payloads/index.d.ts.map +1 -1
- package/dist/attack/payloads/index.js +17 -1
- package/dist/attack/payloads/index.js.map +1 -1
- package/dist/attack/payloads/memory-weaponization.d.ts +7 -0
- package/dist/attack/payloads/memory-weaponization.d.ts.map +1 -0
- package/dist/attack/payloads/memory-weaponization.js +110 -0
- package/dist/attack/payloads/memory-weaponization.js.map +1 -0
- package/dist/attack/payloads/supply-chain.d.ts +16 -0
- package/dist/attack/payloads/supply-chain.d.ts.map +1 -0
- package/dist/attack/payloads/supply-chain.js +187 -0
- package/dist/attack/payloads/supply-chain.js.map +1 -0
- package/dist/attack/payloads/tool-shadow.d.ts +16 -0
- package/dist/attack/payloads/tool-shadow.d.ts.map +1 -0
- package/dist/attack/payloads/tool-shadow.js +229 -0
- package/dist/attack/payloads/tool-shadow.js.map +1 -0
- package/dist/attack/scanner.d.ts.map +1 -1
- package/dist/attack/scanner.js +12 -0
- package/dist/attack/scanner.js.map +1 -1
- package/dist/attack/types.d.ts +1 -1
- package/dist/attack/types.d.ts.map +1 -1
- package/dist/attack/types.js +20 -0
- package/dist/attack/types.js.map +1 -1
- package/dist/checker/index.d.ts +2 -0
- package/dist/checker/index.d.ts.map +1 -1
- package/dist/checker/index.js +8 -1
- package/dist/checker/index.js.map +1 -1
- package/dist/checker/skill-dependency-graph.d.ts +55 -0
- package/dist/checker/skill-dependency-graph.d.ts.map +1 -0
- package/dist/checker/skill-dependency-graph.js +288 -0
- package/dist/checker/skill-dependency-graph.js.map +1 -0
- package/dist/cli.js +481 -66
- package/dist/cli.js.map +1 -1
- package/dist/hardening/index.d.ts +5 -0
- package/dist/hardening/index.d.ts.map +1 -1
- package/dist/hardening/index.js +11 -1
- package/dist/hardening/index.js.map +1 -1
- package/dist/hardening/scanner.d.ts +40 -0
- package/dist/hardening/scanner.d.ts.map +1 -1
- package/dist/hardening/scanner.js +991 -14
- package/dist/hardening/scanner.js.map +1 -1
- package/dist/hardening/security-check.d.ts +2 -0
- package/dist/hardening/security-check.d.ts.map +1 -1
- package/dist/hardening/skill-capability-validator.d.ts +31 -0
- package/dist/hardening/skill-capability-validator.d.ts.map +1 -0
- package/dist/hardening/skill-capability-validator.js +237 -0
- package/dist/hardening/skill-capability-validator.js.map +1 -0
- package/dist/hardening/skill-context.d.ts +22 -0
- package/dist/hardening/skill-context.d.ts.map +1 -0
- package/dist/hardening/skill-context.js +127 -0
- package/dist/hardening/skill-context.js.map +1 -0
- package/dist/hardening/taxonomy.d.ts +17 -0
- package/dist/hardening/taxonomy.d.ts.map +1 -0
- package/dist/hardening/taxonomy.js +152 -0
- package/dist/hardening/taxonomy.js.map +1 -0
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/plugins/credvault.js +2 -2
- package/dist/plugins/credvault.js.map +1 -1
- package/dist/plugins/secretless.d.ts +15 -0
- package/dist/plugins/secretless.d.ts.map +1 -0
- package/dist/plugins/secretless.js +199 -0
- package/dist/plugins/secretless.js.map +1 -0
- package/dist/plugins/signcrypt.d.ts.map +1 -1
- package/dist/plugins/signcrypt.js +17 -2
- package/dist/plugins/signcrypt.js.map +1 -1
- package/dist/plugins/skillguard.js +2 -2
- package/dist/plugins/skillguard.js.map +1 -1
- package/dist/resolve-mcp.d.ts +21 -0
- package/dist/resolve-mcp.d.ts.map +1 -0
- package/dist/resolve-mcp.js +42 -0
- package/dist/resolve-mcp.js.map +1 -0
- package/dist/scanner/external-scanner.js +5 -5
- package/dist/scanner/external-scanner.js.map +1 -1
- package/dist/telemetry/contribute.d.ts +60 -0
- package/dist/telemetry/contribute.d.ts.map +1 -0
- package/dist/telemetry/contribute.js +169 -0
- package/dist/telemetry/contribute.js.map +1 -0
- package/dist/telemetry/index.d.ts +6 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +18 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/opt-in.d.ts +46 -0
- package/dist/telemetry/opt-in.d.ts.map +1 -0
- package/dist/telemetry/opt-in.js +220 -0
- package/dist/telemetry/opt-in.js.map +1 -0
- package/package.json +9 -3
|
@@ -53,6 +53,8 @@ export interface SecurityFinding {
|
|
|
53
53
|
line?: number;
|
|
54
54
|
/** Specific fix instruction for this issue */
|
|
55
55
|
fix?: string;
|
|
56
|
+
/** Attack taxonomy class this finding maps to (e.g., "CRED-HARVEST") */
|
|
57
|
+
attackClass?: string;
|
|
56
58
|
details?: Record<string, unknown>;
|
|
57
59
|
}
|
|
58
60
|
export interface ScanResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-check.d.ts","sourceRoot":"","sources":["../../src/hardening/security-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,sEAAsE;IACtE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"security-check.d.ts","sourceRoot":"","sources":["../../src/hardening/security-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,sEAAsE;IACtE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declared-vs-Actual Capability Validation
|
|
3
|
+
*
|
|
4
|
+
* Compares what a SKILL.md declares in its frontmatter (capabilities/permissions)
|
|
5
|
+
* against what the skill body actually does. Generates SKILL-018 findings for
|
|
6
|
+
* undeclared capabilities.
|
|
7
|
+
*/
|
|
8
|
+
import type { SecurityFinding } from './security-check';
|
|
9
|
+
export interface SkillDeclaredCapabilities {
|
|
10
|
+
capabilities: string[];
|
|
11
|
+
permissions: Record<string, string[]>;
|
|
12
|
+
}
|
|
13
|
+
export interface InferredCapability {
|
|
14
|
+
capability: string;
|
|
15
|
+
evidence: string;
|
|
16
|
+
lineNumber: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extract capabilities and permissions from YAML frontmatter.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseDeclaredCapabilities(content: string): SkillDeclaredCapabilities;
|
|
22
|
+
/**
|
|
23
|
+
* Scan skill body (NOT frontmatter) for capability indicators.
|
|
24
|
+
*/
|
|
25
|
+
export declare function inferActualCapabilities(content: string): InferredCapability[];
|
|
26
|
+
/**
|
|
27
|
+
* Compare declared vs inferred capabilities.
|
|
28
|
+
* Generate SKILL-018 findings for undeclared capabilities.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateCapabilities(declared: SkillDeclaredCapabilities, inferred: InferredCapability[], filePath?: string): SecurityFinding[];
|
|
31
|
+
//# sourceMappingURL=skill-capability-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-capability-validator.d.ts","sourceRoot":"","sources":["../../src/hardening/skill-capability-validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,CAgDpF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAuE7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,yBAAyB,EACnC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,eAAe,EAAE,CAwBnB"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Declared-vs-Actual Capability Validation
|
|
4
|
+
*
|
|
5
|
+
* Compares what a SKILL.md declares in its frontmatter (capabilities/permissions)
|
|
6
|
+
* against what the skill body actually does. Generates SKILL-018 findings for
|
|
7
|
+
* undeclared capabilities.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.parseDeclaredCapabilities = parseDeclaredCapabilities;
|
|
11
|
+
exports.inferActualCapabilities = inferActualCapabilities;
|
|
12
|
+
exports.validateCapabilities = validateCapabilities;
|
|
13
|
+
/**
|
|
14
|
+
* Extract capabilities and permissions from YAML frontmatter.
|
|
15
|
+
*/
|
|
16
|
+
function parseDeclaredCapabilities(content) {
|
|
17
|
+
const result = {
|
|
18
|
+
capabilities: [],
|
|
19
|
+
permissions: {},
|
|
20
|
+
};
|
|
21
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
22
|
+
if (!frontmatterMatch)
|
|
23
|
+
return result;
|
|
24
|
+
const frontmatter = frontmatterMatch[1];
|
|
25
|
+
// Parse capabilities list
|
|
26
|
+
result.capabilities = parseYamlList(frontmatter, 'capabilities');
|
|
27
|
+
// Also include permissions keys as capabilities
|
|
28
|
+
const permissionsBlock = extractYamlBlock(frontmatter, 'permissions');
|
|
29
|
+
if (permissionsBlock) {
|
|
30
|
+
const keyPattern = /^\s{2}(\S[^:]*?):\s*$/gm;
|
|
31
|
+
let match;
|
|
32
|
+
while ((match = keyPattern.exec(permissionsBlock)) !== null) {
|
|
33
|
+
const key = match[1].trim();
|
|
34
|
+
result.permissions[key] = [];
|
|
35
|
+
// Find list items under this key
|
|
36
|
+
const keyIdx = permissionsBlock.indexOf(match[0]);
|
|
37
|
+
const afterKey = permissionsBlock.substring(keyIdx + match[0].length);
|
|
38
|
+
const itemPattern = /^\s{4}-\s+(.+)$/gm;
|
|
39
|
+
let itemMatch;
|
|
40
|
+
while ((itemMatch = itemPattern.exec(afterKey)) !== null) {
|
|
41
|
+
result.permissions[key].push(itemMatch[1].trim().replace(/^["']|["']$/g, ''));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Also accept flat filesystem:/network: entries in capabilities
|
|
46
|
+
for (const cap of result.capabilities) {
|
|
47
|
+
if (cap.includes(':') && !result.permissions[cap.split(':')[0]]) {
|
|
48
|
+
const [prefix, ...rest] = cap.split(':');
|
|
49
|
+
const scope = rest.join(':');
|
|
50
|
+
if (!result.permissions[prefix]) {
|
|
51
|
+
result.permissions[prefix] = [];
|
|
52
|
+
}
|
|
53
|
+
if (scope) {
|
|
54
|
+
result.permissions[prefix].push(scope);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Scan skill body (NOT frontmatter) for capability indicators.
|
|
62
|
+
*/
|
|
63
|
+
function inferActualCapabilities(content) {
|
|
64
|
+
const inferred = [];
|
|
65
|
+
// Strip frontmatter to only analyze body
|
|
66
|
+
const bodyContent = content.replace(/^---\s*\n[\s\S]*?\n---\s*\n?/, '');
|
|
67
|
+
const lines = bodyContent.split('\n');
|
|
68
|
+
// Find the offset for line numbers (account for stripped frontmatter)
|
|
69
|
+
const frontmatterMatch = content.match(/^---\s*\n[\s\S]*?\n---\s*\n?/);
|
|
70
|
+
const frontmatterLines = frontmatterMatch
|
|
71
|
+
? frontmatterMatch[0].split('\n').length - 1
|
|
72
|
+
: 0;
|
|
73
|
+
const sensitivePathPatterns = [
|
|
74
|
+
{ pattern: /~\/\.ssh/g, capability: 'filesystem:~/.ssh' },
|
|
75
|
+
{ pattern: /~\/\.aws/g, capability: 'filesystem:~/.aws' },
|
|
76
|
+
{ pattern: /~\/\.kube/g, capability: 'filesystem:~/.kube' },
|
|
77
|
+
{ pattern: /~\/\.gnupg/g, capability: 'filesystem:~/.gnupg' },
|
|
78
|
+
{ pattern: /~\/\.config/g, capability: 'filesystem:~/.config' },
|
|
79
|
+
];
|
|
80
|
+
const networkOutboundPatterns = [
|
|
81
|
+
{ pattern: /\bcurl\b/g, capability: 'network:outbound' },
|
|
82
|
+
{ pattern: /\bwget\b/g, capability: 'network:outbound' },
|
|
83
|
+
{ pattern: /\bfetch\s*\(/g, capability: 'network:outbound' },
|
|
84
|
+
{ pattern: /\bhttp\.get\b/g, capability: 'network:outbound' },
|
|
85
|
+
{ pattern: /\baxios\b/g, capability: 'network:outbound' },
|
|
86
|
+
];
|
|
87
|
+
const shellPatterns = [
|
|
88
|
+
{ pattern: /\bshell\s*:/g, capability: 'shell:execute' },
|
|
89
|
+
{ pattern: /\bbash\s/g, capability: 'shell:execute' },
|
|
90
|
+
{ pattern: /\bexec\s*\(/g, capability: 'shell:execute' },
|
|
91
|
+
{ pattern: /\bspawn\s*\(/g, capability: 'shell:execute' },
|
|
92
|
+
];
|
|
93
|
+
const networkInboundPatterns = [
|
|
94
|
+
{ pattern: /\blisten\s*\(/g, capability: 'network:inbound' },
|
|
95
|
+
{ pattern: /\bcreateServer\b/g, capability: 'network:inbound' },
|
|
96
|
+
];
|
|
97
|
+
const filesystemWildcardPatterns = [
|
|
98
|
+
{ pattern: /filesystem:\s*\*/g, capability: 'filesystem:wildcard' },
|
|
99
|
+
];
|
|
100
|
+
const allPatterns = [
|
|
101
|
+
...sensitivePathPatterns,
|
|
102
|
+
...networkOutboundPatterns,
|
|
103
|
+
...shellPatterns,
|
|
104
|
+
...networkInboundPatterns,
|
|
105
|
+
...filesystemWildcardPatterns,
|
|
106
|
+
];
|
|
107
|
+
for (let i = 0; i < lines.length; i++) {
|
|
108
|
+
const line = lines[i];
|
|
109
|
+
for (const { pattern, capability } of allPatterns) {
|
|
110
|
+
pattern.lastIndex = 0;
|
|
111
|
+
if (pattern.test(line)) {
|
|
112
|
+
// Avoid duplicate capabilities on same line
|
|
113
|
+
if (!inferred.some(inf => inf.lineNumber === i + frontmatterLines + 1 && inf.capability === capability)) {
|
|
114
|
+
inferred.push({
|
|
115
|
+
capability,
|
|
116
|
+
evidence: line.trim().substring(0, 100),
|
|
117
|
+
lineNumber: i + frontmatterLines + 1,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return inferred;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Compare declared vs inferred capabilities.
|
|
127
|
+
* Generate SKILL-018 findings for undeclared capabilities.
|
|
128
|
+
*/
|
|
129
|
+
function validateCapabilities(declared, inferred, filePath) {
|
|
130
|
+
const findings = [];
|
|
131
|
+
for (const inf of inferred) {
|
|
132
|
+
if (isCapabilityDeclared(inf.capability, declared)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
findings.push({
|
|
136
|
+
checkId: 'SKILL-018',
|
|
137
|
+
name: 'Undeclared Capability',
|
|
138
|
+
description: 'Skill uses a capability not declared in its frontmatter',
|
|
139
|
+
category: 'skill',
|
|
140
|
+
severity: 'medium',
|
|
141
|
+
passed: false,
|
|
142
|
+
message: `Undeclared capability "${inf.capability}" detected: "${inf.evidence}"`,
|
|
143
|
+
file: filePath,
|
|
144
|
+
line: inf.lineNumber,
|
|
145
|
+
fixable: false,
|
|
146
|
+
fix: `Add "${inf.capability}" to the capabilities list in the skill frontmatter`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return findings;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if a capability is covered by the declared capabilities/permissions.
|
|
153
|
+
*/
|
|
154
|
+
function isCapabilityDeclared(capability, declared) {
|
|
155
|
+
// Direct match in capabilities list
|
|
156
|
+
if (declared.capabilities.includes(capability)) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
// Check by prefix (e.g., "filesystem:~/.ssh" is covered by "filesystem" capability)
|
|
160
|
+
const [prefix] = capability.split(':');
|
|
161
|
+
if (declared.capabilities.includes(prefix)) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Check wildcard permissions (e.g., "filesystem:./**" covers filesystem access)
|
|
165
|
+
if (declared.permissions[prefix]) {
|
|
166
|
+
const scopes = declared.permissions[prefix];
|
|
167
|
+
// Any declared scope for this prefix counts as declared
|
|
168
|
+
if (scopes.length > 0) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
// Empty scopes list means the prefix was declared without specific scopes
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
// Check for broader capability declarations
|
|
175
|
+
// "network" covers "network:outbound" and "network:inbound"
|
|
176
|
+
if (declared.capabilities.some(cap => {
|
|
177
|
+
const [capPrefix] = cap.split(':');
|
|
178
|
+
return capPrefix === prefix;
|
|
179
|
+
})) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Parse a simple YAML list from frontmatter.
|
|
186
|
+
*/
|
|
187
|
+
function parseYamlList(frontmatter, field) {
|
|
188
|
+
// Inline format: field: [a, b, c]
|
|
189
|
+
const inlineMatch = frontmatter.match(new RegExp(`^${field}:\\s*\\[([^\\]]*)]`, 'm'));
|
|
190
|
+
if (inlineMatch) {
|
|
191
|
+
return inlineMatch[1]
|
|
192
|
+
.split(',')
|
|
193
|
+
.map(item => item.trim().replace(/^["']|["']$/g, ''))
|
|
194
|
+
.filter(item => item.length > 0);
|
|
195
|
+
}
|
|
196
|
+
// Block format
|
|
197
|
+
const blockPattern = new RegExp(`^${field}:\\s*$`, 'm');
|
|
198
|
+
const blockMatch = frontmatter.match(blockPattern);
|
|
199
|
+
if (!blockMatch)
|
|
200
|
+
return [];
|
|
201
|
+
const startIdx = frontmatter.indexOf(blockMatch[0]) + blockMatch[0].length;
|
|
202
|
+
const remaining = frontmatter.substring(startIdx);
|
|
203
|
+
const items = [];
|
|
204
|
+
for (const line of remaining.split('\n')) {
|
|
205
|
+
const itemMatch = line.match(/^\s+-\s+(.+)$/);
|
|
206
|
+
if (itemMatch) {
|
|
207
|
+
items.push(itemMatch[1].trim().replace(/^["']|["']$/g, ''));
|
|
208
|
+
}
|
|
209
|
+
else if (line.trim() !== '' && !/^\s+-/.test(line)) {
|
|
210
|
+
break; // End of list
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return items;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract a YAML block (key + indented children) from frontmatter.
|
|
217
|
+
*/
|
|
218
|
+
function extractYamlBlock(frontmatter, field) {
|
|
219
|
+
const blockPattern = new RegExp(`^${field}:\\s*$`, 'm');
|
|
220
|
+
const blockMatch = frontmatter.match(blockPattern);
|
|
221
|
+
if (!blockMatch)
|
|
222
|
+
return null;
|
|
223
|
+
const startIdx = frontmatter.indexOf(blockMatch[0]);
|
|
224
|
+
const remaining = frontmatter.substring(startIdx);
|
|
225
|
+
const lines = remaining.split('\n');
|
|
226
|
+
const blockLines = [lines[0]];
|
|
227
|
+
for (let i = 1; i < lines.length; i++) {
|
|
228
|
+
if (/^\s+/.test(lines[i]) || lines[i].trim() === '') {
|
|
229
|
+
blockLines.push(lines[i]);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return blockLines.join('\n');
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=skill-capability-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-capability-validator.js","sourceRoot":"","sources":["../../src/hardening/skill-capability-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-Aware Skill Section Analysis
|
|
3
|
+
*
|
|
4
|
+
* Classifies lines in SKILL.md files by section type to reduce false positives.
|
|
5
|
+
* Prose mentions of "chrome" or ".env" are not attacks -- only code blocks
|
|
6
|
+
* and command blocks are real signals for SKILL-010/011/012.
|
|
7
|
+
*/
|
|
8
|
+
export type SkillSection = 'frontmatter' | 'prose' | 'codeblock' | 'command';
|
|
9
|
+
/**
|
|
10
|
+
* Classify what section type a given line index falls within.
|
|
11
|
+
* Parses the full content to determine context.
|
|
12
|
+
*/
|
|
13
|
+
export declare function classifySkillSection(content: string, lineIndex: number): SkillSection;
|
|
14
|
+
/**
|
|
15
|
+
* Determine if a pattern match is likely a false positive based on section context.
|
|
16
|
+
*
|
|
17
|
+
* For SKILL-010/011/012, matches in prose or frontmatter (including capabilities/permissions
|
|
18
|
+
* declarations) are treated as false positives. Only code blocks and command blocks
|
|
19
|
+
* are real signals for these checks.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isLikelyFalsePositive(checkId: string, line: string, section: SkillSection, fullContent: string): boolean;
|
|
22
|
+
//# sourceMappingURL=skill-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-context.d.ts","sourceRoot":"","sources":["../../src/hardening/skill-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CA8DrF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CA6CT"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context-Aware Skill Section Analysis
|
|
4
|
+
*
|
|
5
|
+
* Classifies lines in SKILL.md files by section type to reduce false positives.
|
|
6
|
+
* Prose mentions of "chrome" or ".env" are not attacks -- only code blocks
|
|
7
|
+
* and command blocks are real signals for SKILL-010/011/012.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.classifySkillSection = classifySkillSection;
|
|
11
|
+
exports.isLikelyFalsePositive = isLikelyFalsePositive;
|
|
12
|
+
/**
|
|
13
|
+
* Classify what section type a given line index falls within.
|
|
14
|
+
* Parses the full content to determine context.
|
|
15
|
+
*/
|
|
16
|
+
function classifySkillSection(content, lineIndex) {
|
|
17
|
+
const lines = content.split('\n');
|
|
18
|
+
if (lineIndex < 0 || lineIndex >= lines.length) {
|
|
19
|
+
return 'prose';
|
|
20
|
+
}
|
|
21
|
+
let inFrontmatter = false;
|
|
22
|
+
let frontmatterCount = 0;
|
|
23
|
+
let inCodeBlock = false;
|
|
24
|
+
for (let i = 0; i <= lineIndex; i++) {
|
|
25
|
+
const line = lines[i];
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
// Track frontmatter (--- delimiters at start of file)
|
|
28
|
+
if (trimmed === '---' || trimmed === '---\r') {
|
|
29
|
+
if (i === 0 || (frontmatterCount === 0 && i <= 1)) {
|
|
30
|
+
inFrontmatter = true;
|
|
31
|
+
frontmatterCount++;
|
|
32
|
+
if (i === lineIndex)
|
|
33
|
+
return 'frontmatter';
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
else if (inFrontmatter && frontmatterCount === 1) {
|
|
37
|
+
frontmatterCount++;
|
|
38
|
+
inFrontmatter = false;
|
|
39
|
+
if (i === lineIndex)
|
|
40
|
+
return 'frontmatter';
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (inFrontmatter) {
|
|
45
|
+
if (i === lineIndex)
|
|
46
|
+
return 'frontmatter';
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Track fenced code blocks (``` or ~~~)
|
|
50
|
+
if (/^(`{3,}|~{3,})/.test(trimmed)) {
|
|
51
|
+
inCodeBlock = !inCodeBlock;
|
|
52
|
+
if (i === lineIndex)
|
|
53
|
+
return inCodeBlock ? 'codeblock' : 'codeblock';
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (inCodeBlock) {
|
|
57
|
+
if (i === lineIndex)
|
|
58
|
+
return 'codeblock';
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Command lines: start with $ or >
|
|
62
|
+
if (/^\s*[$>]\s+\S/.test(line)) {
|
|
63
|
+
if (i === lineIndex)
|
|
64
|
+
return 'command';
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// Indented code block: 4+ spaces after a blank line
|
|
68
|
+
if (/^ {4,}\S/.test(line) && i > 0 && lines[i - 1].trim() === '') {
|
|
69
|
+
if (i === lineIndex)
|
|
70
|
+
return 'command';
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (inFrontmatter)
|
|
75
|
+
return 'frontmatter';
|
|
76
|
+
if (inCodeBlock)
|
|
77
|
+
return 'codeblock';
|
|
78
|
+
return 'prose';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Determine if a pattern match is likely a false positive based on section context.
|
|
82
|
+
*
|
|
83
|
+
* For SKILL-010/011/012, matches in prose or frontmatter (including capabilities/permissions
|
|
84
|
+
* declarations) are treated as false positives. Only code blocks and command blocks
|
|
85
|
+
* are real signals for these checks.
|
|
86
|
+
*/
|
|
87
|
+
function isLikelyFalsePositive(checkId, line, section, fullContent) {
|
|
88
|
+
const contextSensitiveChecks = ['SKILL-010', 'SKILL-011', 'SKILL-012'];
|
|
89
|
+
if (!contextSensitiveChecks.includes(checkId)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// Matches inside capabilities/permissions YAML blocks are declarations, not attacks
|
|
93
|
+
if (section === 'frontmatter') {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
// Prose mentions are false positives for these checks
|
|
97
|
+
if (section === 'prose') {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
// Check if line is inside a permissions: or capabilities: YAML block in body
|
|
101
|
+
// (some skills declare permissions outside frontmatter in structured blocks)
|
|
102
|
+
const trimmedLine = line.trim();
|
|
103
|
+
if (/^(permissions|capabilities)\s*:/.test(trimmedLine)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
// Check if the line is a YAML list item under permissions/capabilities
|
|
107
|
+
if (/^\s*-\s+/.test(line)) {
|
|
108
|
+
const lines = fullContent.split('\n');
|
|
109
|
+
const lineIdx = lines.indexOf(line);
|
|
110
|
+
if (lineIdx >= 0) {
|
|
111
|
+
// Look backwards for a permissions:/capabilities: header
|
|
112
|
+
for (let i = lineIdx - 1; i >= 0 && i >= lineIdx - 10; i--) {
|
|
113
|
+
const prevLine = lines[i].trim();
|
|
114
|
+
if (/^(permissions|capabilities)\s*:/.test(prevLine)) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
// If we hit a non-indented, non-list line, stop looking
|
|
118
|
+
if (prevLine !== '' && !prevLine.startsWith('-') && !prevLine.startsWith(' ')) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Code blocks and command blocks are real signals
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=skill-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-context.js","sourceRoot":"","sources":["../../src/hardening/skill-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attack Taxonomy Mapping
|
|
3
|
+
* Maps HMA security check IDs to registry attack class identifiers.
|
|
4
|
+
* These identifiers match the attack_classes table in the OpenA2A Registry.
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityFinding } from './security-check';
|
|
7
|
+
/**
|
|
8
|
+
* Look up the attack class for a given HMA check ID.
|
|
9
|
+
* Returns undefined if no mapping exists.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getAttackClass(checkId: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Enrich an array of SecurityFindings with their attack class mappings.
|
|
14
|
+
* Modifies findings in place.
|
|
15
|
+
*/
|
|
16
|
+
export declare function enrichWithTaxonomy(findings: SecurityFinding[]): void;
|
|
17
|
+
//# sourceMappingURL=taxonomy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../../src/hardening/taxonomy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA4IxD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI,CAOpE"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Attack Taxonomy Mapping
|
|
4
|
+
* Maps HMA security check IDs to registry attack class identifiers.
|
|
5
|
+
* These identifiers match the attack_classes table in the OpenA2A Registry.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.getAttackClass = getAttackClass;
|
|
9
|
+
exports.enrichWithTaxonomy = enrichWithTaxonomy;
|
|
10
|
+
/** Maps HMA check ID prefixes and exact IDs to attack class identifiers */
|
|
11
|
+
const TAXONOMY_MAP = {
|
|
12
|
+
// SOUL series
|
|
13
|
+
'SOUL-TH-001': 'SOUL-POISON',
|
|
14
|
+
'SOUL-TH-002': 'SOUL-POISON',
|
|
15
|
+
'SOUL-TH-003': 'SOUL-DRIFT',
|
|
16
|
+
'SOUL-TH-004': 'SOUL-DRIFT',
|
|
17
|
+
'SOUL-TH-005': 'SOUL-INJECT',
|
|
18
|
+
'SOUL-CB-001': 'SOUL-BOUNDARY',
|
|
19
|
+
'SOUL-CB-002': 'SOUL-BOUNDARY',
|
|
20
|
+
'SOUL-IH-001': 'SOUL-INJECT',
|
|
21
|
+
'SOUL-IH-002': 'SOUL-INJECT',
|
|
22
|
+
'PROMPT-001': 'SOUL-INJECT',
|
|
23
|
+
'PROMPT-002': 'SOUL-INJECT',
|
|
24
|
+
'PROMPT-003': 'SOUL-INJECT',
|
|
25
|
+
'PROMPT-004': 'SOUL-INJECT',
|
|
26
|
+
'SOUL-DH-001': 'SOUL-DELEGATE',
|
|
27
|
+
'SOUL-DH-002': 'SOUL-DELEGATE',
|
|
28
|
+
'SOUL-HB-001': 'SOUL-OVERRIDE',
|
|
29
|
+
'SOUL-HB-002': 'SOUL-OVERRIDE',
|
|
30
|
+
'SOUL-AS-001': 'SOUL-COLLUDE',
|
|
31
|
+
'SOUL-AS-002': 'SOUL-COLLUDE',
|
|
32
|
+
'SOUL-HT-001': 'SOUL-COLLUDE',
|
|
33
|
+
'SOUL-HT-002': 'SOUL-COLLUDE',
|
|
34
|
+
'SOUL-HO-001': 'SOUL-OVERRIDE',
|
|
35
|
+
'SOUL-HO-002': 'SOUL-OVERRIDE',
|
|
36
|
+
// Harm avoidance
|
|
37
|
+
'SOUL-HV-001': 'HV-DECEPTION',
|
|
38
|
+
'SOUL-HV-002': 'HV-MANIPULATION',
|
|
39
|
+
'SOUL-HV-003': 'HV-UNSAFE-CODE',
|
|
40
|
+
'SOUL-HV-004': 'HV-RESOURCE-ABUSE',
|
|
41
|
+
// Credential exposure
|
|
42
|
+
'CRED-001': 'CRED-HARVEST',
|
|
43
|
+
'CRED-002': 'CRED-HARVEST',
|
|
44
|
+
'CRED-003': 'CRED-HARVEST',
|
|
45
|
+
'CRED-004': 'CRED-HARVEST',
|
|
46
|
+
// Unicode steganography
|
|
47
|
+
'UNICODE-STEGO-001': 'STEGO-INJECT',
|
|
48
|
+
'UNICODE-STEGO-002': 'STEGO-INJECT',
|
|
49
|
+
'UNICODE-STEGO-003': 'STEGO-INJECT',
|
|
50
|
+
'UNICODE-STEGO-004': 'STEGO-INJECT',
|
|
51
|
+
// OpenClaw persistence
|
|
52
|
+
'HEARTBEAT-001': 'SOUL-PERSIST',
|
|
53
|
+
'HEARTBEAT-002': 'SOUL-PERSIST',
|
|
54
|
+
'HEARTBEAT-003': 'SOUL-PERSIST',
|
|
55
|
+
'HEARTBEAT-004': 'SOUL-PERSIST',
|
|
56
|
+
'HEARTBEAT-005': 'SOUL-PERSIST',
|
|
57
|
+
'HEARTBEAT-006': 'SOUL-PERSIST',
|
|
58
|
+
'SKILL-002': 'SOUL-PERSIST',
|
|
59
|
+
'SKILL-003': 'SOUL-PERSIST',
|
|
60
|
+
// Skill exfiltration
|
|
61
|
+
'SKILL-006': 'SOUL-EXFIL',
|
|
62
|
+
'NET-001': 'SOUL-EXFIL',
|
|
63
|
+
'NET-002': 'SOUL-EXFIL',
|
|
64
|
+
'NET-003': 'SOUL-EXFIL',
|
|
65
|
+
// Supply chain
|
|
66
|
+
'SUPPLY-001': 'ORG-SKILL-SUPPLY',
|
|
67
|
+
'SUPPLY-002': 'ORG-SKILL-SUPPLY',
|
|
68
|
+
'SUPPLY-003': 'ORG-SKILL-SUPPLY',
|
|
69
|
+
'SUPPLY-004': 'ORG-SKILL-SUPPLY',
|
|
70
|
+
'SUPPLY-005': 'ORG-SKILL-SUPPLY',
|
|
71
|
+
'SUPPLY-006': 'ORG-SKILL-SUPPLY',
|
|
72
|
+
'SUPPLY-007': 'ORG-SKILL-SUPPLY',
|
|
73
|
+
'SUPPLY-008': 'ORG-SKILL-SUPPLY',
|
|
74
|
+
'DEP-001': 'ORG-SKILL-SUPPLY',
|
|
75
|
+
'DEP-002': 'ORG-SKILL-SUPPLY',
|
|
76
|
+
'DEP-003': 'ORG-SKILL-SUPPLY',
|
|
77
|
+
'DEP-004': 'ORG-SKILL-SUPPLY',
|
|
78
|
+
// Memory/context
|
|
79
|
+
'MEM-001': 'MEM-POISON',
|
|
80
|
+
'MEM-002': 'MEM-POISON',
|
|
81
|
+
'MEM-003': 'MEM-POISON',
|
|
82
|
+
'MEM-004': 'MEM-POISON',
|
|
83
|
+
'MEM-005': 'MEM-POISON',
|
|
84
|
+
// RAG poisoning
|
|
85
|
+
'RAG-001': 'RAG-POISON',
|
|
86
|
+
'RAG-002': 'RAG-POISON',
|
|
87
|
+
'RAG-003': 'RAG-POISON',
|
|
88
|
+
'RAG-004': 'RAG-POISON',
|
|
89
|
+
// Identity spoofing
|
|
90
|
+
'AIM-001': 'IDENTITY-SPOOF',
|
|
91
|
+
'AIM-002': 'IDENTITY-SPOOF',
|
|
92
|
+
'AIM-003': 'IDENTITY-SPOOF',
|
|
93
|
+
// Agent DNA forgery
|
|
94
|
+
'DNA-001': 'DNA-FORGE',
|
|
95
|
+
'DNA-002': 'DNA-FORGE',
|
|
96
|
+
'DNA-003': 'DNA-FORGE',
|
|
97
|
+
// Skill memory
|
|
98
|
+
'SKILL-MEM-001': 'SKILL-MEM',
|
|
99
|
+
// Adversarial skill
|
|
100
|
+
'SKILL-001': 'SKILL-ADVERSARIAL',
|
|
101
|
+
'SKILL-004': 'SKILL-ADVERSARIAL',
|
|
102
|
+
'SKILL-005': 'SKILL-ADVERSARIAL',
|
|
103
|
+
'SKILL-007': 'SKILL-ADVERSARIAL',
|
|
104
|
+
'SKILL-008': 'SKILL-ADVERSARIAL',
|
|
105
|
+
'SKILL-009': 'SKILL-ADVERSARIAL',
|
|
106
|
+
'SKILL-010': 'SKILL-ADVERSARIAL',
|
|
107
|
+
'SKILL-011': 'SKILL-ADVERSARIAL',
|
|
108
|
+
'SKILL-012': 'SKILL-ADVERSARIAL',
|
|
109
|
+
'SKILL-018': 'SKILL-ADVERSARIAL',
|
|
110
|
+
'SKILL-019': 'SKILL-ADVERSARIAL',
|
|
111
|
+
'HEARTBEAT-007': 'SKILL-ADVERSARIAL',
|
|
112
|
+
// Gateway/config
|
|
113
|
+
'GATEWAY-001': 'GATEWAY-EXPLOIT',
|
|
114
|
+
'GATEWAY-002': 'GATEWAY-EXPLOIT',
|
|
115
|
+
'GATEWAY-003': 'GATEWAY-EXPLOIT',
|
|
116
|
+
'GATEWAY-004': 'GATEWAY-EXPLOIT',
|
|
117
|
+
'GATEWAY-005': 'GATEWAY-EXPLOIT',
|
|
118
|
+
'GATEWAY-006': 'GATEWAY-EXPLOIT',
|
|
119
|
+
'GATEWAY-007': 'GATEWAY-EXPLOIT',
|
|
120
|
+
'GATEWAY-008': 'GATEWAY-EXPLOIT',
|
|
121
|
+
// MCP exploitation
|
|
122
|
+
'MCP-001': 'MCP-EXPLOIT',
|
|
123
|
+
'MCP-002': 'MCP-EXPLOIT',
|
|
124
|
+
'MCP-003': 'MCP-EXPLOIT',
|
|
125
|
+
'MCP-004': 'MCP-EXPLOIT',
|
|
126
|
+
'MCP-005': 'MCP-EXPLOIT',
|
|
127
|
+
'MCP-006': 'MCP-EXPLOIT',
|
|
128
|
+
'MCP-007': 'MCP-EXPLOIT',
|
|
129
|
+
'MCP-008': 'MCP-EXPLOIT',
|
|
130
|
+
'MCP-009': 'MCP-EXPLOIT',
|
|
131
|
+
'MCP-010': 'MCP-EXPLOIT',
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Look up the attack class for a given HMA check ID.
|
|
135
|
+
* Returns undefined if no mapping exists.
|
|
136
|
+
*/
|
|
137
|
+
function getAttackClass(checkId) {
|
|
138
|
+
return TAXONOMY_MAP[checkId];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Enrich an array of SecurityFindings with their attack class mappings.
|
|
142
|
+
* Modifies findings in place.
|
|
143
|
+
*/
|
|
144
|
+
function enrichWithTaxonomy(findings) {
|
|
145
|
+
for (const finding of findings) {
|
|
146
|
+
const attackClass = getAttackClass(finding.checkId);
|
|
147
|
+
if (attackClass) {
|
|
148
|
+
finding.attackClass = attackClass;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=taxonomy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../../src/hardening/taxonomy.ts"],"names":[],"mappings":"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"}
|