fivosense 0.1.5 → 0.2.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.
- package/.kilo/skill/fivosense/skill.json +5 -5
- package/COMPLETE_SUMMARY.md +412 -0
- package/DEPLOYMENT_GUIDE.md +2 -2
- package/FINAL_VERIFICATION.md +316 -0
- package/GITHUB_PUSH.md +4 -4
- package/LICENSE +1 -1
- package/README.md +290 -208
- package/RELEASE_READY.md +3 -3
- package/bin/fivosense.mjs +6 -0
- package/dist/ai/client.d.ts +33 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +170 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/judge.d.ts +9 -3
- package/dist/ai/judge.d.ts.map +1 -1
- package/dist/ai/judge.js +49 -14
- package/dist/ai/judge.js.map +1 -1
- package/dist/cli/index.d.ts +3 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/orchestrator.d.ts +34 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +211 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/scope.d.ts +32 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +149 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/editors/vscode.d.ts +4 -2
- package/dist/editors/vscode.d.ts.map +1 -1
- package/dist/editors/vscode.js +6 -0
- package/dist/editors/vscode.js.map +1 -1
- package/dist/engine/adversary.d.ts +9 -2
- package/dist/engine/adversary.d.ts.map +1 -1
- package/dist/engine/adversary.js +47 -13
- package/dist/engine/adversary.js.map +1 -1
- package/dist/engine/graph.d.ts +4 -1
- package/dist/engine/graph.d.ts.map +1 -1
- package/dist/engine/graph.js +6 -0
- package/dist/engine/graph.js.map +1 -1
- package/dist/engine/poc.d.ts +26 -0
- package/dist/engine/poc.d.ts.map +1 -0
- package/dist/engine/poc.js +179 -0
- package/dist/engine/poc.js.map +1 -0
- package/dist/engine/reach.d.ts +4 -2
- package/dist/engine/reach.d.ts.map +1 -1
- package/dist/engine/reach.js +6 -0
- package/dist/engine/reach.js.map +1 -1
- package/dist/engine/sinks.d.ts +22 -32
- package/dist/engine/sinks.d.ts.map +1 -1
- package/dist/engine/sinks.js +338 -44
- package/dist/engine/sinks.js.map +1 -1
- package/dist/engine/sources.d.ts +11 -19
- package/dist/engine/sources.d.ts.map +1 -1
- package/dist/engine/sources.js +100 -24
- package/dist/engine/sources.js.map +1 -1
- package/dist/engine/taint.d.ts +6 -0
- package/dist/engine/taint.d.ts.map +1 -1
- package/dist/engine/taint.js +6 -0
- package/dist/engine/taint.js.map +1 -1
- package/dist/engine/verify.d.ts +4 -1
- package/dist/engine/verify.d.ts.map +1 -1
- package/dist/engine/verify.js +6 -0
- package/dist/engine/verify.js.map +1 -1
- package/dist/features/badge.d.ts +6 -0
- package/dist/features/badge.d.ts.map +1 -1
- package/dist/features/badge.js +4 -1
- package/dist/features/badge.js.map +1 -1
- package/dist/features/fix.d.ts +6 -0
- package/dist/features/fix.d.ts.map +1 -1
- package/dist/features/fix.js +4 -1
- package/dist/features/fix.js.map +1 -1
- package/dist/features/index.d.ts +6 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +6 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/roast.d.ts +6 -0
- package/dist/features/roast.d.ts.map +1 -1
- package/dist/features/roast.js +4 -1
- package/dist/features/roast.js.map +1 -1
- package/dist/hooks/agent.d.ts +4 -1
- package/dist/hooks/agent.d.ts.map +1 -1
- package/dist/hooks/agent.js +6 -0
- package/dist/hooks/agent.js.map +1 -1
- package/dist/hooks/git.d.ts +34 -0
- package/dist/hooks/git.d.ts.map +1 -0
- package/dist/hooks/git.js +161 -0
- package/dist/hooks/git.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/destructive.d.ts +12 -21
- package/dist/rules/destructive.d.ts.map +1 -1
- package/dist/rules/destructive.js +306 -24
- package/dist/rules/destructive.js.map +1 -1
- package/dist/rules/secrets.d.ts +8 -10
- package/dist/rules/secrets.d.ts.map +1 -1
- package/dist/rules/secrets.js +294 -17
- package/dist/rules/secrets.js.map +1 -1
- package/mcp/index.js +55 -20
- package/mcp/package-lock.json +382 -0
- package/mcp/package.json +21 -4
- package/package.json +5 -5
- package/src/ai/client.ts +226 -0
- package/src/ai/judge.ts +58 -14
- package/src/cli/index.ts +7 -1
- package/src/core/orchestrator.ts +266 -0
- package/src/core/scope.ts +175 -0
- package/src/editors/vscode.ts +7 -0
- package/src/engine/adversary.ts +55 -12
- package/src/engine/graph.ts +7 -0
- package/src/engine/poc.ts +219 -0
- package/src/engine/reach.ts +7 -0
- package/src/engine/sinks.ts +358 -45
- package/src/engine/sources.ts +109 -24
- package/src/engine/taint.ts +7 -0
- package/src/engine/verify.ts +7 -0
- package/src/features/badge.ts +7 -0
- package/src/features/fix.ts +7 -0
- package/src/features/index.ts +7 -0
- package/src/features/roast.ts +7 -0
- package/src/hooks/agent.ts +7 -0
- package/src/hooks/git.ts +194 -0
- package/src/index.ts +7 -0
- package/src/rules/destructive.ts +316 -26
- package/src/rules/secrets.ts +306 -17
- package/vscode-extension/CHANGELOG.md +14 -2
- package/vscode-extension/LICENSE +1 -1
- package/vscode-extension/README.md +28 -23
- package/vscode-extension/fivosense-vscode-0.1.0.vsix +0 -0
- package/vscode-extension/fivosense-vscode-0.1.1.vsix +0 -0
- package/vscode-extension/package-lock.json +6 -6
- package/vscode-extension/package.json +7 -5
- package/vscode-extension/src/extension.ts +65 -11
package/src/rules/destructive.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* FivoSense - AI Security Scanner
|
|
3
|
+
* Copyright (c) 2026 thevinsoni
|
|
4
|
+
* Licensed under the MIT License
|
|
5
|
+
* https://github.com/thevinsoni/sense
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Destructive command detection — blocks dangerous operations
|
|
10
|
+
* 35+ patterns covering filesystem, database, system, network, and privilege escalation
|
|
4
11
|
*/
|
|
5
12
|
|
|
6
13
|
export interface DestructivePattern {
|
|
7
14
|
pattern: RegExp;
|
|
8
15
|
description: string;
|
|
9
16
|
severity: 'critical' | 'high';
|
|
10
|
-
category: 'filesystem' | 'database' | 'system';
|
|
17
|
+
category: 'filesystem' | 'database' | 'system' | 'network' | 'container' | 'privilege';
|
|
11
18
|
}
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
* Filesystem destructive patterns
|
|
15
|
-
*/
|
|
20
|
+
// === Filesystem Destructive ===
|
|
16
21
|
export const FS_DESTRUCTIVE: DestructivePattern[] = [
|
|
17
22
|
{
|
|
18
23
|
pattern: /rm\s+-rf\s+[\/~]/,
|
|
@@ -26,6 +31,12 @@ export const FS_DESTRUCTIVE: DestructivePattern[] = [
|
|
|
26
31
|
severity: 'critical',
|
|
27
32
|
category: 'filesystem',
|
|
28
33
|
},
|
|
34
|
+
{
|
|
35
|
+
pattern: /rm\s+-rf\s+["']?\//,
|
|
36
|
+
description: 'Recursive force delete from absolute path',
|
|
37
|
+
severity: 'critical',
|
|
38
|
+
category: 'filesystem',
|
|
39
|
+
},
|
|
29
40
|
{
|
|
30
41
|
pattern: /unlink\s*\(\s*['"]\/['"]\s*\)/,
|
|
31
42
|
description: 'Unlink root directory',
|
|
@@ -38,11 +49,57 @@ export const FS_DESTRUCTIVE: DestructivePattern[] = [
|
|
|
38
49
|
severity: 'critical',
|
|
39
50
|
category: 'filesystem',
|
|
40
51
|
},
|
|
52
|
+
{
|
|
53
|
+
pattern: /shred\s+/,
|
|
54
|
+
description: 'Secure file deletion (shred)',
|
|
55
|
+
severity: 'critical',
|
|
56
|
+
category: 'filesystem',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
pattern: /mkfs\./,
|
|
60
|
+
description: 'Format filesystem',
|
|
61
|
+
severity: 'critical',
|
|
62
|
+
category: 'filesystem',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
pattern: /dd\s+if=.*of=\/dev\//,
|
|
66
|
+
description: 'dd write to device',
|
|
67
|
+
severity: 'critical',
|
|
68
|
+
category: 'filesystem',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
pattern: />\s*\/dev\/sd[a-z]/,
|
|
72
|
+
description: 'Write directly to disk device',
|
|
73
|
+
severity: 'critical',
|
|
74
|
+
category: 'filesystem',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
pattern: /wipefs\s+/,
|
|
78
|
+
description: 'Wipe filesystem signatures',
|
|
79
|
+
severity: 'critical',
|
|
80
|
+
category: 'filesystem',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
pattern: /truncate\s+-s\s+0/,
|
|
84
|
+
description: 'Truncate file to zero bytes',
|
|
85
|
+
severity: 'high',
|
|
86
|
+
category: 'filesystem',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
pattern: /del\s+\/[sfq]/i,
|
|
90
|
+
description: 'Windows force delete',
|
|
91
|
+
severity: 'critical',
|
|
92
|
+
category: 'filesystem',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
pattern: /rmdir\s+\/s\s+\/q/i,
|
|
96
|
+
description: 'Windows recursive directory delete',
|
|
97
|
+
severity: 'critical',
|
|
98
|
+
category: 'filesystem',
|
|
99
|
+
},
|
|
41
100
|
];
|
|
42
101
|
|
|
43
|
-
|
|
44
|
-
* Database destructive patterns
|
|
45
|
-
*/
|
|
102
|
+
// === Database Destructive ===
|
|
46
103
|
export const DB_DESTRUCTIVE: DestructivePattern[] = [
|
|
47
104
|
{
|
|
48
105
|
pattern: /DROP\s+TABLE/i,
|
|
@@ -56,10 +113,16 @@ export const DB_DESTRUCTIVE: DestructivePattern[] = [
|
|
|
56
113
|
severity: 'critical',
|
|
57
114
|
category: 'database',
|
|
58
115
|
},
|
|
116
|
+
{
|
|
117
|
+
pattern: /DROP\s+SCHEMA/i,
|
|
118
|
+
description: 'SQL DROP SCHEMA',
|
|
119
|
+
severity: 'critical',
|
|
120
|
+
category: 'database',
|
|
121
|
+
},
|
|
59
122
|
{
|
|
60
123
|
pattern: /TRUNCATE\s+TABLE/i,
|
|
61
124
|
description: 'SQL TRUNCATE TABLE',
|
|
62
|
-
severity: '
|
|
125
|
+
severity: 'critical',
|
|
63
126
|
category: 'database',
|
|
64
127
|
},
|
|
65
128
|
{
|
|
@@ -68,44 +131,274 @@ export const DB_DESTRUCTIVE: DestructivePattern[] = [
|
|
|
68
131
|
severity: 'critical',
|
|
69
132
|
category: 'database',
|
|
70
133
|
},
|
|
134
|
+
{
|
|
135
|
+
pattern: /UPDATE\s+\w+\s+SET.*WHERE\s+1\s*=\s*1/i,
|
|
136
|
+
description: 'SQL UPDATE all rows',
|
|
137
|
+
severity: 'critical',
|
|
138
|
+
category: 'database',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
pattern: /db\.dropDatabase/,
|
|
142
|
+
description: 'MongoDB drop database',
|
|
143
|
+
severity: 'critical',
|
|
144
|
+
category: 'database',
|
|
145
|
+
},
|
|
71
146
|
{
|
|
72
147
|
pattern: /db\.collection\(\w+\)\.drop\(\)/,
|
|
73
148
|
description: 'MongoDB collection drop',
|
|
149
|
+
severity: 'critical',
|
|
150
|
+
category: 'database',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
pattern: /FLUSH\s+(PRIVILEGES|TABLES|LOGS)/i,
|
|
154
|
+
description: 'MySQL FLUSH command',
|
|
155
|
+
severity: 'high',
|
|
156
|
+
category: 'database',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
pattern: /ALTER\s+TABLE.*DROP\s+COLUMN/i,
|
|
160
|
+
description: 'SQL DROP COLUMN',
|
|
74
161
|
severity: 'high',
|
|
75
162
|
category: 'database',
|
|
76
163
|
},
|
|
164
|
+
{
|
|
165
|
+
pattern: /db\.users\.remove/,
|
|
166
|
+
description: 'MongoDB mass remove',
|
|
167
|
+
severity: 'critical',
|
|
168
|
+
category: 'database',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
pattern: /\.remove\(\{\}\)/,
|
|
172
|
+
description: 'MongoDB remove all documents',
|
|
173
|
+
severity: 'critical',
|
|
174
|
+
category: 'database',
|
|
175
|
+
},
|
|
77
176
|
];
|
|
78
177
|
|
|
79
|
-
|
|
80
|
-
* System destructive patterns
|
|
81
|
-
*/
|
|
178
|
+
// === System Destructive ===
|
|
82
179
|
export const SYSTEM_DESTRUCTIVE: DestructivePattern[] = [
|
|
83
180
|
{
|
|
84
|
-
pattern: /shutdown
|
|
181
|
+
pattern: /shutdown\s+(-[hprs])?\s*(now|\+[0-9])/i,
|
|
85
182
|
description: 'System shutdown command',
|
|
86
183
|
severity: 'critical',
|
|
87
184
|
category: 'system',
|
|
88
185
|
},
|
|
89
186
|
{
|
|
90
|
-
pattern: /
|
|
91
|
-
description: '
|
|
187
|
+
pattern: /reboot\s*(-[f])?/i,
|
|
188
|
+
description: 'System reboot',
|
|
189
|
+
severity: 'critical',
|
|
190
|
+
category: 'system',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
pattern: /halt\s*(-[f])?/i,
|
|
194
|
+
description: 'System halt',
|
|
195
|
+
severity: 'critical',
|
|
196
|
+
category: 'system',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
pattern: /poweroff/i,
|
|
200
|
+
description: 'System power off',
|
|
201
|
+
severity: 'critical',
|
|
202
|
+
category: 'system',
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
pattern: /kill\s+-9\s+1\b/,
|
|
206
|
+
description: 'Kill init process (PID 1)',
|
|
207
|
+
severity: 'critical',
|
|
208
|
+
category: 'system',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
pattern: /killall\s+-9/,
|
|
212
|
+
description: 'Force kill all processes',
|
|
213
|
+
severity: 'critical',
|
|
214
|
+
category: 'system',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
pattern: /:(){ :\|:& };:/,
|
|
218
|
+
description: 'Fork bomb',
|
|
219
|
+
severity: 'critical',
|
|
220
|
+
category: 'system',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
pattern: /init\s+0/,
|
|
224
|
+
description: 'Init shutdown',
|
|
92
225
|
severity: 'critical',
|
|
93
226
|
category: 'system',
|
|
94
227
|
},
|
|
228
|
+
{
|
|
229
|
+
pattern: /systemctl\s+(stop|disable)\s+/,
|
|
230
|
+
description: 'Stop/disable systemd service',
|
|
231
|
+
severity: 'high',
|
|
232
|
+
category: 'system',
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
pattern: /service\s+\w+\s+stop/,
|
|
236
|
+
description: 'Stop system service',
|
|
237
|
+
severity: 'high',
|
|
238
|
+
category: 'system',
|
|
239
|
+
},
|
|
95
240
|
];
|
|
96
241
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
242
|
+
// === Network Destructive ===
|
|
243
|
+
export const NETWORK_DESTRUCTIVE: DestructivePattern[] = [
|
|
244
|
+
{
|
|
245
|
+
pattern: /iptables\s+-F/,
|
|
246
|
+
description: 'Flush all firewall rules',
|
|
247
|
+
severity: 'critical',
|
|
248
|
+
category: 'network',
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
pattern: /iptables\s+--flush/,
|
|
252
|
+
description: 'Flush firewall rules',
|
|
253
|
+
severity: 'critical',
|
|
254
|
+
category: 'network',
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
pattern: /ufw\s+disable/,
|
|
258
|
+
description: 'Disable UFW firewall',
|
|
259
|
+
severity: 'critical',
|
|
260
|
+
category: 'network',
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
pattern: /netsh\s+firewall\s+set\s+opmode\s+disable/i,
|
|
264
|
+
description: 'Windows disable firewall',
|
|
265
|
+
severity: 'critical',
|
|
266
|
+
category: 'network',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
pattern: /ip\s+link\s+set\s+\w+\s+down/,
|
|
270
|
+
description: 'Disable network interface',
|
|
271
|
+
severity: 'high',
|
|
272
|
+
category: 'network',
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
pattern: /ifconfig\s+\w+\s+down/,
|
|
276
|
+
description: 'Disable network interface (ifconfig)',
|
|
277
|
+
severity: 'high',
|
|
278
|
+
category: 'network',
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
pattern: /route\s+(del|flush)/,
|
|
282
|
+
description: 'Delete/flush routing table',
|
|
283
|
+
severity: 'high',
|
|
284
|
+
category: 'network',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
pattern: /curl\s+.*\|\s*(bash|sh)/,
|
|
288
|
+
description: 'Remote code execution via curl pipe',
|
|
289
|
+
severity: 'critical',
|
|
290
|
+
category: 'network',
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
pattern: /wget\s+.*\|\s*(bash|sh)/,
|
|
294
|
+
description: 'Remote code execution via wget pipe',
|
|
295
|
+
severity: 'critical',
|
|
296
|
+
category: 'network',
|
|
297
|
+
},
|
|
298
|
+
];
|
|
299
|
+
|
|
300
|
+
// === Container / Cloud Destructive ===
|
|
301
|
+
export const CONTAINER_DESTRUCTIVE: DestructivePattern[] = [
|
|
302
|
+
{
|
|
303
|
+
pattern: /docker\s+rm\s+-f\s+\$\(docker\s+ps/,
|
|
304
|
+
description: 'Force remove all Docker containers',
|
|
305
|
+
severity: 'critical',
|
|
306
|
+
category: 'container',
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
pattern: /docker\s+rmi\s+-f\s+\$\(docker\s+images/,
|
|
310
|
+
description: 'Force remove all Docker images',
|
|
311
|
+
severity: 'critical',
|
|
312
|
+
category: 'container',
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
pattern: /docker\s+system\s+prune\s+-a/,
|
|
316
|
+
description: 'Prune all Docker data',
|
|
317
|
+
severity: 'high',
|
|
318
|
+
category: 'container',
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
pattern: /kubectl\s+delete\s+(pods|deployment|namespace)\s+--all/,
|
|
322
|
+
description: 'Delete all Kubernetes resources',
|
|
323
|
+
severity: 'critical',
|
|
324
|
+
category: 'container',
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
pattern: /kubectl\s+delete\s+namespace/,
|
|
328
|
+
description: 'Delete Kubernetes namespace',
|
|
329
|
+
severity: 'critical',
|
|
330
|
+
category: 'container',
|
|
331
|
+
},
|
|
332
|
+
];
|
|
333
|
+
|
|
334
|
+
// === Privilege Escalation ===
|
|
335
|
+
export const PRIVILEGE_DESTRUCTIVE: DestructivePattern[] = [
|
|
336
|
+
{
|
|
337
|
+
pattern: /chmod\s+777\s+[\/~]/,
|
|
338
|
+
description: 'Set full permissions (chmod 777)',
|
|
339
|
+
severity: 'critical',
|
|
340
|
+
category: 'privilege',
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
pattern: /chmod\s+-R\s+777/,
|
|
344
|
+
description: 'Recursive full permissions',
|
|
345
|
+
severity: 'critical',
|
|
346
|
+
category: 'privilege',
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
pattern: /chown\s+-R\s+root/,
|
|
350
|
+
description: 'Recursive ownership to root',
|
|
351
|
+
severity: 'critical',
|
|
352
|
+
category: 'privilege',
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
pattern: /chmod\s+\+s/,
|
|
356
|
+
description: 'Set SUID/SGID bit',
|
|
357
|
+
severity: 'critical',
|
|
358
|
+
category: 'privilege',
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
pattern: /chmod\s+u\+s/,
|
|
362
|
+
description: 'Set SUID bit',
|
|
363
|
+
severity: 'critical',
|
|
364
|
+
category: 'privilege',
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
pattern: /visudo/,
|
|
368
|
+
description: 'Edit sudoers file',
|
|
369
|
+
severity: 'critical',
|
|
370
|
+
category: 'privilege',
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
pattern: /echo\s+.*>>\s*\/etc\/sudoers/,
|
|
374
|
+
description: 'Append to sudoers file',
|
|
375
|
+
severity: 'critical',
|
|
376
|
+
category: 'privilege',
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
pattern: /usermod\s+-aG\s+sudo/,
|
|
380
|
+
description: 'Add user to sudo group',
|
|
381
|
+
severity: 'high',
|
|
382
|
+
category: 'privilege',
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
pattern: /passwd\s+(root|-e)/,
|
|
386
|
+
description: 'Change root password or expire',
|
|
387
|
+
severity: 'critical',
|
|
388
|
+
category: 'privilege',
|
|
389
|
+
},
|
|
390
|
+
];
|
|
391
|
+
|
|
392
|
+
// === All destructive patterns combined ===
|
|
393
|
+
export const ALL_DESTRUCTIVE: DestructivePattern[] = [
|
|
101
394
|
...FS_DESTRUCTIVE,
|
|
102
395
|
...DB_DESTRUCTIVE,
|
|
103
396
|
...SYSTEM_DESTRUCTIVE,
|
|
397
|
+
...NETWORK_DESTRUCTIVE,
|
|
398
|
+
...CONTAINER_DESTRUCTIVE,
|
|
399
|
+
...PRIVILEGE_DESTRUCTIVE,
|
|
104
400
|
];
|
|
105
401
|
|
|
106
|
-
/**
|
|
107
|
-
* Check if code contains destructive patterns
|
|
108
|
-
*/
|
|
109
402
|
export function detectDestructive(code: string): DestructivePattern[] {
|
|
110
403
|
const matches: DestructivePattern[] = [];
|
|
111
404
|
|
|
@@ -118,9 +411,6 @@ export function detectDestructive(code: string): DestructivePattern[] {
|
|
|
118
411
|
return matches;
|
|
119
412
|
}
|
|
120
413
|
|
|
121
|
-
/**
|
|
122
|
-
* Check if specific line contains destructive command
|
|
123
|
-
*/
|
|
124
414
|
export function isDestructiveLine(line: string): DestructivePattern | null {
|
|
125
415
|
for (const pattern of ALL_DESTRUCTIVE) {
|
|
126
416
|
if (pattern.pattern.test(line)) {
|