safemode 2.0.2 → 2.0.3
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.
|
@@ -17,10 +17,10 @@ export interface ScanResult {
|
|
|
17
17
|
scan_duration_ms: number;
|
|
18
18
|
}
|
|
19
19
|
export declare class FirstRunScanner {
|
|
20
|
-
private
|
|
20
|
+
private scanRoot;
|
|
21
21
|
private maxFilesToScan;
|
|
22
22
|
private maxFileSize;
|
|
23
|
-
constructor();
|
|
23
|
+
constructor(scanRoot?: string);
|
|
24
24
|
/**
|
|
25
25
|
* Run a full scan
|
|
26
26
|
*/
|
|
@@ -29,6 +29,10 @@ export declare class FirstRunScanner {
|
|
|
29
29
|
* Scan for files that may contain secrets
|
|
30
30
|
*/
|
|
31
31
|
private scanForSecretFiles;
|
|
32
|
+
/**
|
|
33
|
+
* Quick check of well-known dotfiles in $HOME (no recursive glob)
|
|
34
|
+
*/
|
|
35
|
+
private scanHomeDotfiles;
|
|
32
36
|
/**
|
|
33
37
|
* Scan environment for issues
|
|
34
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAiCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAiCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,WAAW,CAAe;gBAEtB,QAAQ,CAAC,EAAE,MAAM;IAI7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAgCjC;;OAEG;YACW,kBAAkB;IA8DhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;YACW,WAAW;CAqD1B"}
|
|
@@ -36,11 +36,11 @@ const SECRET_CONTENT_PATTERNS = [
|
|
|
36
36
|
// First-Run Scanner
|
|
37
37
|
// ============================================================================
|
|
38
38
|
export class FirstRunScanner {
|
|
39
|
-
|
|
39
|
+
scanRoot;
|
|
40
40
|
maxFilesToScan = 1000;
|
|
41
41
|
maxFileSize = 1024 * 1024; // 1MB
|
|
42
|
-
constructor() {
|
|
43
|
-
this.
|
|
42
|
+
constructor(scanRoot) {
|
|
43
|
+
this.scanRoot = scanRoot || process.cwd();
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Run a full scan
|
|
@@ -49,10 +49,14 @@ export class FirstRunScanner {
|
|
|
49
49
|
const startTime = performance.now();
|
|
50
50
|
const findings = [];
|
|
51
51
|
let scannedFiles = 0;
|
|
52
|
-
// Scan for secret files
|
|
52
|
+
// Scan project directory for secret files
|
|
53
53
|
const secretFindings = await this.scanForSecretFiles();
|
|
54
54
|
findings.push(...secretFindings.findings);
|
|
55
55
|
scannedFiles += secretFindings.scanned;
|
|
56
|
+
// Quick check of well-known dotfiles in $HOME (no recursive glob)
|
|
57
|
+
const homeFindings = this.scanHomeDotfiles();
|
|
58
|
+
findings.push(...homeFindings.findings);
|
|
59
|
+
scannedFiles += homeFindings.scanned;
|
|
56
60
|
// Scan for environment issues
|
|
57
61
|
const envFindings = this.scanEnvironment();
|
|
58
62
|
findings.push(...envFindings);
|
|
@@ -76,10 +80,19 @@ export class FirstRunScanner {
|
|
|
76
80
|
for (const pattern of SECRET_FILE_PATTERNS) {
|
|
77
81
|
try {
|
|
78
82
|
const files = await glob(pattern, {
|
|
79
|
-
cwd: this.
|
|
83
|
+
cwd: this.scanRoot,
|
|
80
84
|
absolute: true,
|
|
81
85
|
nodir: true,
|
|
82
|
-
|
|
86
|
+
dot: true,
|
|
87
|
+
ignore: [
|
|
88
|
+
'**/node_modules/**',
|
|
89
|
+
'**/.git/**',
|
|
90
|
+
'**/dist/**',
|
|
91
|
+
'**/build/**',
|
|
92
|
+
'**/.cache/**',
|
|
93
|
+
'**/Library/**',
|
|
94
|
+
'**/.Trash/**',
|
|
95
|
+
],
|
|
83
96
|
});
|
|
84
97
|
for (const file of files.slice(0, 100)) {
|
|
85
98
|
if (scanned >= this.maxFilesToScan)
|
|
@@ -116,6 +129,48 @@ export class FirstRunScanner {
|
|
|
116
129
|
}
|
|
117
130
|
return { findings, scanned };
|
|
118
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Quick check of well-known dotfiles in $HOME (no recursive glob)
|
|
134
|
+
*/
|
|
135
|
+
scanHomeDotfiles() {
|
|
136
|
+
const findings = [];
|
|
137
|
+
let scanned = 0;
|
|
138
|
+
const home = os.homedir();
|
|
139
|
+
const dotfiles = [
|
|
140
|
+
path.join(home, '.env'),
|
|
141
|
+
path.join(home, '.env.local'),
|
|
142
|
+
path.join(home, '.aws', 'credentials'),
|
|
143
|
+
path.join(home, '.npmrc'),
|
|
144
|
+
];
|
|
145
|
+
for (const file of dotfiles) {
|
|
146
|
+
try {
|
|
147
|
+
if (!fs.existsSync(file))
|
|
148
|
+
continue;
|
|
149
|
+
const stats = fs.statSync(file);
|
|
150
|
+
if (stats.size > this.maxFileSize)
|
|
151
|
+
continue;
|
|
152
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
153
|
+
scanned++;
|
|
154
|
+
for (const { pattern: secretPattern, name } of SECRET_CONTENT_PATTERNS) {
|
|
155
|
+
secretPattern.lastIndex = 0;
|
|
156
|
+
if (secretPattern.test(content)) {
|
|
157
|
+
findings.push({
|
|
158
|
+
type: 'secret',
|
|
159
|
+
severity: 'high',
|
|
160
|
+
description: `${name} found in file`,
|
|
161
|
+
path: file,
|
|
162
|
+
recommendation: 'Consider using environment variables or a secrets manager',
|
|
163
|
+
});
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Skip files we can't read
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return { findings, scanned };
|
|
173
|
+
}
|
|
119
174
|
/**
|
|
120
175
|
* Scan environment for issues
|
|
121
176
|
*/
|
|
@@ -149,10 +204,11 @@ export class FirstRunScanner {
|
|
|
149
204
|
async scanConfigs() {
|
|
150
205
|
const findings = [];
|
|
151
206
|
// Check for insecure MCP server configurations
|
|
207
|
+
const home = os.homedir();
|
|
152
208
|
const mcpConfigPaths = [
|
|
153
|
-
path.join(
|
|
154
|
-
path.join(
|
|
155
|
-
path.join(
|
|
209
|
+
path.join(home, 'Library/Application Support/Claude/claude_desktop_config.json'),
|
|
210
|
+
path.join(home, '.cursor/mcp.json'),
|
|
211
|
+
path.join(home, '.claude/mcp_servers.json'),
|
|
156
212
|
];
|
|
157
213
|
for (const configPath of mcpConfigPaths) {
|
|
158
214
|
if (!fs.existsSync(configPath))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAoB5B,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,oBAAoB,GAAG;IAC3B,SAAS;IACT,WAAW;IACX,qBAAqB;IACrB,iBAAiB;IACjB,gBAAgB;IAChB,UAAU;IACV,UAAU;IACV,WAAW;IACX,eAAe;IACf,qBAAqB;IACrB,WAAW;CACZ,CAAC;AAEF,MAAM,uBAAuB,GAAG;IAC9B,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACxD,EAAE,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjE,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,EAAE;IACvD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC1D,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACpE,EAAE,OAAO,EAAE,2CAA2C,EAAE,IAAI,EAAE,aAAa,EAAE;CAC9E,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,OAAO,eAAe;IAClB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanner/index.ts"],"names":[],"mappings":"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"}
|