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.
Files changed (136) hide show
  1. package/.kilo/skill/fivosense/skill.json +5 -5
  2. package/COMPLETE_SUMMARY.md +412 -0
  3. package/DEPLOYMENT_GUIDE.md +2 -2
  4. package/FINAL_VERIFICATION.md +316 -0
  5. package/GITHUB_PUSH.md +4 -4
  6. package/LICENSE +1 -1
  7. package/README.md +290 -208
  8. package/RELEASE_READY.md +3 -3
  9. package/bin/fivosense.mjs +6 -0
  10. package/dist/ai/client.d.ts +33 -0
  11. package/dist/ai/client.d.ts.map +1 -0
  12. package/dist/ai/client.js +170 -0
  13. package/dist/ai/client.js.map +1 -0
  14. package/dist/ai/judge.d.ts +9 -3
  15. package/dist/ai/judge.d.ts.map +1 -1
  16. package/dist/ai/judge.js +49 -14
  17. package/dist/ai/judge.js.map +1 -1
  18. package/dist/cli/index.d.ts +3 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +6 -1
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/core/orchestrator.d.ts +34 -0
  23. package/dist/core/orchestrator.d.ts.map +1 -0
  24. package/dist/core/orchestrator.js +211 -0
  25. package/dist/core/orchestrator.js.map +1 -0
  26. package/dist/core/scope.d.ts +32 -0
  27. package/dist/core/scope.d.ts.map +1 -0
  28. package/dist/core/scope.js +149 -0
  29. package/dist/core/scope.js.map +1 -0
  30. package/dist/editors/vscode.d.ts +4 -2
  31. package/dist/editors/vscode.d.ts.map +1 -1
  32. package/dist/editors/vscode.js +6 -0
  33. package/dist/editors/vscode.js.map +1 -1
  34. package/dist/engine/adversary.d.ts +9 -2
  35. package/dist/engine/adversary.d.ts.map +1 -1
  36. package/dist/engine/adversary.js +47 -13
  37. package/dist/engine/adversary.js.map +1 -1
  38. package/dist/engine/graph.d.ts +4 -1
  39. package/dist/engine/graph.d.ts.map +1 -1
  40. package/dist/engine/graph.js +6 -0
  41. package/dist/engine/graph.js.map +1 -1
  42. package/dist/engine/poc.d.ts +26 -0
  43. package/dist/engine/poc.d.ts.map +1 -0
  44. package/dist/engine/poc.js +179 -0
  45. package/dist/engine/poc.js.map +1 -0
  46. package/dist/engine/reach.d.ts +4 -2
  47. package/dist/engine/reach.d.ts.map +1 -1
  48. package/dist/engine/reach.js +6 -0
  49. package/dist/engine/reach.js.map +1 -1
  50. package/dist/engine/sinks.d.ts +22 -32
  51. package/dist/engine/sinks.d.ts.map +1 -1
  52. package/dist/engine/sinks.js +338 -44
  53. package/dist/engine/sinks.js.map +1 -1
  54. package/dist/engine/sources.d.ts +11 -19
  55. package/dist/engine/sources.d.ts.map +1 -1
  56. package/dist/engine/sources.js +100 -24
  57. package/dist/engine/sources.js.map +1 -1
  58. package/dist/engine/taint.d.ts +6 -0
  59. package/dist/engine/taint.d.ts.map +1 -1
  60. package/dist/engine/taint.js +6 -0
  61. package/dist/engine/taint.js.map +1 -1
  62. package/dist/engine/verify.d.ts +4 -1
  63. package/dist/engine/verify.d.ts.map +1 -1
  64. package/dist/engine/verify.js +6 -0
  65. package/dist/engine/verify.js.map +1 -1
  66. package/dist/features/badge.d.ts +6 -0
  67. package/dist/features/badge.d.ts.map +1 -1
  68. package/dist/features/badge.js +4 -1
  69. package/dist/features/badge.js.map +1 -1
  70. package/dist/features/fix.d.ts +6 -0
  71. package/dist/features/fix.d.ts.map +1 -1
  72. package/dist/features/fix.js +4 -1
  73. package/dist/features/fix.js.map +1 -1
  74. package/dist/features/index.d.ts +6 -0
  75. package/dist/features/index.d.ts.map +1 -1
  76. package/dist/features/index.js +6 -0
  77. package/dist/features/index.js.map +1 -1
  78. package/dist/features/roast.d.ts +6 -0
  79. package/dist/features/roast.d.ts.map +1 -1
  80. package/dist/features/roast.js +4 -1
  81. package/dist/features/roast.js.map +1 -1
  82. package/dist/hooks/agent.d.ts +4 -1
  83. package/dist/hooks/agent.d.ts.map +1 -1
  84. package/dist/hooks/agent.js +6 -0
  85. package/dist/hooks/agent.js.map +1 -1
  86. package/dist/hooks/git.d.ts +34 -0
  87. package/dist/hooks/git.d.ts.map +1 -0
  88. package/dist/hooks/git.js +161 -0
  89. package/dist/hooks/git.js.map +1 -0
  90. package/dist/index.d.ts +4 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +6 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/rules/destructive.d.ts +12 -21
  95. package/dist/rules/destructive.d.ts.map +1 -1
  96. package/dist/rules/destructive.js +306 -24
  97. package/dist/rules/destructive.js.map +1 -1
  98. package/dist/rules/secrets.d.ts +8 -10
  99. package/dist/rules/secrets.d.ts.map +1 -1
  100. package/dist/rules/secrets.js +294 -17
  101. package/dist/rules/secrets.js.map +1 -1
  102. package/mcp/index.js +55 -20
  103. package/mcp/package-lock.json +382 -0
  104. package/mcp/package.json +21 -4
  105. package/package.json +5 -5
  106. package/src/ai/client.ts +226 -0
  107. package/src/ai/judge.ts +58 -14
  108. package/src/cli/index.ts +7 -1
  109. package/src/core/orchestrator.ts +266 -0
  110. package/src/core/scope.ts +175 -0
  111. package/src/editors/vscode.ts +7 -0
  112. package/src/engine/adversary.ts +55 -12
  113. package/src/engine/graph.ts +7 -0
  114. package/src/engine/poc.ts +219 -0
  115. package/src/engine/reach.ts +7 -0
  116. package/src/engine/sinks.ts +358 -45
  117. package/src/engine/sources.ts +109 -24
  118. package/src/engine/taint.ts +7 -0
  119. package/src/engine/verify.ts +7 -0
  120. package/src/features/badge.ts +7 -0
  121. package/src/features/fix.ts +7 -0
  122. package/src/features/index.ts +7 -0
  123. package/src/features/roast.ts +7 -0
  124. package/src/hooks/agent.ts +7 -0
  125. package/src/hooks/git.ts +194 -0
  126. package/src/index.ts +7 -0
  127. package/src/rules/destructive.ts +316 -26
  128. package/src/rules/secrets.ts +306 -17
  129. package/vscode-extension/CHANGELOG.md +14 -2
  130. package/vscode-extension/LICENSE +1 -1
  131. package/vscode-extension/README.md +28 -23
  132. package/vscode-extension/fivosense-vscode-0.1.0.vsix +0 -0
  133. package/vscode-extension/fivosense-vscode-0.1.1.vsix +0 -0
  134. package/vscode-extension/package-lock.json +6 -6
  135. package/vscode-extension/package.json +7 -5
  136. package/vscode-extension/src/extension.ts +65 -11
@@ -1,18 +1,23 @@
1
1
  /**
2
- * Destructive command detection
3
- * Blocks dangerous operations: rm -rf, DROP TABLE, mass deletes, etc.
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: 'high',
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|reboot|halt/i,
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: /kill\s+-9\s+1/,
91
- description: 'Kill init process',
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
- * All destructive patterns
99
- */
100
- export const ALL_DESTRUCTIVE = [
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)) {