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,320 @@
1
+ /**
2
+ * SkillShield — Filesystem Jail
3
+ *
4
+ * Restricts skill access to specific directories. Skills can only read/write
5
+ * within their jail, and sensitive paths are always blocked.
6
+ *
7
+ * Unlike NVIDIA OpenShell (which needs Landlock/Linux), this works
8
+ * cross-platform by intercepting Node.js fs module calls.
9
+ */
10
+ import { resolve, normalize, relative, isAbsolute } from 'path';
11
+ /** Sensitive paths that are ALWAYS blocked regardless of policy */
12
+ const SENSITIVE_PATHS = [
13
+ // SSH & credentials
14
+ '~/.ssh',
15
+ '~/.aws',
16
+ '~/.config/gcloud',
17
+ '~/.kube',
18
+ '~/.gnupg',
19
+ '~/.npmrc',
20
+ '~/.pypirc',
21
+ // Environment files
22
+ '.env',
23
+ '.env.local',
24
+ '.env.production',
25
+ '.env.staging',
26
+ 'credentials.json',
27
+ 'secrets.json',
28
+ 'service-account.json',
29
+ // System files
30
+ '/etc/passwd',
31
+ '/etc/shadow',
32
+ '/etc/sudoers',
33
+ // Agent identity files (Memory Poisoning protection)
34
+ 'SOUL.md',
35
+ 'MEMORY.md',
36
+ 'IDENTITY.md',
37
+ 'HEARTBEAT.md',
38
+ 'AGENTS.md',
39
+ 'USER.md',
40
+ '.clawhome',
41
+ '.openclaw',
42
+ // Git credentials
43
+ '.git-credentials',
44
+ '.gitconfig',
45
+ ];
46
+ /** Sensitive path patterns (regex) */
47
+ const SENSITIVE_PATTERNS = [
48
+ /\.env(\.[a-z]+)?$/i,
49
+ /id_rsa|id_ed25519|id_ecdsa/i,
50
+ /\.pem$/i,
51
+ /\.key$/i,
52
+ /credentials/i,
53
+ /secrets?\.(json|yaml|yml|toml)$/i,
54
+ /service.account.*\.json$/i,
55
+ ];
56
+ export class FilesystemJail {
57
+ constructor(policy) {
58
+ this.violations = [];
59
+ this.fileCount = 0;
60
+ this.totalBytesWritten = 0;
61
+ this.policy = policy;
62
+ this.jailRoot = resolve(policy.jailRoot);
63
+ this.homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';
64
+ // Expand ~ in sensitive paths and add to blocked set
65
+ this.blockedPaths = new Set([
66
+ ...SENSITIVE_PATHS.map((p) => this.expandPath(p)),
67
+ ...(policy.blockedPaths || []).map((p) => resolve(p)),
68
+ ]);
69
+ }
70
+ /**
71
+ * Check if a read operation is allowed.
72
+ */
73
+ checkRead(filePath) {
74
+ const resolved = this.resolvePath(filePath);
75
+ // Always block sensitive paths
76
+ if (this.isSensitivePath(resolved)) {
77
+ this.recordViolation({
78
+ type: 'SENSITIVE_PATH',
79
+ path: resolved,
80
+ operation: 'read',
81
+ details: `Access to sensitive path blocked: ${resolved}`,
82
+ });
83
+ return false;
84
+ }
85
+ // Check if inside jail
86
+ if (this.isInsideJail(resolved)) {
87
+ return true;
88
+ }
89
+ // Check additional readable paths
90
+ if (this.policy.readablePaths?.some((p) => resolved.startsWith(resolve(p)))) {
91
+ return true;
92
+ }
93
+ // Check allow-read-outside setting
94
+ if (this.policy.allowReadOutsideJail) {
95
+ return true;
96
+ }
97
+ this.recordViolation({
98
+ type: 'READ_BLOCKED',
99
+ path: resolved,
100
+ operation: 'read',
101
+ details: `Read outside jail: ${resolved} (jail: ${this.jailRoot})`,
102
+ });
103
+ return false;
104
+ }
105
+ /**
106
+ * Check if a write operation is allowed.
107
+ */
108
+ checkWrite(filePath, size) {
109
+ const resolved = this.resolvePath(filePath);
110
+ // Always block sensitive paths
111
+ if (this.isSensitivePath(resolved)) {
112
+ this.recordViolation({
113
+ type: 'SENSITIVE_PATH',
114
+ path: resolved,
115
+ operation: 'write',
116
+ details: `Write to sensitive path blocked: ${resolved}`,
117
+ });
118
+ return false;
119
+ }
120
+ // Must be inside jail OR in writable paths
121
+ const isInJail = this.isInsideJail(resolved);
122
+ const isInWritable = this.policy.writablePaths?.some((p) => resolved.startsWith(resolve(p))) || false;
123
+ if (!isInJail && !isInWritable) {
124
+ this.recordViolation({
125
+ type: 'WRITE_BLOCKED',
126
+ path: resolved,
127
+ operation: 'write',
128
+ details: `Write outside jail: ${resolved} (jail: ${this.jailRoot})`,
129
+ });
130
+ return false;
131
+ }
132
+ // Check file size
133
+ if (size && this.policy.maxWriteSize && size > this.policy.maxWriteSize) {
134
+ this.recordViolation({
135
+ type: 'SIZE_EXCEEDED',
136
+ path: resolved,
137
+ operation: 'write',
138
+ details: `File size ${size} exceeds limit ${this.policy.maxWriteSize}`,
139
+ });
140
+ return false;
141
+ }
142
+ // Check file count
143
+ if (this.policy.maxFileCount && this.fileCount >= this.policy.maxFileCount) {
144
+ this.recordViolation({
145
+ type: 'FILE_COUNT_EXCEEDED',
146
+ path: resolved,
147
+ operation: 'write',
148
+ details: `File count ${this.fileCount} exceeds limit ${this.policy.maxFileCount}`,
149
+ });
150
+ return false;
151
+ }
152
+ this.fileCount++;
153
+ if (size)
154
+ this.totalBytesWritten += size;
155
+ return true;
156
+ }
157
+ /**
158
+ * Check if a delete operation is allowed.
159
+ */
160
+ checkDelete(filePath) {
161
+ const resolved = this.resolvePath(filePath);
162
+ // Never allow deleting sensitive paths
163
+ if (this.isSensitivePath(resolved)) {
164
+ this.recordViolation({
165
+ type: 'SENSITIVE_PATH',
166
+ path: resolved,
167
+ operation: 'delete',
168
+ details: `Delete of sensitive path blocked: ${resolved}`,
169
+ });
170
+ return false;
171
+ }
172
+ // Must be inside jail only
173
+ if (!this.isInsideJail(resolved)) {
174
+ this.recordViolation({
175
+ type: 'DELETE_BLOCKED',
176
+ path: resolved,
177
+ operation: 'delete',
178
+ details: `Delete outside jail: ${resolved} (jail: ${this.jailRoot})`,
179
+ });
180
+ return false;
181
+ }
182
+ return true;
183
+ }
184
+ /**
185
+ * Generate Node.js code that enforces filesystem policy at runtime.
186
+ */
187
+ generateEnforcementCode() {
188
+ const jailRootJSON = JSON.stringify(this.jailRoot);
189
+ const sensitiveJSON = JSON.stringify([...this.blockedPaths]);
190
+ const patternsJSON = JSON.stringify(SENSITIVE_PATTERNS.map((p) => p.source));
191
+ const readableJSON = JSON.stringify((this.policy.readablePaths || []).map((p) => resolve(p)));
192
+ const writableJSON = JSON.stringify((this.policy.writablePaths || []).map((p) => resolve(p)));
193
+ return `
194
+ // ── SkillShield Filesystem Jail ──
195
+ const __ss_path = require('path');
196
+ const __ss_jailRoot = ${jailRootJSON};
197
+ const __ss_sensitive = new Set(${sensitiveJSON});
198
+ const __ss_patterns = ${patternsJSON}.map(s => new RegExp(s, 'i'));
199
+ const __ss_readable = ${readableJSON};
200
+ const __ss_writable = ${writableJSON};
201
+ const __ss_maxWrite = ${this.policy.maxWriteSize || 0};
202
+ let __ss_fileCount = 0;
203
+ const __ss_maxFiles = ${this.policy.maxFileCount || 100};
204
+
205
+ function __ss_isSensitive(p) {
206
+ const resolved = __ss_path.resolve(p);
207
+ if (__ss_sensitive.has(resolved)) return true;
208
+ for (const s of __ss_sensitive) { if (resolved.startsWith(s + __ss_path.sep)) return true; }
209
+ for (const pat of __ss_patterns) { if (pat.test(resolved)) return true; }
210
+ return false;
211
+ }
212
+
213
+ function __ss_isInJail(p) {
214
+ const resolved = __ss_path.resolve(p);
215
+ const rel = __ss_path.relative(__ss_jailRoot, resolved);
216
+ return !rel.startsWith('..') && !__ss_path.isAbsolute(rel);
217
+ }
218
+
219
+ function __ss_checkRead(p) {
220
+ if (__ss_isSensitive(p)) throw new Error('[SkillShield] BLOCKED: Access to sensitive path: ' + p);
221
+ if (__ss_isInJail(p)) return true;
222
+ for (const r of __ss_readable) { if (__ss_path.resolve(p).startsWith(r)) return true; }
223
+ throw new Error('[SkillShield] BLOCKED: Read outside jail: ' + p);
224
+ }
225
+
226
+ function __ss_checkWrite(p) {
227
+ if (__ss_isSensitive(p)) throw new Error('[SkillShield] BLOCKED: Write to sensitive path: ' + p);
228
+ if (__ss_isInJail(p)) { __ss_fileCount++; if (__ss_fileCount > __ss_maxFiles) throw new Error('[SkillShield] File count limit exceeded'); return true; }
229
+ for (const w of __ss_writable) { if (__ss_path.resolve(p).startsWith(w)) return true; }
230
+ throw new Error('[SkillShield] BLOCKED: Write outside jail: ' + p);
231
+ }
232
+
233
+ // Intercept fs operations
234
+ const __ss_fs = require('fs');
235
+ const __ss_origReadFile = __ss_fs.readFileSync;
236
+ const __ss_origWriteFile = __ss_fs.writeFileSync;
237
+ const __ss_origUnlink = __ss_fs.unlinkSync;
238
+
239
+ __ss_fs.readFileSync = function(path, ...args) {
240
+ __ss_checkRead(String(path));
241
+ return __ss_origReadFile.call(this, path, ...args);
242
+ };
243
+ __ss_fs.writeFileSync = function(path, data, ...args) {
244
+ __ss_checkWrite(String(path));
245
+ return __ss_origWriteFile.call(this, path, data, ...args);
246
+ };
247
+ __ss_fs.unlinkSync = function(path, ...args) {
248
+ if (__ss_isSensitive(String(path)) || !__ss_isInJail(String(path)))
249
+ throw new Error('[SkillShield] BLOCKED: Delete outside jail: ' + path);
250
+ return __ss_origUnlink.call(this, path, ...args);
251
+ };
252
+ // ── End SkillShield Filesystem Jail ──
253
+ `;
254
+ }
255
+ isSensitivePath(resolved) {
256
+ // Direct match
257
+ if (this.blockedPaths.has(resolved))
258
+ return true;
259
+ // Check if path is under a blocked directory
260
+ for (const blocked of this.blockedPaths) {
261
+ if (resolved.startsWith(blocked + '/') || resolved.startsWith(blocked + '\\')) {
262
+ return true;
263
+ }
264
+ }
265
+ // Pattern match
266
+ for (const pattern of SENSITIVE_PATTERNS) {
267
+ if (pattern.test(resolved))
268
+ return true;
269
+ }
270
+ return false;
271
+ }
272
+ isInsideJail(resolved) {
273
+ const rel = relative(this.jailRoot, resolved);
274
+ return !rel.startsWith('..') && !isAbsolute(rel);
275
+ }
276
+ resolvePath(filePath) {
277
+ return resolve(normalize(filePath));
278
+ }
279
+ expandPath(p) {
280
+ if (p.startsWith('~/') || p === '~') {
281
+ return resolve(this.homeDir, p.slice(2));
282
+ }
283
+ return resolve(p);
284
+ }
285
+ recordViolation(partial) {
286
+ this.violations.push({ ...partial, timestamp: new Date().toISOString() });
287
+ }
288
+ getViolations() {
289
+ return [...this.violations];
290
+ }
291
+ getStats() {
292
+ return {
293
+ filesCreated: this.fileCount,
294
+ bytesWritten: this.totalBytesWritten,
295
+ violations: this.violations.length,
296
+ };
297
+ }
298
+ }
299
+ /**
300
+ * Parse filesystem policy from SKILL.md frontmatter.
301
+ * Expected format:
302
+ * filesystem:
303
+ * writable: ["./output", "/tmp"]
304
+ * readable: ["./data"]
305
+ * maxWriteMB: 50
306
+ * maxFiles: 100
307
+ */
308
+ export function parseFilesystemPolicy(frontmatter, defaultJailRoot) {
309
+ const fs = (frontmatter.filesystem || frontmatter.fs || {});
310
+ return {
311
+ jailRoot: fs.root || defaultJailRoot,
312
+ readablePaths: fs.readable || [],
313
+ writablePaths: fs.writable || [],
314
+ blockedPaths: fs.blocked || [],
315
+ allowReadOutsideJail: fs.allowReadOutside || false,
316
+ maxWriteSize: (fs.maxWriteMB || 50) * 1024 * 1024,
317
+ maxFileCount: fs.maxFiles || 100,
318
+ };
319
+ }
320
+ //# sourceMappingURL=filesystem-jail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-jail.js","sourceRoot":"","sources":["../../src/shield/filesystem-jail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * SkillShield — Unified Runtime Security Engine
3
+ *
4
+ * Combines: Pre-scan (guard) + Network Policy + Filesystem Jail +
5
+ * Runtime Monitor + Kill Switch + Audit Trail
6
+ *
7
+ * This is what makes SkillShield unique:
8
+ * - Snyk/Cisco only scan before install
9
+ * - NVIDIA OpenShell needs Linux + enterprise infra
10
+ * - Aegis only intercepts LLM API calls
11
+ * - SkillShield does scan + runtime in one CLI, cross-platform
12
+ */
13
+ export { NetworkPolicyEngine, parseNetworkPolicy } from './network-policy.js';
14
+ export type { NetworkPolicy, NetworkViolation } from './network-policy.js';
15
+ export { FilesystemJail, parseFilesystemPolicy } from './filesystem-jail.js';
16
+ export type { FilesystemPolicy, FilesystemViolation } from './filesystem-jail.js';
17
+ export { RuntimeMonitor, getDefaultMonitorPolicy } from './runtime-monitor.js';
18
+ export type { MonitorPolicy, RuntimeEvent, MonitorReport } from './runtime-monitor.js';
19
+ export { AuditTrail } from './audit-trail.js';
20
+ export type { AuditEntry, AuditEventType } from './audit-trail.js';
21
+ import { NetworkPolicyEngine, type NetworkPolicy } from './network-policy.js';
22
+ import { FilesystemJail, type FilesystemPolicy } from './filesystem-jail.js';
23
+ import { RuntimeMonitor, type MonitorPolicy } from './runtime-monitor.js';
24
+ import { AuditTrail } from './audit-trail.js';
25
+ export interface ShieldConfig {
26
+ skillId: string;
27
+ /** SKILL.md frontmatter for policy extraction */
28
+ frontmatter?: Record<string, unknown>;
29
+ /** Override network policy */
30
+ networkPolicy?: Partial<NetworkPolicy>;
31
+ /** Override filesystem policy */
32
+ filesystemPolicy?: Partial<FilesystemPolicy>;
33
+ /** Override monitor policy */
34
+ monitorPolicy?: Partial<MonitorPolicy>;
35
+ /** Working directory for the skill */
36
+ workDir?: string;
37
+ /** Enable audit trail (default: true) */
38
+ enableAudit?: boolean;
39
+ /** Verbose logging */
40
+ verbose?: boolean;
41
+ }
42
+ export interface ShieldReport {
43
+ skillId: string;
44
+ timestamp: string;
45
+ /** Pre-execution scan results */
46
+ scanScore: number;
47
+ scanStatus: string;
48
+ /** Runtime results */
49
+ killed: boolean;
50
+ killReason?: string;
51
+ durationMs: number;
52
+ /** Violations across all layers */
53
+ networkViolations: number;
54
+ filesystemViolations: number;
55
+ runtimeThreats: number;
56
+ totalViolations: number;
57
+ /** Audit trail hash (for verification) */
58
+ auditHash: string | null;
59
+ auditLength: number;
60
+ auditVerified: boolean;
61
+ }
62
+ /**
63
+ * The main Shield — orchestrates all security layers.
64
+ */
65
+ export declare class SkillShield {
66
+ private config;
67
+ network: NetworkPolicyEngine;
68
+ filesystem: FilesystemJail;
69
+ monitor: RuntimeMonitor;
70
+ audit: AuditTrail;
71
+ constructor(config: ShieldConfig);
72
+ /**
73
+ * Generate the combined enforcement code that wraps skill execution.
74
+ * This code is prepended to the skill's execution context.
75
+ */
76
+ generateEnforcementWrapper(): string;
77
+ /**
78
+ * Get the final shield report after execution.
79
+ */
80
+ getReport(scanScore: number, scanStatus: string, durationMs: number): ShieldReport;
81
+ }
82
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shield/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAsB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAyB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,cAAc,EAA2B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAe;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;gBAEb,MAAM,EAAE,YAAY;IAwBhC;;;OAGG;IACH,0BAA0B,IAAI,MAAM;IAgBpC;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;CAuBnF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * SkillShield — Unified Runtime Security Engine
3
+ *
4
+ * Combines: Pre-scan (guard) + Network Policy + Filesystem Jail +
5
+ * Runtime Monitor + Kill Switch + Audit Trail
6
+ *
7
+ * This is what makes SkillShield unique:
8
+ * - Snyk/Cisco only scan before install
9
+ * - NVIDIA OpenShell needs Linux + enterprise infra
10
+ * - Aegis only intercepts LLM API calls
11
+ * - SkillShield does scan + runtime in one CLI, cross-platform
12
+ */
13
+ export { NetworkPolicyEngine, parseNetworkPolicy } from './network-policy.js';
14
+ export { FilesystemJail, parseFilesystemPolicy } from './filesystem-jail.js';
15
+ export { RuntimeMonitor, getDefaultMonitorPolicy } from './runtime-monitor.js';
16
+ export { AuditTrail } from './audit-trail.js';
17
+ import { NetworkPolicyEngine, parseNetworkPolicy } from './network-policy.js';
18
+ import { FilesystemJail, parseFilesystemPolicy } from './filesystem-jail.js';
19
+ import { RuntimeMonitor, getDefaultMonitorPolicy } from './runtime-monitor.js';
20
+ import { AuditTrail } from './audit-trail.js';
21
+ /**
22
+ * The main Shield — orchestrates all security layers.
23
+ */
24
+ export class SkillShield {
25
+ constructor(config) {
26
+ this.config = config;
27
+ const frontmatter = config.frontmatter || {};
28
+ const workDir = config.workDir || process.cwd();
29
+ // Initialize network policy
30
+ const baseNetPolicy = parseNetworkPolicy(frontmatter);
31
+ const netPolicy = { ...baseNetPolicy, ...config.networkPolicy };
32
+ this.network = new NetworkPolicyEngine(netPolicy);
33
+ // Initialize filesystem jail
34
+ const baseFsPolicy = parseFilesystemPolicy(frontmatter, workDir);
35
+ const fsPolicy = { ...baseFsPolicy, ...config.filesystemPolicy };
36
+ this.filesystem = new FilesystemJail(fsPolicy);
37
+ // Initialize runtime monitor
38
+ const baseMonPolicy = getDefaultMonitorPolicy();
39
+ const monPolicy = { ...baseMonPolicy, ...config.monitorPolicy };
40
+ this.monitor = new RuntimeMonitor(monPolicy);
41
+ // Initialize audit trail
42
+ this.audit = new AuditTrail(config.skillId);
43
+ }
44
+ /**
45
+ * Generate the combined enforcement code that wraps skill execution.
46
+ * This code is prepended to the skill's execution context.
47
+ */
48
+ generateEnforcementWrapper() {
49
+ const networkCode = this.network.generateEnforcementCode();
50
+ const filesystemCode = this.filesystem.generateEnforcementCode();
51
+ return `
52
+ // ╔══════════════════════════════════════════════════════════════╗
53
+ // ║ SKILLSHIELD RUNTIME ENFORCEMENT ║
54
+ // ║ Network Policy + Filesystem Jail + Output Monitoring ║
55
+ // ╚══════════════════════════════════════════════════════════════╝
56
+ ${networkCode}
57
+ ${filesystemCode}
58
+ // ── SkillShield Ready ──
59
+ console.error('[SkillShield] Runtime enforcement active');
60
+ `;
61
+ }
62
+ /**
63
+ * Get the final shield report after execution.
64
+ */
65
+ getReport(scanScore, scanStatus, durationMs) {
66
+ const networkStats = this.network.getStats();
67
+ const fsStats = this.filesystem.getStats();
68
+ const monitorReport = this.monitor.getReport();
69
+ const auditVerification = this.audit.verify();
70
+ return {
71
+ skillId: this.config.skillId,
72
+ timestamp: new Date().toISOString(),
73
+ scanScore,
74
+ scanStatus,
75
+ killed: this.monitor.isKilled(),
76
+ killReason: monitorReport.killReason,
77
+ durationMs,
78
+ networkViolations: networkStats.violations,
79
+ filesystemViolations: fsStats.violations,
80
+ runtimeThreats: monitorReport.threatsDetected,
81
+ totalViolations: networkStats.violations + fsStats.violations + monitorReport.threatsDetected,
82
+ auditHash: this.audit.getLatestHash(),
83
+ auditLength: this.audit.getLength(),
84
+ auditVerified: auditVerification.valid,
85
+ };
86
+ }
87
+ }
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shield/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
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
+ export interface NetworkPolicy {
11
+ /** Allowed domains (e.g., ["api.openai.com", "api.anthropic.com"]) */
12
+ allowedDomains: string[];
13
+ /** Allowed IP ranges in CIDR notation (e.g., ["10.0.0.0/8"]) */
14
+ allowedIPs?: string[];
15
+ /** Block all outbound by default? (true = default-deny) */
16
+ defaultDeny: boolean;
17
+ /** Max concurrent connections per skill */
18
+ maxConnections?: number;
19
+ /** Max data transfer in bytes (prevent exfiltration) */
20
+ maxTransferBytes?: number;
21
+ /** Block known malicious IPs/domains */
22
+ blockMalicious?: boolean;
23
+ }
24
+ export interface NetworkViolation {
25
+ timestamp: string;
26
+ type: 'DNS_BLOCKED' | 'CONNECTION_BLOCKED' | 'TRANSFER_EXCEEDED' | 'MALICIOUS_DOMAIN';
27
+ domain?: string;
28
+ ip?: string;
29
+ port?: number;
30
+ details: string;
31
+ }
32
+ export declare class NetworkPolicyEngine {
33
+ private policy;
34
+ private violations;
35
+ private connectionCount;
36
+ private transferredBytes;
37
+ private blockedDomains;
38
+ constructor(policy: NetworkPolicy);
39
+ /**
40
+ * Check if a domain is allowed by the policy.
41
+ * Returns true if allowed, false if blocked.
42
+ */
43
+ checkDomain(domain: string): boolean;
44
+ /**
45
+ * Check if a connection attempt is allowed.
46
+ */
47
+ checkConnection(domain: string, port: number): boolean;
48
+ /**
49
+ * Track data transfer and block if limit exceeded.
50
+ */
51
+ trackTransfer(bytes: number): boolean;
52
+ /**
53
+ * Generate the Node.js code that enforces this policy at runtime.
54
+ * This wraps the skill's execution with DNS/network interception.
55
+ */
56
+ generateEnforcementCode(): string;
57
+ private recordViolation;
58
+ getViolations(): NetworkViolation[];
59
+ getStats(): {
60
+ connections: number;
61
+ transferredBytes: number;
62
+ violations: number;
63
+ };
64
+ reset(): void;
65
+ }
66
+ /**
67
+ * Parse network policy from SKILL.md frontmatter.
68
+ * Expected format in frontmatter:
69
+ * network:
70
+ * allowed: ["api.openai.com", "api.anthropic.com"]
71
+ * maxTransferMB: 10
72
+ */
73
+ export declare function parseNetworkPolicy(frontmatter: Record<string, unknown>): NetworkPolicy;
74
+ //# sourceMappingURL=network-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-policy.d.ts","sourceRoot":"","sources":["../../src/shield/network-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AA0BD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,cAAc,CAAc;gBAExB,MAAM,EAAE,aAAa;IAQjC;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAgDpC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAqBtD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAcrC;;;OAGG;IACH,uBAAuB,IAAI,MAAM;IA6DjC,OAAO,CAAC,eAAe;IAOvB,aAAa,IAAI,gBAAgB,EAAE;IAInC,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAQjF,KAAK,IAAI,IAAI;CAKd;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAYtF"}