@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,397 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
- id: runsec.java-spring.java-001
|
|
3
|
+
metadata:
|
|
4
|
+
runsec_version: v1.0
|
|
5
|
+
confidence: |-
|
|
6
|
+
0.9
|
|
7
|
+
exploit_scenario: |-
|
|
8
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
9
|
+
fix_template: |-
|
|
10
|
+
String expr = request.getParameter("expr"); if (!expr.matches("^[0-9+\\-*/(). ]{1,64}$")) throw new IllegalArgumentException(); ... Object result = safeMathEval(expr);
|
|
11
|
+
pattern-either:
|
|
12
|
+
- pattern: |-
|
|
13
|
+
String expr = request.getParameter("expr");
|
|
14
|
+
...
|
|
15
|
+
Object result = engine.eval(expr);
|
|
16
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-001\\b'
|
|
17
|
+
message: |-
|
|
18
|
+
RunSec Detection [JAVA-001]: CWE-94
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
severity: WARNING
|
|
22
|
+
- id: runsec.java-spring.java-002
|
|
23
|
+
metadata:
|
|
24
|
+
runsec_version: v1.0
|
|
25
|
+
confidence: |-
|
|
26
|
+
0.9
|
|
27
|
+
exploit_scenario: |-
|
|
28
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
29
|
+
fix_template: |-
|
|
30
|
+
String host = req.getParameter("host"); if (!host.matches("^[a-zA-Z0-9.-]{1,255}$")) throw new IllegalArgumentException(); ... new ProcessBuilder("ping","-c","1",host).start();
|
|
31
|
+
pattern-either:
|
|
32
|
+
- pattern: |-
|
|
33
|
+
String host = req.getParameter("host");
|
|
34
|
+
...
|
|
35
|
+
Runtime.getRuntime().exec("ping -c 1 " + host);
|
|
36
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-002\\b'
|
|
37
|
+
message: |-
|
|
38
|
+
RunSec Detection [JAVA-002]: CWE-78
|
|
39
|
+
languages:
|
|
40
|
+
- java
|
|
41
|
+
severity: WARNING
|
|
42
|
+
- id: runsec.java-spring.java-003
|
|
43
|
+
metadata:
|
|
44
|
+
runsec_version: v1.0
|
|
45
|
+
confidence: |-
|
|
46
|
+
0.9
|
|
47
|
+
exploit_scenario: |-
|
|
48
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
49
|
+
fix_template: |-
|
|
50
|
+
String action = req.getParameter("action"); Map<String,List<String>> allowed = Map.of("uptime", List.of("uptime")); ... new ProcessBuilder(allowed.get(action)).start();
|
|
51
|
+
pattern-either:
|
|
52
|
+
- pattern: |-
|
|
53
|
+
String cmd = req.getParameter("cmd");
|
|
54
|
+
...
|
|
55
|
+
new ProcessBuilder("sh","-c", cmd).start();
|
|
56
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-003\\b'
|
|
57
|
+
message: |-
|
|
58
|
+
RunSec Detection [JAVA-003]: CWE-77
|
|
59
|
+
languages:
|
|
60
|
+
- java
|
|
61
|
+
severity: WARNING
|
|
62
|
+
- id: runsec.java-spring.java-004
|
|
63
|
+
metadata:
|
|
64
|
+
runsec_version: v1.0
|
|
65
|
+
confidence: |-
|
|
66
|
+
0.9
|
|
67
|
+
exploit_scenario: |-
|
|
68
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
69
|
+
fix_template: |-
|
|
70
|
+
String key = req.getParameter("handler"); Map<String,Class<?>> allow = Map.of("health", HealthHandler.class); ... Class<?> c = allow.get(key);
|
|
71
|
+
pattern-either:
|
|
72
|
+
- pattern: |-
|
|
73
|
+
String className = req.getParameter("class");
|
|
74
|
+
...
|
|
75
|
+
Class<?> c = Class.forName(className);
|
|
76
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-004\\b'
|
|
77
|
+
message: |-
|
|
78
|
+
RunSec Detection [JAVA-004]: CWE-470
|
|
79
|
+
languages:
|
|
80
|
+
- java
|
|
81
|
+
severity: WARNING
|
|
82
|
+
- id: runsec.java-spring.java-005
|
|
83
|
+
metadata:
|
|
84
|
+
runsec_version: v1.0
|
|
85
|
+
confidence: |-
|
|
86
|
+
0.9
|
|
87
|
+
exploit_scenario: |-
|
|
88
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
89
|
+
fix_template: |-
|
|
90
|
+
String method = req.getParameter("method"); Set<String> allow = Set.of("health","status"); if (!allow.contains(method)) throw new SecurityException(); ... target.getClass().getMethod(method).invoke(target);
|
|
91
|
+
pattern-either:
|
|
92
|
+
- pattern: |-
|
|
93
|
+
String method = req.getParameter("method");
|
|
94
|
+
...
|
|
95
|
+
target.getClass().getMethod(method).invoke(target);
|
|
96
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-005\\b'
|
|
97
|
+
message: |-
|
|
98
|
+
RunSec Detection [JAVA-005]: CWE-74
|
|
99
|
+
languages:
|
|
100
|
+
- java
|
|
101
|
+
severity: WARNING
|
|
102
|
+
- id: runsec.java-spring.java-006
|
|
103
|
+
metadata:
|
|
104
|
+
runsec_version: v1.0
|
|
105
|
+
confidence: |-
|
|
106
|
+
0.9
|
|
107
|
+
exploit_scenario: |-
|
|
108
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
109
|
+
fix_template: |-
|
|
110
|
+
String order = req.getParameter("order"); if (!Set.of("name","created_at").contains(order)) order = "name"; ... String q = "SELECT * FROM users ORDER BY " + order;
|
|
111
|
+
pattern-either:
|
|
112
|
+
- pattern: |-
|
|
113
|
+
String order = req.getParameter("order");
|
|
114
|
+
...
|
|
115
|
+
String q = "SELECT * FROM users ORDER BY " + order;
|
|
116
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-006\\b'
|
|
117
|
+
message: |-
|
|
118
|
+
RunSec Detection [JAVA-006]: CWE-74
|
|
119
|
+
languages:
|
|
120
|
+
- java
|
|
121
|
+
severity: WARNING
|
|
122
|
+
- id: runsec.java-spring.java-007
|
|
123
|
+
metadata:
|
|
124
|
+
runsec_version: v1.0
|
|
125
|
+
confidence: |-
|
|
126
|
+
0.9
|
|
127
|
+
exploit_scenario: |-
|
|
128
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
129
|
+
fix_template: |-
|
|
130
|
+
String key = req.getParameter("key"); Map<String,String> allow = Map.of("env","prod"); ... return allow.getOrDefault(key, "n/a");
|
|
131
|
+
pattern-either:
|
|
132
|
+
- pattern: |-
|
|
133
|
+
String exp = req.getParameter("exp");
|
|
134
|
+
...
|
|
135
|
+
parser.parseExpression(exp).getValue(ctx);
|
|
136
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-007\\b'
|
|
137
|
+
message: |-
|
|
138
|
+
RunSec Detection [JAVA-007]: CWE-94
|
|
139
|
+
languages:
|
|
140
|
+
- java
|
|
141
|
+
severity: WARNING
|
|
142
|
+
- id: runsec.java-spring.java-008
|
|
143
|
+
metadata:
|
|
144
|
+
runsec_version: v1.0
|
|
145
|
+
confidence: |-
|
|
146
|
+
0.9
|
|
147
|
+
exploit_scenario: |-
|
|
148
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
149
|
+
fix_template: |-
|
|
150
|
+
String cmd = req.getParameter("cmd"); if (!Set.of("normalize").contains(cmd)) throw new SecurityException(); ... runFixedJsFunction(cmd);
|
|
151
|
+
pattern-either:
|
|
152
|
+
- pattern: |-
|
|
153
|
+
String js = req.getParameter("script");
|
|
154
|
+
...
|
|
155
|
+
engine.eval(js);
|
|
156
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-008\\b'
|
|
157
|
+
message: |-
|
|
158
|
+
RunSec Detection [JAVA-008]: CWE-95
|
|
159
|
+
languages:
|
|
160
|
+
- java
|
|
161
|
+
severity: WARNING
|
|
162
|
+
- id: runsec.java-spring.java-009
|
|
163
|
+
metadata:
|
|
164
|
+
runsec_version: v1.0
|
|
165
|
+
confidence: |-
|
|
166
|
+
0.9
|
|
167
|
+
exploit_scenario: |-
|
|
168
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
169
|
+
fix_template: |-
|
|
170
|
+
String key = request.getParameter("key"); Map<String,Object> allowed = Map.of("health", true); ... return allowed.getOrDefault(key, false);
|
|
171
|
+
pattern-either:
|
|
172
|
+
- pattern: |-
|
|
173
|
+
String expr = request.getParameter("expr");
|
|
174
|
+
...
|
|
175
|
+
spelParser.parseExpression(expr).getValue(context);
|
|
176
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-009\\b'
|
|
177
|
+
message: |-
|
|
178
|
+
RunSec Detection [JAVA-009]: CWE-917
|
|
179
|
+
languages:
|
|
180
|
+
- java
|
|
181
|
+
severity: WARNING
|
|
182
|
+
- id: runsec.java-spring.java-010
|
|
183
|
+
metadata:
|
|
184
|
+
runsec_version: v1.0
|
|
185
|
+
confidence: |-
|
|
186
|
+
0.9
|
|
187
|
+
exploit_scenario: |-
|
|
188
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
189
|
+
fix_template: |-
|
|
190
|
+
ObjectMapper mapper = new ObjectMapper(); ... mapper.disableDefaultTyping(); UserDTO obj = mapper.readValue(body, UserDTO.class);
|
|
191
|
+
pattern-either:
|
|
192
|
+
- pattern: |-
|
|
193
|
+
ObjectMapper mapper = new ObjectMapper();
|
|
194
|
+
...
|
|
195
|
+
mapper.enableDefaultTyping();
|
|
196
|
+
Object obj = mapper.readValue(body, Object.class);
|
|
197
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-010\\b'
|
|
198
|
+
message: |-
|
|
199
|
+
RunSec Detection [JAVA-010]: CWE-502
|
|
200
|
+
languages:
|
|
201
|
+
- java
|
|
202
|
+
severity: WARNING
|
|
203
|
+
- id: runsec.java-spring.java-011
|
|
204
|
+
metadata:
|
|
205
|
+
runsec_version: v1.0
|
|
206
|
+
confidence: |-
|
|
207
|
+
0.9
|
|
208
|
+
exploit_scenario: |-
|
|
209
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
210
|
+
fix_template: |-
|
|
211
|
+
String msg = request.getParameter("msg"); String safe = msg.replace("${", "\\${"); ... logger.error("msg={}", safe);
|
|
212
|
+
pattern-either:
|
|
213
|
+
- pattern: |-
|
|
214
|
+
String msg = request.getParameter("msg");
|
|
215
|
+
...
|
|
216
|
+
logger.error(msg);
|
|
217
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-011\\b'
|
|
218
|
+
message: |-
|
|
219
|
+
RunSec Detection [JAVA-011]: CWE-502
|
|
220
|
+
languages:
|
|
221
|
+
- java
|
|
222
|
+
severity: WARNING
|
|
223
|
+
- id: runsec.java-spring.java-012
|
|
224
|
+
metadata:
|
|
225
|
+
runsec_version: v1.0
|
|
226
|
+
confidence: |-
|
|
227
|
+
0.9
|
|
228
|
+
exploit_scenario: |-
|
|
229
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
230
|
+
fix_template: |-
|
|
231
|
+
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); f.setFeature("http://xml.org/sax/features/external-general-entities", false); f.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
|
|
232
|
+
pattern-either:
|
|
233
|
+
- pattern: |-
|
|
234
|
+
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
|
|
235
|
+
...
|
|
236
|
+
DocumentBuilder b = f.newDocumentBuilder();
|
|
237
|
+
Document d = b.parse(input);
|
|
238
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-012\\b'
|
|
239
|
+
message: |-
|
|
240
|
+
RunSec Detection [JAVA-012]: CWE-611
|
|
241
|
+
languages:
|
|
242
|
+
- java
|
|
243
|
+
severity: WARNING
|
|
244
|
+
- id: runsec.java-spring.java-013
|
|
245
|
+
metadata:
|
|
246
|
+
runsec_version: v1.0
|
|
247
|
+
confidence: |-
|
|
248
|
+
0.9
|
|
249
|
+
exploit_scenario: |-
|
|
250
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
251
|
+
fix_template: |-
|
|
252
|
+
http.authorizeHttpRequests(auth -> auth .requestMatchers("/admin/**").hasRole("ADMIN") );
|
|
253
|
+
pattern-either:
|
|
254
|
+
- pattern: |-
|
|
255
|
+
http.authorizeHttpRequests(auth -> auth
|
|
256
|
+
.requestMatchers("/admin/**").permitAll()
|
|
257
|
+
);
|
|
258
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-013\\b'
|
|
259
|
+
message: |-
|
|
260
|
+
RunSec Detection [JAVA-013]: CWE-306
|
|
261
|
+
languages:
|
|
262
|
+
- java
|
|
263
|
+
severity: WARNING
|
|
264
|
+
- id: runsec.java-spring.java-014
|
|
265
|
+
metadata:
|
|
266
|
+
runsec_version: v1.0
|
|
267
|
+
confidence: |-
|
|
268
|
+
0.9
|
|
269
|
+
exploit_scenario: |-
|
|
270
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
271
|
+
fix_template: |-
|
|
272
|
+
http.csrf(csrf -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) );
|
|
273
|
+
pattern-either:
|
|
274
|
+
- pattern: |-
|
|
275
|
+
http.csrf(csrf -> csrf.disable());
|
|
276
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-014\\b'
|
|
277
|
+
message: |-
|
|
278
|
+
RunSec Detection [JAVA-014]: CWE-352
|
|
279
|
+
languages:
|
|
280
|
+
- java
|
|
281
|
+
severity: WARNING
|
|
282
|
+
- id: runsec.java-spring.java-015
|
|
283
|
+
metadata:
|
|
284
|
+
runsec_version: v1.0
|
|
285
|
+
confidence: |-
|
|
286
|
+
0.9
|
|
287
|
+
exploit_scenario: |-
|
|
288
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
289
|
+
fix_template: |-
|
|
290
|
+
String next = request.getParameter("next"); if (!next.startsWith("/")) next = "/"; ... return "redirect:" + next;
|
|
291
|
+
pattern-either:
|
|
292
|
+
- pattern: |-
|
|
293
|
+
String next = request.getParameter("next");
|
|
294
|
+
...
|
|
295
|
+
return "redirect:" + next;
|
|
296
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-015\\b'
|
|
297
|
+
message: |-
|
|
298
|
+
RunSec Detection [JAVA-015]: CWE-601
|
|
299
|
+
languages:
|
|
300
|
+
- java
|
|
301
|
+
severity: WARNING
|
|
302
|
+
- id: runsec.java-spring.java-016
|
|
303
|
+
metadata:
|
|
304
|
+
runsec_version: v1.0
|
|
305
|
+
confidence: |-
|
|
306
|
+
0.9
|
|
307
|
+
exploit_scenario: |-
|
|
308
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
309
|
+
fix_template: |-
|
|
310
|
+
JwsHeader<?> h = Jwts.parserBuilder().build().parseClaimsJws(token).getHeader(); if (!"HS256".equals(h.getAlgorithm())) throw new SecurityException(); Claims c = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
|
|
311
|
+
pattern-either:
|
|
312
|
+
- pattern: |-
|
|
313
|
+
Claims c = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
|
|
314
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-016\\b'
|
|
315
|
+
message: |-
|
|
316
|
+
RunSec Detection [JAVA-016]: CWE-347
|
|
317
|
+
languages:
|
|
318
|
+
- java
|
|
319
|
+
severity: WARNING
|
|
320
|
+
- id: runsec.java-spring.java-017
|
|
321
|
+
metadata:
|
|
322
|
+
runsec_version: v1.0
|
|
323
|
+
confidence: |-
|
|
324
|
+
0.9
|
|
325
|
+
exploit_scenario: |-
|
|
326
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
327
|
+
fix_template: |-
|
|
328
|
+
SecureRandom r = new SecureRandom(); ... byte[] token = new byte[32]; r.nextBytes(token);
|
|
329
|
+
pattern-either:
|
|
330
|
+
- pattern: |-
|
|
331
|
+
Random r = new Random();
|
|
332
|
+
...
|
|
333
|
+
String token = Long.toHexString(r.nextLong());
|
|
334
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-017\\b'
|
|
335
|
+
message: |-
|
|
336
|
+
RunSec Detection [JAVA-017]: CWE-338
|
|
337
|
+
languages:
|
|
338
|
+
- java
|
|
339
|
+
severity: WARNING
|
|
340
|
+
- id: runsec.java-spring.java-018
|
|
341
|
+
metadata:
|
|
342
|
+
runsec_version: v1.0
|
|
343
|
+
confidence: |-
|
|
344
|
+
0.9
|
|
345
|
+
exploit_scenario: |-
|
|
346
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
347
|
+
fix_template: |-
|
|
348
|
+
String jwtSecret = System.getenv("JWT_SECRET"); if (jwtSecret == null) throw new IllegalStateException();
|
|
349
|
+
pattern-either:
|
|
350
|
+
- pattern: |-
|
|
351
|
+
String jwtSecret = "prod-secret-123";
|
|
352
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-018\\b'
|
|
353
|
+
message: |-
|
|
354
|
+
RunSec Detection [JAVA-018]: CWE-798
|
|
355
|
+
languages:
|
|
356
|
+
- java
|
|
357
|
+
severity: WARNING
|
|
358
|
+
- id: runsec.java-spring.java-019
|
|
359
|
+
metadata:
|
|
360
|
+
runsec_version: v1.0
|
|
361
|
+
confidence: |-
|
|
362
|
+
0.9
|
|
363
|
+
exploit_scenario: |-
|
|
364
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
365
|
+
fix_template: |-
|
|
366
|
+
if (file.getSize() > 5 * 1024 * 1024) throw new IllegalArgumentException(); ... byte[] data = file.getBytes();
|
|
367
|
+
pattern-either:
|
|
368
|
+
- pattern: |-
|
|
369
|
+
MultipartFile file = req.getFile("file");
|
|
370
|
+
...
|
|
371
|
+
byte[] data = file.getBytes();
|
|
372
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-019\\b'
|
|
373
|
+
message: |-
|
|
374
|
+
RunSec Detection [JAVA-019]: CWE-400
|
|
375
|
+
languages:
|
|
376
|
+
- java
|
|
377
|
+
severity: WARNING
|
|
378
|
+
- id: runsec.java-spring.java-020
|
|
379
|
+
metadata:
|
|
380
|
+
runsec_version: v1.0
|
|
381
|
+
confidence: |-
|
|
382
|
+
0.9
|
|
383
|
+
exploit_scenario: |-
|
|
384
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
385
|
+
fix_template: |-
|
|
386
|
+
String p = request.getParameter("path"); Path target = Paths.get(root, p).normalize(); if (!target.startsWith(Paths.get(root))) throw new SecurityException();
|
|
387
|
+
pattern-either:
|
|
388
|
+
- pattern: |-
|
|
389
|
+
String p = request.getParameter("path");
|
|
390
|
+
...
|
|
391
|
+
Path target = Paths.get(root, p);
|
|
392
|
+
- pattern-regex: 'Vulnerable:\\s*JAVA\\-020\\b'
|
|
393
|
+
message: |-
|
|
394
|
+
RunSec Detection [JAVA-020]: CWE-22
|
|
395
|
+
languages:
|
|
396
|
+
- java
|
|
397
|
+
severity: WARNING
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
- id: runsec.license-compliance.lic-001
|
|
3
|
+
metadata:
|
|
4
|
+
runsec_version: v1.0
|
|
5
|
+
confidence: |-
|
|
6
|
+
0.9
|
|
7
|
+
exploit_scenario: |-
|
|
8
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
9
|
+
fix_template: |-
|
|
10
|
+
Заменить AGPL зависимость на совместимую по лицензии (MIT/BSD/Apache-2.0) и проверить транзитивные зависимости (lockfile/SBOM).
|
|
11
|
+
pattern-either:
|
|
12
|
+
- pattern: |-
|
|
13
|
+
"license": "AGPL-3.0"
|
|
14
|
+
AGPL-3.0
|
|
15
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-001\\b'
|
|
16
|
+
message: |-
|
|
17
|
+
RunSec Detection [LIC-001]: Policy: strong copyleft (AGPL-3.0)
|
|
18
|
+
languages:
|
|
19
|
+
- generic
|
|
20
|
+
severity: WARNING
|
|
21
|
+
- id: runsec.license-compliance.lic-002
|
|
22
|
+
metadata:
|
|
23
|
+
runsec_version: v1.0
|
|
24
|
+
confidence: |-
|
|
25
|
+
0.9
|
|
26
|
+
exploit_scenario: |-
|
|
27
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
28
|
+
fix_template: |-
|
|
29
|
+
Исключить SSPL зависимости в облачном контуре, заменить на permissive варианты и подтвердить лицензионную совместимость (SBOM/scan).
|
|
30
|
+
pattern-either:
|
|
31
|
+
- pattern: |-
|
|
32
|
+
SSPL
|
|
33
|
+
"license": "SSPL"
|
|
34
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-002\\b'
|
|
35
|
+
message: |-
|
|
36
|
+
RunSec Detection [LIC-002]: Policy: SSPL risk for hosted services
|
|
37
|
+
languages:
|
|
38
|
+
- generic
|
|
39
|
+
severity: WARNING
|
|
40
|
+
- id: runsec.license-compliance.lic-003
|
|
41
|
+
metadata:
|
|
42
|
+
runsec_version: v1.0
|
|
43
|
+
confidence: |-
|
|
44
|
+
0.9
|
|
45
|
+
exploit_scenario: |-
|
|
46
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
47
|
+
fix_template: |-
|
|
48
|
+
Обновить библиотеку до поддерживаемой версии, либо заменить на альтернативу с активным мейнтейном; фиксировать версии в lockfile.
|
|
49
|
+
pattern-either:
|
|
50
|
+
- pattern: |-
|
|
51
|
+
deprecated: true
|
|
52
|
+
last_updated: "2021-01-01"
|
|
53
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-003\\b'
|
|
54
|
+
message: |-
|
|
55
|
+
RunSec Detection [LIC-003]: Policy: dependency maintenance SLA (2y)
|
|
56
|
+
languages:
|
|
57
|
+
- generic
|
|
58
|
+
severity: WARNING
|
|
59
|
+
- id: runsec.license-compliance.lic-004
|
|
60
|
+
metadata:
|
|
61
|
+
runsec_version: v1.0
|
|
62
|
+
confidence: |-
|
|
63
|
+
0.9
|
|
64
|
+
exploit_scenario: |-
|
|
65
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
66
|
+
fix_template: |-
|
|
67
|
+
Разрешать только явно идентифицированные SPDX-лицензии; блокировать сборку при UNKNOWN/NOASSERTION.
|
|
68
|
+
pattern-either:
|
|
69
|
+
- pattern: |-
|
|
70
|
+
"license": "UNKNOWN"
|
|
71
|
+
license: null
|
|
72
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-004\\b'
|
|
73
|
+
message: |-
|
|
74
|
+
RunSec Detection [LIC-004]: SPDX policy baseline
|
|
75
|
+
languages:
|
|
76
|
+
- generic
|
|
77
|
+
severity: WARNING
|
|
78
|
+
- id: runsec.license-compliance.lic-005
|
|
79
|
+
metadata:
|
|
80
|
+
runsec_version: v1.0
|
|
81
|
+
confidence: |-
|
|
82
|
+
0.9
|
|
83
|
+
exploit_scenario: |-
|
|
84
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
85
|
+
fix_template: |-
|
|
86
|
+
Использовать только доверенные внутренние registry/mirror и фиксировать источник в CI policy.
|
|
87
|
+
pattern-either:
|
|
88
|
+
- pattern: |-
|
|
89
|
+
pip install --index-url https://pypi.org/simple
|
|
90
|
+
npm config set registry https://registry.npmjs.org/
|
|
91
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-005\\b'
|
|
92
|
+
message: |-
|
|
93
|
+
RunSec Detection [LIC-005]: Supply-chain trusted source policy
|
|
94
|
+
languages:
|
|
95
|
+
- generic
|
|
96
|
+
severity: WARNING
|
|
97
|
+
- id: runsec.license-compliance.lic-006
|
|
98
|
+
metadata:
|
|
99
|
+
runsec_version: v1.0
|
|
100
|
+
confidence: |-
|
|
101
|
+
0.9
|
|
102
|
+
exploit_scenario: |-
|
|
103
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
104
|
+
fix_template: |-
|
|
105
|
+
Добавить CI gate: syft + policy check (block on AGPL/GPL/SSPL according to org policy).
|
|
106
|
+
pattern-either:
|
|
107
|
+
- pattern: |-
|
|
108
|
+
# build runs without syft/license stage
|
|
109
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-006\\b'
|
|
110
|
+
message: |-
|
|
111
|
+
RunSec Detection [LIC-006]: CI/CD license governance
|
|
112
|
+
languages:
|
|
113
|
+
- generic
|
|
114
|
+
severity: WARNING
|
|
115
|
+
- id: runsec.license-compliance.lic-008
|
|
116
|
+
metadata:
|
|
117
|
+
runsec_version: v1.0
|
|
118
|
+
confidence: |-
|
|
119
|
+
0.9
|
|
120
|
+
exploit_scenario: |-
|
|
121
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
122
|
+
fix_template: |-
|
|
123
|
+
Генерировать SBOM через syft в формате CycloneDX/SPDX и сохранять как артефакт релиза.
|
|
124
|
+
pattern-either:
|
|
125
|
+
- pattern: |-
|
|
126
|
+
# no sbom artifact generated
|
|
127
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-008\\b'
|
|
128
|
+
message: |-
|
|
129
|
+
RunSec Detection [LIC-008]: SBOM requirement (CycloneDX/SPDX)
|
|
130
|
+
languages:
|
|
131
|
+
- generic
|
|
132
|
+
severity: WARNING
|
|
133
|
+
- id: runsec.license-compliance.lic-009
|
|
134
|
+
metadata:
|
|
135
|
+
runsec_version: v1.0
|
|
136
|
+
confidence: |-
|
|
137
|
+
0.9
|
|
138
|
+
exploit_scenario: |-
|
|
139
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
140
|
+
fix_template: |-
|
|
141
|
+
Анализировать syft-отчет на транзитивные copyleft-лицензии и блокировать релиз до remediation/exception approval.
|
|
142
|
+
pattern-either:
|
|
143
|
+
- pattern: |-
|
|
144
|
+
# syft output includes GPL/AGPL transitive packages
|
|
145
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-009\\b'
|
|
146
|
+
message: |-
|
|
147
|
+
RunSec Detection [LIC-009]: Transitive license risk management
|
|
148
|
+
languages:
|
|
149
|
+
- generic
|
|
150
|
+
severity: WARNING
|
|
151
|
+
- id: runsec.license-compliance.lic-010
|
|
152
|
+
metadata:
|
|
153
|
+
runsec_version: v1.0
|
|
154
|
+
confidence: |-
|
|
155
|
+
0.9
|
|
156
|
+
exploit_scenario: |-
|
|
157
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
158
|
+
fix_template: |-
|
|
159
|
+
Для бинарных зависимостей проверять наличие license metadata/attestation и подтверждать источник/право использования.
|
|
160
|
+
pattern-either:
|
|
161
|
+
- pattern: |-
|
|
162
|
+
# bundled .so/.dll without embedded license evidence
|
|
163
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-010\\b'
|
|
164
|
+
message: |-
|
|
165
|
+
RunSec Detection [LIC-010]: Binary provenance and license policy
|
|
166
|
+
languages:
|
|
167
|
+
- generic
|
|
168
|
+
severity: WARNING
|
|
169
|
+
- id: runsec.license-compliance.lic-011
|
|
170
|
+
metadata:
|
|
171
|
+
runsec_version: v1.0
|
|
172
|
+
confidence: |-
|
|
173
|
+
0.9
|
|
174
|
+
exploit_scenario: |-
|
|
175
|
+
Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия.
|
|
176
|
+
fix_template: |-
|
|
177
|
+
Enable central package management + lockfile; verify package hashes in CI; verify binary signatures for external DLLs.
|
|
178
|
+
pattern-either:
|
|
179
|
+
- pattern: |-
|
|
180
|
+
# dotnet restore without packages.lock.json integrity gate
|
|
181
|
+
- pattern-regex: 'Vulnerable:\\s*LIC\\-011\\b'
|
|
182
|
+
message: |-
|
|
183
|
+
RunSec Detection [LIC-011]: CWE-347, CWE-1104
|
|
184
|
+
languages:
|
|
185
|
+
- generic
|
|
186
|
+
severity: WARNING
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
- id: runsec.mobile-flutter.mob-001
|
|
3
|
+
pattern-either:
|
|
4
|
+
- pattern: |-
|
|
5
|
+
HttpOverrides.global = MyHttpOverrides();
|
|
6
|
+
class MyHttpOverrides extends HttpOverrides {
|
|
7
|
+
bool badCertificateCallback(...) => true;
|
|
8
|
+
}
|
|
9
|
+
- pattern-regex: 'Vulnerable:\\s*MOB\\-001\\b'
|
|
10
|
+
message: 'RunSec Detection [MOB-001]: Mobile security baseline'
|
|
11
|
+
languages:
|
|
12
|
+
- generic
|
|
13
|
+
severity: WARNING
|
|
14
|
+
- id: runsec.mobile-flutter.mob-010
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |-
|
|
17
|
+
if (kDebugMode) {
|
|
18
|
+
print('token - $token');
|
|
19
|
+
}
|
|
20
|
+
- pattern-regex: 'Vulnerable:\\s*MOB\\-010\\b'
|
|
21
|
+
message: 'RunSec Detection [MOB-010]: Mobile security baseline'
|
|
22
|
+
languages:
|
|
23
|
+
- generic
|
|
24
|
+
severity: WARNING
|
|
25
|
+
- id: runsec.mobile-flutter.mob-021
|
|
26
|
+
pattern-either:
|
|
27
|
+
- pattern: |-
|
|
28
|
+
class MainActivity: FlutterActivity() {
|
|
29
|
+
override fun onCreate(...) {
|
|
30
|
+
super.onCreate(...)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
- pattern-regex: 'Vulnerable:\\s*MOB\\-021\\b'
|
|
34
|
+
message: 'RunSec Detection [MOB-021]: Mobile security baseline'
|
|
35
|
+
languages:
|
|
36
|
+
- generic
|
|
37
|
+
severity: WARNING
|