hackmyagent 0.12.0 → 0.12.2
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 +21 -2
- package/dist/.integrity-manifest.json +1 -1
- package/dist/arp/intelligence/ast-monitor.d.ts +62 -0
- package/dist/arp/intelligence/ast-monitor.d.ts.map +1 -0
- package/dist/arp/intelligence/ast-monitor.js +197 -0
- package/dist/arp/intelligence/ast-monitor.js.map +1 -0
- package/dist/attack/types.d.ts +2 -0
- package/dist/attack/types.d.ts.map +1 -1
- package/dist/attack/types.js.map +1 -1
- package/dist/cli.js +141 -7
- package/dist/cli.js.map +1 -1
- package/dist/hardening/scanner.d.ts.map +1 -1
- package/dist/hardening/scanner.js +11 -0
- package/dist/hardening/scanner.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/nanomind-core/compiler/semantic-compiler.d.ts.map +1 -1
- package/dist/nanomind-core/compiler/semantic-compiler.js +107 -11
- package/dist/nanomind-core/compiler/semantic-compiler.js.map +1 -1
- package/dist/nanomind-core/index.d.ts +6 -0
- package/dist/nanomind-core/index.d.ts.map +1 -1
- package/dist/nanomind-core/index.js +23 -1
- package/dist/nanomind-core/index.js.map +1 -1
- package/dist/nanomind-core/inference/tme-classifier.d.ts +62 -0
- package/dist/nanomind-core/inference/tme-classifier.d.ts.map +1 -0
- package/dist/nanomind-core/inference/tme-classifier.js +176 -0
- package/dist/nanomind-core/inference/tme-classifier.js.map +1 -0
- package/dist/nanomind-core/verification/ast-validator.d.ts +55 -0
- package/dist/nanomind-core/verification/ast-validator.d.ts.map +1 -0
- package/dist/nanomind-core/verification/ast-validator.js +228 -0
- package/dist/nanomind-core/verification/ast-validator.js.map +1 -0
- package/dist/scanner/external-scanner.d.ts.map +1 -1
- package/dist/scanner/external-scanner.js +37 -30
- package/dist/scanner/external-scanner.js.map +1 -1
- package/dist/simulation/index.d.ts +1 -1
- package/dist/simulation/index.js +1 -1
- package/dist/wild/browser.d.ts +44 -0
- package/dist/wild/browser.d.ts.map +1 -0
- package/dist/wild/browser.js +222 -0
- package/dist/wild/browser.js.map +1 -0
- package/dist/wild/index.d.ts +20 -0
- package/dist/wild/index.d.ts.map +1 -0
- package/dist/wild/index.js +173 -0
- package/dist/wild/index.js.map +1 -0
- package/dist/wild/scorer.d.ts +29 -0
- package/dist/wild/scorer.d.ts.map +1 -0
- package/dist/wild/scorer.js +101 -0
- package/dist/wild/scorer.js.map +1 -0
- package/dist/wild/types.d.ts +95 -0
- package/dist/wild/types.d.ts.map +1 -0
- package/dist/wild/types.js +8 -0
- package/dist/wild/types.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AST-Aware Runtime Monitor
|
|
4
|
+
*
|
|
5
|
+
* Connects ARP runtime monitoring to the NanoMind Semantic Compiler.
|
|
6
|
+
* Compares observed runtime events against the AST's declared behavioral
|
|
7
|
+
* envelope. Flags events that fall outside what the AST predicted.
|
|
8
|
+
*
|
|
9
|
+
* This is real-time behavioral verification:
|
|
10
|
+
* AST declares: "this skill reads customer data"
|
|
11
|
+
* ARP observes: "this skill wrote to /etc/passwd"
|
|
12
|
+
* Monitor flags: capability exercise outside declared scope
|
|
13
|
+
*
|
|
14
|
+
* Architecture:
|
|
15
|
+
* AST (compiled at scan time) → ASTMonitor (loaded at runtime)
|
|
16
|
+
* ARP events → compared against AST declarations → drift detected
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.ASTMonitor = void 0;
|
|
20
|
+
/**
|
|
21
|
+
* AST-Aware Runtime Monitor.
|
|
22
|
+
*
|
|
23
|
+
* Loads a SecurityAST at startup and compares every ARP event against it.
|
|
24
|
+
* When an event falls outside the AST's declared behavioral envelope,
|
|
25
|
+
* it generates an ASTDriftEvent.
|
|
26
|
+
*/
|
|
27
|
+
class ASTMonitor {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.ast = null;
|
|
30
|
+
this.declaredCapNames = new Set();
|
|
31
|
+
this.hasOverrideResistance = false;
|
|
32
|
+
this.maxDeclaredRisk = 'low';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load an AST for monitoring. Call this when the agent starts
|
|
36
|
+
* or when the AST is recompiled after a skill update.
|
|
37
|
+
*/
|
|
38
|
+
loadAST(ast) {
|
|
39
|
+
this.ast = ast;
|
|
40
|
+
this.declaredCapNames = new Set(ast.declaredCapabilities.map(c => c.name));
|
|
41
|
+
// Pre-compute risk profile
|
|
42
|
+
this.hasOverrideResistance = ast.declaredConstraints.some(c => c.domain === 'behavioral_constraint' && c.enforceability > 0.5);
|
|
43
|
+
const riskOrder = ['low', 'medium', 'high', 'critical'];
|
|
44
|
+
for (const cap of ast.declaredCapabilities) {
|
|
45
|
+
if (riskOrder.indexOf(cap.riskLevel) > riskOrder.indexOf(this.maxDeclaredRisk)) {
|
|
46
|
+
this.maxDeclaredRisk = cap.riskLevel;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check a runtime event against the loaded AST.
|
|
52
|
+
* Returns null if the event is within the declared envelope,
|
|
53
|
+
* or an ASTDriftEvent if it falls outside.
|
|
54
|
+
*/
|
|
55
|
+
checkEvent(event) {
|
|
56
|
+
if (!this.ast)
|
|
57
|
+
return null;
|
|
58
|
+
// Check 1: Capability scope violation
|
|
59
|
+
const capDrift = this.checkCapabilityScope(event);
|
|
60
|
+
if (capDrift)
|
|
61
|
+
return capDrift;
|
|
62
|
+
// Check 2: Data access outside declared patterns
|
|
63
|
+
const dataDrift = this.checkDataAccess(event);
|
|
64
|
+
if (dataDrift)
|
|
65
|
+
return dataDrift;
|
|
66
|
+
// Check 3: External communication not declared
|
|
67
|
+
const netDrift = this.checkNetworkAccess(event);
|
|
68
|
+
if (netDrift)
|
|
69
|
+
return netDrift;
|
|
70
|
+
// Check 4: Override attempt detection
|
|
71
|
+
const overrideDrift = this.checkOverrideAttempt(event);
|
|
72
|
+
if (overrideDrift)
|
|
73
|
+
return overrideDrift;
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Event Checks
|
|
78
|
+
// ============================================================================
|
|
79
|
+
checkCapabilityScope(event) {
|
|
80
|
+
if (!this.ast)
|
|
81
|
+
return null;
|
|
82
|
+
// Map ARP event source to capability name
|
|
83
|
+
const capName = mapEventToCapability(event);
|
|
84
|
+
if (!capName)
|
|
85
|
+
return null;
|
|
86
|
+
// Check if this capability was declared
|
|
87
|
+
if (!this.declaredCapNames.has(capName)) {
|
|
88
|
+
// Check for wildcard matches (db.* covers db.read, db.write)
|
|
89
|
+
const hasWildcard = [...this.declaredCapNames].some(d => {
|
|
90
|
+
const prefix = d.replace('.*', '');
|
|
91
|
+
return capName.startsWith(prefix);
|
|
92
|
+
});
|
|
93
|
+
if (!hasWildcard) {
|
|
94
|
+
return {
|
|
95
|
+
event,
|
|
96
|
+
violation: 'Undeclared capability exercised at runtime',
|
|
97
|
+
declared: `Declared: ${[...this.declaredCapNames].join(', ')}`,
|
|
98
|
+
observed: `Observed: ${capName}`,
|
|
99
|
+
severity: event.severity === 'critical' ? 'critical' : 'high',
|
|
100
|
+
action: 'throttle',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
checkDataAccess(event) {
|
|
107
|
+
if (!this.ast)
|
|
108
|
+
return null;
|
|
109
|
+
// Check if event involves data access outside declared patterns
|
|
110
|
+
const data = event.data;
|
|
111
|
+
if (!data)
|
|
112
|
+
return null;
|
|
113
|
+
const accessedPath = (data.path || data.url || data.query || '');
|
|
114
|
+
if (!accessedPath)
|
|
115
|
+
return null;
|
|
116
|
+
// Check against declared data access patterns
|
|
117
|
+
const declaredDataTypes = this.ast.declaredDataAccess.map(d => d.dataType);
|
|
118
|
+
// Sensitive data access not in declarations
|
|
119
|
+
const sensitivePatterns = ['password', 'credential', 'secret', 'token', 'ssn', 'medical'];
|
|
120
|
+
const accessesSensitive = sensitivePatterns.some(p => accessedPath.toLowerCase().includes(p));
|
|
121
|
+
const declaresSensitive = declaredDataTypes.some(d => ['credentials', 'pii', 'financial'].includes(d));
|
|
122
|
+
if (accessesSensitive && !declaresSensitive) {
|
|
123
|
+
return {
|
|
124
|
+
event,
|
|
125
|
+
violation: 'Sensitive data access not declared',
|
|
126
|
+
declared: `Declared data types: ${declaredDataTypes.join(', ')}`,
|
|
127
|
+
observed: `Accessed: ${accessedPath}`,
|
|
128
|
+
severity: 'critical',
|
|
129
|
+
action: 'suspend',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
checkNetworkAccess(event) {
|
|
135
|
+
if (!this.ast)
|
|
136
|
+
return null;
|
|
137
|
+
const data = event.data;
|
|
138
|
+
if (!data)
|
|
139
|
+
return null;
|
|
140
|
+
const url = (data.url || data.endpoint || data.host || '');
|
|
141
|
+
if (!url)
|
|
142
|
+
return null;
|
|
143
|
+
// Check if network access was declared
|
|
144
|
+
const hasNetworkCap = this.declaredCapNames.has('api.call') ||
|
|
145
|
+
this.declaredCapNames.has('http.request') ||
|
|
146
|
+
[...this.declaredCapNames].some(c => c.includes('external'));
|
|
147
|
+
const isExternal = !url.includes('localhost') && !url.includes('127.0.0.1') && !url.includes('internal');
|
|
148
|
+
if (isExternal && !hasNetworkCap) {
|
|
149
|
+
return {
|
|
150
|
+
event,
|
|
151
|
+
violation: 'External network access not declared',
|
|
152
|
+
declared: 'No external network capability declared',
|
|
153
|
+
observed: `External request to: ${url}`,
|
|
154
|
+
severity: 'high',
|
|
155
|
+
action: 'alert',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
checkOverrideAttempt(event) {
|
|
161
|
+
if (!this.ast)
|
|
162
|
+
return null;
|
|
163
|
+
const description = (event.description || '').toLowerCase();
|
|
164
|
+
const isOverrideAttempt = /ignore.*previous|override.*instruction|new.*task|bypass.*security/i.test(description);
|
|
165
|
+
if (isOverrideAttempt && !this.hasOverrideResistance) {
|
|
166
|
+
return {
|
|
167
|
+
event,
|
|
168
|
+
violation: 'Override attempt detected and no override resistance declared',
|
|
169
|
+
declared: 'No override resistance in constraints',
|
|
170
|
+
observed: `Override language detected: "${event.description?.slice(0, 80)}"`,
|
|
171
|
+
severity: 'critical',
|
|
172
|
+
action: 'kill',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.ASTMonitor = ASTMonitor;
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Event → Capability Mapping
|
|
181
|
+
// ============================================================================
|
|
182
|
+
function mapEventToCapability(event) {
|
|
183
|
+
const source = event.source?.toLowerCase() ?? '';
|
|
184
|
+
const desc = (event.description || '').toLowerCase();
|
|
185
|
+
if (source.includes('network') || desc.includes('http') || desc.includes('fetch'))
|
|
186
|
+
return 'api.call';
|
|
187
|
+
if (source.includes('filesystem') || desc.includes('file'))
|
|
188
|
+
return desc.includes('write') ? 'file.write' : 'file.read';
|
|
189
|
+
if (source.includes('process') || desc.includes('exec') || desc.includes('spawn'))
|
|
190
|
+
return 'process.execute';
|
|
191
|
+
if (source.includes('memory') || desc.includes('memory'))
|
|
192
|
+
return desc.includes('write') ? 'memory.write' : 'memory.read';
|
|
193
|
+
if (desc.includes('database') || desc.includes('query'))
|
|
194
|
+
return desc.includes('write') ? 'db.write' : 'db.read';
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=ast-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-monitor.js","sourceRoot":"","sources":["../../../src/arp/intelligence/ast-monitor.ts"],"names":[],"mappings":"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"}
|
package/dist/attack/types.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export interface AttackPayload {
|
|
|
30
30
|
cwe?: string;
|
|
31
31
|
/** Remediation guidance */
|
|
32
32
|
remediation: string;
|
|
33
|
+
/** Wild prevalence score from AgentPwn data (0-100, populated via --enrich) */
|
|
34
|
+
wildPrevalence?: number;
|
|
33
35
|
}
|
|
34
36
|
export interface AttackResult {
|
|
35
37
|
/** Payload that was tested */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/attack/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,WAAW,GACX,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,GACtB,kBAAkB,GAClB,YAAY,GACZ,sBAAsB,GACtB,gBAAgB,GAChB,cAAc,GACd,aAAa,CAAC;AAElB,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,QAAQ,GACR,YAAY,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,EAAE,eAAe,CAAC;IAC3B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kCAAkC;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/attack/types.ts"],"names":[],"mappings":"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"}
|
package/dist/attack/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/attack/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/attack/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAyKH,wBAAwB;AACX,QAAA,iBAAiB,GAA0F;IACtH,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,2DAA2D;QACxE,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACpC;IACD,WAAW,EAAE;QACX,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,uDAAuD;QACpE,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,0DAA0D;QACvE,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACpC;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iDAAiD;QAC9D,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACpC;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,4CAA4C;QACzD,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,wFAAwF;QACrG,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,oFAAoF;QACjG,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,2EAA2E;QACxF,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,iFAAiF;QAC9F,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;IACD,cAAc,EAAE;QACd,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,wEAAwE;QACrF,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACpC;IACD,aAAa,EAAE;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,6FAA6F;QAC1G,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KAC7B;CACF,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -41,6 +41,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
41
41
|
const commander_1 = require("commander");
|
|
42
42
|
const index_1 = require("./index");
|
|
43
43
|
const resolve_mcp_1 = require("./resolve-mcp");
|
|
44
|
+
const wild_1 = require("./wild");
|
|
44
45
|
const nemoclaw_scanner_1 = require("./hardening/nemoclaw-scanner");
|
|
45
46
|
const program = new commander_1.Command();
|
|
46
47
|
program.showHelpAfterError('(run with --help for usage)');
|
|
@@ -2887,16 +2888,18 @@ Examples:
|
|
|
2887
2888
|
.option('-v, --verbose', 'Show detailed finding information')
|
|
2888
2889
|
.action(async (target, options) => {
|
|
2889
2890
|
try {
|
|
2890
|
-
|
|
2891
|
-
console.log(`\nScanning ${target}...\n`);
|
|
2892
|
-
}
|
|
2893
|
-
const scanner = new index_1.ExternalScanner();
|
|
2891
|
+
const timeoutMs = parseInt(options.timeout ?? '5000', 10);
|
|
2894
2892
|
const customPorts = options.ports
|
|
2895
2893
|
? options.ports.split(',').map((p) => parseInt(p.trim(), 10))
|
|
2896
2894
|
: undefined;
|
|
2895
|
+
const portCount = customPorts?.length ?? 11;
|
|
2896
|
+
if (!options.json) {
|
|
2897
|
+
console.log(`\nScanning ${target} (${portCount} ports, ${timeoutMs}ms timeout)...\n`);
|
|
2898
|
+
}
|
|
2899
|
+
const scanner = new index_1.ExternalScanner();
|
|
2897
2900
|
const result = await scanner.scan(target, {
|
|
2898
2901
|
ports: customPorts,
|
|
2899
|
-
timeout:
|
|
2902
|
+
timeout: timeoutMs,
|
|
2900
2903
|
});
|
|
2901
2904
|
if (options.json) {
|
|
2902
2905
|
writeJsonStdout(result);
|
|
@@ -5251,6 +5254,136 @@ program
|
|
|
5251
5254
|
console.log(`\n${trainingCount} training samples exported to NanoMind corpus.`);
|
|
5252
5255
|
}
|
|
5253
5256
|
});
|
|
5257
|
+
// wild: test AI agent resilience against real-world web-based attacks
|
|
5258
|
+
program
|
|
5259
|
+
.command('wild')
|
|
5260
|
+
.description(`Test AI agent resilience in the wild
|
|
5261
|
+
|
|
5262
|
+
Fetches pages from AgentPwn (agentpwn.com) and analyzes hidden injection
|
|
5263
|
+
payloads that AI agents encounter when browsing the web. Reports which
|
|
5264
|
+
attack surfaces exist and computes a wild resilience score.
|
|
5265
|
+
|
|
5266
|
+
Attack categories (11):
|
|
5267
|
+
prompt-injection, jailbreak, data-exfiltration, capability-abuse,
|
|
5268
|
+
context-manipulation, mcp-exploitation, a2a-attack,
|
|
5269
|
+
memory-weaponization, context-window, supply-chain, tool-shadow
|
|
5270
|
+
|
|
5271
|
+
Injection surfaces detected:
|
|
5272
|
+
html-comment, invisible-span, json-ld, meta-tag, http-header,
|
|
5273
|
+
aria-label, image-alt, unicode-stego
|
|
5274
|
+
|
|
5275
|
+
Also tests: robots.txt, llms.txt, sitemap.xml for embedded payloads
|
|
5276
|
+
|
|
5277
|
+
Examples:
|
|
5278
|
+
$ hackmyagent wild
|
|
5279
|
+
$ hackmyagent wild https://agentpwn.com
|
|
5280
|
+
$ hackmyagent wild --category prompt-injection
|
|
5281
|
+
$ hackmyagent wild --tier 5
|
|
5282
|
+
$ hackmyagent wild --json
|
|
5283
|
+
$ hackmyagent wild -v -o report.json`)
|
|
5284
|
+
.argument('[url]', 'Target URL to scan', 'https://agentpwn.com')
|
|
5285
|
+
.option('-c, --category <category>', 'Filter by attack category')
|
|
5286
|
+
.option('-t, --tier <tier>', 'Filter by specific difficulty tier')
|
|
5287
|
+
.option('--timeout <ms>', 'Request timeout in milliseconds', '15000')
|
|
5288
|
+
.option('--delay <ms>', 'Delay between requests in milliseconds', '500')
|
|
5289
|
+
.option('--json', 'Output as JSON')
|
|
5290
|
+
.option('-o, --output <file>', 'Write output to file')
|
|
5291
|
+
.option('--verbose', 'Show detailed output for each page')
|
|
5292
|
+
.action(async (url, options) => {
|
|
5293
|
+
try {
|
|
5294
|
+
const scanner = new wild_1.WildScanner({
|
|
5295
|
+
url: url || 'https://agentpwn.com',
|
|
5296
|
+
category: options.category,
|
|
5297
|
+
tier: options.tier ? parseInt(options.tier, 10) : undefined,
|
|
5298
|
+
timeout: parseInt(options.timeout || '15000', 10),
|
|
5299
|
+
delay: parseInt(options.delay || '500', 10),
|
|
5300
|
+
verbose: options.verbose || false,
|
|
5301
|
+
json: options.json || false,
|
|
5302
|
+
});
|
|
5303
|
+
if (!options.json) {
|
|
5304
|
+
console.log(`\n${colors.cyan}HackMyAgent Wild Scanner${colors.reset}`);
|
|
5305
|
+
console.log(`${'━'.repeat(50)}\n`);
|
|
5306
|
+
console.log(`Target: ${url || 'https://agentpwn.com'}`);
|
|
5307
|
+
if (options.category)
|
|
5308
|
+
console.log(`Category: ${options.category}`);
|
|
5309
|
+
if (options.tier)
|
|
5310
|
+
console.log(`Tier: ${options.tier}`);
|
|
5311
|
+
console.log('');
|
|
5312
|
+
}
|
|
5313
|
+
const report = await scanner.scan();
|
|
5314
|
+
if (options.json) {
|
|
5315
|
+
const output = JSON.stringify(report, null, 2);
|
|
5316
|
+
if (options.output) {
|
|
5317
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
5318
|
+
fs.writeFileSync(options.output, output);
|
|
5319
|
+
process.stderr.write(`Report written to ${options.output}\n`);
|
|
5320
|
+
}
|
|
5321
|
+
else {
|
|
5322
|
+
console.log(output);
|
|
5323
|
+
}
|
|
5324
|
+
}
|
|
5325
|
+
else {
|
|
5326
|
+
printWildReport(report);
|
|
5327
|
+
if (options.output) {
|
|
5328
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
5329
|
+
fs.writeFileSync(options.output, JSON.stringify(report, null, 2));
|
|
5330
|
+
console.log(`\nJSON report written to ${options.output}`);
|
|
5331
|
+
}
|
|
5332
|
+
}
|
|
5333
|
+
// Exit with non-zero if resilience is poor
|
|
5334
|
+
if (report.resilienceRating === 'critical' || report.resilienceRating === 'poor') {
|
|
5335
|
+
process.exit(1);
|
|
5336
|
+
}
|
|
5337
|
+
}
|
|
5338
|
+
catch (error) {
|
|
5339
|
+
console.error(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
5340
|
+
process.exit(1);
|
|
5341
|
+
}
|
|
5342
|
+
});
|
|
5343
|
+
function printWildReport(report) {
|
|
5344
|
+
// File fetches
|
|
5345
|
+
console.log(`${colors.dim}File-Level Attack Surfaces${colors.reset}`);
|
|
5346
|
+
for (const f of report.fileFetches) {
|
|
5347
|
+
const status = f.hasPayload
|
|
5348
|
+
? `${colors.red}PAYLOAD FOUND${colors.reset}`
|
|
5349
|
+
: `${colors.green}clean${colors.reset}`;
|
|
5350
|
+
console.log(` ${f.file}: ${f.statusCode} [${status}]`);
|
|
5351
|
+
if (f.payloadExcerpt) {
|
|
5352
|
+
console.log(` ${colors.dim}${f.payloadExcerpt}${colors.reset}`);
|
|
5353
|
+
}
|
|
5354
|
+
}
|
|
5355
|
+
// Page results by category
|
|
5356
|
+
console.log(`\n${colors.dim}Attack Pages (${report.pagesScanned} scanned)${colors.reset}`);
|
|
5357
|
+
const categories = Object.keys(report.summary.byCategory).sort();
|
|
5358
|
+
for (const cat of categories) {
|
|
5359
|
+
const stats = report.summary.byCategory[cat];
|
|
5360
|
+
console.log(` ${cat}: ${stats.pages} pages, ${stats.payloads} payloads`);
|
|
5361
|
+
}
|
|
5362
|
+
// Injection surfaces
|
|
5363
|
+
console.log(`\n${colors.dim}Injection Surfaces Detected${colors.reset}`);
|
|
5364
|
+
const surfaces = Object.entries(report.summary.bySurface).sort((a, b) => b[1] - a[1]);
|
|
5365
|
+
for (const [surface, count] of surfaces) {
|
|
5366
|
+
console.log(` ${surface}: ${count}`);
|
|
5367
|
+
}
|
|
5368
|
+
// Score
|
|
5369
|
+
const scoreColor = report.wildResilienceScore >= 60
|
|
5370
|
+
? colors.green
|
|
5371
|
+
: report.wildResilienceScore >= 40
|
|
5372
|
+
? colors.yellow
|
|
5373
|
+
: colors.red;
|
|
5374
|
+
console.log(`\n${'━'.repeat(50)}`);
|
|
5375
|
+
console.log(`\n${colors.dim}Wild Resilience Score:${colors.reset} ${scoreColor}${report.wildResilienceScore}/100 (${report.resilienceRating})${colors.reset}`);
|
|
5376
|
+
console.log(`${colors.dim}Pages Scanned:${colors.reset} ${report.pagesScanned}`);
|
|
5377
|
+
console.log(`${colors.dim}Total Payloads:${colors.reset} ${report.summary.totalPayloads}`);
|
|
5378
|
+
console.log(`${colors.dim}Callback Pages:${colors.reset} ${report.summary.callbackPages}`);
|
|
5379
|
+
console.log(`${colors.dim}Canary Pages:${colors.reset} ${report.summary.canaryPages}`);
|
|
5380
|
+
console.log(`${colors.dim}Max Tier:${colors.reset} ${report.summary.maxTier}`);
|
|
5381
|
+
console.log(`${colors.dim}Duration:${colors.reset} ${(report.duration / 1000).toFixed(1)}s`);
|
|
5382
|
+
console.log(`\n${colors.dim}Note: This score reflects the attack surface coverage of the target`);
|
|
5383
|
+
console.log(`site. To test your actual agent's resilience, use --model to pipe`);
|
|
5384
|
+
console.log(`page content through an LLM. For static config scanning, use:${colors.reset}`);
|
|
5385
|
+
console.log(` ${colors.cyan}npx hackmyagent secure${colors.reset}`);
|
|
5386
|
+
}
|
|
5254
5387
|
// create-skill: generate best-practice, secured skills from plain English
|
|
5255
5388
|
program
|
|
5256
5389
|
.command('create-skill')
|
|
@@ -5262,11 +5395,12 @@ program
|
|
|
5262
5395
|
const { writeSkill } = await Promise.resolve().then(() => __importStar(require('./skills/builder.js')));
|
|
5263
5396
|
console.log(`\nGenerating secured skill...\n`);
|
|
5264
5397
|
const result = writeSkill({ purpose: description, name: options.name, outputDir: options.output });
|
|
5265
|
-
|
|
5398
|
+
const outputDir = options.output ?? result.dirName;
|
|
5399
|
+
console.log(`Created ${outputDir}/`);
|
|
5266
5400
|
for (const file of result.filesWritten) {
|
|
5267
5401
|
console.log(` ${file.split('/').pop()}`);
|
|
5268
5402
|
}
|
|
5269
|
-
console.log(`\nYour skill is ready. Verify security with: hackmyagent secure ${
|
|
5403
|
+
console.log(`\nYour skill is ready. Verify security with: hackmyagent secure ${outputDir}/`);
|
|
5270
5404
|
});
|
|
5271
5405
|
// Self-securing: verify own integrity before running any command
|
|
5272
5406
|
// A security tool that doesn't verify itself is worse than no security tool
|