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