@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.
Files changed (40) hide show
  1. package/dist/index.js +578 -0
  2. package/package.json +43 -0
  3. package/src/rules/data/rule-compliance-map.json +43563 -0
  4. package/src/rules/data/semgrep-rules/README-taint-overlays.md +21 -0
  5. package/src/rules/data/semgrep-rules/advanced-agent-cloud.yaml +802 -0
  6. package/src/rules/data/semgrep-rules/app-logic.yaml +445 -0
  7. package/src/rules/data/semgrep-rules/auth-keycloak.yaml +831 -0
  8. package/src/rules/data/semgrep-rules/browser-agent.yaml +260 -0
  9. package/src/rules/data/semgrep-rules/cloud-secrets.yaml +316 -0
  10. package/src/rules/data/semgrep-rules/csharp-dotnet.yaml +4864 -0
  11. package/src/rules/data/semgrep-rules/desktop-electron-pro.yaml +30 -0
  12. package/src/rules/data/semgrep-rules/desktop-vsto-suite.yaml +2759 -0
  13. package/src/rules/data/semgrep-rules/devops-security.yaml +393 -0
  14. package/src/rules/data/semgrep-rules/domain-access-management.yaml +1023 -0
  15. package/src/rules/data/semgrep-rules/domain-data-privacy.yaml +852 -0
  16. package/src/rules/data/semgrep-rules/domain-input-validation.yaml +2894 -0
  17. package/src/rules/data/semgrep-rules/domain-platform-hardening.yaml +1715 -0
  18. package/src/rules/data/semgrep-rules/ds-ml-security.yaml +2431 -0
  19. package/src/rules/data/semgrep-rules/fastapi-async.yaml +5953 -0
  20. package/src/rules/data/semgrep-rules/frontend-react.yaml +4035 -0
  21. package/src/rules/data/semgrep-rules/frontend-security.yaml +200 -0
  22. package/src/rules/data/semgrep-rules/go-core.yaml +4959 -0
  23. package/src/rules/data/semgrep-rules/hft-cpp-security.yaml +631 -0
  24. package/src/rules/data/semgrep-rules/infra-k8s-helm.yaml +4968 -0
  25. package/src/rules/data/semgrep-rules/integration-security.yaml +2362 -0
  26. package/src/rules/data/semgrep-rules/java-enterprise.yaml +14756 -0
  27. package/src/rules/data/semgrep-rules/java-spring.yaml +397 -0
  28. package/src/rules/data/semgrep-rules/license-compliance.yaml +186 -0
  29. package/src/rules/data/semgrep-rules/mobile-flutter.yaml +37 -0
  30. package/src/rules/data/semgrep-rules/mobile-security.yaml +721 -0
  31. package/src/rules/data/semgrep-rules/nodejs-nestjs.yaml +5164 -0
  32. package/src/rules/data/semgrep-rules/nodejs-security.yaml +326 -0
  33. package/src/rules/data/semgrep-rules/observability.yaml +381 -0
  34. package/src/rules/data/semgrep-rules/php-security.yaml +3601 -0
  35. package/src/rules/data/semgrep-rules/python-backend-pro.yaml +30 -0
  36. package/src/rules/data/semgrep-rules/python-django.yaml +181 -0
  37. package/src/rules/data/semgrep-rules/python-security.yaml +284 -0
  38. package/src/rules/data/semgrep-rules/ru-regulatory.yaml +496 -0
  39. package/src/rules/data/semgrep-rules/ruby-rails.yaml +3078 -0
  40. 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