@gendigital/sage-opencode 0.9.0 → 0.11.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/README.md +60 -71
- package/dist/bundled-dirs.d.ts +1 -1
- package/dist/bundled-dirs.d.ts.map +1 -1
- package/dist/bundled-dirs.js +1 -1
- package/dist/bundled-dirs.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +83 -18
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.cjs +31776 -0
- package/dist/mcp-server.cjs.map +7 -0
- package/dist/plugin-discovery.js +1 -1
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/startup-scan.d.ts.map +1 -1
- package/dist/startup-scan.js +3 -2
- package/dist/startup-scan.js.map +1 -1
- package/dist/tool-handler.d.ts +1 -1
- package/dist/tool-handler.d.ts.map +1 -1
- package/dist/tool-handler.js +61 -6
- package/dist/tool-handler.js.map +1 -1
- package/package.json +6 -4
- package/resources/threats/agent-layer.yaml +186 -0
- package/resources/threats/commands.yaml +24 -53
- package/resources/threats/credentials.yaml +12 -20
- package/resources/threats/dummy.yaml +22 -33
- package/resources/threats/files.yaml +34 -53
- package/resources/threats/mac-commands.yaml +20 -47
- package/resources/threats/mac-credentials.yaml +4 -12
- package/resources/threats/mac-files.yaml +5 -15
- package/resources/threats/mac-obfuscation.yaml +6 -13
- package/resources/threats/mac-persistence.yaml +11 -20
- package/resources/threats/mac-supply-chain.yaml +5 -8
- package/resources/threats/mitre.yaml +105 -167
- package/resources/threats/obfuscation.yaml +7 -15
- package/resources/threats/persistence.yaml +10 -17
- package/resources/threats/prompt-injection.yaml +94 -44
- package/resources/threats/self-defense.yaml +8 -12
- package/resources/threats/supply_chain.yaml +1 -2
- package/resources/threats/urls.yaml +9 -14
- package/resources/threats/win-commands.yaml +46 -106
- package/resources/threats/win-credentials.yaml +15 -25
- package/resources/threats/win-files.yaml +10 -20
- package/resources/threats/win-obfuscation.yaml +21 -37
- package/resources/threats/win-persistence.yaml +8 -16
- package/resources/threats/win-supply-chain.yaml +2 -3
- package/dist/logger-adaptor.d.ts +0 -15
- package/dist/logger-adaptor.d.ts.map +0 -1
- package/dist/logger-adaptor.js +0 -32
- package/dist/logger-adaptor.js.map +0 -1
- /package/resources/{allowlists → trusted-domains}/trusted-installer-domains.yaml +0 -0
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
# Command threat patterns for Sage
|
|
2
2
|
# Author: Gen Digital Inc.
|
|
3
3
|
# License: DRL-1.1 (see threats/LICENSE)
|
|
4
|
-
# Schema: id, category, severity, confidence,
|
|
4
|
+
# Schema: id, category, severity, confidence, pattern, match_on, title, expires_at, revoked, flags
|
|
5
5
|
|
|
6
6
|
# --- Pipe to shell (Remote Code Execution) ---
|
|
7
7
|
- id: "CLT-CMD-001"
|
|
8
8
|
category: tool
|
|
9
9
|
severity: critical
|
|
10
10
|
confidence: 0.95
|
|
11
|
-
action: block
|
|
12
11
|
pattern: "curl\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
|
|
13
12
|
match_on: command
|
|
14
13
|
title: "Remote code execution via curl pipe to shell"
|
|
@@ -19,7 +18,6 @@
|
|
|
19
18
|
category: tool
|
|
20
19
|
severity: critical
|
|
21
20
|
confidence: 0.95
|
|
22
|
-
action: block
|
|
23
21
|
pattern: "wget\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
|
|
24
22
|
match_on: command
|
|
25
23
|
title: "Remote code execution via wget pipe to shell"
|
|
@@ -31,8 +29,7 @@
|
|
|
31
29
|
category: tool
|
|
32
30
|
severity: critical
|
|
33
31
|
confidence: 0.90
|
|
34
|
-
|
|
35
|
-
pattern: "/dev/tcp/"
|
|
32
|
+
pattern: "\\b(bash|sh|zsh|ksh|dash)\\s+-i\\b[\\s\\S]{0,160}/dev/tcp/"
|
|
36
33
|
match_on: command
|
|
37
34
|
title: "Reverse shell via /dev/tcp"
|
|
38
35
|
expires_at: null
|
|
@@ -42,7 +39,6 @@
|
|
|
42
39
|
category: tool
|
|
43
40
|
severity: critical
|
|
44
41
|
confidence: 0.90
|
|
45
|
-
action: block
|
|
46
42
|
pattern: "\\bnc\\b.*\\s-e\\s"
|
|
47
43
|
match_on: command
|
|
48
44
|
title: "Reverse shell via netcat -e"
|
|
@@ -53,7 +49,6 @@
|
|
|
53
49
|
category: tool
|
|
54
50
|
severity: critical
|
|
55
51
|
confidence: 0.85
|
|
56
|
-
action: block
|
|
57
52
|
pattern: "bash\\s+-i\\s+>\\s*&\\s*/dev/"
|
|
58
53
|
match_on: command
|
|
59
54
|
title: "Interactive reverse shell via bash"
|
|
@@ -65,7 +60,6 @@
|
|
|
65
60
|
category: tool
|
|
66
61
|
severity: critical
|
|
67
62
|
confidence: 0.95
|
|
68
|
-
action: block
|
|
69
63
|
pattern: "\\brm\\s+(-[a-zA-Z]*f[a-zA-Z]*\\s+)?(-[a-zA-Z]*r[a-zA-Z]*\\s+)?/(\\s|$|[;&|*])|\\brm\\s+(-[a-zA-Z]*r[a-zA-Z]*\\s+)?(-[a-zA-Z]*f[a-zA-Z]*\\s+)?/(\\s|$|[;&|*])|\\brm\\s+-[a-zA-Z]*rf[a-zA-Z]*\\s+/(\\s|$|[;&|*])"
|
|
70
64
|
match_on: command
|
|
71
65
|
title: "Recursive forced deletion from root"
|
|
@@ -76,7 +70,6 @@
|
|
|
76
70
|
category: tool
|
|
77
71
|
severity: critical
|
|
78
72
|
confidence: 0.95
|
|
79
|
-
action: block
|
|
80
73
|
pattern: "\\bmkfs\\b"
|
|
81
74
|
match_on: command
|
|
82
75
|
title: "Filesystem format command"
|
|
@@ -85,9 +78,8 @@
|
|
|
85
78
|
|
|
86
79
|
- id: "CLT-CMD-008"
|
|
87
80
|
category: tool
|
|
88
|
-
severity:
|
|
81
|
+
severity: warning
|
|
89
82
|
confidence: 0.85
|
|
90
|
-
action: block
|
|
91
83
|
pattern: "\\bdd\\s+if=.*of=/dev/"
|
|
92
84
|
match_on: command
|
|
93
85
|
title: "Direct disk write via dd"
|
|
@@ -98,7 +90,6 @@
|
|
|
98
90
|
category: tool
|
|
99
91
|
severity: critical
|
|
100
92
|
confidence: 0.90
|
|
101
|
-
action: block
|
|
102
93
|
pattern: "\\bshred\\b"
|
|
103
94
|
match_on: command
|
|
104
95
|
title: "Secure file destruction via shred"
|
|
@@ -110,7 +101,6 @@
|
|
|
110
101
|
category: tool
|
|
111
102
|
severity: critical
|
|
112
103
|
confidence: 0.90
|
|
113
|
-
action: block
|
|
114
104
|
pattern: "(curl|wget)\\s[\\s\\S]*?(&&|;)\\s*chmod\\s+\\+x"
|
|
115
105
|
match_on: command
|
|
116
106
|
title: "Download and execute chain"
|
|
@@ -120,9 +110,8 @@
|
|
|
120
110
|
# --- Privilege escalation ---
|
|
121
111
|
- id: "CLT-CMD-011"
|
|
122
112
|
category: tool
|
|
123
|
-
severity:
|
|
124
|
-
confidence: 0.
|
|
125
|
-
action: require_approval
|
|
113
|
+
severity: warning
|
|
114
|
+
confidence: 0.60
|
|
126
115
|
pattern: "\\bchmod\\s+777\\b"
|
|
127
116
|
match_on: command
|
|
128
117
|
title: "Overly permissive file permissions"
|
|
@@ -131,9 +120,8 @@
|
|
|
131
120
|
|
|
132
121
|
- id: "CLT-CMD-012"
|
|
133
122
|
category: tool
|
|
134
|
-
severity:
|
|
135
|
-
confidence: 0.
|
|
136
|
-
action: require_approval
|
|
123
|
+
severity: warning
|
|
124
|
+
confidence: 0.60
|
|
137
125
|
pattern: "NOPASSWD"
|
|
138
126
|
match_on: command
|
|
139
127
|
title: "Passwordless sudo configuration"
|
|
@@ -143,9 +131,8 @@
|
|
|
143
131
|
# --- Data exfiltration ---
|
|
144
132
|
- id: "CLT-CMD-013"
|
|
145
133
|
category: network_egress
|
|
146
|
-
severity:
|
|
147
|
-
confidence: 0.
|
|
148
|
-
action: require_approval
|
|
134
|
+
severity: warning
|
|
135
|
+
confidence: 0.60
|
|
149
136
|
pattern: "curl\\s[^|;]*(-d|--data|--data-binary)\\s\\S*(/etc/passwd|/etc/shadow|\\.ssh/|id_rsa|credentials|secrets)"
|
|
150
137
|
match_on: command
|
|
151
138
|
title: "Possible data exfiltration of sensitive files"
|
|
@@ -157,7 +144,6 @@
|
|
|
157
144
|
category: tool
|
|
158
145
|
severity: critical
|
|
159
146
|
confidence: 0.95
|
|
160
|
-
action: block
|
|
161
147
|
pattern: "\\bsudo\\s+(curl|wget)\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
|
|
162
148
|
match_on: command
|
|
163
149
|
title: "Privileged pipe-to-shell (sudo curl/wget piped to shell)"
|
|
@@ -171,9 +157,8 @@
|
|
|
171
157
|
# bounded non-greedy quantifier to avoid catastrophic backtracking.
|
|
172
158
|
- id: "CLT-CMD-015"
|
|
173
159
|
category: tool
|
|
174
|
-
severity:
|
|
175
|
-
confidence: 0.
|
|
176
|
-
action: require_approval
|
|
160
|
+
severity: warning
|
|
161
|
+
confidence: 0.60
|
|
177
162
|
pattern: "python[3]?\\s+-c\\s+[\"'][\\s\\S]{0,2048}?(?:os\\.(?:system|popen|exec[lv]?[ep]?e?)|subprocess\\.(?:run|call|Popen|check_output|check_call|getoutput|getstatusoutput)|__import__)\\s*\\("
|
|
178
163
|
match_on: command
|
|
179
164
|
title: "Python one-liner invoking shell/exec/subprocess call"
|
|
@@ -185,7 +170,6 @@
|
|
|
185
170
|
category: tool
|
|
186
171
|
severity: critical
|
|
187
172
|
confidence: 0.90
|
|
188
|
-
action: block
|
|
189
173
|
pattern: "\\bbash\\s+<\\(\\s*(curl|wget)\\b"
|
|
190
174
|
match_on: command
|
|
191
175
|
title: "Process substitution executing remote content"
|
|
@@ -194,9 +178,8 @@
|
|
|
194
178
|
|
|
195
179
|
- id: "CLT-CMD-017"
|
|
196
180
|
category: tool
|
|
197
|
-
severity:
|
|
181
|
+
severity: warning
|
|
198
182
|
confidence: 0.85
|
|
199
|
-
action: block
|
|
200
183
|
pattern: "\\beval\\b[^;|]*\\b(curl|wget)\\b"
|
|
201
184
|
match_on: command
|
|
202
185
|
title: "Eval executing remote download command"
|
|
@@ -205,13 +188,12 @@
|
|
|
205
188
|
|
|
206
189
|
- id: "CLT-CMD-018"
|
|
207
190
|
category: tool
|
|
208
|
-
severity:
|
|
191
|
+
severity: warning
|
|
209
192
|
confidence: 0.85
|
|
210
|
-
action: block
|
|
211
193
|
# The lookarounds prevent matching short-option flags like `du -sh` or
|
|
212
194
|
# identifiers like `shell`/`bashrc`; only standalone command invocations
|
|
213
195
|
# (preceded by whitespace, `/`, etc.) are flagged.
|
|
214
|
-
pattern: "\\bxargs\\b[
|
|
196
|
+
pattern: "\\bxargs\\b[^|;\\r\\n]{0,400}(?:(?<![-\\w])(bash|sh)(?![-\\w])(?:\\s+-[\\w]*c\\b\\s+(?:\"(?!\\s*(?:head|cat|wc)\\b)[^\"\\r\\n]{0,240}(?:\\{\\}|\\$[@*]|\\$\\d)[^\"\\r\\n]{0,240}\"|'(?!\\s*(?:head|cat|wc)\\b)[^'\\r\\n]{0,240}(?:\\{\\}|\\$[@*]|\\$\\d)[^'\\r\\n]{0,240}')|(?!\\s+-[\\w]*c\\b))|(?<![-\\w])(curl|wget)(?![-\\w])[^|;\\r\\n]{0,400}(?:-d|--data|--data-binary|--upload-file|-T|--post-file|--post-data|--body-file)\\b)"
|
|
215
197
|
match_on: command
|
|
216
198
|
title: "xargs dispatching download or shell execution"
|
|
217
199
|
expires_at: null
|
|
@@ -219,9 +201,8 @@
|
|
|
219
201
|
|
|
220
202
|
- id: "CLT-CMD-019"
|
|
221
203
|
category: tool
|
|
222
|
-
severity:
|
|
204
|
+
severity: warning
|
|
223
205
|
confidence: 0.85
|
|
224
|
-
action: block
|
|
225
206
|
pattern: "\\bfind\\b[^|;]*-exec\\s+(bash|sh|curl|wget)\\b"
|
|
226
207
|
match_on: command
|
|
227
208
|
title: "find -exec executing shell or download commands"
|
|
@@ -231,9 +212,8 @@
|
|
|
231
212
|
# --- DNS exfiltration ---
|
|
232
213
|
- id: "CLT-CMD-020"
|
|
233
214
|
category: network_egress
|
|
234
|
-
severity:
|
|
215
|
+
severity: warning
|
|
235
216
|
confidence: 0.80
|
|
236
|
-
action: block
|
|
237
217
|
pattern: "\\b(nslookup|dig|host)\\b[^|;]*\\$\\([^)]+\\)\\.[a-zA-Z]"
|
|
238
218
|
match_on: command
|
|
239
219
|
title: "DNS exfiltration via command substitution as subdomain label"
|
|
@@ -242,9 +222,8 @@
|
|
|
242
222
|
|
|
243
223
|
- id: "CLT-CMD-021"
|
|
244
224
|
category: network_egress
|
|
245
|
-
severity:
|
|
225
|
+
severity: warning
|
|
246
226
|
confidence: 0.80
|
|
247
|
-
action: block
|
|
248
227
|
pattern: "\\b(nslookup|dig|host)\\b[^|;]*`[^`]+`\\.[a-zA-Z]"
|
|
249
228
|
match_on: command
|
|
250
229
|
title: "DNS exfiltration via backtick substitution as subdomain label"
|
|
@@ -254,9 +233,8 @@
|
|
|
254
233
|
# --- Loop-based indirect execution ---
|
|
255
234
|
- id: "CLT-CMD-022"
|
|
256
235
|
category: tool
|
|
257
|
-
severity:
|
|
236
|
+
severity: warning
|
|
258
237
|
confidence: 0.80
|
|
259
|
-
action: block
|
|
260
238
|
pattern: "\\b(while|for)\\b[^;]*;\\s*do[^;]*(\\b(bash|sh)\\s+-c\\b|\\b(curl|wget)\\b[^;]*\\|\\s*(?:sudo\\s+)?(?:env\\s+)?(?:[^\\s\"']*[\\\\/])?(bash|sh|zsh|ksh|dash)\\b|\\b(curl|wget)\\b[^;]*(?:(-d|--data|--data-binary)\\s+['\\\"]?@\\S+|(--upload-file|-T)\\s+['\\\"]?\\S+))"
|
|
261
239
|
match_on: command
|
|
262
240
|
title: "Loop executing shell or download commands"
|
|
@@ -270,7 +248,6 @@
|
|
|
270
248
|
category: tool
|
|
271
249
|
severity: critical
|
|
272
250
|
confidence: 0.90
|
|
273
|
-
action: block
|
|
274
251
|
pattern: "python[23]?\\s+-c.*socket.*connect.*(\\/bin\\/zsh|\\/bin\\/sh|\\/bin\\/bash)"
|
|
275
252
|
match_on: command
|
|
276
253
|
title: "Python reverse shell via socket"
|
|
@@ -282,7 +259,6 @@
|
|
|
282
259
|
category: tool
|
|
283
260
|
severity: critical
|
|
284
261
|
confidence: 0.90
|
|
285
|
-
action: block
|
|
286
262
|
pattern: "ruby\\s+-e.*TCPSocket.*exec.*(\\/bin\\/zsh|\\/bin\\/sh)"
|
|
287
263
|
match_on: command
|
|
288
264
|
title: "Ruby reverse shell via TCPSocket"
|
|
@@ -294,7 +270,6 @@
|
|
|
294
270
|
category: tool
|
|
295
271
|
severity: critical
|
|
296
272
|
confidence: 0.90
|
|
297
|
-
action: block
|
|
298
273
|
pattern: "\\bzsh\\s+-c\\b.*\\b(exec|socket|/dev/tcp)\\b"
|
|
299
274
|
match_on: command
|
|
300
275
|
title: "Zsh reverse shell pattern"
|
|
@@ -306,7 +281,6 @@
|
|
|
306
281
|
category: tool
|
|
307
282
|
severity: critical
|
|
308
283
|
confidence: 0.95
|
|
309
|
-
action: block
|
|
310
284
|
pattern: "\\brm\\s+(-[a-zA-Z]+\\s+)*-[a-zA-Z]*[rR][a-zA-Z]*(\\s+-[a-zA-Z]+)*\\s+/(home|Users|etc|usr|var|boot|bin|sbin|lib|lib64|opt|root|System|Applications|Library|Volumes|private|mnt)\\b/?(\\s|$|[;&|])"
|
|
311
285
|
match_on: command
|
|
312
286
|
title: "Recursive deletion of critical system directory"
|
|
@@ -316,9 +290,8 @@
|
|
|
316
290
|
# --- Deletion of .env files ---
|
|
317
291
|
- id: "CLT-CMD-027"
|
|
318
292
|
category: tool
|
|
319
|
-
severity:
|
|
320
|
-
confidence: 0.
|
|
321
|
-
action: require_approval
|
|
293
|
+
severity: warning
|
|
294
|
+
confidence: 0.60
|
|
322
295
|
pattern: "\\brm\\s+(-{1,2}[\\w-]+(=\\S+)?\\s+)*(\\S+[\\\\/])?\\.env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.(local|production|prod|staging|stage|development|dev|test))?\\b"
|
|
323
296
|
match_on: command
|
|
324
297
|
title: "Deletion of .env file"
|
|
@@ -328,9 +301,8 @@
|
|
|
328
301
|
# --- Deletion of database files ---
|
|
329
302
|
- id: "CLT-CMD-028"
|
|
330
303
|
category: tool
|
|
331
|
-
severity:
|
|
332
|
-
confidence: 0.
|
|
333
|
-
action: require_approval
|
|
304
|
+
severity: warning
|
|
305
|
+
confidence: 0.60
|
|
334
306
|
pattern: "\\brm\\s+(-{1,2}[\\w-]+(=\\S+)?\\s+)*\\S+\\.(db|sqlite|sqlite3)\\b"
|
|
335
307
|
match_on: command
|
|
336
308
|
title: "Deletion of database file"
|
|
@@ -340,9 +312,8 @@
|
|
|
340
312
|
# --- Deletion of .git directory ---
|
|
341
313
|
- id: "CLT-CMD-029"
|
|
342
314
|
category: tool
|
|
343
|
-
severity:
|
|
344
|
-
confidence: 0.
|
|
345
|
-
action: require_approval
|
|
315
|
+
severity: warning
|
|
316
|
+
confidence: 0.60
|
|
346
317
|
pattern: "\\b(rm|del|rmdir|rd|Remove-Item|unlink)\\b.*(\\s|[\\\\/])\\.git(\\s|[\\\\/]|$)"
|
|
347
318
|
case_insensitive: true
|
|
348
319
|
match_on: command
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
category: secrets
|
|
8
8
|
severity: critical
|
|
9
9
|
confidence: 0.80
|
|
10
|
-
action: block
|
|
11
10
|
pattern: "(sk-[a-zA-Z0-9_-]{20,}|sk-proj-[a-zA-Z0-9_-]{20,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|ghp_[0-9a-zA-Z]{36}|gho_[0-9a-zA-Z]{36}|glpat-[0-9a-zA-Z_-]{20,}|xox[baprs]-[0-9a-zA-Z-]+)"
|
|
12
11
|
match_on: [command, content]
|
|
13
12
|
title: "Known API key prefix detected"
|
|
@@ -17,9 +16,8 @@
|
|
|
17
16
|
# --- Export of credential env vars ---
|
|
18
17
|
- id: "CLT-CRED-002"
|
|
19
18
|
category: secrets
|
|
20
|
-
severity:
|
|
21
|
-
confidence: 0.
|
|
22
|
-
action: require_approval
|
|
19
|
+
severity: warning
|
|
20
|
+
confidence: 0.60
|
|
23
21
|
pattern: "\\bexport\\s+[A-Z_]*(API_KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*="
|
|
24
22
|
match_on: command
|
|
25
23
|
title: "Export of environment variable with credential keyword"
|
|
@@ -29,9 +27,8 @@
|
|
|
29
27
|
# --- .env file writes ---
|
|
30
28
|
- id: "CLT-CRED-003"
|
|
31
29
|
category: secrets
|
|
32
|
-
severity:
|
|
33
|
-
confidence: 0.
|
|
34
|
-
action: require_approval
|
|
30
|
+
severity: warning
|
|
31
|
+
confidence: 0.60
|
|
35
32
|
pattern: "(>>|>)\\s*\\.env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.local|\\.production|\\.prod|\\.staging|\\.stage|\\.development|\\.dev|\\.test)?\\b"
|
|
36
33
|
match_on: command
|
|
37
34
|
title: "Write/append to .env file (potential credential exposure)"
|
|
@@ -41,9 +38,8 @@
|
|
|
41
38
|
# --- Reading credential files ---
|
|
42
39
|
- id: "CLT-CRED-004"
|
|
43
40
|
category: secrets
|
|
44
|
-
severity:
|
|
45
|
-
confidence: 0.
|
|
46
|
-
action: require_approval
|
|
41
|
+
severity: warning
|
|
42
|
+
confidence: 0.60
|
|
47
43
|
pattern: "\\b(cat|less|more|head|tail)\\s+.*(\\.(env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.(local|production|prod|staging|stage|development|dev|test))?)|credentials|\\.aws/credentials|\\.ssh/id_rsa|\\.ssh/id_ed25519|\\.netrc|\\.pgpass)"
|
|
48
44
|
match_on: command
|
|
49
45
|
title: "Reading credential or secret file"
|
|
@@ -53,9 +49,8 @@
|
|
|
53
49
|
# --- Plaintext credential assignment ---
|
|
54
50
|
- id: "CLT-CRED-005"
|
|
55
51
|
category: secrets
|
|
56
|
-
severity:
|
|
57
|
-
confidence: 0.
|
|
58
|
-
action: require_approval
|
|
52
|
+
severity: warning
|
|
53
|
+
confidence: 0.60
|
|
59
54
|
pattern: "\\b(PASSWORD|API_SECRET|SECRET_KEY|PRIVATE_KEY|DB_PASSWORD|MYSQL_PASSWORD|POSTGRES_PASSWORD)=[\"']?[^\\s\"']{8,}"
|
|
60
55
|
match_on: [command, content]
|
|
61
56
|
title: "Plaintext credential assignment detected"
|
|
@@ -67,7 +62,6 @@
|
|
|
67
62
|
category: secrets
|
|
68
63
|
severity: critical
|
|
69
64
|
confidence: 0.92
|
|
70
|
-
action: block
|
|
71
65
|
pattern: "(github_pat_[0-9a-zA-Z_]{22,}|SG\\.[0-9a-zA-Z_-]{22,}\\.[0-9a-zA-Z_-]{22,}|pk_live_[0-9a-zA-Z]{24,}|sk_live_[0-9a-zA-Z]{24,}|rk_live_[0-9a-zA-Z]{24,})"
|
|
72
66
|
match_on: [command, content]
|
|
73
67
|
title: "Long-form API key pattern detected (GitHub PAT, SendGrid, Stripe)"
|
|
@@ -77,9 +71,8 @@
|
|
|
77
71
|
# --- Copy/move/link secret files ---
|
|
78
72
|
- id: "CLT-CRED-007"
|
|
79
73
|
category: secrets
|
|
80
|
-
severity:
|
|
81
|
-
confidence: 0.
|
|
82
|
-
action: require_approval
|
|
74
|
+
severity: warning
|
|
75
|
+
confidence: 0.60
|
|
83
76
|
# Protected files: .env*, .aws/credentials, .ssh/(id_rsa|id_ed25519|id_ecdsa|id_dsa),
|
|
84
77
|
# .netrc, .pgpass, .npmrc, .pypirc, key.properties, .docker/config.json,
|
|
85
78
|
# kubeconfig, .kube/config, master.key, credentials.yml
|
|
@@ -92,9 +85,8 @@
|
|
|
92
85
|
# --- Archive secret files ---
|
|
93
86
|
- id: "CLT-CRED-008"
|
|
94
87
|
category: secrets
|
|
95
|
-
severity:
|
|
96
|
-
confidence: 0.
|
|
97
|
-
action: require_approval
|
|
88
|
+
severity: warning
|
|
89
|
+
confidence: 0.60
|
|
98
90
|
# Protected files: .env*, .aws/credentials, .ssh/(id_rsa|id_ed25519|id_ecdsa|id_dsa),
|
|
99
91
|
# .netrc, .pgpass, .npmrc, .pypirc, key.properties, .docker/config.json,
|
|
100
92
|
# kubeconfig, .kube/config, master.key, credentials.yml
|
|
@@ -24,7 +24,6 @@
|
|
|
24
24
|
category: testing
|
|
25
25
|
severity: critical
|
|
26
26
|
confidence: 0.95
|
|
27
|
-
action: block
|
|
28
27
|
pattern: "__sage_test_deny_cmd_a75bf229__"
|
|
29
28
|
match_on: command
|
|
30
29
|
title: "[TEST] Canary deny command (alpha)"
|
|
@@ -35,7 +34,6 @@
|
|
|
35
34
|
category: testing
|
|
36
35
|
severity: critical
|
|
37
36
|
confidence: 0.95
|
|
38
|
-
action: block
|
|
39
37
|
pattern: "__sage_test_deny_run_c3d91e4a__"
|
|
40
38
|
match_on: command
|
|
41
39
|
title: "[TEST] Canary deny command (bravo)"
|
|
@@ -44,9 +42,8 @@
|
|
|
44
42
|
|
|
45
43
|
- id: "DUMMY-CMD-ASK-001"
|
|
46
44
|
category: testing
|
|
47
|
-
severity:
|
|
48
|
-
confidence: 0.
|
|
49
|
-
action: require_approval
|
|
45
|
+
severity: warning
|
|
46
|
+
confidence: 0.60
|
|
50
47
|
pattern: "__sage_test_ask_cmd_8f2e6b71__"
|
|
51
48
|
match_on: command
|
|
52
49
|
title: "[TEST] Canary approval command (alpha)"
|
|
@@ -55,9 +52,8 @@
|
|
|
55
52
|
|
|
56
53
|
- id: "DUMMY-CMD-ASK-002"
|
|
57
54
|
category: testing
|
|
58
|
-
severity:
|
|
59
|
-
confidence: 0.
|
|
60
|
-
action: require_approval
|
|
55
|
+
severity: warning
|
|
56
|
+
confidence: 0.60
|
|
61
57
|
pattern: "__sage_test_ask_run_d4a09c53__"
|
|
62
58
|
match_on: command
|
|
63
59
|
title: "[TEST] Canary approval command (bravo)"
|
|
@@ -66,14 +62,14 @@
|
|
|
66
62
|
|
|
67
63
|
- id: "DUMMY-CMD-LOG-001"
|
|
68
64
|
category: testing
|
|
69
|
-
severity:
|
|
70
|
-
confidence: 0.
|
|
71
|
-
action: log
|
|
65
|
+
severity: info
|
|
66
|
+
confidence: 0.10
|
|
72
67
|
pattern: "__sage_test_log_cmd_1b7e3f82__"
|
|
73
68
|
match_on: command
|
|
74
69
|
title: "[TEST] Canary log-only command"
|
|
75
70
|
expires_at: null
|
|
76
71
|
revoked: false
|
|
72
|
+
flags: ["report"]
|
|
77
73
|
|
|
78
74
|
# ─── File-path patterns (Write / Edit / Read / Delete tools) ────────
|
|
79
75
|
|
|
@@ -81,7 +77,6 @@
|
|
|
81
77
|
category: testing
|
|
82
78
|
severity: critical
|
|
83
79
|
confidence: 0.95
|
|
84
|
-
action: block
|
|
85
80
|
pattern: "__sage_test_deny_file_e6c4a918__"
|
|
86
81
|
match_on: file_path
|
|
87
82
|
title: "[TEST] Canary deny file path"
|
|
@@ -90,9 +85,8 @@
|
|
|
90
85
|
|
|
91
86
|
- id: "DUMMY-FILE-ASK-001"
|
|
92
87
|
category: testing
|
|
93
|
-
severity:
|
|
94
|
-
confidence: 0.
|
|
95
|
-
action: require_approval
|
|
88
|
+
severity: warning
|
|
89
|
+
confidence: 0.60
|
|
96
90
|
pattern: "__sage_test_ask_file_52fd7b36__"
|
|
97
91
|
match_on: file_path
|
|
98
92
|
title: "[TEST] Canary approval file path"
|
|
@@ -101,14 +95,14 @@
|
|
|
101
95
|
|
|
102
96
|
- id: "DUMMY-FILE-LOG-001"
|
|
103
97
|
category: testing
|
|
104
|
-
severity:
|
|
105
|
-
confidence: 0.
|
|
106
|
-
action: log
|
|
98
|
+
severity: info
|
|
99
|
+
confidence: 0.10
|
|
107
100
|
pattern: "__sage_test_log_file_9a13de74__"
|
|
108
101
|
match_on: file_path
|
|
109
102
|
title: "[TEST] Canary log-only file path"
|
|
110
103
|
expires_at: null
|
|
111
104
|
revoked: false
|
|
105
|
+
flags: ["report"]
|
|
112
106
|
|
|
113
107
|
# ─── Content patterns (Write / Edit tools — file body) ──────────────
|
|
114
108
|
|
|
@@ -116,7 +110,6 @@
|
|
|
116
110
|
category: testing
|
|
117
111
|
severity: critical
|
|
118
112
|
confidence: 0.95
|
|
119
|
-
action: block
|
|
120
113
|
pattern: "__SAGE_TEST_DENY_CONTENT_3c8f15b7__"
|
|
121
114
|
match_on: content
|
|
122
115
|
title: "[TEST] Canary deny content"
|
|
@@ -125,9 +118,8 @@
|
|
|
125
118
|
|
|
126
119
|
- id: "DUMMY-CONTENT-ASK-001"
|
|
127
120
|
category: testing
|
|
128
|
-
severity:
|
|
129
|
-
confidence: 0.
|
|
130
|
-
action: require_approval
|
|
121
|
+
severity: warning
|
|
122
|
+
confidence: 0.60
|
|
131
123
|
pattern: "__SAGE_TEST_ASK_CONTENT_7d4ea2c9__"
|
|
132
124
|
match_on: content
|
|
133
125
|
title: "[TEST] Canary approval content"
|
|
@@ -136,14 +128,14 @@
|
|
|
136
128
|
|
|
137
129
|
- id: "DUMMY-CONTENT-LOG-001"
|
|
138
130
|
category: testing
|
|
139
|
-
severity:
|
|
140
|
-
confidence: 0.
|
|
141
|
-
action: log
|
|
131
|
+
severity: info
|
|
132
|
+
confidence: 0.10
|
|
142
133
|
pattern: "__SAGE_TEST_LOG_CONTENT_f0b683d1__"
|
|
143
134
|
match_on: content
|
|
144
135
|
title: "[TEST] Canary log-only content"
|
|
145
136
|
expires_at: null
|
|
146
137
|
revoked: false
|
|
138
|
+
flags: ["report"]
|
|
147
139
|
|
|
148
140
|
# ─── URL patterns (WebFetch / Bash / Write content) ─────────────────
|
|
149
141
|
# Uses .test TLD (RFC 2606 reserved, never resolves) for safety.
|
|
@@ -152,7 +144,6 @@
|
|
|
152
144
|
category: testing
|
|
153
145
|
severity: critical
|
|
154
146
|
confidence: 0.95
|
|
155
|
-
action: block
|
|
156
147
|
pattern: "sage-canary-deny-4e91ca37\\.test"
|
|
157
148
|
match_on: url
|
|
158
149
|
title: "[TEST] Canary deny URL"
|
|
@@ -161,9 +152,8 @@
|
|
|
161
152
|
|
|
162
153
|
- id: "DUMMY-URL-ASK-001"
|
|
163
154
|
category: testing
|
|
164
|
-
severity:
|
|
165
|
-
confidence: 0.
|
|
166
|
-
action: require_approval
|
|
155
|
+
severity: warning
|
|
156
|
+
confidence: 0.60
|
|
167
157
|
pattern: "sage-canary-ask-b26d80f5\\.test"
|
|
168
158
|
match_on: url
|
|
169
159
|
title: "[TEST] Canary approval URL"
|
|
@@ -172,14 +162,14 @@
|
|
|
172
162
|
|
|
173
163
|
- id: "DUMMY-URL-LOG-001"
|
|
174
164
|
category: testing
|
|
175
|
-
severity:
|
|
176
|
-
confidence: 0.
|
|
177
|
-
action: log
|
|
165
|
+
severity: info
|
|
166
|
+
confidence: 0.10
|
|
178
167
|
pattern: "sage-canary-log-65f3d7a4\\.test"
|
|
179
168
|
match_on: url
|
|
180
169
|
title: "[TEST] Canary log-only URL"
|
|
181
170
|
expires_at: null
|
|
182
171
|
revoked: false
|
|
172
|
+
flags: ["report"]
|
|
183
173
|
|
|
184
174
|
# ─── Domain pattern (verifies domain→url routing in heuristics) ─────
|
|
185
175
|
|
|
@@ -187,7 +177,6 @@
|
|
|
187
177
|
category: testing
|
|
188
178
|
severity: critical
|
|
189
179
|
confidence: 0.95
|
|
190
|
-
action: block
|
|
191
180
|
pattern: "sage-canary-domain-0c82eb16\\.test"
|
|
192
181
|
match_on: domain
|
|
193
182
|
title: "[TEST] Canary deny domain"
|