@gendigital/sage-openclaw 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.
Files changed (35) hide show
  1. package/README.md +63 -20
  2. package/dist/index.cjs +1073 -653
  3. package/dist/index.cjs.map +4 -4
  4. package/dist/mcp-server.cjs +31776 -0
  5. package/dist/mcp-server.cjs.map +7 -0
  6. package/dist/model-download-worker.cjs +422 -29
  7. package/dist/model-download-worker.cjs.map +4 -4
  8. package/openclaw.plugin.json +1 -1
  9. package/package.json +13 -3
  10. package/resources/skills/security-awareness/SKILL.md +5 -1
  11. package/resources/threats/agent-layer.yaml +186 -0
  12. package/resources/threats/commands.yaml +24 -53
  13. package/resources/threats/credentials.yaml +12 -20
  14. package/resources/threats/dummy.yaml +22 -33
  15. package/resources/threats/files.yaml +34 -53
  16. package/resources/threats/mac-commands.yaml +20 -47
  17. package/resources/threats/mac-credentials.yaml +4 -12
  18. package/resources/threats/mac-files.yaml +5 -15
  19. package/resources/threats/mac-obfuscation.yaml +6 -13
  20. package/resources/threats/mac-persistence.yaml +11 -20
  21. package/resources/threats/mac-supply-chain.yaml +5 -8
  22. package/resources/threats/mitre.yaml +105 -167
  23. package/resources/threats/obfuscation.yaml +7 -15
  24. package/resources/threats/persistence.yaml +10 -17
  25. package/resources/threats/prompt-injection.yaml +94 -44
  26. package/resources/threats/self-defense.yaml +8 -12
  27. package/resources/threats/supply_chain.yaml +1 -2
  28. package/resources/threats/urls.yaml +9 -14
  29. package/resources/threats/win-commands.yaml +46 -106
  30. package/resources/threats/win-credentials.yaml +15 -25
  31. package/resources/threats/win-files.yaml +10 -20
  32. package/resources/threats/win-obfuscation.yaml +21 -37
  33. package/resources/threats/win-persistence.yaml +8 -16
  34. package/resources/threats/win-supply-chain.yaml +2 -3
  35. /package/resources/{allowlists → trusted-domains}/trusted-installer-domains.yaml +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "sage-openclaw",
3
3
  "name": "Sage",
4
- "version": "0.9.0",
4
+ "version": "0.11.0",
5
5
  "description": "Safety for Agents — ADR layer that guards commands, files, and web requests",
6
6
  "skills": [
7
7
  "resources/skills/security-awareness"
package/package.json CHANGED
@@ -1,9 +1,18 @@
1
1
  {
2
2
  "name": "@gendigital/sage-openclaw",
3
3
  "license": "Apache-2.0",
4
- "version": "0.9.0",
4
+ "version": "0.11.0",
5
5
  "type": "module",
6
6
  "description": "Safety for Agents — ADR layer for OpenClaw",
7
+ "homepage": "https://github.com/gendigitalinc/sage",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/gendigitalinc/sage.git",
11
+ "directory": "packages/openclaw"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/gendigitalinc/sage/issues"
15
+ },
7
16
  "main": "./dist/index.cjs",
8
17
  "files": [
9
18
  "dist/**",
@@ -21,7 +30,8 @@
21
30
  "esbuild": "^0.25.0",
22
31
  "typescript": "^5.9.0",
23
32
  "vitest": "^4.0.0",
24
- "@gendigital/sage-core": "0.9.0"
33
+ "@gendigital/sage-core": "0.11.0",
34
+ "@gendigital/sage-mcp": "0.11.0"
25
35
  },
26
36
  "openclaw": {
27
37
  "extensions": [
@@ -52,7 +62,7 @@
52
62
  "access": "public"
53
63
  },
54
64
  "scripts": {
55
- "build": "pnpm -C ../core build && pnpm run clean && pnpm run sync:assets && node esbuild.config.js",
65
+ "build": "pnpm run clean && pnpm run sync:assets && node esbuild.config.js",
56
66
  "clean": "node ../../scripts/clean.mjs dist resources",
57
67
  "sync:assets": "node scripts/sync-assets.mjs",
58
68
  "test": "vitest run"
@@ -62,7 +62,11 @@ On OpenCode, Sage relays flagged details through the conversation, making it sus
62
62
 
63
63
  ## False Positive Reporting
64
64
 
65
- If the user believes a Sage detection is incorrect (a wrong block, mistaken flag, or false alarm), you can report it using the MCP tools provided by Sage:
65
+ If the user believes a Sage detection is incorrect (a wrong block, mistaken flag, or false alarm), you can report it using the MCP tools provided by Sage.
66
+
67
+ **Platform availability:** The MCP tools are registered automatically on Claude Code, Cursor, and OpenCode. On VS Code, the user must start the MCP server first (`MCP: List Server` → `sage` → `Start server`). On OpenClaw, the user must add the Sage MCP server to their `mcp.servers` config manually (see the OpenClaw platform guide).
68
+
69
+ With the server running:
66
70
 
67
71
  1. **`sage_list_audit_entries`** — Lists recent Sage audit log entries for the current conversation. Use this to find the `entry_id`s of the detections the user considers incorrect.
68
72
  2. **`sage_report_false_positive`** — Submits a false positive report to the Sage backend. Requires a `description` (what was wrongly detected) and `reasoning` (why it is a false positive). Optionally accepts `entry_ids` to scope the report to specific entries.
@@ -0,0 +1,186 @@
1
+ # Agent-layer threat patterns for Sage
2
+ #
3
+ # Author: ATR (Agent Threat Rules) community contributors
4
+ # Upstream: https://github.com/Agent-Threat-Rule/agent-threat-rules
5
+ # Contributed per issue #30 + vaclavbelak's comment
6
+ # (https://github.com/gendigitalinc/sage/issues/30#issuecomment-4266904912)
7
+ #
8
+ # License: MIT
9
+ # Rules in this file are adapted from the ATR project
10
+ # (https://github.com/Agent-Threat-Rule/agent-threat-rules),
11
+ # Copyright (c) 2026 ATR Contributors, and are included in Sage
12
+ # under the ATR MIT license per explicit agreement in issue #30.
13
+ # Sage-specific modifications to each rule are noted in its comment block.
14
+ #
15
+ # What this file covers (gaps vs Sage's existing rules):
16
+ # MCP tool / response attacks CLT-MCP-004 (1 rule -- path traversal)
17
+ # Skill package compromise CLT-SKL-001..008 (6 rules -- IDs 001,002,004,005,006,008; 003/007 dropped for FP risk)
18
+ # Context exfiltration CLT-CTX-003 (1 rule -- PEM key leak)
19
+ # Supply chain CLT-SUPPLY-002 (1 rule)
20
+ #
21
+ # All prompt_injection rules have been moved to prompt-injection.yaml:
22
+ # CLT-PI-052 (IMPORTANT-tag shadowing, ex CLT-MCP-002)
23
+ # CLT-PI-091..093 (HTML-comment delivery, jailbreak persona, CJK pivot)
24
+ # Dropped: CLT-CTX-002 (instruction tampering) -- covered by CLT-PI-001..005
25
+ #
26
+ # Design notes:
27
+ # - All rules use `match_on: content` so they fire on Write/Edit content,
28
+ # plugin/skill file scans, and any agent integration that passes a
29
+ # `content` artifact. They complement (do not duplicate) Sage's existing
30
+ # command/URL/credential-file rules.
31
+ # - Confidence values are calibrated to Sage's policy zones (docs/decision-pipeline.md):
32
+ # 0.95 = attack-only signal, deny under all sensitivities
33
+ # 0.85 = high-precision attack pattern, deny paranoid/balanced, ask relaxed
34
+ # - `case_insensitive: true` replaces ATR's `(?i)` inline flag.
35
+
36
+ # ===========================================================================
37
+ # MCP TOOL & RESPONSE POISONING
38
+ # ===========================================================================
39
+
40
+ - id: "CLT-MCP-004"
41
+ category: mcp_poisoning
42
+ severity: warning
43
+ confidence: 0.85
44
+ pattern: "\\.\\.[\\/\\\\](?:\\.\\.[\\/\\\\])+(?:etc|proc|root|sys|boot|passwd|shadow|shadow\\.bak|master\\.key)(?:[\\/\\\\]|\\s|$)"
45
+ match_on: content
46
+ case_insensitive: false
47
+ title: "Path traversal targeting system directory (/etc, /proc, /root, /sys, ...)"
48
+ expires_at: null
49
+ revoked: false
50
+ # Adapted from ATR-2026-00012: narrowed to require 2+ traversal hops terminating
51
+ # in a sensitive system directory (dropped dev, hosts from ATR's list); reduces
52
+ # FP on benign code examples that use relative paths like ../../src/.
53
+ # Fires in pre-hook (Write/Edit content blocking) and session-start plugin scans
54
+ # only; post-hook scanning is limited to category=prompt_injection rules.
55
+
56
+ # ===========================================================================
57
+ # SKILL PACKAGE COMPROMISE -- malicious content inside SKILL.md, plugin
58
+ # manifests, or skill package files.
59
+ # ===========================================================================
60
+
61
+ - id: "CLT-SKL-001"
62
+ category: skill_compromise
63
+ severity: critical
64
+ confidence: 0.85
65
+ pattern: "you\\s+(must|should|will|shall)\\s+(ignore|disregard|override|forget|bypass|circumvent|supersede|set\\s+aside|discard|abandon)\\s+(all\\s+)?(previous|prior|system|safety|security)\\s+(instructions?|prompts?|rules?|guidelines?|policies|restrictions?)"
66
+ match_on: content
67
+ case_insensitive: true
68
+ title: "SKILL.md prompt injection via mandatory override"
69
+ expires_at: null
70
+ revoked: false
71
+ # Adapted from ATR-2026-00120: simplified to single regex targeting the
72
+ # mandatory-subject ("you must/shall") framing only; omits ATR's broader
73
+ # context-window injection and multi-condition layers.
74
+ # Intentional layering with CLT-PI-001..004: those rules catch the bare
75
+ # imperative verb; this rule adds a distinct signal for the explicit mandatory
76
+ # subject, increasing confidence when both fire on the same payload.
77
+
78
+ # CLT-SKL-003 intentionally omitted — dropped for FP risk during ATR curation.
79
+
80
+ - id: "CLT-SKL-002"
81
+ category: skill_compromise
82
+ severity: critical
83
+ confidence: 0.85
84
+ pattern: "(eval\\s*\\$\\(\\s*echo\\s+[\"'][A-Za-z0-9+/=]{20,}[\"']\\s*\\|\\s*base64\\s+-d|echo\\s+[\"'][A-Za-z0-9+/=]{20,}[\"']\\s*\\|\\s*base64\\s+(-d|--decode)\\s*\\|\\s*(bash|sh|python|node|ruby|perl))"
85
+ match_on: content
86
+ case_insensitive: true
87
+ title: "Base64-encoded payload piped to interpreter inside skill content"
88
+ expires_at: null
89
+ revoked: false
90
+ # Source: ATR-2026-00121 (pattern unchanged from upstream).
91
+
92
+ - id: "CLT-SKL-004"
93
+ category: skill_compromise
94
+ severity: critical
95
+ confidence: 0.85
96
+ pattern: "<!--[\\s\\S]{0,200}?(agent\\s+should|send\\s+all|output\\s+all|exfiltrate|curl\\s|wget\\s|post\\s+.{0,30}(key|credential|token|password|secret)|api[_-]?key.{0,30}https?://)"
97
+ match_on: content
98
+ case_insensitive: true
99
+ title: "Hidden payload in HTML comment within skill content"
100
+ expires_at: null
101
+ revoked: false
102
+ # Adapted from ATR-2026-00128: changed ATR's [^>] lookahead to [\s\S] to avoid
103
+ # false negatives when a hyphen precedes an exfil keyword; maintains same
104
+ # exfil-keyword focus (distinct from CLT-PI-002's instruction-override focus).
105
+
106
+ - id: "CLT-SKL-005"
107
+ category: skill_compromise
108
+ severity: critical
109
+ confidence: 0.95
110
+ pattern: "(?:\\uDB40[\\uDC00-\\uDC7F]){3,}"
111
+ match_on: content
112
+ case_insensitive: false
113
+ title: "Unicode Tag character smuggling (U+E0000..U+E007F) in skill content"
114
+ expires_at: null
115
+ revoked: false
116
+ # Source: ATR-2026-00129 (pattern unchanged from upstream). Tag characters
117
+ # are invisible to humans but visible to LLMs; 3+ in sequence is an
118
+ # injection signature with no legitimate use.
119
+
120
+ - id: "CLT-SKL-006"
121
+ category: skill_compromise
122
+ severity: critical
123
+ confidence: 0.85
124
+ pattern: "(tar|zip|7z)\\s+[^\\n]*~/?\\.ssh|(find|ls|cat|strings)\\s+[^\\n]*(wallet\\.dat|seed\\.txt|mnemonic|keystore)[^\\n]*(\\||>|>>|curl|wget|fetch|POST)|sqlite3\\s+[^\\n]*(Cookies|Login\\s*Data|cookies\\.sqlite|places\\.sqlite)"
125
+ match_on: content
126
+ case_insensitive: true
127
+ title: "Compound skill-content exfiltration (wallet/browser/SSH archival)"
128
+ expires_at: null
129
+ revoked: false
130
+ # Adapted from ATR-2026-00149: condensed ATR's 13 detection conditions into
131
+ # one regex covering SSH archival, crypto wallet exfil, and browser DB dump;
132
+ # omits ATR's DNS-exfil, IMDS metadata, and env-file piping layers.
133
+ # Intentional layering with CLT-CRED-008 (command artifact): that rule catches
134
+ # the same SSH archival at shell execution time; this rule catches it in
135
+ # written skill/plugin content before it executes.
136
+
137
+ # CLT-SKL-007 intentionally omitted — dropped for FP risk during ATR curation.
138
+
139
+ - id: "CLT-SKL-008"
140
+ category: skill_compromise
141
+ severity: warning
142
+ confidence: 0.85
143
+ pattern: "(?:(?:always|must|shall|will|should)\\s+){1,3}(?:approve|accept|allow|grant|permit)\\b[^.\\n]{0,80}(?:without|regardless|even\\s+if|despite)\\s+(?:confirmation|permission|approval|consent|asking|checking|verification|user)"
144
+ match_on: content
145
+ case_insensitive: true
146
+ title: "Hidden override instruction in skill -- auto-approve all"
147
+ expires_at: null
148
+ revoked: false
149
+ # Adapted from ATR-2026-00163: added "will"/"should" modals and "despite" as
150
+ # an additional consent-bypass synonym; bounded modal repetition to {1,3}.
151
+
152
+ # ===========================================================================
153
+ # CONTEXT EXFILTRATION
154
+ # ===========================================================================
155
+
156
+ - id: "CLT-CTX-003"
157
+ category: context_exfiltration
158
+ severity: critical
159
+ confidence: 0.95
160
+ pattern: "-----BEGIN\\s+[A-Z ]+PRIVATE\\s+KEY-----[\\s\\S]{40,}-----END\\s+[A-Z ]+PRIVATE\\s+KEY-----"
161
+ match_on: content
162
+ title: "PEM private key block appearing in agent content"
163
+ expires_at: null
164
+ revoked: false
165
+ # Source: ATR-2026-00021 (pattern unchanged from upstream). Fires on Write/Edit
166
+ # content and session-start plugin scans (category context_exfiltration is
167
+ # pre-hook only; post-hook scanning is limited to prompt_injection rules).
168
+ # Covers RSA, EC, DSA, OPENSSH, ENCRYPTED variants.
169
+
170
+ # ===========================================================================
171
+ # SUPPLY CHAIN
172
+ # ===========================================================================
173
+
174
+ - id: "CLT-SUPPLY-002"
175
+ category: supply_chain
176
+ severity: warning
177
+ confidence: 0.95
178
+ pattern: "(?:filesytem|filsystem|file_sytem|flie_system|filessystem|filesystm|filsystm|filesysem)[-_](?:read|write|list|delete|search)"
179
+ match_on: content
180
+ case_insensitive: true
181
+ title: "Typosquatted filesystem tool name (targets MCP filesystem server)"
182
+ expires_at: null
183
+ revoked: false
184
+ # Adapted from ATR-2026-00060: extracted filesystem-server typo variants only;
185
+ # narrows ATR's broader MCP squatting rule to the
186
+ # @modelcontextprotocol/server-filesystem impersonation family.
@@ -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, action, pattern, match_on, title, expires_at, revoked
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
- action: block
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: high
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: high
124
- confidence: 0.80
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: high
135
- confidence: 0.80
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: high
147
- confidence: 0.80
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: high
175
- confidence: 0.80
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: high
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: high
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[^|;]*(?<![-\\w])(curl|wget|bash|sh)(?![-\\w])"
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: high
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: high
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: high
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: high
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: high
320
- confidence: 0.85
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: high
332
- confidence: 0.85
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: high
344
- confidence: 0.90
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: high
21
- confidence: 0.80
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: high
33
- confidence: 0.80
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: high
45
- confidence: 0.80
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: high
57
- confidence: 0.85
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: high
81
- confidence: 0.80
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: high
96
- confidence: 0.80
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