@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,89 @@
1
+ # CWE-89: SQL 注入检测规则
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-SQLI-001: JDBC Statement 字符串拼接
7
+ - id: zm-java-sqli-001
8
+ severity: CRITICAL
9
+ message: |
10
+ 检测到 JDBC Statement 使用字符串拼接构造 SQL 查询。
11
+ 攻击者可通过控制变量注入恶意 SQL 语句。
12
+ 应使用 PreparedStatement + 参数化查询。
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ Statement $STMT = $CONN.createStatement();
18
+ ...
19
+ $STMT.executeQuery($SQL + $PARAM);
20
+ - pattern: |
21
+ Statement $STMT = $CONN.createStatement();
22
+ ...
23
+ $STMT.execute($SQL + $PARAM);
24
+ - pattern: |
25
+ Statement $STMT = $CONN.createStatement();
26
+ ...
27
+ $STMT.executeUpdate($SQL + $PARAM);
28
+ metadata:
29
+ cwe: "CWE-89: SQL Injection"
30
+ owasp: "A03:2021 - Injection"
31
+ precision: very-high
32
+
33
+ # ZM-JAVA-SQLI-002: MyBatis ${} 动态 SQL (非预编译)
34
+ - id: zm-java-sqli-002
35
+ severity: CRITICAL
36
+ message: |
37
+ MyBatis 使用 ${} 语法进行字符串替换而非预编译参数绑定。
38
+ 除非是 ORDER BY / GROUP BY 等无法参数化的场景,否则应使用 #{}。
39
+ languages:
40
+ - java
41
+ pattern-either:
42
+ - pattern: |
43
+ @$ANNOTATION("...${...$EXPR}...")
44
+ metadata:
45
+ cwe: "CWE-89: SQL Injection"
46
+ owasp: "A03:2021 - Injection"
47
+ precision: high
48
+
49
+ # ZM-JAVA-SQLI-003: JdbcTemplate 字符串拼接
50
+ - id: zm-java-sqli-003
51
+ severity: HIGH
52
+ message: |
53
+ JdbcTemplate 使用字符串拼接构造 SQL 查询。
54
+ 应使用参数化查询:jdbcTemplate.query(sql, params, mapper)
55
+ languages:
56
+ - java
57
+ pattern-either:
58
+ - pattern: |
59
+ $T.jdbcTemplate.query($SQL + $PARAM, ...);
60
+ - pattern: |
61
+ $T.jdbcTemplate.update($SQL + $PARAM, ...);
62
+ - pattern: |
63
+ $T.jdbcTemplate.queryForObject($SQL + $PARAM, ...);
64
+ metadata:
65
+ cwe: "CWE-89: SQL Injection"
66
+ owasp: "A03:2021 - Injection"
67
+ precision: high
68
+
69
+ # ZM-JAVA-SQLI-004: String.format 构造 SQL
70
+ - id: zm-java-sqli-004
71
+ severity: HIGH
72
+ message: |
73
+ String.format() 构造 SQL 查询,参数值直接拼接。
74
+ 应使用 PreparedStatement 参数化。
75
+ languages:
76
+ - java
77
+ pattern-either:
78
+ - pattern: |
79
+ $SQL = String.format("...SELECT...%s...", $PARAM);
80
+ ...
81
+ $STMT.executeQuery($SQL);
82
+ - pattern: |
83
+ $SQL = String.format("...INSERT...%s...", $PARAM);
84
+ ...
85
+ $STMT.executeUpdate($SQL);
86
+ metadata:
87
+ cwe: "CWE-89: SQL Injection"
88
+ owasp: "A03:2021 - Injection"
89
+ precision: medium
@@ -0,0 +1,45 @@
1
+ # CWE-918: 服务端请求伪造 (SSRF) 检测规则
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-SSRF-001: HttpURLConnection URL 用户可控
7
+ - id: zm-java-ssrf-001
8
+ severity: HIGH
9
+ message: |
10
+ 检测到 HttpURLConnection 打开的 URL 可能包含用户输入。
11
+ 攻击者可能利用 SSRF 访问内网资源 (如 http://169.254.169.254/)。
12
+ 应对 URL 进行白名单校验,禁止访问内网/本地地址。
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ (HttpURLConnection) new URL($URL).openConnection();
18
+ - pattern: |
19
+ HttpURLConnection $CONN = (HttpURLConnection) new URL($URL).openConnection();
20
+ - pattern: |
21
+ new URL($URL).openConnection();
22
+ metadata:
23
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
24
+ owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
25
+ precision: medium
26
+
27
+ # ZM-JAVA-SSRF-002: RestTemplate URL 用户可控
28
+ - id: zm-java-ssrf-002
29
+ severity: MEDIUM
30
+ message: |
31
+ 检测到 RestTemplate 请求的 URL 可能由用户输入构造。
32
+ 应校验目标 URL 域名白名单,拒绝内网地址。
33
+ languages:
34
+ - java
35
+ pattern-either:
36
+ - pattern: |
37
+ $RT.getForObject($URL, ...);
38
+ - pattern: |
39
+ $RT.postForObject($URL, ...);
40
+ - pattern: |
41
+ $RT.exchange($URL, ...);
42
+ metadata:
43
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
44
+ owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
45
+ precision: low
@@ -0,0 +1,59 @@
1
+ # CWE-94: 代码注入检测规则
2
+ # 逐码 ZhuMa V4.0 Alpha — 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JAVA-CI-001: ScriptEngine.eval 用户输入
7
+ - id: zm-java-ci-001
8
+ severity: CRITICAL
9
+ message: |
10
+ 检测到 ScriptEngine.eval() 可能执行用户可控的脚本代码。
11
+ 攻击者可注入恶意脚本实现任意代码执行。
12
+ 避免使用动态脚本执行;如必须使用,需严格白名单校验输入内容。
13
+ languages:
14
+ - java
15
+ pattern-either:
16
+ - pattern: |
17
+ $ENGINE.eval($SCRIPT);
18
+ - pattern: |
19
+ $ENGINE.eval($SCRIPT + $PARAM);
20
+ metadata:
21
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
22
+ owasp: "A03:2021 - Injection"
23
+ precision: high
24
+
25
+ # ZM-JAVA-CI-002: GroovyShell 动态执行
26
+ - id: zm-java-ci-002
27
+ severity: CRITICAL
28
+ message: |
29
+ 检测到 GroovyShell 可能执行用户可控的脚本代码。
30
+ GroovyShell 不应接收外部输入;应使用 SafeGroovyMethods 或禁用 import 等特性。
31
+ languages:
32
+ - java
33
+ pattern-either:
34
+ - pattern: |
35
+ new GroovyShell().evaluate($SCRIPT);
36
+ - pattern: |
37
+ new GroovyShell().parse($SCRIPT);
38
+ metadata:
39
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
40
+ owasp: "A03:2021 - Injection"
41
+ precision: high
42
+
43
+ # ZM-JAVA-CI-003: Runtime.exec 编译执行 (命令注入也可归为此类)
44
+ - id: zm-java-ci-003
45
+ severity: MEDIUM
46
+ message: |
47
+ 检测到 Class.forName 动态加载类,可能被利用进行代码注入。
48
+ 动态类加载应使用白名单限制可加载的类型。
49
+ languages:
50
+ - java
51
+ pattern-either:
52
+ - pattern: |
53
+ Class.forName($NAME).newInstance();
54
+ - pattern: |
55
+ Class.forName($NAME);
56
+ metadata:
57
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
58
+ owasp: "A03:2021 - Injection"
59
+ precision: low
@@ -0,0 +1,117 @@
1
+ # CWE-22: Go 路径穿越深度检测
2
+ # 逐码 ZhuMa V4.1 Sprint — Go 规则库
3
+ # 覆盖: os.MkdirAll + userInput、filepath.Clean无效化、archive/zip ZipSlip
4
+
5
+ rules:
6
+
7
+ # ZM-GO-PT-DEPTH-001: os.MkdirAll 用户输入目录创建
8
+ - id: zm-go-pt-depth-001
9
+ severity: HIGH
10
+ message: |
11
+ 检测到 os.MkdirAll / os.Mkdir 使用用户可控的目录路径参数。
12
+ 攻击者可通过 ../../ 穿越创建任意目录,可能用于植入webshell或覆盖系统文件。
13
+
14
+ 修复方案:
15
+ 1. 使用 filepath.Clean() 规范化路径后验证基础目录前缀:
16
+ cleaned := filepath.Clean(filepath.Join(baseDir, userInput))
17
+ if !strings.HasPrefix(cleaned, filepath.Clean(baseDir)) { return error }
18
+ 2. 使用 filepath.Base() 仅提取目录名部分
19
+ 3. 限制目录名白名单(字母数字+特定符号)
20
+ 4. 禁止用户输入直接作为目录路径
21
+ languages:
22
+ - go
23
+ pattern-either:
24
+ - pattern: os.MkdirAll($INPUT, $PERM)
25
+ - pattern: os.Mkdir($INPUT, $PERM)
26
+ - pattern: os.MkdirTemp($DIR, $INPUT)
27
+ - pattern: os.MkdirTemp($INPUT, $PATTERN)
28
+ metadata:
29
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
30
+ severity: HIGH
31
+ precision: medium
32
+ category: path-traversal
33
+ likelihood: HIGH
34
+ impact: HIGH
35
+ owasp: "A01:2021 - Broken Access Control"
36
+ references:
37
+ - "https://pkg.go.dev/os#MkdirAll"
38
+
39
+ # ZM-GO-PT-DEPTH-002: archive/zip ZipSlip 检测
40
+ - id: zm-go-pt-depth-002
41
+ severity: HIGH
42
+ message: |
43
+ 检测到 ZIP 解压操作中未对压缩包内文件名做路径穿越校验(ZipSlip漏洞)。
44
+ 攻击者可构造包含 ../ 路径的恶意ZIP文件,解压时写入任意目录。
45
+
46
+ 典型漏洞模式:
47
+ for _, f := range reader.File {
48
+ dst := filepath.Join(targetDir, f.Name)
49
+ os.MkdirAll(filepath.Dir(dst), 0755)
50
+ // 未校验 dst 是否在 targetDir 内!
51
+ }
52
+
53
+ 修复方案:
54
+ 1. 使用 filepath.Clean 规范化后校验前缀:
55
+ dst := filepath.Clean(filepath.Join(targetDir, f.Name))
56
+ if !strings.HasPrefix(dst, filepath.Clean(targetDir)+string(os.PathSeparator)) {
57
+ return errors.New("invalid file path")
58
+ }
59
+ 2. 使用 f.FileInfo().Name() 或 filepath.Base(f.Name) 去除路径部分
60
+ 3. 使用专门的ZipSlip防护库
61
+ languages:
62
+ - go
63
+ pattern-either:
64
+ - pattern: filepath.Join($DIR, $ZIPFILE.Name)
65
+ - pattern: filepath.Join($DIR, $F.Name)
66
+ - pattern: filepath.Join($DEST, $HEADER.Name)
67
+ - pattern: path.Join($DIR, $ZIPFILE.Name)
68
+ metadata:
69
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
70
+ severity: HIGH
71
+ precision: high
72
+ category: path-traversal
73
+ likelihood: HIGH
74
+ impact: HIGH
75
+ owasp: "A01:2021 - Broken Access Control"
76
+ references:
77
+ - "https://snyk.io/research/zip-slip-vulnerability"
78
+ - "https://pkg.go.dev/archive/zip"
79
+
80
+ # ZM-GO-PT-DEPTH-003: filepath.Clean 后未做前缀校验(无效化)
81
+ - id: zm-go-pt-depth-003
82
+ severity: WARNING
83
+ message: |
84
+ 检测到使用 filepath.Clean 规范化路径但未验证结果路径的基础目录前缀。
85
+ 仅使用 filepath.Clean 不足以防止路径穿越——需要配合 HasPrefix 校验。
86
+
87
+ 错误示例:
88
+ cleanPath := filepath.Clean(filepath.Join(baseDir, userInput))
89
+ os.Open(cleanPath) // ← 未校验 cleanPath 是否在 baseDir 内
90
+
91
+ 正确示例:
92
+ cleanPath := filepath.Clean(filepath.Join(baseDir, userInput))
93
+ cleanBase := filepath.Clean(baseDir)
94
+ if !strings.HasPrefix(cleanPath, cleanBase) {
95
+ return nil, errors.New("invalid path")
96
+ }
97
+ os.Open(cleanPath)
98
+
99
+ 修复方案:
100
+ 1. filepath.Clean 后添加 HasPrefix 校验
101
+ 2. 使用 filepath.Rel 计算相对路径并检查是否以 .. 开头
102
+ 3. 对用户输入做字符白名单过滤
103
+ languages:
104
+ - go
105
+ pattern-either:
106
+ - pattern: filepath.Clean($INPUT)
107
+ - pattern: path.Clean($INPUT)
108
+ metadata:
109
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
110
+ severity: WARNING
111
+ precision: low
112
+ category: path-traversal
113
+ likelihood: MEDIUM
114
+ impact: HIGH
115
+ owasp: "A01:2021 - Broken Access Control"
116
+ references:
117
+ - "https://pkg.go.dev/path/filepath#Clean"
@@ -0,0 +1,103 @@
1
+ # CWE-22: Go 路径穿越检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: os.Open / ioutil.ReadFile 用户输入路径、path.Join 未验证
4
+
5
+ rules:
6
+
7
+ # ZM-GO-PT-001: os.Open / os.ReadFile / ioutil.ReadFile 动态文件路径
8
+ - id: zm-go-pt-001
9
+ severity: HIGH
10
+ message: |
11
+ 检测到文件读取操作(os.Open / os.ReadFile / ioutil.ReadFile)
12
+ 使用变量作为文件路径。若该变量来自用户输入(HTTP请求参数、
13
+ API输入等),攻击者可通过 ../ 穿越目录读取任意文件(如 /etc/passwd)。
14
+
15
+ 修复方案:
16
+ 1. 使用 filepath.Clean() 规范化路径后,验证是否在允许的基础目录内:
17
+ cleaned := filepath.Clean(userPath)
18
+ if !strings.HasPrefix(cleaned, baseDir) { return error }
19
+ 2. 使用 filepath.Base() 仅提取文件名,丢弃路径部分
20
+ 3. 对用户输入的文件名做白名单校验
21
+ 4. 将文件存储在非Web可访问目录中
22
+ languages:
23
+ - go
24
+ pattern-either:
25
+ - pattern: os.Open($PATH)
26
+ - pattern: os.OpenFile($PATH, $FLAG, $PERM)
27
+ - pattern: os.ReadFile($PATH)
28
+ - pattern: ioutil.ReadFile($PATH)
29
+ - pattern: ioutil.ReadDir($PATH)
30
+ - pattern: os.ReadDir($PATH)
31
+ metadata:
32
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
33
+ severity: HIGH
34
+ precision: medium
35
+ category: path-traversal
36
+ likelihood: HIGH
37
+ impact: HIGH
38
+ owasp: "A01:2021 - Broken Access Control"
39
+ references:
40
+ - "https://pkg.go.dev/path/filepath#Clean"
41
+ - "https://owasp.org/www-community/attacks/Path_Traversal"
42
+
43
+ # ZM-GO-PT-002: path.Join 未做路径前缀验证
44
+ - id: zm-go-pt-002
45
+ severity: HIGH
46
+ message: |
47
+ 检测到使用 path.Join 或 filepath.Join 拼接用户可控的路径组件。
48
+ Join 仅规范化路径分隔符,不会阻止 ../ 穿越。
49
+ 攻击者可通过输入 ../../etc/passwd 绕过 Join 保护。
50
+
51
+ 修复方案:
52
+ 1. 在 Join 之后使用 filepath.Clean() + HasPrefix 验证:
53
+ fullPath := filepath.Clean(filepath.Join(baseDir, userInput))
54
+ if !strings.HasPrefix(fullPath, filepath.Clean(baseDir)) { return error }
55
+ 2. 使用 filepath.Rel() 计算相对路径并检查是否以 .. 开头
56
+ 3. 对用户输入做字符白名单(仅允许字母数字和特定符号)
57
+ languages:
58
+ - go
59
+ pattern-either:
60
+ - pattern: filepath.Join($BASE, $INPUT)
61
+ - pattern: path.Join($BASE, $INPUT)
62
+ - pattern: filepath.Join($INPUT, $SUFFIX)
63
+ - pattern: path.Join($INPUT, $SUFFIX)
64
+ metadata:
65
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
66
+ severity: HIGH
67
+ precision: medium
68
+ category: path-traversal
69
+ likelihood: HIGH
70
+ impact: HIGH
71
+ owasp: "A01:2021 - Broken Access Control"
72
+ references:
73
+ - "https://pkg.go.dev/path/filepath#Join"
74
+
75
+ # ZM-GO-PT-003: http.ServeFile / http.FileServer 动态目录
76
+ - id: zm-go-pt-003
77
+ severity: HIGH
78
+ message: |
79
+ 检测到 http.ServeFile 或 http.FileServer 使用动态路径提供静态文件。
80
+ 若目录路径可由用户控制,攻击者可通过路径穿越访问Web根目录之外的
81
+ 任意文件(配置文件、源码、数据库等)。
82
+
83
+ 修复方案:
84
+ 1. 使用 http.Dir() 包装目录: http.FileServer(http.Dir("/safe/path"))
85
+ 2. 确保 root 目录为绝对路径且不可由用户控制
86
+ 3. 配合 http.StripPrefix 限制访问范围
87
+ 4. 对敏感目录设置 dotfiles 访问控制
88
+ languages:
89
+ - go
90
+ pattern-either:
91
+ - pattern: http.ServeFile($W, $R, $PATH)
92
+ - pattern: http.FileServer(http.Dir($DIR))
93
+ - pattern: http.FileServer(http.Dir($VAR))
94
+ metadata:
95
+ cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
96
+ severity: HIGH
97
+ precision: medium
98
+ category: path-traversal
99
+ likelihood: MEDIUM
100
+ impact: HIGH
101
+ owasp: "A01:2021 - Broken Access Control"
102
+ references:
103
+ - "https://pkg.go.dev/net/http#FileServer"
@@ -0,0 +1,129 @@
1
+ # CWE-307: Go 暴力破解防护缺失检测
2
+ # 逐码 ZhuMa V4.1 Sprint — Go 规则库
3
+ # 覆盖: bcrypt cost<10、登录无rate limit、JWT secret太短
4
+
5
+ rules:
6
+
7
+ # ZM-GO-BF-001: bcrypt cost 过低
8
+ - id: zm-go-bf-001
9
+ severity: WARNING
10
+ message: |
11
+ 检测到 bcrypt.GenerateFromPassword 的 cost 参数 < 10。
12
+ cost 过低使哈希计算速度过快,攻击者可高效进行离线暴力破解。
13
+
14
+ OWASP 建议 bcrypt cost >= 10 (2024年建议 >= 12)。
15
+
16
+ 修复方案:
17
+ 1. 将 cost 提升至 >= 12: bcrypt.GenerateFromPassword(password, 12)
18
+ 2. 考虑使用 argon2 替代(更抗GPU/ASIC)
19
+ 3. 定期评估并上调 cost 值(随硬件性能提升)
20
+ 4. 使用 bcrypt.DefaultCost(10) 作为最低标准
21
+ languages:
22
+ - go
23
+ pattern-either:
24
+ - pattern: bcrypt.GenerateFromPassword($PASS, 1)
25
+ - pattern: bcrypt.GenerateFromPassword($PASS, 2)
26
+ - pattern: bcrypt.GenerateFromPassword($PASS, 3)
27
+ - pattern: bcrypt.GenerateFromPassword($PASS, 4)
28
+ - pattern: bcrypt.GenerateFromPassword($PASS, 5)
29
+ - pattern: bcrypt.GenerateFromPassword($PASS, 6)
30
+ - pattern: bcrypt.GenerateFromPassword($PASS, 7)
31
+ - pattern: bcrypt.GenerateFromPassword($PASS, 8)
32
+ - pattern: bcrypt.GenerateFromPassword($PASS, 9)
33
+ metadata:
34
+ cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
35
+ severity: WARNING
36
+ precision: very-high
37
+ category: brute-force
38
+ likelihood: HIGH
39
+ impact: MEDIUM
40
+ owasp: "A07:2021 - Identification and Authentication Failures"
41
+ references:
42
+ - "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"
43
+ - "https://pkg.go.dev/golang.org/x/crypto/bcrypt"
44
+
45
+ # ZM-GO-BF-002: 登录接口无 rate limit
46
+ - id: zm-go-bf-002
47
+ severity: HIGH
48
+ message: |
49
+ 检测到 Gin/Echo/标准库登录路由处理函数中未使用 rate limiter 中间件。
50
+ 攻击者可对登录接口发起暴力破解攻击,尝试大量用户名/密码组合。
51
+
52
+ 修复方案:
53
+ 1. 使用 tollbooth / go-redis/redis_rate 等限流库:
54
+ limiter := tollbooth.NewLimiter(5, nil)
55
+ limiter.SetIPLookups([]string{"X-Forwarded-For", "RemoteAddr", "X-Real-IP"})
56
+ router.POST("/login", tollbooth.LimitFuncHandler(limiter, loginHandler))
57
+ 2. 基于用户名/IP的渐进式延迟
58
+ 3. 实现账户锁定策略(连续N次失败锁定M分钟)
59
+ 4. 添加验证码机制
60
+ languages:
61
+ - go
62
+ pattern-either:
63
+ - pattern: |
64
+ $ROUTER.POST("/login", $HANDLER)
65
+ - pattern: |
66
+ $ROUTER.GET("/login", $HANDLER)
67
+ - pattern: |
68
+ $G.POST("/login", $HANDLER)
69
+ - pattern: |
70
+ $E.POST("/login", $HANDLER)
71
+ - pattern: |
72
+ http.HandleFunc("/login", $HANDLER)
73
+ - pattern: |
74
+ $MUX.HandleFunc("/login", $HANDLER)
75
+ metadata:
76
+ cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
77
+ severity: HIGH
78
+ precision: low
79
+ category: brute-force
80
+ likelihood: HIGH
81
+ impact: HIGH
82
+ owasp: "A07:2021 - Identification and Authentication Failures"
83
+ references:
84
+ - "https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html"
85
+
86
+ # ZM-GO-BF-003: JWT HMAC secret 过短
87
+ - id: zm-go-bf-003
88
+ severity: HIGH
89
+ message: |
90
+ 检测到 JWT 签名密钥(HMAC secret)可能为硬编码短字符串(如 "secret" / "mykey")。
91
+ 过短的 HMAC 密钥可被暴力破解,攻击者可伪造任意 JWT token。
92
+
93
+ HMAC-SHA256 密钥最低要求 256 bits (32 bytes)。
94
+
95
+ 修复方案:
96
+ 1. 密钥长度 >= 32 字节: jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
97
+ 2. 从环境变量/密钥管理服务加载密钥
98
+ 3. 使用 RSA/ECDSA 非对称签名替代对称签名
99
+ 4. 禁止硬编码密钥字符串
100
+ languages:
101
+ - go
102
+ pattern-either:
103
+ - pattern: |
104
+ []byte("secret")
105
+ - pattern: |
106
+ []byte("mykey")
107
+ - pattern: |
108
+ []byte("key")
109
+ - pattern: |
110
+ []byte("password")
111
+ - pattern: |
112
+ []byte("jwt-secret")
113
+ - pattern: |
114
+ []byte("secret-key")
115
+ - pattern: |
116
+ []byte("my-secret")
117
+ - pattern: |
118
+ []byte("my_secret_key")
119
+ metadata:
120
+ cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
121
+ severity: HIGH
122
+ precision: medium
123
+ category: brute-force
124
+ likelihood: MEDIUM
125
+ impact: CRITICAL
126
+ owasp: "A07:2021 - Identification and Authentication Failures"
127
+ references:
128
+ - "https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html"
129
+ - "https://pkg.go.dev/github.com/golang-jwt/jwt/v5"
@@ -0,0 +1,124 @@
1
+ # CWE-326: Go 弱加密算法检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: crypto/md5、crypto/sha1、crypto/des、crypto/rc4 使用
4
+
5
+ rules:
6
+
7
+ # ZM-GO-WEAKCRYPTO-001: MD5 哈希算法使用
8
+ - id: zm-go-weakcrypto-001
9
+ severity: WARNING
10
+ message: |
11
+ 检测到使用 crypto/md5 哈希算法。
12
+ MD5 已被证实存在碰撞攻击(2004年王小云),SHA-1 也于2017年
13
+ 被Google实现首个碰撞攻击(SHAttered)。
14
+ MD5 不应用于安全场景(密码存储、数字签名、证书验证、完整性校验)。
15
+
16
+ 修复方案:
17
+ 1. 数字签名/完整性校验: crypto/sha256 或 crypto/sha512
18
+ 2. 密码存储: golang.org/x/crypto/bcrypt 或 argon2
19
+ 3. HMAC: crypto/hmac + sha256
20
+ 4. 若仅用于非安全用途(如哈希表键),添加 //nolint 注释忽略
21
+ languages:
22
+ - go
23
+ pattern-either:
24
+ - pattern: md5.New()
25
+ - pattern: md5.Sum($DATA)
26
+ - pattern: md5Sum($DATA)
27
+ metadata:
28
+ cwe: "CWE-326: Inadequate Encryption Strength"
29
+ severity: WARNING
30
+ precision: very-high
31
+ category: crypto
32
+ likelihood: HIGH
33
+ impact: HIGH
34
+ owasp: "A02:2021 - Cryptographic Failures"
35
+ references:
36
+ - "https://shattered.io/"
37
+ - "https://cwe.mitre.org/data/definitions/326.html"
38
+
39
+ # ZM-GO-WEAKCRYPTO-002: SHA-1 哈希算法使用
40
+ - id: zm-go-weakcrypto-002
41
+ severity: WARNING
42
+ message: |
43
+ 检测到使用 crypto/sha1 哈希算法。
44
+ SHA-1 已被 Google 实现碰撞攻击(SHAttered, 2017)。
45
+ 主流浏览器和CA机构已于2017年停止信任SHA-1证书。
46
+ SHA-1 不应用于数字签名、证书或密码存储。
47
+
48
+ 修复方案:
49
+ 1. 升级至 crypto/sha256 或更安全的哈希算法
50
+ 2. 密码存储使用 bcrypt/argon2
51
+ 3. 签名场景使用 SHA256withRSA 或 ECDSA
52
+ languages:
53
+ - go
54
+ pattern-either:
55
+ - pattern: sha1.New()
56
+ - pattern: sha1.Sum($DATA)
57
+ - pattern: sha1Sum($DATA)
58
+ metadata:
59
+ cwe: "CWE-326: Inadequate Encryption Strength"
60
+ severity: WARNING
61
+ precision: very-high
62
+ category: crypto
63
+ likelihood: HIGH
64
+ impact: HIGH
65
+ owasp: "A02:2021 - Cryptographic Failures"
66
+ references:
67
+ - "https://shattered.io/"
68
+ - "https://www.schneier.com/blog/archives/2005/02/sha1_broken.html"
69
+
70
+ # ZM-GO-WEAKCRYPTO-003: DES 对称加密使用
71
+ - id: zm-go-weakcrypto-003
72
+ severity: WARNING
73
+ message: |
74
+ 检测到使用 crypto/des 对称加密算法。
75
+ DES 使用56位密钥(有效仅56位),现代硬件可在数小时内暴力破解。
76
+ Triple DES (3DES) 也仅提供112位有效安全强度,且存在Sweet32攻击。
77
+ 不符合 NIST SP 800-131A Rev.2 标准。
78
+
79
+ 修复方案:
80
+ 1. 使用 crypto/aes + GCM 模式: AES-256-GCM
81
+ 2. 使用 nacl/secretbox (XSalsa20-Poly1305)
82
+ 3. 迁移所有 DES 加密数据到 AES
83
+ languages:
84
+ - go
85
+ pattern-either:
86
+ - pattern: des.NewCipher($KEY)
87
+ - pattern: des.NewTripleDESCipher($KEY)
88
+ metadata:
89
+ cwe: "CWE-326: Inadequate Encryption Strength"
90
+ severity: WARNING
91
+ precision: very-high
92
+ category: crypto
93
+ likelihood: HIGH
94
+ impact: CRITICAL
95
+ owasp: "A02:2021 - Cryptographic Failures"
96
+ references:
97
+ - "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
98
+
99
+ # ZM-GO-WEAKCRYPTO-004: RC4 流密码使用
100
+ - id: zm-go-weakcrypto-004
101
+ severity: WARNING
102
+ message: |
103
+ 检测到使用 crypto/rc4 流密码。
104
+ RC4 存在已知的密钥流偏向性攻击(2013年RFC 7465已禁止在TLS中使用RC4)。
105
+ 流密码本身的使用模式若不正确也易引入重放攻击。
106
+
107
+ 修复方案:
108
+ 1. 使用 AES-GCM(认证加密)替代RC4
109
+ 2. 或使用 ChaCha20-Poly1305 (golang.org/x/crypto/chacha20poly1305)
110
+ 3. 所有敏感数据使用AEAD(带关联数据的认证加密)模式
111
+ languages:
112
+ - go
113
+ pattern-either:
114
+ - pattern: rc4.NewCipher($KEY)
115
+ metadata:
116
+ cwe: "CWE-326: Inadequate Encryption Strength"
117
+ severity: WARNING
118
+ precision: very-high
119
+ category: crypto
120
+ likelihood: MEDIUM
121
+ impact: HIGH
122
+ owasp: "A02:2021 - Cryptographic Failures"
123
+ references:
124
+ - "https://datatracker.ietf.org/doc/rfc7465/"