@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,135 @@
1
+ # CWE-22/434/73 文件操作深度覆盖: 路径遍历全量sink + 文件上传危险模式
2
+
3
+ rules:
4
+
5
+ # ZM-JAVA-FILE-READ-001: Files.read/readAllBytes/readString 路径由用户可控
6
+ - id: zm-java-file-read-001
7
+ severity: HIGH
8
+ message: |
9
+ Files.readXXX / FileInputStream 使用用户可控路径——路径遍历/任意文件读取。
10
+ 校验路径不以 ../ 开头,规范化后验证在允许的根目录内。
11
+ languages:
12
+ - java
13
+ pattern-either:
14
+ - pattern: Files.readAllBytes($PATH)
15
+ - pattern: Files.readString($PATH)
16
+ - pattern: Files.readAllLines($PATH)
17
+ - pattern: Files.newInputStream($PATH)
18
+ - pattern: new FileInputStream($PATH)
19
+ metadata:
20
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
21
+ owasp: "A01:2021 - Broken Access Control"
22
+ precision: medium
23
+ tags: [path-traversal, file-read, nio]
24
+
25
+ # ZM-JAVA-FILE-WRITE-001: Files.write 路径可控
26
+ - id: zm-java-file-write-001
27
+ severity: CRITICAL
28
+ message: |
29
+ Files.write/FileOutputStream 使用用户可控路径——任意文件写入,可getshell。
30
+ 同路径遍历规则校验路径在允许范围内,且不要接受完整文件名。
31
+ languages:
32
+ - java
33
+ pattern-either:
34
+ - pattern: Files.write($PATH, $CONTENT)
35
+ - pattern: Files.newOutputStream($PATH)
36
+ - pattern: new FileOutputStream($PATH)
37
+ - pattern: $FILE.createNewFile()
38
+ metadata:
39
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
40
+ owasp: "A01:2021 - Broken Access Control"
41
+ precision: medium
42
+ tags: [path-traversal, file-write, rce]
43
+
44
+ # ZM-JAVA-FILE-DELETE-001: Files.delete/deleteIfExists 路径可控
45
+ - id: zm-java-file-delete-001
46
+ severity: MEDIUM
47
+ message: |
48
+ Files.delete/deleteIfExists 使用用户可控路径——可删除任意文件。
49
+ 校验路径在白名单内,使用 UUID 文件名避免路径注入。
50
+ languages:
51
+ - java
52
+ pattern-either:
53
+ - pattern: Files.delete($PATH)
54
+ - pattern: Files.deleteIfExists($PATH)
55
+ - pattern: $FILE.delete()
56
+ metadata:
57
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
58
+ owasp: "A01:2021 - Broken Access Control"
59
+ precision: medium
60
+ tags: [path-traversal, file-delete]
61
+
62
+ # ZM-JAVA-UPLOAD-PATH-001: MultipartFile transferTo 使用用户可控路径
63
+ - id: zm-java-upload-path-001
64
+ severity: CRITICAL
65
+ message: |
66
+ MultipartFile.transferTo() 目标路径使用原始文件名 + 用户可控目录——可覆盖任意文件。
67
+ 使用 UUID 重命名上传文件,并确保上传目录在配置的 uploads/ 根内。
68
+ languages:
69
+ - java
70
+ pattern-either:
71
+ - pattern: $FILE.transferTo(new File($PATH));
72
+ - pattern: $FILE.transferTo($DEST);
73
+ metadata:
74
+ cwe: "CWE-434: Unrestricted Upload of File with Dangerous Type"
75
+ owasp: "A03:2021 - Injection"
76
+ precision: high
77
+ tags: [file-upload, path-traversal]
78
+ references:
79
+ - https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
80
+
81
+ # ZM-JAVA-UPLOAD-EXT-001: 文件上传缺少扩展名校验
82
+ - id: zm-java-upload-ext-001
83
+ severity: HIGH
84
+ message: |
85
+ MultipartFile.getOriginalFilename() 直接用于存储——未校验扩展名/Content-Type。
86
+ 限制允许的文件类型(白名单),校验 Magic Bytes,禁止 .jsp/.exe/.sh 等可执行后缀。
87
+ languages:
88
+ - java
89
+ pattern-either:
90
+ - pattern: $FILE.getOriginalFilename()
91
+ - pattern: $PART.getOriginalFilename()
92
+ metadata:
93
+ cwe: "CWE-434: Unrestricted Upload of File with Dangerous Type"
94
+ owasp: "A03:2021 - Injection"
95
+ precision: low
96
+ tags: [file-upload, extension-bypass]
97
+ references:
98
+ - https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
99
+
100
+ # ZM-JAVA-ZIP-SLIP-001: ZipEntry 解压前未校验路径
101
+ - id: zm-java-zip-slip-001
102
+ severity: CRITICAL
103
+ message: |
104
+ ZipEntry.getName() 直接用于 new File(outputDir, entryName) —— 可触发 Zip Slip 路径穿越。
105
+ 规范化后再校验:new File(outputDir, entryName).getCanonicalPath().startsWith(outputDir)
106
+ languages:
107
+ - java
108
+ pattern-either:
109
+ - pattern: new File($OUTDIR, $ENTRY.getName())
110
+ - pattern: |
111
+ $ENTRY = $ZIP.getNextEntry();
112
+ ...
113
+ new File($DIR, $ENTRY);
114
+ metadata:
115
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
116
+ owasp: "A01:2021 - Broken Access Control"
117
+ precision: high
118
+ tags: [zip-slip, path-traversal, rce]
119
+ references:
120
+ - https://snyk.io/research/zip-slip-vulnerability
121
+
122
+ # ZM-JAVA-TEMP-FILE-001: 临时文件使用已弃用 API
123
+ - id: zm-java-temp-file-001
124
+ severity: LOW
125
+ message: |
126
+ File.createTempFile 前缀/后缀固定且无 SecureRandom — 临时文件名可预测。
127
+ 迁移到 Files.createTempFile() 并指定 SecureRandom 前缀。
128
+ languages:
129
+ - java
130
+ pattern: File.createTempFile($PREFIX, $SUFFIX)
131
+ metadata:
132
+ cwe: "CWE-377: Insecure Temporary File"
133
+ owasp: "A01:2021 - Broken Access Control"
134
+ precision: high
135
+ tags: [temp-file, race-condition]
@@ -0,0 +1,81 @@
1
+ # CWE-22: Path Traversal — Spring-specific sinks
2
+ # ZhuMa V4.1 — complement zm-java-cwe22-file-depth.yaml
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-PATH-SPRING-001: ClassPathResource with user-controlled path
7
+ - id: zm-java-path-spring-001
8
+ severity: MEDIUM
9
+ message: |
10
+ Spring ClassPathResource constructed with user input — path traversal into classpath resources.
11
+ Attacker can read application.properties or other sensitive classpath files.
12
+ Fix: validate path against whitelist; use ResourcePatternResolver with allowed prefix.
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ new ClassPathResource($REQ.getParameter(...))
18
+ - pattern: |
19
+ new ClassPathResource($STR + $REQ.getParameter(...))
20
+ - pattern: |
21
+ new ClassPathResource($REQ.getParameter(...)).getInputStream()
22
+ metadata:
23
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
24
+ severity: MEDIUM
25
+ precision: high
26
+ category: path-traversal
27
+ likelihood: MEDIUM
28
+ impact: MEDIUM
29
+ owasp: "A01:2021 - Broken Access Control"
30
+
31
+ # ZM-JAVA-PATH-SPRING-002: FileSystemResource with user-controlled path
32
+ - id: zm-java-path-spring-002
33
+ severity: HIGH
34
+ message: |
35
+ Spring FileSystemResource constructed with user input — arbitrary file read/write on filesystem.
36
+ Attacker can traverse to read /etc/passwd or application config files.
37
+ Fix: normalize path and verify it stays within allowed directory root.
38
+ languages:
39
+ - java
40
+ pattern-either:
41
+ - pattern: |
42
+ new FileSystemResource($REQ.getParameter(...))
43
+ - pattern: |
44
+ new FileSystemResource($DIR + $REQ.getParameter(...))
45
+ - pattern: |
46
+ new FileSystemResource($REQ.getParameter(...)).getFile()
47
+ - pattern: |
48
+ new FileSystemResource($REQ.getParameter(...)).getInputStream()
49
+ metadata:
50
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
51
+ severity: HIGH
52
+ precision: high
53
+ category: path-traversal
54
+ likelihood: MEDIUM
55
+ impact: HIGH
56
+ owasp: "A01:2021 - Broken Access Control"
57
+
58
+ # ZM-JAVA-PATH-SPRING-003: ServletContext.getRealPath() with user input
59
+ - id: zm-java-path-spring-003
60
+ severity: HIGH
61
+ message: |
62
+ ServletContext.getRealPath() with user-controlled virtual path — discloses server filesystem layout.
63
+ Attackers can map internal file structure; combined with file write leads to RCE.
64
+ Fix: never pass user input to getRealPath(); use fixed virtual paths or config-based resource mapping.
65
+ languages:
66
+ - java
67
+ pattern-either:
68
+ - pattern: |
69
+ $CTX.getRealPath($REQ.getParameter(...))
70
+ - pattern: |
71
+ $CTX.getRealPath($STR + $REQ.getParameter(...))
72
+ - pattern: |
73
+ $REQ.getServletContext().getRealPath($REQ.getParameter(...))
74
+ metadata:
75
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
76
+ severity: HIGH
77
+ precision: high
78
+ category: path-traversal
79
+ likelihood: MEDIUM
80
+ impact: HIGH
81
+ owasp: "A01:2021 - Broken Access Control"
@@ -0,0 +1,131 @@
1
+ # CWE-284/862: Missing Authorization — Spring Security deeper patterns
2
+ # ZhuMa V4.1 — complement zm-java-cwe862-authz-depth.yaml and cwe200-actuator-exposure.yaml
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-AUTHZ-SPRING-001: WebSecurityConfig permitAll on sensitive paths
7
+ - id: zm-java-authz-spring-001
8
+ severity: HIGH
9
+ message: |
10
+ Spring Security WebSecurityConfig uses requestMatchers(...).permitAll() on paths likely to be sensitive.
11
+ Check if these endpoints should be authenticated (e.g. /api/admin, /manage, /internal).
12
+ Fix: require authentication for sensitive paths; use hasRole/hasAuthority for admin endpoints.
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ $HTTP.requestMatchers("/api/**").permitAll()
18
+ - pattern: |
19
+ $HTTP.requestMatchers("/admin/**").permitAll()
20
+ - pattern: |
21
+ $HTTP.requestMatchers("/manage/**").permitAll()
22
+ - pattern: |
23
+ $HTTP.requestMatchers("/internal/**").permitAll()
24
+ - pattern: |
25
+ $HTTP.requestMatchers("/graphql").permitAll()
26
+ - pattern: |
27
+ $HTTP.anyRequest().permitAll()
28
+ metadata:
29
+ cwe: "CWE-284: Improper Access Control"
30
+ severity: HIGH
31
+ precision: high
32
+ category: authorization
33
+ likelihood: MEDIUM
34
+ impact: HIGH
35
+ owasp: "A01:2021 - Broken Access Control"
36
+
37
+ # ZM-JAVA-AUTHZ-SPRING-002: POST/PUT/DELETE endpoints without method security
38
+ - id: zm-java-authz-spring-002
39
+ severity: HIGH
40
+ message: |
41
+ Spring MVC controller has state-changing endpoints (@PostMapping/@PutMapping/@DeleteMapping) without @PreAuthorize.
42
+ These write operations should be explicitly protected with role-based authorization.
43
+ Fix: add @PreAuthorize("hasRole('ADMIN')") or @Secured("ROLE_ADMIN") to write endpoints.
44
+ languages:
45
+ - java
46
+ pattern-either:
47
+ - pattern: |
48
+ @$CTRL
49
+ class $CLASS {
50
+ ...
51
+ @PostMapping($PATH)
52
+ $RET $METHOD(...) {
53
+ ...
54
+ }
55
+ ...
56
+ }
57
+ - pattern: |
58
+ @$CTRL
59
+ class $CLASS {
60
+ ...
61
+ @PutMapping($PATH)
62
+ $RET $METHOD(...) {
63
+ ...
64
+ }
65
+ ...
66
+ }
67
+ - pattern: |
68
+ @$CTRL
69
+ class $CLASS {
70
+ ...
71
+ @DeleteMapping($PATH)
72
+ $RET $METHOD(...) {
73
+ ...
74
+ }
75
+ ...
76
+ }
77
+ pattern-not: |
78
+ @$CTRL
79
+ class $CLASS {
80
+ ...
81
+ @PreAuthorize($X)
82
+ }
83
+ metadata:
84
+ cwe: "CWE-862: Missing Authorization"
85
+ severity: HIGH
86
+ precision: medium
87
+ category: authorization
88
+ likelihood: HIGH
89
+ impact: HIGH
90
+ owasp: "A01:2021 - Broken Access Control"
91
+ references:
92
+ - "https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html"
93
+
94
+ # ZM-JAVA-AUTHZ-SPRING-003: @EnableWebSecurity without @EnableMethodSecurity
95
+ - id: zm-java-authz-spring-003
96
+ severity: MEDIUM
97
+ message: |
98
+ SecurityConfig annotated with @EnableWebSecurity but missing @EnableMethodSecurity.
99
+ Without method-level security, @PreAuthorize annotations on controllers have no effect.
100
+ Fix: add @EnableMethodSecurity (Spring Security 6+) or @EnableGlobalMethodSecurity(prePostEnabled = true).
101
+ languages:
102
+ - java
103
+ patterns:
104
+ - pattern: |
105
+ @Configuration
106
+ @EnableWebSecurity
107
+ class $CLASS {
108
+ ...
109
+ }
110
+ - pattern-not: |
111
+ @Configuration
112
+ @EnableWebSecurity
113
+ @EnableMethodSecurity
114
+ class $CLASS {
115
+ ...
116
+ }
117
+ - pattern-not: |
118
+ @Configuration
119
+ @EnableWebSecurity
120
+ @EnableGlobalMethodSecurity
121
+ class $CLASS {
122
+ ...
123
+ }
124
+ metadata:
125
+ cwe: "CWE-284: Improper Access Control"
126
+ severity: MEDIUM
127
+ precision: medium
128
+ category: authorization
129
+ likelihood: MEDIUM
130
+ impact: MEDIUM
131
+ owasp: "A05:2021 - Security Misconfiguration"
@@ -0,0 +1,123 @@
1
+ # CWE-295: Java SSL/TLS 不安全配置检测 (WebView / 自定义TrustManager)
2
+ # 逐码 ZhuMa V4.1 Sprint — Java 规则库
3
+ # 覆盖: AllowAllHostnameVerifier/TrustAllX509TrustManager实现
4
+
5
+ rules:
6
+
7
+ # ZM-JAVA-SSL-001: TrustAll / AllowAll X509TrustManager 实现
8
+ - id: zm-java-ssl-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到自定义 X509TrustManager 实现中绕过所有证书校验
12
+ (checkClientTrusted / checkServerTrusted 为空方法体)。
13
+ 这等效于禁用SSL/TLS证书验证,允许中间人攻击(MITM)。
14
+
15
+ 攻击者可通过伪造证书拦截加密通信,窃取敏感数据。
16
+
17
+ 修复:
18
+ 1. 删除自定义的空 TrustManager 实现
19
+ 2. 使用系统默认的 TrustManagerFactory
20
+ 3. 如确需自定义信任,仅添加特定证书(用 KeyStore 加载)
21
+ 4. Android: 使用 network_security_config.xml 配置证书固定
22
+ languages:
23
+ - java
24
+ pattern-either:
25
+ - pattern: |
26
+ new X509TrustManager() {
27
+ ...
28
+ public void checkClientTrusted(...) {}
29
+ ...
30
+ public void checkServerTrusted(...) {}
31
+ ...
32
+ }
33
+ - pattern: |
34
+ new X509TrustManager() {
35
+ ...
36
+ public void checkClientTrusted(...) { }
37
+ ...
38
+ public void checkServerTrusted(...) { }
39
+ ...
40
+ }
41
+ metadata:
42
+ cwe: "CWE-295: Improper Certificate Validation"
43
+ severity: ERROR
44
+ precision: very-high
45
+ category: ssl
46
+ likelihood: HIGH
47
+ impact: CRITICAL
48
+ owasp: "A02:2021 - Cryptographic Failures"
49
+ references:
50
+ - "https://developer.android.com/training/articles/security-config"
51
+ - "https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning"
52
+
53
+ # ZM-JAVA-SSL-002: HostnameVerifier 绕过 ALLOW_ALL
54
+ - id: zm-java-ssl-002
55
+ severity: ERROR
56
+ message: |
57
+ 检测到使用 ALLOW_ALL_HOSTNAME_VERIFIER 或 hostnameVerifier 始终返回 true。
58
+ 这绕过了SSL/TLS的主机名验证,允许攻击者使用任意证书冒充合法服务。
59
+
60
+ 涉及的API:
61
+ - SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
62
+ - HttpsURLConnection.setDefaultHostnameVerifier
63
+ - OkHttpClient.Builder.hostnameVerifier
64
+ - Apache SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
65
+
66
+ 修复:
67
+ 1. 移除 ALLOW_ALL_HOSTNAME_VERIFIER 使用默认验证器
68
+ 2. 使用 OkHostnameVerifier / DefaultHostnameVerifier
69
+ 3. Android: 使用 network_security_config.xml
70
+ languages:
71
+ - java
72
+ pattern-either:
73
+ - pattern: ALLOW_ALL_HOSTNAME_VERIFIER
74
+ - pattern: new HostnameVerifier() { ... return true; ... }
75
+ - pattern: $BUILDER.hostnameVerifier($HV)
76
+ - pattern: $CONN.setHostnameVerifier($HV)
77
+ metadata:
78
+ cwe: "CWE-295: Improper Certificate Validation"
79
+ severity: ERROR
80
+ precision: very-high
81
+ category: ssl
82
+ likelihood: HIGH
83
+ impact: CRITICAL
84
+ owasp: "A02:2021 - Cryptographic Failures"
85
+ references:
86
+ - "https://developer.android.com/training/articles/security-ssl"
87
+
88
+ # ZM-JAVA-SSL-003: Android WebView 不安全SSL配置
89
+ - id: zm-java-ssl-003
90
+ severity: ERROR
91
+ message: |
92
+ 检测到 Android WebView 中 onReceivedSslError handler 调用 handler.proceed(),
93
+ 忽略 SSL 证书错误继续加载页面。攻击者可利用中间人攻击窃取 WebView 中的敏感数据。
94
+
95
+ 修复:
96
+ 1. 删除 handler.proceed() 调用,使用 handler.cancel()
97
+ 2. 使用 Android Network Security Config 配置证书固定:
98
+ <network-security-config>
99
+ <domain-config>
100
+ <domain includeSubdomains="true">example.com</domain>
101
+ <pin-set>
102
+ <pin digest="SHA-256">...</pin>
103
+ </pin-set>
104
+ </domain-config>
105
+ </network-security-config>
106
+ 3. 仅在 debug 构建中使用 proceed()
107
+ languages:
108
+ - java
109
+ pattern-either:
110
+ - pattern: $HANDLER.proceed()
111
+ - pattern: handler.proceed()
112
+ - pattern: $SV.proceed()
113
+ metadata:
114
+ cwe: "CWE-295: Improper Certificate Validation"
115
+ severity: ERROR
116
+ precision: very-high
117
+ category: ssl
118
+ likelihood: HIGH
119
+ impact: CRITICAL
120
+ owasp: "A02:2021 - Cryptographic Failures"
121
+ references:
122
+ - "https://developer.android.com/training/articles/security-ssl"
123
+ - "https://developer.android.com/training/articles/security-config"
@@ -0,0 +1,197 @@
1
+ # CWE-327: 弱加密算法深度检测
2
+ # 逐码 ZhuMa V4.1 — 通用规则库
3
+ # 检测: Cipher.getInstance("DES"/"RC4"/"Blowfish") 及不安全的密钥派生/密码学误用
4
+
5
+ rules:
6
+
7
+ # ZM-JAVA-WEAKCRYPTO-DEEP-001: Cipher.getInstance 弱算法 (增强版)
8
+ - id: zm-java-weakcrypto-deep-001
9
+ severity: WARNING
10
+ message: |
11
+ 检测到 Cipher.getInstance() 使用了已淘汰或存在已知缺陷的加密算法。
12
+ 包括: DES (56位密钥,可暴力破解)、RC2 (64位块,已淘汰)、RC4 (密钥流偏向性)、
13
+ Blowfish (64位块,Sweet32攻击)、ARCFOUR (RC4别名)。
14
+ 这些算法不符合现代安全标准,应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
15
+ 修复方案:
16
+ 1. 对称加密: Cipher.getInstance("AES/GCM/NoPadding")
17
+ 2. 使用 256 位密钥 + 12 字节随机 IV
18
+ 3. 参考 NIST SP 800-131A Rev.2 算法生命周期
19
+ languages:
20
+ - java
21
+ pattern-either:
22
+ - pattern: Cipher.getInstance("DES")
23
+ - pattern: Cipher.getInstance("DES/")
24
+ - pattern: Cipher.getInstance("RC2")
25
+ - pattern: Cipher.getInstance("RC4")
26
+ - pattern: Cipher.getInstance("Blowfish")
27
+ - pattern: Cipher.getInstance("ARCFOUR")
28
+ - pattern: Cipher.getInstance("DESede")
29
+ - pattern: Cipher.getInstance("DESede/")
30
+ - pattern: Cipher.getInstance("3DES")
31
+ - pattern: Cipher.getInstance("3DES/")
32
+ metadata:
33
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
34
+ severity: WARNING
35
+ precision: very-high
36
+ category: crypto
37
+ likelihood: HIGH
38
+ impact: HIGH
39
+ owasp: "A02:2021 - Cryptographic Failures"
40
+ references:
41
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
42
+ - "https://sweet32.info/"
43
+ - "https://cwe.mitre.org/data/definitions/327.html"
44
+
45
+ # ZM-JAVA-WEAKCRYPTO-DEEP-002: KeyGenerator 弱算法
46
+ - id: zm-java-weakcrypto-deep-002
47
+ severity: WARNING
48
+ message: |
49
+ 检测到 KeyGenerator.getInstance() 使用了弱加密算法。
50
+ DES/RC2/Blowfish 密钥生成器意味着意图使用弱加密算法。
51
+ 应迁移至 KeyGenerator.getInstance("AES") 配合 256 位密钥。
52
+ languages:
53
+ - java
54
+ pattern-either:
55
+ - pattern: KeyGenerator.getInstance("DES")
56
+ - pattern: KeyGenerator.getInstance("RC2")
57
+ - pattern: KeyGenerator.getInstance("Blowfish")
58
+ - pattern: KeyGenerator.getInstance("DESede")
59
+ - pattern: KeyGenerator.getInstance("RC4")
60
+ metadata:
61
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
62
+ severity: WARNING
63
+ precision: very-high
64
+ category: crypto
65
+ likelihood: HIGH
66
+ impact: HIGH
67
+ owasp: "A02:2021 - Cryptographic Failures"
68
+
69
+ # ZM-JAVA-WEAKCRYPTO-DEEP-003: 自定义/非标准加密实现
70
+ - id: zm-java-weakcrypto-deep-003
71
+ severity: WARNING
72
+ message: |
73
+ 检测到自定义或非标准加密类调用(非 javax.crypto.Cipher)。
74
+ 自定义加密实现通常存在严重的密码学缺陷(弱密钥派生、错误模式、旁信道)。
75
+ 除非经过专业密码学审计,否则应使用标准库 Cipher/AES-GCM。
76
+ 修复方案:
77
+ 1. 使用 javax.crypto.Cipher 标准 API
78
+ 2. 使用经过认证的加密库(如 Google Tink, Bouncy Castle)
79
+ 3. 禁止自研加密算法
80
+ languages:
81
+ - java
82
+ pattern-either:
83
+ - pattern: |
84
+ new $CUSTOMCIPHER(...).encrypt(...)
85
+ - pattern: |
86
+ new $CUSTOMCIPHER(...).decrypt(...)
87
+ - pattern: |
88
+ $CIPHER.encrypt(...)
89
+ - pattern: |
90
+ $CIPHER.decrypt(...)
91
+ paths:
92
+ include:
93
+ - "**/*.java"
94
+ metadata:
95
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
96
+ severity: WARNING
97
+ precision: low
98
+ category: crypto
99
+ likelihood: MEDIUM
100
+ impact: HIGH
101
+ owasp: "A02:2021 - Cryptographic Failures"
102
+
103
+ # ZM-JAVA-WEAKCRYPTO-DEEP-004: 弱密码哈希 (MD5/SHA-1)
104
+ - id: zm-java-weakcrypto-deep-004
105
+ severity: WARNING
106
+ message: |
107
+ 检测到使用 MessageDigest.getInstance("MD5") 或 ("SHA-1") 进行密码哈希。
108
+ MD5 和 SHA-1 已可被碰撞攻击,不应用于安全场景(密码存储、数字签名)。
109
+ 应使用 bcrypt、scrypt、Argon2 (密码哈希) 或 SHA-256/SHA-3 (完整性校验)。
110
+ 修复方案:
111
+ 1. 密码存储: BCryptPasswordEncoder / Argon2PasswordEncoder
112
+ 2. 完整性校验: MessageDigest.getInstance("SHA-256") 或 "SHA-512"
113
+ 3. 数字签名: Signature.getInstance("SHA256withRSA")
114
+ languages:
115
+ - java
116
+ pattern-either:
117
+ - pattern: MessageDigest.getInstance("MD5")
118
+ - pattern: MessageDigest.getInstance("SHA-1")
119
+ - pattern: MessageDigest.getInstance("SHA1")
120
+ - pattern: DigestUtils.md5Hex(...)
121
+ - pattern: DigestUtils.sha1Hex(...)
122
+ - pattern: new DigestUtils("MD5")
123
+ - pattern: new DigestUtils("SHA-1")
124
+ metadata:
125
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
126
+ severity: WARNING
127
+ precision: very-high
128
+ category: crypto
129
+ likelihood: HIGH
130
+ impact: HIGH
131
+ owasp: "A02:2021 - Cryptographic Failures"
132
+ references:
133
+ - "https://shattered.io/"
134
+ - "https://cwe.mitre.org/data/definitions/328.html"
135
+
136
+ # ZM-JAVA-WEAKCRYPTO-DEEP-005: SecureRandom 不安全种子
137
+ - id: zm-java-weakcrypto-deep-005
138
+ severity: WARNING
139
+ message: |
140
+ 检测到 SecureRandom 使用了固定或可预测的种子 (setSeed)。
141
+ 固定种子会导致"随机"数可被完全预测,破坏加密安全性。
142
+ SecureRandom 默认使用操作系统熵源,无需手动设置种子。
143
+ 修复方案:
144
+ 1. 移除手动 setSeed() 调用,使用默认构造的 SecureRandom
145
+ 2. 若必须设置种子,使用 System.nanoTime() + 硬件熵源混合
146
+ 3. 确保在 Linux 上 /dev/urandom 可用
147
+ languages:
148
+ - java
149
+ pattern-either:
150
+ - pattern: |
151
+ new SecureRandom($BYTES).setSeed(...)
152
+ - pattern: |
153
+ $SR = new SecureRandom();
154
+ ...
155
+ $SR.setSeed($SEED);
156
+ ...
157
+ - pattern: |
158
+ new SecureRandom(0)
159
+ metadata:
160
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
161
+ severity: WARNING
162
+ precision: medium
163
+ category: crypto
164
+ likelihood: MEDIUM
165
+ impact: MEDIUM
166
+ owasp: "A02:2021 - Cryptographic Failures"
167
+
168
+ # ZM-JAVA-WEAKCRYPTO-DEEP-006: 硬编码 AES/DES 密钥
169
+ - id: zm-java-weakcrypto-deep-006
170
+ severity: WARNING
171
+ message: |
172
+ 检测到 SecretKeySpec 使用了字面量字符串作为密钥材料,属于硬编码密钥。
173
+ 硬编码密钥一旦泄露(如代码仓库公开),攻击者可解密所有受保护数据。
174
+ 修复方案:
175
+ 1. 密钥从环境变量或密钥管理服务 (KMS) 获取
176
+ 2. 使用 KeyStore / Vault 等安全密钥存储
177
+ 3. 密钥应在部署时自动生成,每个环境独立
178
+ 4. 参考 NIST SP 800-57 密钥管理最佳实践
179
+ languages:
180
+ - java
181
+ pattern-either:
182
+ - pattern: |
183
+ new SecretKeySpec("...".getBytes(), $ALG)
184
+ - pattern: |
185
+ new SecretKeySpec($KEY_STR.getBytes(), "AES")
186
+ - pattern: |
187
+ new SecretKeySpec($KEY_STR.getBytes(), "DES")
188
+ - pattern: |
189
+ new SecretKeySpec("...".getBytes("..."), $ALG)
190
+ metadata:
191
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
192
+ severity: WARNING
193
+ precision: medium
194
+ category: crypto
195
+ likelihood: MEDIUM
196
+ impact: CRITICAL
197
+ owasp: "A02:2021 - Cryptographic Failures"
@@ -0,0 +1,30 @@
1
+ # CWE-347: JWT 安全配置缺陷
2
+ rules:
3
+ - id: zm-java-jwt-01
4
+ severity: WARNING
5
+ message: JWT Parser 未调用 requireIssuer/requireAudience,可能接受任意发行者的令牌。
6
+ languages: [java]
7
+ pattern-either:
8
+ - pattern: Jwts.parser().setSigningKey($KEY).parseClaimsJws($TOKEN)
9
+ - pattern: Jwts.parserBuilder().setSigningKey($KEY).build().parseClaimsJws($TOKEN)
10
+ metadata: { cwe: "CWE-347", precision: medium, category: auth, owasp: "A02:2021 - Cryptographic Failures" }
11
+
12
+ - id: zm-java-jwt-02
13
+ severity: ERROR
14
+ message: JWT 签名密钥硬编码为字符串,可被攻击者伪造令牌。
15
+ languages: [java]
16
+ pattern-either:
17
+ - pattern: Keys.hmacShaKeyFor("$KEY".getBytes())
18
+ - pattern: Keys.hmacShaKeyFor($STR.getBytes())
19
+ - pattern: Keys.secretKeyFor(SignatureAlgorithm.$ALG)
20
+ metadata: { cwe: "CWE-347", precision: medium, category: crypto, owasp: "A02:2021" }
21
+
22
+ - id: zm-java-jwt-03
23
+ severity: WARNING
24
+ message: JWT 解析中接受过期令牌 acceptExpiredAt() / 允许宽松时间窗口。
25
+ languages: [java]
26
+ pattern-either:
27
+ - pattern: $PARSER.setAllowedClockSkewSeconds($N)
28
+ - pattern: $PARSER.setSigningKey($KEY).parseClaimsJws($TOKEN)
29
+ - pattern: Jwts.parserBuilder().setAllowedClockSkewSeconds($N).build()
30
+ metadata: { cwe: "CWE-347", precision: low, category: auth, owasp: "A02:2021" }