@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,217 @@
1
+ # CWE-295: SSL/TLS 证书验证绕过
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+ #
4
+ # 禁用或绕过 SSL/TLS 证书验证使应用完全暴露于中间人攻击(MITM)。
5
+ # 攻击者可拦截并篡改所有传输的数据——包括凭证、会话令牌和加密密钥。
6
+ # 任何时候都不应在生产代码中绕过证书验证。
7
+
8
+ rules:
9
+
10
+ # ZM-JAVA-SSLVERIFY-001: 全信任 TrustManager(空校验)
11
+ - id: zm-java-sslverify-001
12
+ severity: CRITICAL
13
+ message: |
14
+ 检测到 X509TrustManager 实现但 checkServerTrusted / checkClientTrusted 方法体为空。
15
+ 这相当于完全信任任何证书,攻击者可通过 MITM 攻击拦截所有 TLS 流量。
16
+ 移除此自定义 TrustManager,使用系统默认证书链验证。
17
+
18
+ 修复示例:
19
+ // 删除自定义空 TrustManager
20
+ // 使用默认 TrustManagerFactory:
21
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance(
22
+ TrustManagerFactory.getDefaultAlgorithm());
23
+ tmf.init((KeyStore) null);
24
+ SSLContext ctx = SSLContext.getInstance("TLS");
25
+ ctx.init(null, tmf.getTrustManagers(), new SecureRandom());
26
+
27
+ 参考:
28
+ - CWE-295: https://cwe.mitre.org/data/definitions/295.html
29
+ - Android Security: Network Security Configuration: https://developer.android.com/training/articles/security-config
30
+ languages:
31
+ - java
32
+ pattern-either:
33
+ - pattern: |
34
+ new X509TrustManager() {
35
+ ...
36
+ public void checkServerTrusted(...) {}
37
+ ...
38
+ public void checkClientTrusted(...) {}
39
+ ...
40
+ }
41
+ - pattern: |
42
+ new X509TrustManager() {
43
+ ...
44
+ public void checkClientTrusted(...) {}
45
+ ...
46
+ public void checkServerTrusted(...) {}
47
+ ...
48
+ }
49
+ - pattern: |
50
+ new X509TrustManager() {
51
+ ...
52
+ public void checkServerTrusted(...) { }
53
+ ...
54
+ }
55
+ - pattern: |
56
+ new X509TrustManager() {
57
+ ...
58
+ public void checkClientTrusted(...) { }
59
+ ...
60
+ }
61
+ - pattern: |
62
+ class $CLASS implements X509TrustManager {
63
+ ...
64
+ public void checkServerTrusted(...) { }
65
+ ...
66
+ }
67
+ metadata:
68
+ cwe: "CWE-295: Improper Certificate Validation"
69
+ owasp: "A02:2021 - Cryptographic Failures"
70
+ precision: very-high
71
+ industries: ["common"]
72
+ tags:
73
+ - crypto
74
+ - tls
75
+ - ssl
76
+ - certificate-validation
77
+ - mitm
78
+ references:
79
+ - https://cwe.mitre.org/data/definitions/295.html
80
+ - https://developer.android.com/training/articles/security-config
81
+
82
+ # ZM-JAVA-SSLVERIFY-002: HostnameVerifier 全部接受
83
+ - id: zm-java-sslverify-002
84
+ severity: HIGH
85
+ message: |
86
+ 检测到 HostnameVerifier 实现始终返回 true,或使用 ALLOW_ALL_HOSTNAME_VERIFIER。
87
+ 这会绕过主机名验证,使得 MITM 攻击者可以通过任意证书伪装成合法服务器。
88
+ 生产代码不得使用此类验证器;仅在测试环境中临时使用。
89
+
90
+ 修复示例:
91
+ // 删除自定义 HostnameVerifier
92
+ // 使用默认 hostname 验证即可:
93
+ HttpsURLConnection.setDefaultHostnameVerifier(
94
+ HttpsURLConnection.getDefaultHostnameVerifier());
95
+
96
+ 参考:
97
+ - CWE-295: https://cwe.mitre.org/data/definitions/295.html
98
+ - Android HostnameVerifier: https://developer.android.com/reference/javax/net/ssl/HostnameVerifier
99
+ languages:
100
+ - java
101
+ pattern-either:
102
+ - pattern: |
103
+ new HostnameVerifier() {
104
+ ...
105
+ public boolean verify(...) {
106
+ ...
107
+ return true;
108
+ }
109
+ ...
110
+ }
111
+ - pattern: |
112
+ public boolean verify(...) {
113
+ ...
114
+ return true;
115
+ ...
116
+ }
117
+ - pattern: |
118
+ SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
119
+ - pattern: |
120
+ $CONN.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
121
+ metadata:
122
+ cwe: "CWE-295: Improper Certificate Validation"
123
+ owasp: "A02:2021 - Cryptographic Failures"
124
+ precision: very-high
125
+ industries: ["common"]
126
+ tags:
127
+ - crypto
128
+ - tls
129
+ - ssl
130
+ - hostname-verification
131
+ - mitm
132
+ references:
133
+ - https://cwe.mitre.org/data/definitions/295.html
134
+ - https://developer.android.com/reference/javax/net/ssl/HostnameVerifier
135
+
136
+ # ZM-JAVA-SSLVERIFY-003: allowAllHostnames() 调用
137
+ - id: zm-java-sslverify-003
138
+ severity: HIGH
139
+ message: |
140
+ 检测到 Apache HttpClient 的 allowAllHostnames() 调用,绕过主机名验证。
141
+ 这使得 MITM 攻击者可使用任意证书伪装为合法服务器。
142
+ 删除此调用以使用默认主机名验证。
143
+
144
+ 修复示例:
145
+ // 删除 .allowAllHostnames() 调用
146
+ // HttpClient 4.3+ 默认执行严格主机名验证
147
+
148
+ 参考:
149
+ - CWE-295: https://cwe.mitre.org/data/definitions/295.html
150
+ - Apache HttpClient SSL Guide: https://hc.apache.org/httpcomponents-client-4.5.x/ssl-tls.html
151
+ languages:
152
+ - java
153
+ pattern-either:
154
+ - pattern: |
155
+ $BUILDER.allowAllHostnames()
156
+ - pattern: |
157
+ $B.allowAllHostnames()
158
+ - pattern: |
159
+ $HTTP.allowAllHostnames()
160
+ metadata:
161
+ cwe: "CWE-295: Improper Certificate Validation"
162
+ owasp: "A02:2021 - Cryptographic Failures"
163
+ precision: high
164
+ industries: ["common"]
165
+ tags:
166
+ - crypto
167
+ - tls
168
+ - ssl
169
+ - apache-httpclient
170
+ - hostname-verification
171
+ references:
172
+ - https://cwe.mitre.org/data/definitions/295.html
173
+ - https://hc.apache.org/httpcomponents-client-4.5.x/ssl-tls.html
174
+
175
+ # ZM-JAVA-SSLVERIFY-004: SSLContext.init 空 TrustManager
176
+ - id: zm-java-sslverify-004
177
+ severity: CRITICAL
178
+ message: |
179
+ 检测到 SSLContext.init() 传入包含空 TrustManager 的数组。
180
+ 空 TrustManager 意味着不验证服务器证书链,完全暴露于 MITM 攻击。
181
+ 使用 TrustManagerFactory 从系统信任库加载默认 TrustManager。
182
+
183
+ 修复示例:
184
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance(
185
+ TrustManagerFactory.getDefaultAlgorithm());
186
+ tmf.init((KeyStore) null);
187
+ SSLContext ctx = SSLContext.getInstance("TLS");
188
+ ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
189
+
190
+ 参考:
191
+ - CWE-295: https://cwe.mitre.org/data/definitions/295.html
192
+ - OWASP TLS Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html
193
+ languages:
194
+ - java
195
+ pattern-either:
196
+ - pattern: |
197
+ SSLContext.getInstance("$TLS").init($KM, new TrustManager[]{$NULL_TM}, $RANDOM)
198
+ - pattern: |
199
+ $CTX.init($KM, new TrustManager[]{$NULL_TM}, $RANDOM)
200
+ - pattern: |
201
+ $CTX.init($KM, new TrustManager[] {$NULL_TM}, $RANDOM)
202
+ - pattern: |
203
+ $CTX.init($KM, new TrustManager[]{new X509TrustManager(), ...}, $RANDOM)
204
+ metadata:
205
+ cwe: "CWE-295: Improper Certificate Validation"
206
+ owasp: "A02:2021 - Cryptographic Failures"
207
+ precision: very-high
208
+ industries: ["common"]
209
+ tags:
210
+ - crypto
211
+ - tls
212
+ - ssl
213
+ - trust-manager
214
+ - mitm
215
+ references:
216
+ - https://cwe.mitre.org/data/definitions/295.html
217
+ - https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html
@@ -0,0 +1,64 @@
1
+ # CWE-295: SSL 证书验证禁用检测规则
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-SSL-001: 信任所有证书 TrustManager
7
+ - id: zm-java-ssl-001
8
+ severity: HIGH
9
+ message: |
10
+ 检测到 X509TrustManager 实现中信任所有证书 (checkClientTrusted/checkServerTrusted 为空)。
11
+ 这将导致 SSL/TLS 中间人攻击 (MITM)。
12
+ 必须正确验证证书链和主机名。
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ new X509TrustManager() {
18
+ ...
19
+ public void checkClientTrusted(...) {}
20
+ public void checkServerTrusted(...) {}
21
+ ...
22
+ };
23
+ metadata:
24
+ cwe: "CWE-295: Improper Certificate Validation"
25
+ owasp: "A02:2021 - Cryptographic Failures"
26
+ precision: very-high
27
+
28
+ # ZM-JAVA-SSL-002: HostnameVerifier 返回 true
29
+ - id: zm-java-ssl-002
30
+ severity: HIGH
31
+ message: |
32
+ 检测到 HostnameVerifier 总是返回 true,绕过主机名验证。
33
+ 应使用默认的浏览器兼容主机名验证器。
34
+ languages:
35
+ - java
36
+ pattern-either:
37
+ - pattern: |
38
+ new HostnameVerifier() {
39
+ ...
40
+ public boolean verify(...) {
41
+ return true;
42
+ }
43
+ ...
44
+ };
45
+ metadata:
46
+ cwe: "CWE-295: Improper Certificate Validation"
47
+ owasp: "A02:2021 - Cryptographic Failures"
48
+ precision: very-high
49
+
50
+ # ZM-JAVA-SSL-003: SSLContext 使用 ALLOW_ALL_HOSTNAME_VERIFIER
51
+ - id: zm-java-ssl-003
52
+ severity: HIGH
53
+ message: |
54
+ 检测到使用 ALLOW_ALL_HOSTNAME_VERIFIER 禁用主机名验证。
55
+ 中间人攻击者可伪造证书劫持加密通信。
56
+ languages:
57
+ - java
58
+ pattern-either:
59
+ - pattern: |
60
+ SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
61
+ metadata:
62
+ cwe: "CWE-295: Improper Certificate Validation"
63
+ owasp: "A02:2021 - Cryptographic Failures"
64
+ precision: very-high
@@ -0,0 +1,44 @@
1
+ # CWE-306: 关键功能缺少身份验证检测规则 (Sprint 2)
2
+ # 已知限制: Semgrep Java parser 不支持 pattern-not-inside 配合注解 (Parse_error)
3
+ # 无法自动排除已有 @PreAuthorize/@Secured 的方法
4
+ # FPR 28.6% 为已知可接受水平,人工审查可快速过滤
5
+
6
+ rules:
7
+
8
+ # ZM-JAVA-MA-001: @RestController + @GetMapping/@PostMapping 无 @PreAuthorize
9
+ - id: zm-java-ma-001
10
+ severity: MEDIUM
11
+ message: |
12
+ @GetMapping/@PostMapping 方法缺少认证注解。应检查是否已添加 @PreAuthorize/@Secured。
13
+ 如已有安全注解且本规则误报,人工忽略。
14
+ languages:
15
+ - java
16
+ pattern-either:
17
+ - pattern: |
18
+ @GetMapping(...)
19
+ public $RET $METHOD(...) {
20
+ ...
21
+ }
22
+ - pattern: |
23
+ @PostMapping(...)
24
+ public $RET $METHOD(...) {
25
+ ...
26
+ }
27
+ metadata:
28
+ cwe: "CWE-306: Missing Authentication for Critical Function"
29
+ owasp: "A01:2021 - Broken Access Control"
30
+ precision: low
31
+
32
+ # ZM-JAVA-MA-002: Spring Security 配置无认证要求
33
+ - id: zm-java-ma-002
34
+ severity: MEDIUM
35
+ message: |
36
+ Spring Security permitAll() 允许未认证访问,需审查是否所有敏感端点都要求认证。
37
+ languages:
38
+ - java
39
+ pattern-either:
40
+ - pattern: $HTTP.authorizeRequests().anyRequest().permitAll()
41
+ metadata:
42
+ cwe: "CWE-306: Missing Authentication for Critical Function"
43
+ owasp: "A01:2021 - Broken Access Control"
44
+ precision: low
@@ -0,0 +1,107 @@
1
+ # CWE-326: Inadequate Encryption Strength
2
+ # ZhuMa V4.0 Alpha -- Common Rules
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-WEAKKEY-001: AES key size < 128 bits
7
+ - id: zm-java-weakkey-001
8
+ severity: CRITICAL
9
+ message: |
10
+ AES key size below 128 bits detected. NIST SP 800-57 Part 1 requires >= 128-bit
11
+ security strength. Standard AES key lengths are 128, 192, or 256 bits.
12
+ Production environments should use AES-256.
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ $KG.init(64)
18
+ - pattern: |
19
+ $KG.init(96)
20
+ - pattern: |
21
+ $KG.init(8)
22
+ - pattern: |
23
+ $KG.init(16)
24
+ - pattern: |
25
+ $KG.init(32)
26
+ - pattern: |
27
+ $KG.init(40)
28
+ - pattern: |
29
+ $KG.init(48)
30
+ - pattern: |
31
+ $KG.init(56)
32
+ - pattern: |
33
+ $KG.init(80)
34
+ - pattern: |
35
+ $KG.init(112)
36
+ - pattern: |
37
+ $KG.init(127)
38
+ metadata:
39
+ cwe: "CWE-326: Inadequate Encryption Strength"
40
+ owasp: "A02:2021 - Cryptographic Failures"
41
+ precision: very-high
42
+ industries:
43
+ - common
44
+ references:
45
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf"
46
+ - "https://cwe.mitre.org/data/definitions/326.html"
47
+
48
+ # ZM-JAVA-WEAKKEY-002: RSA key size < 2048 bits
49
+ - id: zm-java-weakkey-002
50
+ severity: CRITICAL
51
+ message: |
52
+ RSA key size below 2048 bits detected. NIST SP 800-131A Rev.2 requires RSA >= 2048.
53
+ RSA-512/768/1024 have been demonstrated factorable.
54
+ Use 2048, 3072, or 4096 bits.
55
+ languages:
56
+ - java
57
+ pattern-either:
58
+ - pattern: |
59
+ $KPG.initialize(512)
60
+ - pattern: |
61
+ $KPG.initialize(768)
62
+ - pattern: |
63
+ $KPG.initialize(1024)
64
+ - pattern: |
65
+ $KPG.initialize(1536)
66
+ - pattern: |
67
+ $KPG.initialize(2047)
68
+ metadata:
69
+ cwe: "CWE-326: Inadequate Encryption Strength"
70
+ owasp: "A02:2021 - Cryptographic Failures"
71
+ precision: very-high
72
+ industries:
73
+ - common
74
+ references:
75
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
76
+ - "https://cwe.mitre.org/data/definitions/326.html"
77
+
78
+ # ZM-JAVA-WEAKKEY-003: EC key size < 256 bits
79
+ - id: zm-java-weakkey-003
80
+ severity: HIGH
81
+ message: |
82
+ EC key size below 256 bits detected. NIST SP 800-57 recommends >= 256-bit curves.
83
+ secp192r1/secp224r1 provide < 128-bit equivalent security.
84
+ Use secp256r1 (P-256), secp384r1 (P-384), secp521r1 (P-521), or Curve25519.
85
+ languages:
86
+ - java
87
+ pattern-either:
88
+ - pattern: |
89
+ $KPG.initialize(192)
90
+ - pattern: |
91
+ $KPG.initialize(224)
92
+ - pattern: |
93
+ $KPG.initialize(128)
94
+ - pattern: |
95
+ $KPG.initialize(160)
96
+ - pattern: |
97
+ $KPG.initialize(255)
98
+ metadata:
99
+ cwe: "CWE-326: Inadequate Encryption Strength"
100
+ owasp: "A02:2021 - Cryptographic Failures"
101
+ precision: high
102
+ industries:
103
+ - common
104
+ references:
105
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf"
106
+ - "https://safecurves.cr.yp.to/"
107
+ - "https://cwe.mitre.org/data/definitions/326.html"
@@ -0,0 +1,177 @@
1
+ # CWE-327: 使用破解或危险的加密算法
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-WEAKCRYPTO-001: DES/3DES 加密
7
+ - id: zm-java-weakcrypto-001
8
+ severity: CRITICAL
9
+ message: |
10
+ 使用了 DES/3DES 加密算法,该算法已被破解且密钥长度不足。
11
+ DES 使用 56 位有效密钥,可在数小时内暴力破解;3DES 仅提供 112 位等效安全性。
12
+ 应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
13
+ 参考: NIST SP 800-131A Rev.2 已废止 DES/3DES。
14
+ languages:
15
+ - java
16
+ pattern-either:
17
+ - pattern: Cipher.getInstance("DES")
18
+ - pattern: Cipher.getInstance("DESede")
19
+ - pattern: Cipher.getInstance("3DES")
20
+ - pattern: KeyGenerator.getInstance("DES")
21
+ - pattern: Cipher.getInstance("DES/CBC/PKCS5Padding")
22
+ - pattern: Cipher.getInstance("DES/CBC/NoPadding")
23
+ - pattern: Cipher.getInstance("DES/ECB/PKCS5Padding")
24
+ - pattern: Cipher.getInstance("DES/ECB/NoPadding")
25
+ - pattern: Cipher.getInstance("DESede/CBC/PKCS5Padding")
26
+ - pattern: Cipher.getInstance("DESede/ECB/PKCS5Padding")
27
+ metadata:
28
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
29
+ owasp: "A02:2021 - Cryptographic Failures"
30
+ precision: very-high
31
+ industries:
32
+ - common
33
+ references:
34
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
35
+ - "https://cwe.mitre.org/data/definitions/327.html"
36
+
37
+ # ZM-JAVA-WEAKCRYPTO-002: RC2/RC4/Blowfish 弱算法
38
+ - id: zm-java-weakcrypto-002
39
+ severity: CRITICAL
40
+ message: |
41
+ 使用了 RC2/RC4/Blowfish 弱加密算法。
42
+ RC4 存在严重密码学缺陷(偏向性密钥流),RC2 为 64 位分组密码已被淘汰,
43
+ Blowfish 使用 64 位分组大小易受 Sweet32 生日攻击。
44
+ 应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
45
+ languages:
46
+ - java
47
+ pattern-either:
48
+ - pattern: Cipher.getInstance("RC2")
49
+ - pattern: Cipher.getInstance("RC4")
50
+ - pattern: Cipher.getInstance("Blowfish")
51
+ - pattern: Cipher.getInstance("RC2/CBC/PKCS5Padding")
52
+ - pattern: Cipher.getInstance("Blowfish/CBC/PKCS5Padding")
53
+ - pattern: KeyGenerator.getInstance("RC2")
54
+ - pattern: KeyGenerator.getInstance("Blowfish")
55
+ metadata:
56
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
57
+ owasp: "A02:2021 - Cryptographic Failures"
58
+ precision: very-high
59
+ industries:
60
+ - common
61
+ references:
62
+ - "https://sweet32.info/"
63
+ - "https://cwe.mitre.org/data/definitions/327.html"
64
+
65
+ # ZM-JAVA-WEAKCRYPTO-003: 无认证加密模式 ECB
66
+ - id: zm-java-weakcrypto-003
67
+ severity: HIGH
68
+ message: |
69
+ 使用了 ECB 模式进行对称加密,该模式不提供数据认证且无法隐藏数据模式。
70
+ 相同的明文块会产生相同的密文块,可遭受块重放攻击和模式分析攻击。
71
+ 应使用 GCM(Galois/Counter Mode)或 CTR+CBC 配合 HMAC 提供认证加密。
72
+ languages:
73
+ - java
74
+ pattern-either:
75
+ - pattern: Cipher.getInstance("AES/ECB/NoPadding")
76
+ - pattern: Cipher.getInstance("AES/ECB/PKCS5Padding")
77
+ - pattern: Cipher.getInstance("AES/ECB/ISO10126Padding")
78
+ - pattern: Cipher.getInstance("DES/ECB/NoPadding")
79
+ - pattern: Cipher.getInstance("DES/ECB/PKCS5Padding")
80
+ - pattern: Cipher.getInstance("DESede/ECB/NoPadding")
81
+ - pattern: Cipher.getInstance("DESede/ECB/PKCS5Padding")
82
+ - pattern: Cipher.getInstance("Blowfish/ECB/NoPadding")
83
+ - pattern: Cipher.getInstance("Blowfish/ECB/PKCS5Padding")
84
+ - pattern: Cipher.getInstance("RC2/ECB/PKCS5Padding")
85
+ - pattern: Cipher.getInstance("RSA/ECB/NoPadding")
86
+ - pattern: Cipher.getInstance("RSA/ECB/PKCS1Padding")
87
+ metadata:
88
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
89
+ owasp: "A02:2021 - Cryptographic Failures"
90
+ precision: high
91
+ industries:
92
+ - common
93
+ references:
94
+ - "https://csrc.nist.gov/pubs/sp/800/38/d/final"
95
+ - "https://cwe.mitre.org/data/definitions/327.html"
96
+
97
+ # ZM-JAVA-WEAKCRYPTO-004: RSA 不安全配置
98
+ - id: zm-java-weakcrypto-004
99
+ severity: HIGH
100
+ message: |
101
+ 使用了不安全的 RSA 配置:密钥长度不足 2048 位或使用 PKCS1Padding 填充模式。
102
+ RSA-1024 在 2024 年已被认为可破解,PKCS1Padding 易受 Bleichenbacher 选择密文攻击。
103
+ 应使用 RSA-2048(最低要求)或 RSA-4096,搭配 OAEPWithSHA-256AndMGF1Padding。
104
+ NIST SP 800-131A Rev.2 要求 RSA 密钥 ≥ 2048 位。
105
+ languages:
106
+ - java
107
+ pattern-either:
108
+ - pattern: Cipher.getInstance("RSA")
109
+ - pattern: Cipher.getInstance("RSA/ECB/PKCS1Padding")
110
+ - pattern: Cipher.getInstance("RSA/ECB/NoPadding")
111
+ - pattern: Cipher.getInstance("RSA/NONE/PKCS1Padding")
112
+ - pattern: Cipher.getInstance("RSA/NONE/NoPadding")
113
+ metadata:
114
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
115
+ owasp: "A02:2021 - Cryptographic Failures"
116
+ precision: high
117
+ industries:
118
+ - common
119
+ references:
120
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
121
+ - "https://cwe.mitre.org/data/definitions/327.html"
122
+
123
+ # ZM-JAVA-WEAKCRYPTO-005: JWT Algorithm=none
124
+ - id: zm-java-weakcrypto-005
125
+ severity: CRITICAL
126
+ message: |
127
+ JWT 使用 algorithm="none" 或在未校验算法前设置签名密钥,可能导致 JWT 算法混淆攻击。
128
+ 攻击者可将 algorithm 修改为 "none" 绕过签名验证,或使用公钥算法混淆为 HMAC 实现伪造签名。
129
+ 必须在解析 JWT 前显式限制 algorithm,使用 .requireAlgorithm() 或 .verifyWith() 明确指定算法。
130
+ 参考: CVE-2015-9235, CVE-2016-5431(alg=none 攻击)。
131
+ languages:
132
+ - java
133
+ pattern-either:
134
+ - pattern: |
135
+ Jwts.parser().setSigningKey(...)
136
+ - pattern: |
137
+ Jwts.parserBuilder().setSigningKey(...)
138
+ - pattern: Jwts.parser().parseClaimsJwt(...)
139
+ metadata:
140
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
141
+ owasp: "A02:2021 - Cryptographic Failures"
142
+ precision: high
143
+ industries:
144
+ - common
145
+ references:
146
+ - "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-9235"
147
+ - "https://cwe.mitre.org/data/definitions/327.html"
148
+ - "https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/"
149
+
150
+ # ZM-JAVA-WEAKCRYPTO-006: 固定 IV / 硬编码 IV
151
+ - id: zm-java-weakcrypto-006
152
+ severity: HIGH
153
+ message: |
154
+ 使用了硬编码或静态初始化向量(IV),严重削弱 CBC/GCM 等模式的安全性。
155
+ 对于 CBC 模式,固定 IV 使加密确定性化,可遭受块重放攻击和选择明文攻击(如 BEAST)。
156
+ 对于 GCM 模式,IV 重用会完全破坏认证加密的安全性,泄露明文 XOR 结果。
157
+ 必须为每次加密使用 CSPRNG 生成随机 IV(如 SecureRandom),并将 IV 随密文一起存储。
158
+ languages:
159
+ - java
160
+ patterns:
161
+ - pattern: |
162
+ new IvParameterSpec($BYTES)
163
+ - pattern: |
164
+ new GCMParameterSpec(..., $BYTES)
165
+ - pattern: |
166
+ new IvParameterSpec("...".getBytes())
167
+ - pattern: |
168
+ new IvParameterSpec(new byte[]{...})
169
+ metadata:
170
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
171
+ owasp: "A02:2021 - Cryptographic Failures"
172
+ precision: high
173
+ industries:
174
+ - common
175
+ references:
176
+ - "https://csrc.nist.gov/glossary/term/initialization_vector"
177
+ - "https://cwe.mitre.org/data/definitions/327.html"