hackmyagent 0.14.1 → 0.15.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.
Files changed (127) hide show
  1. package/dist/.integrity-manifest.json +1 -1
  2. package/dist/arp/engine/event-engine.d.ts.map +1 -1
  3. package/dist/arp/engine/event-engine.js +8 -6
  4. package/dist/arp/engine/event-engine.js.map +1 -1
  5. package/dist/arp/intelligence/coordinator.d.ts.map +1 -1
  6. package/dist/arp/intelligence/coordinator.js +17 -12
  7. package/dist/arp/intelligence/coordinator.js.map +1 -1
  8. package/dist/arp/intelligence/nanomind-l1.js +2 -2
  9. package/dist/arp/intelligence/nanomind-l1.js.map +1 -1
  10. package/dist/arp/interceptors/process.d.ts.map +1 -1
  11. package/dist/arp/interceptors/process.js +40 -5
  12. package/dist/arp/interceptors/process.js.map +1 -1
  13. package/dist/arp/proxy/server.d.ts +6 -0
  14. package/dist/arp/proxy/server.d.ts.map +1 -1
  15. package/dist/arp/proxy/server.js +40 -14
  16. package/dist/arp/proxy/server.js.map +1 -1
  17. package/dist/arp/telemetry/gtin.d.ts +1 -1
  18. package/dist/arp/telemetry/gtin.d.ts.map +1 -1
  19. package/dist/arp/telemetry/gtin.js +4 -0
  20. package/dist/arp/telemetry/gtin.js.map +1 -1
  21. package/dist/attack/payloads/index.d.ts +2 -1
  22. package/dist/attack/payloads/index.d.ts.map +1 -1
  23. package/dist/attack/payloads/index.js +5 -1
  24. package/dist/attack/payloads/index.js.map +1 -1
  25. package/dist/attack/payloads/policy-enforcement-integrity.d.ts +13 -0
  26. package/dist/attack/payloads/policy-enforcement-integrity.d.ts.map +1 -0
  27. package/dist/attack/payloads/policy-enforcement-integrity.js +217 -0
  28. package/dist/attack/payloads/policy-enforcement-integrity.js.map +1 -0
  29. package/dist/attack/scanner.d.ts.map +1 -1
  30. package/dist/attack/scanner.js +1 -0
  31. package/dist/attack/scanner.js.map +1 -1
  32. package/dist/attack/types.d.ts +1 -1
  33. package/dist/attack/types.d.ts.map +1 -1
  34. package/dist/attack/types.js +5 -0
  35. package/dist/attack/types.js.map +1 -1
  36. package/dist/attack-engine/types.d.ts +1 -1
  37. package/dist/attack-engine/types.d.ts.map +1 -1
  38. package/dist/attack-engine/types.js.map +1 -1
  39. package/dist/cli.js +279 -20
  40. package/dist/cli.js.map +1 -1
  41. package/dist/hardening/scanner.d.ts +18 -4
  42. package/dist/hardening/scanner.d.ts.map +1 -1
  43. package/dist/hardening/scanner.js +76 -18
  44. package/dist/hardening/scanner.js.map +1 -1
  45. package/dist/nanomind-core/inference/tme-classifier.d.ts.map +1 -1
  46. package/dist/nanomind-core/inference/tme-classifier.js +0 -1
  47. package/dist/nanomind-core/inference/tme-classifier.js.map +1 -1
  48. package/dist/nanomind-core/scanner-bridge.d.ts.map +1 -1
  49. package/dist/nanomind-core/scanner-bridge.js +8 -0
  50. package/dist/nanomind-core/scanner-bridge.js.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/abgr/controls.d.ts +0 -35
  53. package/dist/abgr/controls.d.ts.map +0 -1
  54. package/dist/abgr/controls.js +0 -1058
  55. package/dist/abgr/controls.js.map +0 -1
  56. package/dist/abgr/detector.d.ts +0 -45
  57. package/dist/abgr/detector.d.ts.map +0 -1
  58. package/dist/abgr/detector.js +0 -175
  59. package/dist/abgr/detector.js.map +0 -1
  60. package/dist/abgr/index.d.ts +0 -24
  61. package/dist/abgr/index.d.ts.map +0 -1
  62. package/dist/abgr/index.js +0 -50
  63. package/dist/abgr/index.js.map +0 -1
  64. package/dist/abgr/scorer.d.ts +0 -36
  65. package/dist/abgr/scorer.d.ts.map +0 -1
  66. package/dist/abgr/scorer.js +0 -205
  67. package/dist/abgr/scorer.js.map +0 -1
  68. package/dist/abgr/templates.d.ts +0 -35
  69. package/dist/abgr/templates.d.ts.map +0 -1
  70. package/dist/abgr/templates.js +0 -668
  71. package/dist/abgr/templates.js.map +0 -1
  72. package/dist/abgr/tier.d.ts +0 -27
  73. package/dist/abgr/tier.d.ts.map +0 -1
  74. package/dist/abgr/tier.js +0 -115
  75. package/dist/abgr/tier.js.map +0 -1
  76. package/dist/abgr/types.d.ts +0 -59
  77. package/dist/abgr/types.d.ts.map +0 -1
  78. package/dist/abgr/types.js +0 -10
  79. package/dist/abgr/types.js.map +0 -1
  80. package/dist/agent-scan/checks.d.ts +0 -6
  81. package/dist/agent-scan/checks.d.ts.map +0 -1
  82. package/dist/agent-scan/checks.js +0 -93
  83. package/dist/agent-scan/checks.js.map +0 -1
  84. package/dist/agent-scan/index.d.ts +0 -10
  85. package/dist/agent-scan/index.d.ts.map +0 -1
  86. package/dist/agent-scan/index.js +0 -16
  87. package/dist/agent-scan/index.js.map +0 -1
  88. package/dist/agent-scan/scanner.d.ts +0 -31
  89. package/dist/agent-scan/scanner.d.ts.map +0 -1
  90. package/dist/agent-scan/scanner.js +0 -484
  91. package/dist/agent-scan/scanner.js.map +0 -1
  92. package/dist/agent-scan/types.d.ts +0 -63
  93. package/dist/agent-scan/types.d.ts.map +0 -1
  94. package/dist/agent-scan/types.js +0 -10
  95. package/dist/agent-scan/types.js.map +0 -1
  96. package/dist/hardening/llm-checks.d.ts +0 -18
  97. package/dist/hardening/llm-checks.d.ts.map +0 -1
  98. package/dist/hardening/llm-checks.js +0 -434
  99. package/dist/hardening/llm-checks.js.map +0 -1
  100. package/dist/hardening/mcp-tool-enum.d.ts +0 -45
  101. package/dist/hardening/mcp-tool-enum.d.ts.map +0 -1
  102. package/dist/hardening/mcp-tool-enum.js +0 -315
  103. package/dist/hardening/mcp-tool-enum.js.map +0 -1
  104. package/dist/hardening/shell-checks.d.ts +0 -21
  105. package/dist/hardening/shell-checks.d.ts.map +0 -1
  106. package/dist/hardening/shell-checks.js +0 -236
  107. package/dist/hardening/shell-checks.js.map +0 -1
  108. package/dist/nanomind-core/telemetry/auto-update.d.ts +0 -27
  109. package/dist/nanomind-core/telemetry/auto-update.d.ts.map +0 -1
  110. package/dist/nanomind-core/telemetry/auto-update.js +0 -129
  111. package/dist/nanomind-core/telemetry/auto-update.js.map +0 -1
  112. package/dist/nanomind-core/telemetry/client.d.ts +0 -66
  113. package/dist/nanomind-core/telemetry/client.d.ts.map +0 -1
  114. package/dist/nanomind-core/telemetry/client.js +0 -123
  115. package/dist/nanomind-core/telemetry/client.js.map +0 -1
  116. package/dist/nanomind-core/telemetry/config.d.ts +0 -33
  117. package/dist/nanomind-core/telemetry/config.d.ts.map +0 -1
  118. package/dist/nanomind-core/telemetry/config.js +0 -119
  119. package/dist/nanomind-core/telemetry/config.js.map +0 -1
  120. package/dist/nanomind-core/telemetry/index.d.ts +0 -15
  121. package/dist/nanomind-core/telemetry/index.d.ts.map +0 -1
  122. package/dist/nanomind-core/telemetry/index.js +0 -27
  123. package/dist/nanomind-core/telemetry/index.js.map +0 -1
  124. package/dist/registry/contribution.d.ts +0 -178
  125. package/dist/registry/contribution.d.ts.map +0 -1
  126. package/dist/registry/contribution.js +0 -272
  127. package/dist/registry/contribution.js.map +0 -1
@@ -1,315 +0,0 @@
1
- "use strict";
2
- /**
3
- * MCP Tool Enumeration (MCPTOOL-001 to MCPTOOL-005)
4
- *
5
- * Connects to configured MCP servers, discovers their tools via JSON-RPC,
6
- * and classifies dangerous capabilities. Only runs with --deep or --live-mcp flag.
7
- */
8
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- var desc = Object.getOwnPropertyDescriptor(m, k);
11
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
- desc = { enumerable: true, get: function() { return m[k]; } };
13
- }
14
- Object.defineProperty(o, k2, desc);
15
- }) : (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- o[k2] = m[k];
18
- }));
19
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
- Object.defineProperty(o, "default", { enumerable: true, value: v });
21
- }) : function(o, v) {
22
- o["default"] = v;
23
- });
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.discoverMcpConfigs = discoverMcpConfigs;
43
- exports.enumerateStdioTools = enumerateStdioTools;
44
- exports.classifyTools = classifyTools;
45
- exports.checkMcpToolEnumeration = checkMcpToolEnumeration;
46
- const child_process_1 = require("child_process");
47
- const fs = __importStar(require("fs/promises"));
48
- const path = __importStar(require("path"));
49
- const os = __importStar(require("os"));
50
- // Dangerous capability classification
51
- const EXECUTION_TOOLS = new Set([
52
- 'execute_command', 'bash', 'shell', 'run_command', 'exec',
53
- 'run_script', 'terminal', 'execute', 'run', 'system',
54
- 'execute_shell', 'run_shell', 'subprocess',
55
- ]);
56
- const FILESYSTEM_WRITE_TOOLS = new Set([
57
- 'write_file', 'create_file', 'delete_file', 'edit_file',
58
- 'write', 'remove_file', 'mkdir', 'rename_file', 'move_file',
59
- 'append_file', 'overwrite_file', 'file_write',
60
- ]);
61
- const NETWORK_TOOLS = new Set([
62
- 'fetch', 'http_request', 'curl', 'wget', 'request',
63
- 'http_get', 'http_post', 'web_request', 'send_request',
64
- 'make_request', 'api_call',
65
- ]);
66
- const CREDENTIAL_TOOLS = new Set([
67
- 'get_secret', 'read_env', 'get_credential', 'get_password',
68
- 'read_secret', 'fetch_secret', 'env_var', 'get_token',
69
- 'read_keychain', 'get_api_key',
70
- ]);
71
- const SPAWN_TIMEOUT_MS = 5000;
72
- const JSON_RPC_VERSION = '2.0';
73
- /**
74
- * Discover MCP server configurations from known config file locations.
75
- */
76
- async function discoverMcpConfigs(targetDir) {
77
- const configs = new Map();
78
- const configPaths = [
79
- path.join(targetDir, 'mcp.json'),
80
- path.join(targetDir, '.cursor', 'mcp.json'),
81
- path.join(targetDir, '.vscode', 'mcp.json'),
82
- path.join(os.homedir(), '.claude', 'settings.json'),
83
- ];
84
- for (const configPath of configPaths) {
85
- try {
86
- const content = await fs.readFile(configPath, 'utf-8');
87
- const parsed = JSON.parse(content);
88
- // Handle different config formats
89
- const servers = parsed.mcpServers || parsed.servers || {};
90
- for (const [name, serverConfig] of Object.entries(servers)) {
91
- const config = serverConfig;
92
- if (config.command || config.url) {
93
- configs.set(name, {
94
- config: {
95
- command: config.command,
96
- args: config.args,
97
- env: config.env,
98
- url: config.url,
99
- },
100
- configPath,
101
- });
102
- }
103
- }
104
- }
105
- catch {
106
- // Config file doesn't exist or is invalid, skip
107
- }
108
- }
109
- return configs;
110
- }
111
- /**
112
- * Connect to a stdio MCP server and enumerate its tools.
113
- */
114
- async function enumerateStdioTools(serverName, config) {
115
- return new Promise((resolve) => {
116
- let child = null;
117
- let buffer = '';
118
- let resolved = false;
119
- const cleanup = () => {
120
- if (child && !child.killed) {
121
- child.kill('SIGTERM');
122
- }
123
- };
124
- const finish = (result) => {
125
- if (!resolved) {
126
- resolved = true;
127
- cleanup();
128
- resolve(result);
129
- }
130
- };
131
- // Timeout
132
- const timer = setTimeout(() => {
133
- finish({ serverName, configPath: '', tools: [], error: 'Timeout after 5s' });
134
- }, SPAWN_TIMEOUT_MS);
135
- try {
136
- child = (0, child_process_1.spawn)(config.command, config.args || [], {
137
- stdio: ['pipe', 'pipe', 'pipe'],
138
- env: { ...process.env, ...config.env },
139
- });
140
- child.on('error', (err) => {
141
- clearTimeout(timer);
142
- finish({ serverName, configPath: '', tools: [], error: err.message });
143
- });
144
- child.stdout?.on('data', (data) => {
145
- buffer += data.toString();
146
- // Try to parse JSON-RPC responses
147
- const lines = buffer.split('\n');
148
- for (const line of lines) {
149
- const trimmed = line.trim();
150
- if (!trimmed)
151
- continue;
152
- try {
153
- const msg = JSON.parse(trimmed);
154
- // Response to initialize
155
- if (msg.id === 1 && msg.result) {
156
- // Send tools/list
157
- const toolsRequest = JSON.stringify({
158
- jsonrpc: JSON_RPC_VERSION,
159
- id: 2,
160
- method: 'tools/list',
161
- params: {},
162
- }) + '\n';
163
- child?.stdin?.write(toolsRequest);
164
- }
165
- // Response to tools/list
166
- if (msg.id === 2 && msg.result) {
167
- clearTimeout(timer);
168
- const tools = (msg.result.tools || []).map((t) => ({
169
- name: t.name,
170
- description: t.description,
171
- inputSchema: t.inputSchema,
172
- }));
173
- finish({ serverName, configPath: '', tools });
174
- }
175
- }
176
- catch {
177
- // Not valid JSON, skip
178
- }
179
- }
180
- // Keep only the last incomplete line in buffer
181
- buffer = lines[lines.length - 1] || '';
182
- });
183
- // Send initialize request
184
- const initRequest = JSON.stringify({
185
- jsonrpc: JSON_RPC_VERSION,
186
- id: 1,
187
- method: 'initialize',
188
- params: {
189
- protocolVersion: '2024-11-05',
190
- capabilities: {},
191
- clientInfo: { name: 'hackmyagent-scanner', version: '0.8.0' },
192
- },
193
- }) + '\n';
194
- child.stdin?.write(initRequest);
195
- }
196
- catch (err) {
197
- clearTimeout(timer);
198
- finish({ serverName, configPath: '', tools: [], error: err.message });
199
- }
200
- });
201
- }
202
- /**
203
- * Classify tool capabilities and generate security findings.
204
- */
205
- function classifyTools(serverName, configPath, tools) {
206
- const findings = [];
207
- // MCPTOOL-001: Execution tools
208
- const execTools = tools.filter((t) => EXECUTION_TOOLS.has(t.name.toLowerCase()));
209
- if (execTools.length > 0) {
210
- findings.push({
211
- checkId: 'MCPTOOL-001',
212
- name: 'MCP server exposes command execution',
213
- description: `MCP server "${serverName}" provides tools that can execute arbitrary commands: ${execTools.map((t) => t.name).join(', ')}. This allows the AI to run any system command.`,
214
- category: 'mcp-capability',
215
- severity: 'critical',
216
- passed: false,
217
- message: `${serverName}: ${execTools.length} execution tool(s) exposed`,
218
- fixable: false,
219
- file: configPath,
220
- fix: 'Restrict command execution tools or add an allowlist of permitted commands.',
221
- });
222
- }
223
- // MCPTOOL-002: Filesystem write tools
224
- const fsWriteTools = tools.filter((t) => FILESYSTEM_WRITE_TOOLS.has(t.name.toLowerCase()));
225
- if (fsWriteTools.length > 0) {
226
- findings.push({
227
- checkId: 'MCPTOOL-002',
228
- name: 'MCP server exposes filesystem write',
229
- description: `MCP server "${serverName}" provides tools that can write/delete files: ${fsWriteTools.map((t) => t.name).join(', ')}. This allows modifying system files.`,
230
- category: 'mcp-capability',
231
- severity: 'high',
232
- passed: false,
233
- message: `${serverName}: ${fsWriteTools.length} filesystem write tool(s) exposed`,
234
- fixable: false,
235
- file: configPath,
236
- fix: 'Add path restrictions to filesystem write tools.',
237
- });
238
- }
239
- // MCPTOOL-003: Unrestricted network tools
240
- const netTools = tools.filter((t) => NETWORK_TOOLS.has(t.name.toLowerCase()));
241
- if (netTools.length > 0) {
242
- findings.push({
243
- checkId: 'MCPTOOL-003',
244
- name: 'MCP server exposes unrestricted network access',
245
- description: `MCP server "${serverName}" provides tools for network requests: ${netTools.map((t) => t.name).join(', ')}. This allows data exfiltration.`,
246
- category: 'mcp-capability',
247
- severity: 'high',
248
- passed: false,
249
- message: `${serverName}: ${netTools.length} network tool(s) exposed`,
250
- fixable: false,
251
- file: configPath,
252
- fix: 'Restrict network access to specific domains or add an allowlist.',
253
- });
254
- }
255
- // MCPTOOL-004: Credential-accessing tools
256
- const credTools = tools.filter((t) => CREDENTIAL_TOOLS.has(t.name.toLowerCase()));
257
- if (credTools.length > 0) {
258
- findings.push({
259
- checkId: 'MCPTOOL-004',
260
- name: 'MCP server exposes credential access',
261
- description: `MCP server "${serverName}" provides tools that access credentials: ${credTools.map((t) => t.name).join(', ')}.`,
262
- category: 'mcp-capability',
263
- severity: 'critical',
264
- passed: false,
265
- message: `${serverName}: ${credTools.length} credential-accessing tool(s) exposed`,
266
- fixable: false,
267
- file: configPath,
268
- fix: 'Remove credential access tools or use secretless-ai broker for credential isolation.',
269
- });
270
- }
271
- // MCPTOOL-005: Server with 10+ tools and no apparent access control
272
- if (tools.length >= 10) {
273
- findings.push({
274
- checkId: 'MCPTOOL-005',
275
- name: 'MCP server exposes excessive tools',
276
- description: `MCP server "${serverName}" exposes ${tools.length} tools. Large tool surfaces increase the attack area for prompt injection.`,
277
- category: 'mcp-capability',
278
- severity: 'medium',
279
- passed: false,
280
- message: `${serverName}: ${tools.length} tools exposed (threshold: 10)`,
281
- fixable: false,
282
- file: configPath,
283
- fix: 'Reduce the number of exposed tools or implement per-tool access controls.',
284
- });
285
- }
286
- return findings;
287
- }
288
- /**
289
- * Run full MCP tool enumeration scan.
290
- * Discovers MCP configs, connects to each server, enumerates tools, classifies dangers.
291
- */
292
- async function checkMcpToolEnumeration(targetDir, onProgress) {
293
- const findings = [];
294
- const configs = await discoverMcpConfigs(targetDir);
295
- if (configs.size === 0)
296
- return findings;
297
- onProgress?.(`Found ${configs.size} MCP server(s), enumerating tools...`);
298
- for (const [serverName, { config, configPath }] of configs) {
299
- onProgress?.(`Scanning ${serverName}...`);
300
- if (config.command) {
301
- const result = await enumerateStdioTools(serverName, config);
302
- if (result.error) {
303
- // Non-fatal: server couldn't be reached
304
- onProgress?.(` ${serverName}: ${result.error}`);
305
- continue;
306
- }
307
- const serverFindings = classifyTools(serverName, configPath, result.tools);
308
- findings.push(...serverFindings);
309
- onProgress?.(` ${serverName}: ${result.tools.length} tools, ${serverFindings.length} findings`);
310
- }
311
- // SSE servers would go here (future)
312
- }
313
- return findings;
314
- }
315
- //# sourceMappingURL=mcp-tool-enum.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-tool-enum.js","sourceRoot":"","sources":["../../src/hardening/mcp-tool-enum.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DH,gDAwCC;AAKD,kDAoGC;AAKD,sCA4FC;AAMD,0DAiCC;AAlVD,iDAAyD;AACzD,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAuBzB,sCAAsC;AACtC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM;IACzD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ;IACpD,eAAe,EAAE,WAAW,EAAE,YAAY;CAC3C,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW;IACvD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW;IAC3D,aAAa,EAAE,gBAAgB,EAAE,YAAY;CAC9C,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAClD,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc;IACtD,cAAc,EAAE,UAAU;CAC3B,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc;IAC1D,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW;IACrD,eAAe,EAAE,aAAa;CAC/B,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAK,CAAC;AAC/B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;GAEG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2D,CAAC;IAEnF,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC;KACpD,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,kCAAkC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YAE1D,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3D,MAAM,MAAM,GAAG,YAAuC,CAAC;gBACvD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;wBAChB,MAAM,EAAE;4BACN,OAAO,EAAE,MAAM,CAAC,OAAiB;4BACjC,IAAI,EAAE,MAAM,CAAC,IAA4B;4BACzC,GAAG,EAAE,MAAM,CAAC,GAAyC;4BACrD,GAAG,EAAE,MAAM,CAAC,GAAyB;yBACtC;wBACD,UAAU;qBACX,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,MAAuB;IAEvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,KAAK,GAAwB,IAAI,CAAC;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAuB,EAAE,EAAE;YACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,UAAU;QACV,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC/E,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,IAAI,CAAC;YACH,KAAK,GAAG,IAAA,qBAAK,EAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE;gBAC/C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE;aACvC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAE1B,kCAAkC;gBAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO;wBAAE,SAAS;oBAEvB,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAEhC,yBAAyB;wBACzB,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;4BAC/B,kBAAkB;4BAClB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;gCAClC,OAAO,EAAE,gBAAgB;gCACzB,EAAE,EAAE,CAAC;gCACL,MAAM,EAAE,YAAY;gCACpB,MAAM,EAAE,EAAE;6BACX,CAAC,GAAG,IAAI,CAAC;4BACV,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;wBACpC,CAAC;wBAED,yBAAyB;wBACzB,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;4BAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;4BACpB,MAAM,KAAK,GAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CACvD,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;gCAC/B,IAAI,EAAE,CAAC,CAAC,IAAc;gCACtB,WAAW,EAAE,CAAC,CAAC,WAAiC;gCAChD,WAAW,EAAE,CAAC,CAAC,WAAkD;6BAClE,CAAC,CACH,CAAC;4BACF,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;wBAChD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB;oBACzB,CAAC;gBACH,CAAC;gBACD,+CAA+C;gBAC/C,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;gBACjC,OAAO,EAAE,gBAAgB;gBACzB,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE;oBACN,eAAe,EAAE,YAAY;oBAC7B,YAAY,EAAE,EAAE;oBAChB,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;iBAC9D;aACF,CAAC,GAAG,IAAI,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,UAAkB,EAClB,UAAkB,EAClB,KAAoB;IAEpB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,+BAA+B;IAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,sCAAsC;YAC5C,WAAW,EAAE,eAAe,UAAU,yDAAyD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD;YACvL,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,UAAsB;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG,UAAU,KAAK,SAAS,CAAC,MAAM,4BAA4B;YACvE,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,6EAA6E;SACnF,CAAC,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3F,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,qCAAqC;YAC3C,WAAW,EAAE,eAAe,UAAU,iDAAiD,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC;YACxK,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,MAAkB;YAC5B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG,UAAU,KAAK,YAAY,CAAC,MAAM,mCAAmC;YACjF,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,kDAAkD;SACxD,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,gDAAgD;YACtD,WAAW,EAAE,eAAe,UAAU,0CAA0C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC;YACxJ,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,MAAkB;YAC5B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG,UAAU,KAAK,QAAQ,CAAC,MAAM,0BAA0B;YACpE,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,kEAAkE;SACxE,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,sCAAsC;YAC5C,WAAW,EAAE,eAAe,UAAU,6CAA6C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC7H,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,UAAsB;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG,UAAU,KAAK,SAAS,CAAC,MAAM,uCAAuC;YAClF,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,sFAAsF;SAC5F,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,oCAAoC;YAC1C,WAAW,EAAE,eAAe,UAAU,aAAa,KAAK,CAAC,MAAM,4EAA4E;YAC3I,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,QAAoB;YAC9B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG,UAAU,KAAK,KAAK,CAAC,MAAM,gCAAgC;YACvE,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,2EAA2E;SACjF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,UAAsC;IAEtC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAExC,UAAU,EAAE,CAAC,SAAS,OAAO,CAAC,IAAI,sCAAsC,CAAC,CAAC;IAE1E,KAAK,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QAC3D,UAAU,EAAE,CAAC,YAAY,UAAU,KAAK,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,wCAAwC;gBACxC,UAAU,EAAE,CAAC,KAAK,UAAU,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3E,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAEjC,UAAU,EAAE,CACV,KAAK,UAAU,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,cAAc,CAAC,MAAM,WAAW,CACnF,CAAC;QACJ,CAAC;QACD,qCAAqC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Shell environment and history scanning checks.
3
- * Scans ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv for exported secrets
4
- * and ~/.bash_history, ~/.zsh_history for credentials in command history.
5
- */
6
- import type { SecurityFinding } from './security-check';
7
- export declare const SHELL_CREDENTIAL_PATTERNS: {
8
- name: string;
9
- pattern: RegExp;
10
- }[];
11
- /**
12
- * Scan shell environment config files for exported secrets.
13
- * Checks ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv
14
- */
15
- export declare function checkShellEnvironment(): Promise<SecurityFinding[]>;
16
- /**
17
- * Scan shell history files for credentials.
18
- * Checks ~/.bash_history, ~/.zsh_history (last 10K lines)
19
- */
20
- export declare function checkShellHistory(): Promise<SecurityFinding[]>;
21
- //# sourceMappingURL=shell-checks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shell-checks.d.ts","sourceRoot":"","sources":["../../src/hardening/shell-checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAGlE,eAAO,MAAM,yBAAyB;;;GAerC,CAAC;AAiBF;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA4DxE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAiFpE"}
@@ -1,236 +0,0 @@
1
- "use strict";
2
- /**
3
- * Shell environment and history scanning checks.
4
- * Scans ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv for exported secrets
5
- * and ~/.bash_history, ~/.zsh_history for credentials in command history.
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.SHELL_CREDENTIAL_PATTERNS = void 0;
42
- exports.checkShellEnvironment = checkShellEnvironment;
43
- exports.checkShellHistory = checkShellHistory;
44
- const fs = __importStar(require("fs/promises"));
45
- const path = __importStar(require("path"));
46
- const os = __importStar(require("os"));
47
- // Credential patterns to detect in shell files and LLM configs
48
- exports.SHELL_CREDENTIAL_PATTERNS = [
49
- { name: 'ANTHROPIC_API_KEY', pattern: /sk-ant-api\d{2}-[a-zA-Z0-9_-]{20,}/ },
50
- { name: 'OPENAI_API_KEY', pattern: /sk-proj-[a-zA-Z0-9]{20,}/ },
51
- { name: 'OPENAI_API_KEY', pattern: /sk-[a-zA-Z0-9]{48,}/ },
52
- { name: 'AWS_ACCESS_KEY', pattern: /AKIA[0-9A-Z]{16}/ },
53
- { name: 'GITHUB_TOKEN', pattern: /ghp_[a-zA-Z0-9]{36}/ },
54
- { name: 'GITHUB_TOKEN', pattern: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/ },
55
- { name: 'SLACK_TOKEN', pattern: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}/ },
56
- { name: 'GOOGLE_API_KEY', pattern: /AIza[0-9A-Za-z_-]{35}/ },
57
- { name: 'STRIPE_KEY', pattern: /sk_live_[0-9a-zA-Z]{24,}/ },
58
- { name: 'SENDGRID_KEY', pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/ },
59
- { name: 'OPENROUTER_KEY', pattern: /sk-or-v1-[a-zA-Z0-9]{48,}/ },
60
- { name: 'GROQ_KEY', pattern: /gsk_[a-zA-Z0-9]{20,}/ },
61
- { name: 'REPLICATE_TOKEN', pattern: /r8_[a-zA-Z0-9]{20,}/ },
62
- { name: 'HUGGINGFACE_TOKEN', pattern: /hf_[a-zA-Z0-9]{20,}/ },
63
- ];
64
- // Command-line patterns that indicate credentials passed as arguments
65
- const COMMAND_CREDENTIAL_PATTERNS = [
66
- /curl\s+[^\n]*-H\s*["']Authorization:\s*Bearer\s+\S{20,}["']/i,
67
- /curl\s+[^\n]*-H\s*["']x-api-key:\s*\S{20,}["']/i,
68
- /--api[_-]?key[=\s]+\S{20,}/i,
69
- /--token[=\s]+\S{20,}/i,
70
- /--secret[=\s]+\S{20,}/i,
71
- /--password[=\s]+\S{10,}/i,
72
- ];
73
- const SHELL_CONFIG_FILES = ['.bashrc', '.zshrc', '.profile', '.zshenv'];
74
- const HISTORY_FILES = ['.bash_history', '.zsh_history'];
75
- const MAX_HISTORY_LINES = 10000;
76
- const MAX_LINE_LENGTH = 10000;
77
- /**
78
- * Scan shell environment config files for exported secrets.
79
- * Checks ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv
80
- */
81
- async function checkShellEnvironment() {
82
- const findings = [];
83
- const homeDir = os.homedir();
84
- for (const configFile of SHELL_CONFIG_FILES) {
85
- const filePath = path.join(homeDir, configFile);
86
- let content;
87
- try {
88
- content = await fs.readFile(filePath, 'utf-8');
89
- }
90
- catch {
91
- continue; // File doesn't exist, skip
92
- }
93
- const lines = content.split('\n');
94
- for (let i = 0; i < lines.length; i++) {
95
- const line = lines[i];
96
- // Skip empty lines and lines over max length
97
- if (!line || line.length > MAX_LINE_LENGTH)
98
- continue;
99
- // Skip comment lines
100
- if (/^\s*#/.test(line))
101
- continue;
102
- // Skip env var references (${VAR} or $VAR without a literal value)
103
- if (/\$\{[A-Z_]+\}/.test(line) || /\$[A-Z_]+/.test(line)) {
104
- // But only skip if there's no literal credential pattern
105
- let hasCredential = false;
106
- for (const { pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
107
- if (pattern.test(line)) {
108
- hasCredential = true;
109
- break;
110
- }
111
- }
112
- if (!hasCredential)
113
- continue;
114
- }
115
- for (const { name, pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
116
- if (pattern.test(line)) {
117
- const checkId = getShellCheckId(name);
118
- findings.push({
119
- checkId,
120
- name: `Exposed ${name} in shell config`,
121
- description: `Found ${name} hardcoded in ~/${configFile}. Credentials in shell config files are loaded into every terminal session and may be captured by AI coding assistants.`,
122
- category: 'credential-exposure',
123
- severity: 'critical',
124
- passed: false,
125
- message: `~/${configFile}:${i + 1} contains ${name}`,
126
- fixable: false,
127
- file: `~/${configFile}`,
128
- line: i + 1,
129
- fix: 'Move credentials to a secret manager. Run: npx secretless-ai doctor',
130
- });
131
- break; // One finding per line
132
- }
133
- }
134
- }
135
- }
136
- return findings;
137
- }
138
- /**
139
- * Scan shell history files for credentials.
140
- * Checks ~/.bash_history, ~/.zsh_history (last 10K lines)
141
- */
142
- async function checkShellHistory() {
143
- const findings = [];
144
- const homeDir = os.homedir();
145
- for (const histFile of HISTORY_FILES) {
146
- const filePath = path.join(homeDir, histFile);
147
- let content;
148
- try {
149
- content = await fs.readFile(filePath, 'utf-8');
150
- }
151
- catch {
152
- continue; // File doesn't exist, skip
153
- }
154
- const allLines = content.split('\n');
155
- // Only scan last MAX_HISTORY_LINES
156
- const startIdx = Math.max(0, allLines.length - MAX_HISTORY_LINES);
157
- const lines = allLines.slice(startIdx);
158
- for (let i = 0; i < lines.length; i++) {
159
- let line = lines[i];
160
- // Skip empty lines and lines over max length
161
- if (!line || line.length > MAX_LINE_LENGTH)
162
- continue;
163
- // Strip zsh extended history timestamp prefix: `: 1234567890:0;actual command`
164
- const zshMatch = line.match(/^:\s*\d+:\d+;(.*)$/);
165
- if (zshMatch) {
166
- line = zshMatch[1];
167
- }
168
- const lineNum = startIdx + i + 1;
169
- let foundOnLine = false;
170
- // Check credential patterns in history (SHELLHIST-001/002)
171
- for (const { name, pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
172
- if (pattern.test(line)) {
173
- findings.push({
174
- checkId: getHistoryCheckId(name),
175
- name: 'Credential in shell history',
176
- description: `Found ${name} in ~/${histFile}. Credentials pasted into terminal are stored in history and accessible to any process running as your user.`,
177
- category: 'credential-exposure',
178
- severity: 'high',
179
- passed: false,
180
- message: `~/${histFile}:${lineNum} contains ${name}`,
181
- fixable: false,
182
- file: `~/${histFile}`,
183
- line: lineNum,
184
- fix: 'Clear history entry and use a secret manager. Run: npx secretless-ai scan-history',
185
- });
186
- foundOnLine = true;
187
- break;
188
- }
189
- }
190
- // Check command-line credential patterns (SHELLHIST-003)
191
- // Only if we haven't already found a credential pattern on this line
192
- if (!foundOnLine) {
193
- for (const pattern of COMMAND_CREDENTIAL_PATTERNS) {
194
- if (pattern.test(line)) {
195
- findings.push({
196
- checkId: 'SHELLHIST-003',
197
- name: 'Credential in command arguments',
198
- description: `Found credential passed as command argument in ~/${histFile}. Command-line arguments are visible in process listings and stored in history.`,
199
- category: 'credential-exposure',
200
- severity: 'high',
201
- passed: false,
202
- message: `~/${histFile}:${lineNum} contains credential in command`,
203
- fixable: false,
204
- file: `~/${histFile}`,
205
- line: lineNum,
206
- fix: 'Use environment variables instead of command-line arguments for credentials.',
207
- });
208
- break;
209
- }
210
- }
211
- }
212
- }
213
- }
214
- return findings;
215
- }
216
- function getShellCheckId(credName) {
217
- switch (credName) {
218
- case 'ANTHROPIC_API_KEY': return 'SHELL-001';
219
- case 'OPENAI_API_KEY': return 'SHELL-002';
220
- case 'AWS_ACCESS_KEY': return 'SHELL-003';
221
- default: return 'SHELL-004';
222
- }
223
- }
224
- function getHistoryCheckId(credName) {
225
- switch (credName) {
226
- case 'ANTHROPIC_API_KEY':
227
- case 'OPENAI_API_KEY':
228
- return 'SHELLHIST-001';
229
- case 'AWS_ACCESS_KEY':
230
- case 'GITHUB_TOKEN':
231
- return 'SHELLHIST-002';
232
- default:
233
- return 'SHELLHIST-001';
234
- }
235
- }
236
- //# sourceMappingURL=shell-checks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shell-checks.js","sourceRoot":"","sources":["../../src/hardening/shell-checks.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * NanoMind Auto-Update
3
- *
4
- * Checks the Registry for newer model versions on each run.
5
- * Downloads and caches the latest model if available.
6
- * Never blocks: if check/download fails, use the cached version.
7
- */
8
- import { TelemetryConfig } from './config.js';
9
- export interface ModelVersionInfo {
10
- version: string;
11
- sha256: string;
12
- downloadUrl: string;
13
- changelog: string;
14
- publishedAt: string;
15
- }
16
- /**
17
- * Check if a newer model version is available.
18
- * Returns null if check fails or no update available.
19
- * Respects CHECK_INTERVAL_MS to avoid hammering the registry.
20
- */
21
- export declare function checkForUpdate(currentVersion: string, config?: TelemetryConfig): Promise<ModelVersionInfo | null>;
22
- /**
23
- * Download and cache a new model version.
24
- * Returns the local path to the downloaded model, or null on failure.
25
- */
26
- export declare function downloadModel(info: ModelVersionInfo): Promise<string | null>;
27
- //# sourceMappingURL=auto-update.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../../src/nanomind-core/telemetry/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAU1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4BlC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBlF"}