skillshield 1.0.0 → 2.0.0

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.
@@ -0,0 +1,226 @@
1
+ /**
2
+ * SkillShield — Network Policy Engine
3
+ *
4
+ * Per-skill domain allowlisting. Skills declare which domains they need,
5
+ * and SkillShield blocks everything else at the DNS resolution level.
6
+ *
7
+ * This is what Snyk and Cisco DON'T do — they scan before install,
8
+ * but can't stop a skill from phoning home at runtime.
9
+ */
10
+ /** Known malicious domains commonly used in skill attacks */
11
+ const MALICIOUS_DOMAINS = [
12
+ 'evil.com',
13
+ 'attacker.com',
14
+ 'exfil.io',
15
+ 'c2server.net',
16
+ 'malware.download',
17
+ 'ngrok.io', // Tunneling — often used for exfiltration
18
+ 'requestbin.com', // Data capture
19
+ 'webhook.site', // Data capture
20
+ 'pipedream.net', // Data capture
21
+ 'burpcollaborator.net', // Pentesting tool
22
+ ];
23
+ /** Known mining pool domains */
24
+ const MINING_DOMAINS = [
25
+ 'pool.monero.cc',
26
+ 'xmr.pool.minergate.com',
27
+ 'cryptonight.usa.nicehash.com',
28
+ 'mine.xmrpool.net',
29
+ 'coinhive.com',
30
+ 'authedmine.com',
31
+ ];
32
+ export class NetworkPolicyEngine {
33
+ constructor(policy) {
34
+ this.violations = [];
35
+ this.connectionCount = 0;
36
+ this.transferredBytes = 0;
37
+ this.policy = policy;
38
+ this.blockedDomains = new Set([
39
+ ...MALICIOUS_DOMAINS,
40
+ ...(policy.blockMalicious !== false ? MINING_DOMAINS : []),
41
+ ]);
42
+ }
43
+ /**
44
+ * Check if a domain is allowed by the policy.
45
+ * Returns true if allowed, false if blocked.
46
+ */
47
+ checkDomain(domain) {
48
+ const normalizedDomain = domain.toLowerCase().trim();
49
+ // Check malicious domains first
50
+ if (this.blockedDomains.has(normalizedDomain)) {
51
+ this.recordViolation({
52
+ type: 'MALICIOUS_DOMAIN',
53
+ domain: normalizedDomain,
54
+ details: `Blocked known malicious domain: ${normalizedDomain}`,
55
+ });
56
+ return false;
57
+ }
58
+ // Check against subdomain patterns in malicious list
59
+ for (const malicious of this.blockedDomains) {
60
+ if (normalizedDomain.endsWith(`.${malicious}`)) {
61
+ this.recordViolation({
62
+ type: 'MALICIOUS_DOMAIN',
63
+ domain: normalizedDomain,
64
+ details: `Blocked subdomain of malicious domain: ${normalizedDomain} (parent: ${malicious})`,
65
+ });
66
+ return false;
67
+ }
68
+ }
69
+ // Default deny mode — only allowlisted domains pass
70
+ if (this.policy.defaultDeny) {
71
+ const isAllowed = this.policy.allowedDomains.some((allowed) => {
72
+ const normalizedAllowed = allowed.toLowerCase().trim();
73
+ return (normalizedDomain === normalizedAllowed ||
74
+ normalizedDomain.endsWith(`.${normalizedAllowed}`));
75
+ });
76
+ if (!isAllowed) {
77
+ this.recordViolation({
78
+ type: 'DNS_BLOCKED',
79
+ domain: normalizedDomain,
80
+ details: `Domain not in allowlist: ${normalizedDomain}. Allowed: [${this.policy.allowedDomains.join(', ')}]`,
81
+ });
82
+ return false;
83
+ }
84
+ }
85
+ return true;
86
+ }
87
+ /**
88
+ * Check if a connection attempt is allowed.
89
+ */
90
+ checkConnection(domain, port) {
91
+ // Check domain first
92
+ if (!this.checkDomain(domain)) {
93
+ return false;
94
+ }
95
+ // Check max connections
96
+ if (this.policy.maxConnections && this.connectionCount >= this.policy.maxConnections) {
97
+ this.recordViolation({
98
+ type: 'CONNECTION_BLOCKED',
99
+ domain,
100
+ port,
101
+ details: `Max connections exceeded: ${this.connectionCount}/${this.policy.maxConnections}`,
102
+ });
103
+ return false;
104
+ }
105
+ this.connectionCount++;
106
+ return true;
107
+ }
108
+ /**
109
+ * Track data transfer and block if limit exceeded.
110
+ */
111
+ trackTransfer(bytes) {
112
+ this.transferredBytes += bytes;
113
+ if (this.policy.maxTransferBytes && this.transferredBytes > this.policy.maxTransferBytes) {
114
+ this.recordViolation({
115
+ type: 'TRANSFER_EXCEEDED',
116
+ details: `Transfer limit exceeded: ${this.transferredBytes}/${this.policy.maxTransferBytes} bytes`,
117
+ });
118
+ return false;
119
+ }
120
+ return true;
121
+ }
122
+ /**
123
+ * Generate the Node.js code that enforces this policy at runtime.
124
+ * This wraps the skill's execution with DNS/network interception.
125
+ */
126
+ generateEnforcementCode() {
127
+ const allowedJSON = JSON.stringify(this.policy.allowedDomains);
128
+ const blockedJSON = JSON.stringify([...this.blockedDomains]);
129
+ return `
130
+ // ── SkillShield Network Policy Enforcement ──
131
+ const __ss_allowed = new Set(${allowedJSON}.map(d => d.toLowerCase()));
132
+ const __ss_blocked = new Set(${blockedJSON}.map(d => d.toLowerCase()));
133
+ const __ss_defaultDeny = ${this.policy.defaultDeny};
134
+ const __ss_maxTransfer = ${this.policy.maxTransferBytes || 0};
135
+ let __ss_transferred = 0;
136
+
137
+ const __ss_originalDnsLookup = require('dns').lookup;
138
+ require('dns').lookup = function(hostname, options, callback) {
139
+ const domain = hostname.toLowerCase();
140
+
141
+ // Block malicious
142
+ for (const blocked of __ss_blocked) {
143
+ if (domain === blocked || domain.endsWith('.' + blocked)) {
144
+ const err = new Error('[SkillShield] BLOCKED: ' + domain + ' is a known malicious domain');
145
+ err.code = 'ENOTFOUND';
146
+ if (typeof options === 'function') return options(err);
147
+ return callback(err);
148
+ }
149
+ }
150
+
151
+ // Default deny check
152
+ if (__ss_defaultDeny) {
153
+ let allowed = false;
154
+ for (const a of __ss_allowed) {
155
+ if (domain === a || domain.endsWith('.' + a)) { allowed = true; break; }
156
+ }
157
+ if (!allowed) {
158
+ const err = new Error('[SkillShield] BLOCKED: ' + domain + ' not in network policy allowlist');
159
+ err.code = 'ENOTFOUND';
160
+ if (typeof options === 'function') return options(err);
161
+ return callback(err);
162
+ }
163
+ }
164
+
165
+ return __ss_originalDnsLookup.call(this, hostname, options, callback);
166
+ };
167
+
168
+ // Intercept http/https to track transfer size
169
+ const __ss_origRequest = require('https').request;
170
+ require('https').request = function(...args) {
171
+ const req = __ss_origRequest.apply(this, args);
172
+ req.on('response', (res) => {
173
+ res.on('data', (chunk) => {
174
+ __ss_transferred += chunk.length;
175
+ if (__ss_maxTransfer > 0 && __ss_transferred > __ss_maxTransfer) {
176
+ res.destroy(new Error('[SkillShield] Transfer limit exceeded: ' + __ss_transferred + ' bytes'));
177
+ }
178
+ });
179
+ });
180
+ return req;
181
+ };
182
+ // ── End SkillShield Network Policy ──
183
+ `;
184
+ }
185
+ recordViolation(partial) {
186
+ this.violations.push({
187
+ ...partial,
188
+ timestamp: new Date().toISOString(),
189
+ });
190
+ }
191
+ getViolations() {
192
+ return [...this.violations];
193
+ }
194
+ getStats() {
195
+ return {
196
+ connections: this.connectionCount,
197
+ transferredBytes: this.transferredBytes,
198
+ violations: this.violations.length,
199
+ };
200
+ }
201
+ reset() {
202
+ this.violations = [];
203
+ this.connectionCount = 0;
204
+ this.transferredBytes = 0;
205
+ }
206
+ }
207
+ /**
208
+ * Parse network policy from SKILL.md frontmatter.
209
+ * Expected format in frontmatter:
210
+ * network:
211
+ * allowed: ["api.openai.com", "api.anthropic.com"]
212
+ * maxTransferMB: 10
213
+ */
214
+ export function parseNetworkPolicy(frontmatter) {
215
+ const network = (frontmatter.network || frontmatter.networking || {});
216
+ const allowed = (network.allowed || network.domains || []);
217
+ const maxTransferMB = (network.maxTransferMB || network.maxTransfer || 10);
218
+ return {
219
+ allowedDomains: allowed.length > 0 ? allowed : [],
220
+ defaultDeny: allowed.length > 0, // If skill declares domains, enforce them
221
+ maxConnections: network.maxConnections || 50,
222
+ maxTransferBytes: maxTransferMB * 1024 * 1024,
223
+ blockMalicious: true,
224
+ };
225
+ }
226
+ //# sourceMappingURL=network-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-policy.js","sourceRoot":"","sources":["../../src/shield/network-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * SkillShield — Runtime Monitor + Kill Switch
3
+ *
4
+ * Real-time monitoring of skill execution. Watches stdout/stderr
5
+ * for threat patterns, tracks resource consumption, and kills the
6
+ * process if anomalies are detected.
7
+ *
8
+ * This is the core differentiator: Snyk scans before install,
9
+ * SkillShield watches DURING execution.
10
+ */
11
+ import { ChildProcess } from 'child_process';
12
+ import { type ThreatCategory, type SeverityLevel } from '../guard/patterns.js';
13
+ export interface MonitorPolicy {
14
+ /** Max execution time in ms (kill switch) */
15
+ maxExecutionTime: number;
16
+ /** Max memory in MB (kill switch) */
17
+ maxMemoryMB: number;
18
+ /** Max output size in bytes (prevent output flooding) */
19
+ maxOutputBytes: number;
20
+ /** Severity threshold to trigger kill (CRITICAL = kill immediately) */
21
+ killOnSeverity: SeverityLevel;
22
+ /** Re-scan output for threats in real-time */
23
+ enableOutputScanning: boolean;
24
+ /** Max violations before kill */
25
+ maxViolations: number;
26
+ /** Categories that trigger immediate kill */
27
+ criticalCategories: ThreatCategory[];
28
+ }
29
+ export interface RuntimeEvent {
30
+ timestamp: string;
31
+ type: 'STDOUT' | 'STDERR' | 'THREAT_DETECTED' | 'RESOURCE_LIMIT' | 'KILL_SWITCH' | 'ANOMALY' | 'EXIT';
32
+ severity: SeverityLevel;
33
+ details: string;
34
+ data?: unknown;
35
+ }
36
+ export interface MonitorReport {
37
+ startTime: string;
38
+ endTime?: string;
39
+ durationMs: number;
40
+ events: RuntimeEvent[];
41
+ threatsDetected: number;
42
+ killed: boolean;
43
+ killReason?: string;
44
+ resourceUsage: {
45
+ peakMemoryMB: number;
46
+ totalOutputBytes: number;
47
+ cpuTimeMs: number;
48
+ };
49
+ }
50
+ export declare class RuntimeMonitor {
51
+ private policy;
52
+ private events;
53
+ private startTime;
54
+ private outputBytes;
55
+ private threatsDetected;
56
+ private killed;
57
+ private killReason?;
58
+ private process?;
59
+ private killTimer?;
60
+ private memoryCheckInterval?;
61
+ /** Subset of patterns optimized for real-time output scanning */
62
+ private runtimePatterns;
63
+ constructor(policy: MonitorPolicy);
64
+ /**
65
+ * Attach the monitor to a running child process.
66
+ */
67
+ attach(childProcess: ChildProcess): void;
68
+ /**
69
+ * Process output from the skill and check for threats.
70
+ */
71
+ private onOutput;
72
+ /**
73
+ * Scan skill output for threat patterns in real-time.
74
+ * This catches skills that generate malicious output (e.g., writing
75
+ * shell commands to stdout that another tool might execute).
76
+ */
77
+ private scanOutput;
78
+ /**
79
+ * Check process memory usage.
80
+ */
81
+ private checkMemory;
82
+ /**
83
+ * Kill the child process — the kill switch.
84
+ */
85
+ killProcess(reason: string, details: string): void;
86
+ /**
87
+ * Clean up timers and intervals.
88
+ */
89
+ private cleanup;
90
+ /**
91
+ * Compare severity levels. Returns positive if a >= b.
92
+ */
93
+ private compareSeverity;
94
+ private recordEvent;
95
+ /**
96
+ * Generate the final monitoring report.
97
+ */
98
+ getReport(): MonitorReport;
99
+ isKilled(): boolean;
100
+ getEventCount(): number;
101
+ }
102
+ /**
103
+ * Default monitor policy — strict but reasonable for developer use.
104
+ */
105
+ export declare function getDefaultMonitorPolicy(): MonitorPolicy;
106
+ //# sourceMappingURL=runtime-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-monitor.d.ts","sourceRoot":"","sources":["../../src/shield/runtime-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAA6C,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1H,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,cAAc,EAAE,aAAa,CAAC;IAC9B,8CAA8C;IAC9C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,kBAAkB,EAAE,cAAc,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;IACtG,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,mBAAmB,CAAC,CAAiB;IAE7C,iEAAiE;IACjE,OAAO,CAAC,eAAe,CAAqB;gBAEhC,MAAM,EAAE,aAAa;IAQjC;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAyCxC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAahB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA+ClB;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA0BlD;;OAEG;IACH,OAAO,CAAC,OAAO;IAWf;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,SAAS,IAAI,aAAa;IAkB1B,QAAQ,IAAI,OAAO;IAInB,aAAa,IAAI,MAAM;CAGxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAevD"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * SkillShield — Runtime Monitor + Kill Switch
3
+ *
4
+ * Real-time monitoring of skill execution. Watches stdout/stderr
5
+ * for threat patterns, tracks resource consumption, and kills the
6
+ * process if anomalies are detected.
7
+ *
8
+ * This is the core differentiator: Snyk scans before install,
9
+ * SkillShield watches DURING execution.
10
+ */
11
+ import { MALICIOUS_PATTERNS } from '../guard/patterns.js';
12
+ export class RuntimeMonitor {
13
+ constructor(policy) {
14
+ this.events = [];
15
+ this.startTime = 0;
16
+ this.outputBytes = 0;
17
+ this.threatsDetected = 0;
18
+ this.killed = false;
19
+ this.policy = policy;
20
+ // Select high-severity patterns for real-time scanning (keep it fast)
21
+ this.runtimePatterns = MALICIOUS_PATTERNS.filter((p) => p.severity === 'CRITICAL' || p.severity === 'HIGH');
22
+ }
23
+ /**
24
+ * Attach the monitor to a running child process.
25
+ */
26
+ attach(childProcess) {
27
+ this.process = childProcess;
28
+ this.startTime = Date.now();
29
+ this.killed = false;
30
+ // Start the kill timer (max execution time)
31
+ this.killTimer = setTimeout(() => {
32
+ this.killProcess('TIMEOUT', `Execution exceeded ${this.policy.maxExecutionTime}ms limit`);
33
+ }, this.policy.maxExecutionTime);
34
+ // Monitor stdout
35
+ childProcess.stdout?.on('data', (data) => {
36
+ const text = data.toString();
37
+ this.outputBytes += data.length;
38
+ this.onOutput('STDOUT', text);
39
+ });
40
+ // Monitor stderr
41
+ childProcess.stderr?.on('data', (data) => {
42
+ const text = data.toString();
43
+ this.outputBytes += data.length;
44
+ this.onOutput('STDERR', text);
45
+ });
46
+ // Monitor exit
47
+ childProcess.on('exit', (code, signal) => {
48
+ this.recordEvent({
49
+ type: 'EXIT',
50
+ severity: 'LOW',
51
+ details: `Process exited with code ${code}, signal ${signal}`,
52
+ data: { code, signal },
53
+ });
54
+ this.cleanup();
55
+ });
56
+ // Memory monitoring (check every 2 seconds)
57
+ this.memoryCheckInterval = setInterval(() => {
58
+ this.checkMemory();
59
+ }, 2000);
60
+ }
61
+ /**
62
+ * Process output from the skill and check for threats.
63
+ */
64
+ onOutput(stream, text) {
65
+ // Check output size
66
+ if (this.outputBytes > this.policy.maxOutputBytes) {
67
+ this.killProcess('OUTPUT_FLOOD', `Output exceeded ${this.policy.maxOutputBytes} bytes — possible output flooding attack`);
68
+ return;
69
+ }
70
+ // Real-time threat scanning on output
71
+ if (this.policy.enableOutputScanning) {
72
+ this.scanOutput(text, stream);
73
+ }
74
+ }
75
+ /**
76
+ * Scan skill output for threat patterns in real-time.
77
+ * This catches skills that generate malicious output (e.g., writing
78
+ * shell commands to stdout that another tool might execute).
79
+ */
80
+ scanOutput(text, stream) {
81
+ for (const pattern of this.runtimePatterns) {
82
+ // Reset regex state for global patterns
83
+ pattern.pattern.lastIndex = 0;
84
+ const match = pattern.pattern.exec(text);
85
+ if (match) {
86
+ this.threatsDetected++;
87
+ this.recordEvent({
88
+ type: 'THREAT_DETECTED',
89
+ severity: pattern.severity,
90
+ details: `[${stream}] ${pattern.description} — Evidence: "${match[0].substring(0, 100)}"`,
91
+ data: {
92
+ patternId: pattern.id,
93
+ category: pattern.category,
94
+ evidence: match[0].substring(0, 200),
95
+ },
96
+ });
97
+ // Kill immediately if critical category
98
+ if (this.policy.criticalCategories.includes(pattern.category)) {
99
+ this.killProcess('CRITICAL_THREAT', `Critical threat detected in output: ${pattern.category} — ${pattern.description}`);
100
+ return;
101
+ }
102
+ // Kill if severity exceeds threshold
103
+ if (this.compareSeverity(pattern.severity, this.policy.killOnSeverity) >= 0) {
104
+ this.killProcess('SEVERITY_THRESHOLD', `Threat severity ${pattern.severity} exceeds kill threshold ${this.policy.killOnSeverity}`);
105
+ return;
106
+ }
107
+ // Kill if too many violations
108
+ if (this.threatsDetected >= this.policy.maxViolations) {
109
+ this.killProcess('MAX_VIOLATIONS', `${this.threatsDetected} violations detected (limit: ${this.policy.maxViolations})`);
110
+ return;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Check process memory usage.
117
+ */
118
+ checkMemory() {
119
+ if (!this.process || !this.process.pid)
120
+ return;
121
+ try {
122
+ // Use process.memoryUsage() for the parent — child memory is harder
123
+ // For child process, we estimate from output + known overhead
124
+ const memUsage = process.memoryUsage();
125
+ const heapMB = Math.round(memUsage.heapUsed / 1024 / 1024);
126
+ if (heapMB > this.policy.maxMemoryMB) {
127
+ this.killProcess('MEMORY_LIMIT', `Memory usage ${heapMB}MB exceeds limit ${this.policy.maxMemoryMB}MB`);
128
+ }
129
+ }
130
+ catch {
131
+ // Ignore memory check errors
132
+ }
133
+ }
134
+ /**
135
+ * Kill the child process — the kill switch.
136
+ */
137
+ killProcess(reason, details) {
138
+ if (this.killed)
139
+ return;
140
+ this.killed = true;
141
+ this.killReason = `${reason}: ${details}`;
142
+ this.recordEvent({
143
+ type: 'KILL_SWITCH',
144
+ severity: 'CRITICAL',
145
+ details: `🛑 KILL SWITCH ACTIVATED — ${reason}: ${details}`,
146
+ });
147
+ if (this.process && !this.process.killed) {
148
+ // First try SIGTERM for graceful shutdown
149
+ this.process.kill('SIGTERM');
150
+ // Force kill after 3 seconds if still running
151
+ setTimeout(() => {
152
+ if (this.process && !this.process.killed) {
153
+ this.process.kill('SIGKILL');
154
+ }
155
+ }, 3000);
156
+ }
157
+ this.cleanup();
158
+ }
159
+ /**
160
+ * Clean up timers and intervals.
161
+ */
162
+ cleanup() {
163
+ if (this.killTimer) {
164
+ clearTimeout(this.killTimer);
165
+ this.killTimer = undefined;
166
+ }
167
+ if (this.memoryCheckInterval) {
168
+ clearInterval(this.memoryCheckInterval);
169
+ this.memoryCheckInterval = undefined;
170
+ }
171
+ }
172
+ /**
173
+ * Compare severity levels. Returns positive if a >= b.
174
+ */
175
+ compareSeverity(a, b) {
176
+ const order = {
177
+ CRITICAL: 4,
178
+ HIGH: 3,
179
+ MEDIUM: 2,
180
+ LOW: 1,
181
+ };
182
+ return order[a] - order[b];
183
+ }
184
+ recordEvent(partial) {
185
+ this.events.push({ ...partial, timestamp: new Date().toISOString() });
186
+ }
187
+ /**
188
+ * Generate the final monitoring report.
189
+ */
190
+ getReport() {
191
+ const endTime = Date.now();
192
+ return {
193
+ startTime: new Date(this.startTime).toISOString(),
194
+ endTime: new Date(endTime).toISOString(),
195
+ durationMs: endTime - this.startTime,
196
+ events: [...this.events],
197
+ threatsDetected: this.threatsDetected,
198
+ killed: this.killed,
199
+ killReason: this.killReason,
200
+ resourceUsage: {
201
+ peakMemoryMB: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),
202
+ totalOutputBytes: this.outputBytes,
203
+ cpuTimeMs: endTime - this.startTime,
204
+ },
205
+ };
206
+ }
207
+ isKilled() {
208
+ return this.killed;
209
+ }
210
+ getEventCount() {
211
+ return this.events.length;
212
+ }
213
+ }
214
+ /**
215
+ * Default monitor policy — strict but reasonable for developer use.
216
+ */
217
+ export function getDefaultMonitorPolicy() {
218
+ return {
219
+ maxExecutionTime: 60000, // 60 seconds
220
+ maxMemoryMB: 512, // 512MB
221
+ maxOutputBytes: 10 * 1024 * 1024, // 10MB output
222
+ killOnSeverity: 'CRITICAL',
223
+ enableOutputScanning: true,
224
+ maxViolations: 5,
225
+ criticalCategories: [
226
+ 'MEMORY_POISONING',
227
+ 'CREDENTIAL_THEFT',
228
+ 'MALWARE',
229
+ 'DATA_EXFILTRATION',
230
+ ],
231
+ };
232
+ }
233
+ //# sourceMappingURL=runtime-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-monitor.js","sourceRoot":"","sources":["../../src/shield/runtime-monitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillshield",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Runtime security for AI Agent Skills — Scan, sandbox & enforce. Detect prompt injection, memory poisoning, supply chain attacks. 72+ patterns, 14 categories. The firewall Snyk and Cisco don't build.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",