@runsec/mcp 1.0.1
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/dist/index.js +578 -0
- package/package.json +43 -0
- package/src/rules/data/rule-compliance-map.json +43563 -0
- package/src/rules/data/semgrep-rules/README-taint-overlays.md +21 -0
- package/src/rules/data/semgrep-rules/advanced-agent-cloud.yaml +802 -0
- package/src/rules/data/semgrep-rules/app-logic.yaml +445 -0
- package/src/rules/data/semgrep-rules/auth-keycloak.yaml +831 -0
- package/src/rules/data/semgrep-rules/browser-agent.yaml +260 -0
- package/src/rules/data/semgrep-rules/cloud-secrets.yaml +316 -0
- package/src/rules/data/semgrep-rules/csharp-dotnet.yaml +4864 -0
- package/src/rules/data/semgrep-rules/desktop-electron-pro.yaml +30 -0
- package/src/rules/data/semgrep-rules/desktop-vsto-suite.yaml +2759 -0
- package/src/rules/data/semgrep-rules/devops-security.yaml +393 -0
- package/src/rules/data/semgrep-rules/domain-access-management.yaml +1023 -0
- package/src/rules/data/semgrep-rules/domain-data-privacy.yaml +852 -0
- package/src/rules/data/semgrep-rules/domain-input-validation.yaml +2894 -0
- package/src/rules/data/semgrep-rules/domain-platform-hardening.yaml +1715 -0
- package/src/rules/data/semgrep-rules/ds-ml-security.yaml +2431 -0
- package/src/rules/data/semgrep-rules/fastapi-async.yaml +5953 -0
- package/src/rules/data/semgrep-rules/frontend-react.yaml +4035 -0
- package/src/rules/data/semgrep-rules/frontend-security.yaml +200 -0
- package/src/rules/data/semgrep-rules/go-core.yaml +4959 -0
- package/src/rules/data/semgrep-rules/hft-cpp-security.yaml +631 -0
- package/src/rules/data/semgrep-rules/infra-k8s-helm.yaml +4968 -0
- package/src/rules/data/semgrep-rules/integration-security.yaml +2362 -0
- package/src/rules/data/semgrep-rules/java-enterprise.yaml +14756 -0
- package/src/rules/data/semgrep-rules/java-spring.yaml +397 -0
- package/src/rules/data/semgrep-rules/license-compliance.yaml +186 -0
- package/src/rules/data/semgrep-rules/mobile-flutter.yaml +37 -0
- package/src/rules/data/semgrep-rules/mobile-security.yaml +721 -0
- package/src/rules/data/semgrep-rules/nodejs-nestjs.yaml +5164 -0
- package/src/rules/data/semgrep-rules/nodejs-security.yaml +326 -0
- package/src/rules/data/semgrep-rules/observability.yaml +381 -0
- package/src/rules/data/semgrep-rules/php-security.yaml +3601 -0
- package/src/rules/data/semgrep-rules/python-backend-pro.yaml +30 -0
- package/src/rules/data/semgrep-rules/python-django.yaml +181 -0
- package/src/rules/data/semgrep-rules/python-security.yaml +284 -0
- package/src/rules/data/semgrep-rules/ru-regulatory.yaml +496 -0
- package/src/rules/data/semgrep-rules/ruby-rails.yaml +3078 -0
- package/src/rules/data/semgrep-rules/rust-security.yaml +2701 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
- id: runsec.browser-agent.brw-001
|
|
3
|
+
metadata:
|
|
4
|
+
runsec_version: v1.0
|
|
5
|
+
confidence: |-
|
|
6
|
+
0.9
|
|
7
|
+
exploit_scenario: |-
|
|
8
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
9
|
+
fix_template: |-
|
|
10
|
+
browser = await p.chromium.launch( args=[], headless=True, )
|
|
11
|
+
pattern-either:
|
|
12
|
+
- pattern: |-
|
|
13
|
+
browser = await p.chromium.launch(
|
|
14
|
+
args=["--no-sandbox","--disable-setuid-sandbox"],
|
|
15
|
+
headless=True,
|
|
16
|
+
)
|
|
17
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-001\\b'
|
|
18
|
+
message: |-
|
|
19
|
+
RunSec Detection [BRW-001]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
20
|
+
languages:
|
|
21
|
+
- generic
|
|
22
|
+
severity: WARNING
|
|
23
|
+
- id: runsec.browser-agent.brw-002
|
|
24
|
+
metadata:
|
|
25
|
+
runsec_version: v1.0
|
|
26
|
+
confidence: |-
|
|
27
|
+
0.9
|
|
28
|
+
exploit_scenario: |-
|
|
29
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
30
|
+
fix_template: |-
|
|
31
|
+
context = await browser.new_context(ignoreHTTPSErrors=False) page = await context.new_page()
|
|
32
|
+
pattern-either:
|
|
33
|
+
- pattern: |-
|
|
34
|
+
context = await browser.new_context(ignoreHTTPSErrors=True)
|
|
35
|
+
page = await context.new_page()
|
|
36
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-002\\b'
|
|
37
|
+
message: |-
|
|
38
|
+
RunSec Detection [BRW-002]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
39
|
+
languages:
|
|
40
|
+
- generic
|
|
41
|
+
severity: WARNING
|
|
42
|
+
- id: runsec.browser-agent.brw-003
|
|
43
|
+
metadata:
|
|
44
|
+
runsec_version: v1.0
|
|
45
|
+
confidence: |-
|
|
46
|
+
0.9
|
|
47
|
+
exploit_scenario: |-
|
|
48
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
49
|
+
fix_template: |-
|
|
50
|
+
browser = await p.chromium.launch(headless=True)
|
|
51
|
+
pattern-either:
|
|
52
|
+
- pattern: |-
|
|
53
|
+
browser = await p.chromium.launch(headless=False)
|
|
54
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-003\\b'
|
|
55
|
+
message: |-
|
|
56
|
+
RunSec Detection [BRW-003]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
57
|
+
languages:
|
|
58
|
+
- generic
|
|
59
|
+
severity: WARNING
|
|
60
|
+
- id: runsec.browser-agent.brw-004
|
|
61
|
+
metadata:
|
|
62
|
+
runsec_version: v1.0
|
|
63
|
+
confidence: |-
|
|
64
|
+
0.9
|
|
65
|
+
exploit_scenario: |-
|
|
66
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
67
|
+
fix_template: |-
|
|
68
|
+
await page.route(\"**/*\", lambda route: route.abort() if \"stun\" in route.request.url else route.continue_())
|
|
69
|
+
pattern-either:
|
|
70
|
+
- pattern: |-
|
|
71
|
+
await page.evaluate(() => new RTCPeerConnection().createOffer())
|
|
72
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-004\\b'
|
|
73
|
+
message: |-
|
|
74
|
+
RunSec Detection [BRW-004]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
75
|
+
languages:
|
|
76
|
+
- generic
|
|
77
|
+
severity: WARNING
|
|
78
|
+
- id: runsec.browser-agent.brw-005
|
|
79
|
+
metadata:
|
|
80
|
+
runsec_version: v1.0
|
|
81
|
+
confidence: |-
|
|
82
|
+
0.9
|
|
83
|
+
exploit_scenario: |-
|
|
84
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
85
|
+
fix_template: |-
|
|
86
|
+
allowed = {\"scrollToTop\",\"extractText\"} cmd = request.json()[\"cmd\"] if cmd not in allowed: raise ValueError(\"cmd rejected\") await page.evaluate(\"(arg) => window.scrollTo(0,0)\", None)
|
|
87
|
+
pattern-either:
|
|
88
|
+
- pattern: |-
|
|
89
|
+
user_js = request.json()["script"]
|
|
90
|
+
await page.evaluate(user_js)
|
|
91
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-005\\b'
|
|
92
|
+
message: |-
|
|
93
|
+
RunSec Detection [BRW-005]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
94
|
+
languages:
|
|
95
|
+
- generic
|
|
96
|
+
severity: WARNING
|
|
97
|
+
- id: runsec.browser-agent.brw-006
|
|
98
|
+
metadata:
|
|
99
|
+
runsec_version: v1.0
|
|
100
|
+
confidence: |-
|
|
101
|
+
0.9
|
|
102
|
+
exploit_scenario: |-
|
|
103
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
104
|
+
fix_template: |-
|
|
105
|
+
browser = await p.chromium.launch(args=[])
|
|
106
|
+
pattern-either:
|
|
107
|
+
- pattern: |-
|
|
108
|
+
browser = await p.chromium.launch(
|
|
109
|
+
args=["--disable-web-security","--disable-site-isolation-trials"],
|
|
110
|
+
)
|
|
111
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-006\\b'
|
|
112
|
+
message: |-
|
|
113
|
+
RunSec Detection [BRW-006]: Ошибка доступа к @Docs (Playwright/Selenium)
|
|
114
|
+
languages:
|
|
115
|
+
- generic
|
|
116
|
+
severity: WARNING
|
|
117
|
+
- id: runsec.browser-agent.brw-007
|
|
118
|
+
metadata:
|
|
119
|
+
runsec_version: v1.0
|
|
120
|
+
confidence: |-
|
|
121
|
+
0.9
|
|
122
|
+
exploit_scenario: |-
|
|
123
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
124
|
+
fix_template: |-
|
|
125
|
+
target = user_input_url if target.startswith(\"file://\"): raise ValueError(\"file protocol is forbidden\") await page.goto(target, wait_until=\"domcontentloaded\")
|
|
126
|
+
pattern-either:
|
|
127
|
+
- pattern: |-
|
|
128
|
+
target = user_input_url
|
|
129
|
+
await page.goto(target)
|
|
130
|
+
# attacker can pass file:///etc/passwd
|
|
131
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-007\\b'
|
|
132
|
+
message: |-
|
|
133
|
+
RunSec Detection [BRW-007]: Playwright Security Best Practices; OWASP Web Security Testing Guide
|
|
134
|
+
languages:
|
|
135
|
+
- generic
|
|
136
|
+
severity: WARNING
|
|
137
|
+
- id: runsec.browser-agent.brw-008
|
|
138
|
+
metadata:
|
|
139
|
+
runsec_version: v1.0
|
|
140
|
+
confidence: |-
|
|
141
|
+
0.9
|
|
142
|
+
exploit_scenario: |-
|
|
143
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
144
|
+
fix_template: |-
|
|
145
|
+
import ipaddress from urllib.parse import urlparse def _blocked_host(host: str) -> bool: if host in {\"localhost\"}: return True try: ip = ipaddress.ip_address(host) return ip.is_loopback or ip.is_private or ip.is_link_local except ValueError: return False parsed = urlparse(url) if _blocked_host(parsed.hostname or \"\") or (parsed.hostname == \"169.254.169.254\"): raise ValueError(\"blocked destination\") await page.goto(url, wait_until=\"domcontentloaded\")
|
|
146
|
+
pattern-either:
|
|
147
|
+
- pattern: |-
|
|
148
|
+
await page.goto(url)
|
|
149
|
+
# url may be http://127.0.0.1:... or http://169.254.169.254/...
|
|
150
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-008\\b'
|
|
151
|
+
message: |-
|
|
152
|
+
RunSec Detection [BRW-008]: Playwright Security Best Practices; OWASP Web Security Testing Guide
|
|
153
|
+
languages:
|
|
154
|
+
- generic
|
|
155
|
+
severity: WARNING
|
|
156
|
+
- id: runsec.browser-agent.brw-009
|
|
157
|
+
metadata:
|
|
158
|
+
runsec_version: v1.0
|
|
159
|
+
confidence: |-
|
|
160
|
+
0.9
|
|
161
|
+
exploit_scenario: |-
|
|
162
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
163
|
+
fix_template: |-
|
|
164
|
+
context = await browser.new_context() try: page = await context.new_page() page.set_default_navigation_timeout(10000) await page.goto(url, timeout=10000, wait_until=\"domcontentloaded\") finally: await context.close()
|
|
165
|
+
pattern-either:
|
|
166
|
+
- pattern: |-
|
|
167
|
+
context = await browser.new_context()
|
|
168
|
+
page = await context.new_page()
|
|
169
|
+
await page.goto(url)
|
|
170
|
+
# context.close() missing
|
|
171
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-009\\b'
|
|
172
|
+
message: |-
|
|
173
|
+
RunSec Detection [BRW-009]: Playwright Security Best Practices; OWASP Web Security Testing Guide
|
|
174
|
+
languages:
|
|
175
|
+
- generic
|
|
176
|
+
severity: WARNING
|
|
177
|
+
- id: runsec.browser-agent.brw-010
|
|
178
|
+
metadata:
|
|
179
|
+
runsec_version: v1.0
|
|
180
|
+
confidence: |-
|
|
181
|
+
0.9
|
|
182
|
+
exploit_scenario: |-
|
|
183
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
184
|
+
fix_template: |-
|
|
185
|
+
context = await browser.new_context(accept_downloads=False) page = await context.new_page() resp = await page.goto(url, wait_until=\"domcontentloaded\") content_type = (resp.headers.get(\"content-type\", \"\") if resp else \"\") allowed = {\"text/html\", \"application/json\"} if content_type.split(\";\")[0] not in allowed: raise ValueError(\"blocked MIME type\")
|
|
186
|
+
pattern-either:
|
|
187
|
+
- pattern: |-
|
|
188
|
+
context = await browser.new_context(accept_downloads=True)
|
|
189
|
+
download = await page.wait_for_event("download")
|
|
190
|
+
path = await download.path()
|
|
191
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-010\\b'
|
|
192
|
+
message: |-
|
|
193
|
+
RunSec Detection [BRW-010]: Playwright Security Best Practices; OWASP Web Security Testing Guide
|
|
194
|
+
languages:
|
|
195
|
+
- generic
|
|
196
|
+
severity: WARNING
|
|
197
|
+
- id: runsec.browser-agent.brw-011
|
|
198
|
+
metadata:
|
|
199
|
+
runsec_version: v1.0
|
|
200
|
+
confidence: |-
|
|
201
|
+
0.9
|
|
202
|
+
exploit_scenario: |-
|
|
203
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
204
|
+
fix_template: |-
|
|
205
|
+
const note = request.body.note ... await page.evaluate((value) => { document.querySelector("#out").textContent = value }, note)
|
|
206
|
+
pattern-either:
|
|
207
|
+
- pattern: |-
|
|
208
|
+
const note = request.body.note
|
|
209
|
+
...
|
|
210
|
+
await page.evaluate((value) => { document.querySelector("#out").innerHTML = value }, note)
|
|
211
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-011\\b'
|
|
212
|
+
message: |-
|
|
213
|
+
RunSec Detection [BRW-011]: CWE-79
|
|
214
|
+
languages:
|
|
215
|
+
- generic
|
|
216
|
+
severity: WARNING
|
|
217
|
+
- id: runsec.browser-agent.brw-012
|
|
218
|
+
metadata:
|
|
219
|
+
runsec_version: v1.0
|
|
220
|
+
confidence: |-
|
|
221
|
+
0.9
|
|
222
|
+
exploit_scenario: |-
|
|
223
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
224
|
+
fix_template: |-
|
|
225
|
+
const cmd = request.body.cmd allowed = {"scrollTop":"window.scrollTo(0,0)"} if (!(cmd in allowed)) throw new Error("cmd rejected") ... await page.evaluate(allowed[cmd])
|
|
226
|
+
pattern-either:
|
|
227
|
+
- pattern: |-
|
|
228
|
+
const script = request.body.script
|
|
229
|
+
...
|
|
230
|
+
await page.evaluate((s) => eval(s), script)
|
|
231
|
+
...
|
|
232
|
+
const fn = new Function(script)
|
|
233
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-012\\b'
|
|
234
|
+
message: |-
|
|
235
|
+
RunSec Detection [BRW-012]: CWE-95
|
|
236
|
+
languages:
|
|
237
|
+
- generic
|
|
238
|
+
severity: WARNING
|
|
239
|
+
- id: runsec.browser-agent.brw-013
|
|
240
|
+
metadata:
|
|
241
|
+
runsec_version: v1.0
|
|
242
|
+
confidence: |-
|
|
243
|
+
0.9
|
|
244
|
+
exploit_scenario: |-
|
|
245
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
246
|
+
fix_template: |-
|
|
247
|
+
const patch = request.body.patch for (const k of Object.keys(patch)) { if (["__proto__","constructor","prototype"].includes(k)) throw new Error("blocked key") } ... Object.assign(config, patch)
|
|
248
|
+
pattern-either:
|
|
249
|
+
- pattern: |-
|
|
250
|
+
const patch = request.body.patch
|
|
251
|
+
...
|
|
252
|
+
target.__proto__ = patch
|
|
253
|
+
...
|
|
254
|
+
Object.assign(config, patch)
|
|
255
|
+
- pattern-regex: 'Vulnerable:\\s*BRW\\-013\\b'
|
|
256
|
+
message: |-
|
|
257
|
+
RunSec Detection [BRW-013]: CWE-1321
|
|
258
|
+
languages:
|
|
259
|
+
- generic
|
|
260
|
+
severity: WARNING
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
- id: runsec.cloud-secrets.sec-001
|
|
3
|
+
metadata:
|
|
4
|
+
runsec_version: v1.0
|
|
5
|
+
confidence: |-
|
|
6
|
+
0.9
|
|
7
|
+
exploit_scenario: |-
|
|
8
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
9
|
+
fix_template: |-
|
|
10
|
+
Блокировать link-local metadata endpoints в egress policy; использовать IMDSv2/metadata proxy с явной авторизацией.
|
|
11
|
+
pattern-either:
|
|
12
|
+
- pattern: |-
|
|
13
|
+
requests.get("http://169.254.169.254/latest/meta-data/")
|
|
14
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-001\\b'
|
|
15
|
+
message: |-
|
|
16
|
+
RunSec Detection [SEC-001]: CWE-918
|
|
17
|
+
languages:
|
|
18
|
+
- generic
|
|
19
|
+
severity: WARNING
|
|
20
|
+
- id: runsec.cloud-secrets.sec-002
|
|
21
|
+
metadata:
|
|
22
|
+
runsec_version: v1.0
|
|
23
|
+
confidence: |-
|
|
24
|
+
0.9
|
|
25
|
+
exploit_scenario: |-
|
|
26
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
27
|
+
fix_template: |-
|
|
28
|
+
Хранить секреты только в Secret/external secrets manager (Vault/KMS), шифровать at-rest и ограничить RBAC.
|
|
29
|
+
pattern-either:
|
|
30
|
+
- pattern: |-
|
|
31
|
+
kind: ConfigMap
|
|
32
|
+
data:
|
|
33
|
+
DB_PASSWORD: supersecret
|
|
34
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-002\\b'
|
|
35
|
+
message: |-
|
|
36
|
+
RunSec Detection [SEC-002]: CWE-798
|
|
37
|
+
languages:
|
|
38
|
+
- generic
|
|
39
|
+
severity: WARNING
|
|
40
|
+
- id: runsec.cloud-secrets.sec-003
|
|
41
|
+
metadata:
|
|
42
|
+
runsec_version: v1.0
|
|
43
|
+
confidence: |-
|
|
44
|
+
0.9
|
|
45
|
+
exploit_scenario: |-
|
|
46
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
47
|
+
fix_template: |-
|
|
48
|
+
privileged: false, allowPrivilegeEscalation: false, runAsNonRoot: true, минимальные capabilities.
|
|
49
|
+
pattern-either:
|
|
50
|
+
- pattern: |-
|
|
51
|
+
securityContext:
|
|
52
|
+
privileged: true
|
|
53
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-003\\b'
|
|
54
|
+
message: |-
|
|
55
|
+
RunSec Detection [SEC-003]: CWE-250
|
|
56
|
+
languages:
|
|
57
|
+
- generic
|
|
58
|
+
severity: WARNING
|
|
59
|
+
- id: runsec.cloud-secrets.sec-004
|
|
60
|
+
metadata:
|
|
61
|
+
runsec_version: v1.0
|
|
62
|
+
confidence: |-
|
|
63
|
+
0.9
|
|
64
|
+
exploit_scenario: |-
|
|
65
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
66
|
+
fix_template: |-
|
|
67
|
+
Запретить опасные hostPath mounts; использовать CSI/ephemeral volumes с ограниченными правами.
|
|
68
|
+
pattern-either:
|
|
69
|
+
- pattern: |-
|
|
70
|
+
hostPath:
|
|
71
|
+
path: /var/run/docker.sock
|
|
72
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-004\\b'
|
|
73
|
+
message: |-
|
|
74
|
+
RunSec Detection [SEC-004]: CWE-284
|
|
75
|
+
languages:
|
|
76
|
+
- generic
|
|
77
|
+
severity: WARNING
|
|
78
|
+
- id: runsec.cloud-secrets.sec-005
|
|
79
|
+
metadata:
|
|
80
|
+
runsec_version: v1.0
|
|
81
|
+
confidence: |-
|
|
82
|
+
0.9
|
|
83
|
+
exploit_scenario: |-
|
|
84
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
85
|
+
fix_template: |-
|
|
86
|
+
Отключить auto-mount по умолчанию; выдавать токен только workload-ам, которым он необходим.
|
|
87
|
+
pattern-either:
|
|
88
|
+
- pattern: |-
|
|
89
|
+
automountServiceAccountToken: true
|
|
90
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-005\\b'
|
|
91
|
+
message: |-
|
|
92
|
+
RunSec Detection [SEC-005]: CWE-200
|
|
93
|
+
languages:
|
|
94
|
+
- generic
|
|
95
|
+
severity: WARNING
|
|
96
|
+
- id: runsec.cloud-secrets.sec-006
|
|
97
|
+
metadata:
|
|
98
|
+
runsec_version: v1.0
|
|
99
|
+
confidence: |-
|
|
100
|
+
0.9
|
|
101
|
+
exploit_scenario: |-
|
|
102
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
103
|
+
fix_template: |-
|
|
104
|
+
Никогда не логировать весь ENV; применять allowlist полей и redaction для секретов.
|
|
105
|
+
pattern-either:
|
|
106
|
+
- pattern: |-
|
|
107
|
+
logger.info("env=%s", os.environ)
|
|
108
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-006\\b'
|
|
109
|
+
message: |-
|
|
110
|
+
RunSec Detection [SEC-006]: CWE-532
|
|
111
|
+
languages:
|
|
112
|
+
- generic
|
|
113
|
+
severity: WARNING
|
|
114
|
+
- id: runsec.cloud-secrets.sec-007
|
|
115
|
+
metadata:
|
|
116
|
+
runsec_version: v1.0
|
|
117
|
+
confidence: |-
|
|
118
|
+
0.9
|
|
119
|
+
exploit_scenario: |-
|
|
120
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
121
|
+
fix_template: |-
|
|
122
|
+
Использовать workload identity / IAM role / short-lived STS tokens без hardcode.
|
|
123
|
+
pattern-either:
|
|
124
|
+
- pattern: |-
|
|
125
|
+
AWS_SECRET_ACCESS_KEY = "AKIA..."
|
|
126
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-007\\b'
|
|
127
|
+
message: |-
|
|
128
|
+
RunSec Detection [SEC-007]: CWE-798
|
|
129
|
+
languages:
|
|
130
|
+
- generic
|
|
131
|
+
severity: WARNING
|
|
132
|
+
- id: runsec.cloud-secrets.sec-008
|
|
133
|
+
metadata:
|
|
134
|
+
runsec_version: v1.0
|
|
135
|
+
confidence: |-
|
|
136
|
+
0.9
|
|
137
|
+
exploit_scenario: |-
|
|
138
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
139
|
+
fix_template: |-
|
|
140
|
+
Проверять подпись, issuer, audience, exp, nbf, alg allowlist.
|
|
141
|
+
pattern-either:
|
|
142
|
+
- pattern: |-
|
|
143
|
+
jwt.decode(token, options={"verify_signature": False})
|
|
144
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-008\\b'
|
|
145
|
+
message: |-
|
|
146
|
+
RunSec Detection [SEC-008]: CWE-347
|
|
147
|
+
languages:
|
|
148
|
+
- generic
|
|
149
|
+
severity: WARNING
|
|
150
|
+
- id: runsec.cloud-secrets.sec-009
|
|
151
|
+
metadata:
|
|
152
|
+
runsec_version: v1.0
|
|
153
|
+
confidence: |-
|
|
154
|
+
0.9
|
|
155
|
+
exploit_scenario: |-
|
|
156
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
157
|
+
fix_template: |-
|
|
158
|
+
Хранить Vault auth через AppRole/K8s auth + short-lived token, ротацию и scoped policies; обязательно использовать Vault Agent Injector для автоматической доставки и ротации токенов/секретов в workload.
|
|
159
|
+
pattern-either:
|
|
160
|
+
- pattern: |-
|
|
161
|
+
vault_token: s.xxxxx
|
|
162
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-009\\b'
|
|
163
|
+
message: |-
|
|
164
|
+
RunSec Detection [SEC-009]: CWE-522
|
|
165
|
+
languages:
|
|
166
|
+
- generic
|
|
167
|
+
severity: WARNING
|
|
168
|
+
- id: runsec.cloud-secrets.sec-010
|
|
169
|
+
metadata:
|
|
170
|
+
runsec_version: v1.0
|
|
171
|
+
confidence: |-
|
|
172
|
+
0.9
|
|
173
|
+
exploit_scenario: |-
|
|
174
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
175
|
+
fix_template: |-
|
|
176
|
+
Всегда verify=True, mTLS/CA pinning, запрет insecure transport.
|
|
177
|
+
pattern-either:
|
|
178
|
+
- pattern: |-
|
|
179
|
+
vault_client = hvac.Client(url=VAULT_URL, verify=False)
|
|
180
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-010\\b'
|
|
181
|
+
message: |-
|
|
182
|
+
RunSec Detection [SEC-010]: CWE-295
|
|
183
|
+
languages:
|
|
184
|
+
- generic
|
|
185
|
+
severity: WARNING
|
|
186
|
+
- id: runsec.cloud-secrets.sec-011
|
|
187
|
+
metadata:
|
|
188
|
+
runsec_version: v1.0
|
|
189
|
+
confidence: |-
|
|
190
|
+
0.9
|
|
191
|
+
exploit_scenario: |-
|
|
192
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
193
|
+
fix_template: |-
|
|
194
|
+
Включить SSE-KMS/CMK, ограничить доступ bucket policy и включить audit trail.
|
|
195
|
+
pattern-either:
|
|
196
|
+
- pattern: |-
|
|
197
|
+
s3.put_object(Bucket=b, Key=k, Body=secret_blob)
|
|
198
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-011\\b'
|
|
199
|
+
message: |-
|
|
200
|
+
RunSec Detection [SEC-011]: CWE-311
|
|
201
|
+
languages:
|
|
202
|
+
- generic
|
|
203
|
+
severity: WARNING
|
|
204
|
+
- id: runsec.cloud-secrets.sec-012
|
|
205
|
+
metadata:
|
|
206
|
+
runsec_version: v1.0
|
|
207
|
+
confidence: |-
|
|
208
|
+
0.9
|
|
209
|
+
exploit_scenario: |-
|
|
210
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
211
|
+
fix_template: |-
|
|
212
|
+
Принцип least privilege: ограничить actions/resources и контекст ключей.
|
|
213
|
+
pattern-either:
|
|
214
|
+
- pattern: |-
|
|
215
|
+
"Action": "kms:*", "Resource": "*"
|
|
216
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-012\\b'
|
|
217
|
+
message: |-
|
|
218
|
+
RunSec Detection [SEC-012]: CWE-732
|
|
219
|
+
languages:
|
|
220
|
+
- generic
|
|
221
|
+
severity: WARNING
|
|
222
|
+
- id: runsec.cloud-secrets.sec-013
|
|
223
|
+
metadata:
|
|
224
|
+
runsec_version: v1.0
|
|
225
|
+
confidence: |-
|
|
226
|
+
0.9
|
|
227
|
+
exploit_scenario: |-
|
|
228
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
229
|
+
fix_template: |-
|
|
230
|
+
Удалить/закрыть debug endpoints, включить authz + environment gating для non-prod only.
|
|
231
|
+
pattern-either:
|
|
232
|
+
- pattern: |-
|
|
233
|
+
@app.get("/debug/secrets")
|
|
234
|
+
def dump(): return os.environ
|
|
235
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-013\\b'
|
|
236
|
+
message: |-
|
|
237
|
+
RunSec Detection [SEC-013]: CWE-200
|
|
238
|
+
languages:
|
|
239
|
+
- generic
|
|
240
|
+
severity: WARNING
|
|
241
|
+
- id: runsec.cloud-secrets.sec-014
|
|
242
|
+
metadata:
|
|
243
|
+
runsec_version: v1.0
|
|
244
|
+
confidence: |-
|
|
245
|
+
0.9
|
|
246
|
+
exploit_scenario: |-
|
|
247
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
248
|
+
fix_template: |-
|
|
249
|
+
Обязательная ротация секретов/ключей (TTL), автоматизация revoke/renew и контроль просрочки.
|
|
250
|
+
pattern-either:
|
|
251
|
+
- pattern: |-
|
|
252
|
+
rotation_days = None
|
|
253
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-014\\b'
|
|
254
|
+
message: |-
|
|
255
|
+
RunSec Detection [SEC-014]: CWE-613
|
|
256
|
+
languages:
|
|
257
|
+
- generic
|
|
258
|
+
severity: WARNING
|
|
259
|
+
- id: runsec.cloud-secrets.sec-015
|
|
260
|
+
metadata:
|
|
261
|
+
runsec_version: v1.0
|
|
262
|
+
confidence: |-
|
|
263
|
+
0.9
|
|
264
|
+
exploit_scenario: |-
|
|
265
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
266
|
+
fix_template: |-
|
|
267
|
+
Masked/protected CI variables, secret scanning в pipeline, запрет echo/print секретов.
|
|
268
|
+
pattern-either:
|
|
269
|
+
- pattern: |-
|
|
270
|
+
echo $PROD_DB_PASSWORD
|
|
271
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-015\\b'
|
|
272
|
+
message: |-
|
|
273
|
+
RunSec Detection [SEC-015]: CWE-312
|
|
274
|
+
languages:
|
|
275
|
+
- generic
|
|
276
|
+
severity: WARNING
|
|
277
|
+
- id: runsec.cloud-secrets.sec-016
|
|
278
|
+
metadata:
|
|
279
|
+
runsec_version: v1.0
|
|
280
|
+
confidence: |-
|
|
281
|
+
0.9
|
|
282
|
+
exploit_scenario: |-
|
|
283
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
284
|
+
fix_template: |-
|
|
285
|
+
Использовать kind: ExternalSecret, ссылающийся на SecretStore/ClusterSecretStore (Vault backend), и исключить хранение секретов в Git.
|
|
286
|
+
pattern-either:
|
|
287
|
+
- pattern: |-
|
|
288
|
+
kind: Secret
|
|
289
|
+
stringData:
|
|
290
|
+
password: plain-text
|
|
291
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-016\\b'
|
|
292
|
+
message: |-
|
|
293
|
+
RunSec Detection [SEC-016]: ESO + Vault best practices
|
|
294
|
+
languages:
|
|
295
|
+
- generic
|
|
296
|
+
severity: WARNING
|
|
297
|
+
- id: runsec.cloud-secrets.sec-017
|
|
298
|
+
metadata:
|
|
299
|
+
runsec_version: v1.0
|
|
300
|
+
confidence: |-
|
|
301
|
+
0.9
|
|
302
|
+
exploit_scenario: |-
|
|
303
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
304
|
+
fix_template: |-
|
|
305
|
+
Передавать секреты как файлы через volumeMounts (Vault Agent Injector или ESO synced volume), читать пароль из файловой системы, а не из ENV.
|
|
306
|
+
pattern-either:
|
|
307
|
+
- pattern: |-
|
|
308
|
+
env:
|
|
309
|
+
- name: DB_PASSWORD
|
|
310
|
+
value: supersecret
|
|
311
|
+
- pattern-regex: 'Vulnerable:\\s*SEC\\-017\\b'
|
|
312
|
+
message: |-
|
|
313
|
+
RunSec Detection [SEC-017]: K8s secret delivery hardening
|
|
314
|
+
languages:
|
|
315
|
+
- generic
|
|
316
|
+
severity: WARNING
|