@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,152 @@
1
+ # CWE-327: Go 弱密码模式检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: AES-CBC无认证、ECB模式、CTR无认证、Cipher裸用
4
+
5
+ rules:
6
+
7
+ # ZM-GO-WEAKCIPHER-001: AES-CBC 无认证加密
8
+ - id: zm-go-weakcipher-001
9
+ severity: WARNING
10
+ message: |
11
+ 检测到使用 cipher.NewCBCEncrypter / NewCBCDecrypter 进行CBC模式加密。
12
+ CBC模式仅提供机密性,不提供完整性/认证保护。攻击者可修改密文
13
+ 并通过padding oracle攻击恢复明文(如Lucky13、POODLE攻击)。
14
+ CBC模式不满足现代AEAD(认证加密)安全要求。
15
+
16
+ 修复方案:
17
+ 1. 使用 AES-GCM: cipher.NewGCM() — 内置认证+加密
18
+ gcm, _ := cipher.NewGCM(block)
19
+ ciphertext := gcm.Seal(nil, nonce, plaintext, aad)
20
+ 2. 或使用 golang.org/x/crypto/nacl/secretbox (XSalsa20-Poly1305)
21
+ 3. 若必须使用CBC,必须配合HMAC-SHA256做 Encrypt-then-MAC:
22
+ ciphertext = iv + enc(plaintext)
23
+ mac = HMAC-SHA256(ciphertext)
24
+ 最终输出: ciphertext + mac
25
+ languages:
26
+ - go
27
+ pattern-either:
28
+ - pattern: cipher.NewCBCEncrypter($BLOCK, $IV)
29
+ - pattern: cipher.NewCBCDecrypter($BLOCK, $IV)
30
+ metadata:
31
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
32
+ severity: WARNING
33
+ precision: very-high
34
+ category: crypto
35
+ likelihood: HIGH
36
+ impact: HIGH
37
+ owasp: "A02:2021 - Cryptographic Failures"
38
+ references:
39
+ - "https://pkg.go.dev/crypto/cipher#NewGCM"
40
+ - "https://en.wikipedia.org/wiki/Padding_oracle_attack"
41
+
42
+ # ZM-GO-WEAKCIPHER-002: ECB模式加密
43
+ - id: zm-go-weakcipher-002
44
+ severity: WARNING
45
+ message: |
46
+ 检测到使用 ECB(电子密码本)模式加密。Go标准库不提供ECB实现,
47
+ 此检测匹配第三方库或自定义ECB实现。
48
+ ECB模式会产生确定性密文——相同明文块产生相同密文块,
49
+ 无法隐藏数据模式,攻击者可从密文中直接识别重复数据。
50
+
51
+ 修复方案:
52
+ 1. 使用 AES-GCM (cipher.NewGCM) 替代任何ECB实现
53
+ 2. AES-GCM 提供: 机密性 + 完整性 + 认证 + 随机IV
54
+ 3. 绝对禁止在任何安全敏感场景使用ECB
55
+ 4. 参考 NIST SP 800-38A 了解分组密码模式安全特性
56
+ languages:
57
+ - go
58
+ pattern-either:
59
+ - pattern: NewECBEncrypter($BLOCK)
60
+ - pattern: NewECBDecrypter($BLOCK)
61
+ - pattern: ecb.NewEncrypter($BLOCK)
62
+ - pattern: ecb.NewDecrypter($BLOCK)
63
+ metadata:
64
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
65
+ severity: WARNING
66
+ precision: very-high
67
+ category: crypto
68
+ likelihood: MEDIUM
69
+ impact: HIGH
70
+ owasp: "A02:2021 - Cryptographic Failures"
71
+ references:
72
+ - "https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#ECB"
73
+
74
+ # ZM-GO-WEAKCIPHER-003: AES-CTR 无认证加密
75
+ - id: zm-go-weakcipher-003
76
+ severity: WARNING
77
+ message: |
78
+ 检测到使用 cipher.NewCTR() 进行CTR模式加密。
79
+ CTR模式本身仅提供机密性,不提供完整性保护。
80
+ 攻击者可对密文进行比特翻转修改明文,且无MAC无法检测篡改。
81
+
82
+ 修复方案:
83
+ 1. 使用 AES-GCM 替代 CTR 模式
84
+ 2. 或使用 Golang 支持的 AEAD 接口: cipher.NewGCM / chacha20poly1305
85
+ 3. 若必须用CTR,配合 HMAC-SHA256 实现 Encrypt-then-MAC 认证
86
+ languages:
87
+ - go
88
+ pattern-either:
89
+ - pattern: cipher.NewCTR($BLOCK, $IV)
90
+ metadata:
91
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
92
+ severity: WARNING
93
+ precision: very-high
94
+ category: crypto
95
+ likelihood: HIGH
96
+ impact: HIGH
97
+ owasp: "A02:2021 - Cryptographic Failures"
98
+
99
+ # ZM-GO-WEAKCIPHER-004: Cipher 裸用(无模式加密)
100
+ - id: zm-go-weakcipher-004
101
+ severity: WARNING
102
+ message: |
103
+ 检测到 cipher.Block 接口的 Encrypt/Decrypt 方法直接调用,
104
+ 未通过任何分组密码模式包装。裸 Block 仅加密单个16字节块,
105
+ 无法处理任意长度数据,且无认证和IV。
106
+
107
+ 修复方案:
108
+ 1. 始终通过 cipher.NewGCM(block) 等模式包装后使用
109
+ 2. 绝对禁止直接调用 block.Encrypt / block.Decrypt 处理业务数据
110
+ 3. 正确模式: gcm, _ := cipher.NewGCM(block); gcm.Seal(...)
111
+ languages:
112
+ - go
113
+ pattern-either:
114
+ - pattern: $BLOCK.Encrypt($DST, $SRC)
115
+ - pattern: $BLOCK.Decrypt($DST, $SRC)
116
+ metadata:
117
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
118
+ severity: WARNING
119
+ precision: very-high
120
+ category: crypto
121
+ likelihood: HIGH
122
+ impact: HIGH
123
+ owasp: "A02:2021 - Cryptographic Failures"
124
+ references:
125
+ - "https://pkg.go.dev/crypto/cipher#Block"
126
+
127
+ # ZM-GO-WEAKCIPHER-005: CFB/OFB 无认证
128
+ - id: zm-go-weakcipher-005
129
+ severity: WARNING
130
+ message: |
131
+ 检测到使用 cipher.NewCFBEncrypter / NewOFB 流模式。
132
+ CFB/OFB仅提供机密性,不提供认证保护。不应在现代系统中单独使用。
133
+ OFB模式虽比特翻转影响有限,但仍缺少完整性校验。
134
+
135
+ 修复方案:
136
+ 1. 使用 cipher.NewGCM() — AEAD 是唯一推荐的新增代码加密模式
137
+ 2. 若需流加密,使用 ChaCha20-Poly1305
138
+ 3. 旧系统迁移计划加入HMAC认证
139
+ languages:
140
+ - go
141
+ pattern-either:
142
+ - pattern: cipher.NewCFBEncrypter($BLOCK, $IV)
143
+ - pattern: cipher.NewCFBDecrypter($BLOCK, $IV)
144
+ - pattern: cipher.NewOFB($BLOCK, $IV)
145
+ metadata:
146
+ cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
147
+ severity: WARNING
148
+ precision: very-high
149
+ category: crypto
150
+ likelihood: MEDIUM
151
+ impact: HIGH
152
+ owasp: "A02:2021 - Cryptographic Failures"
@@ -0,0 +1,128 @@
1
+ # CWE-384: Go/Gin 会话固定检测
2
+ # 逐码 ZhuMa V4.1 Sprint — Go 规则库
3
+ # 覆盖: Gin/gorilla session未regenerate、cookie未secure/httpOnly
4
+
5
+ rules:
6
+
7
+ # ZM-GO-SF-001: Gorilla Sessions 登录后未替换会话ID
8
+ - id: zm-go-sf-001
9
+ severity: HIGH
10
+ message: |
11
+ 检测到 gorilla/sessions 在登录/认证成功后未创建新会话或未调用 session.Save() 前
12
+ 未设置新的 session ID。
13
+ 攻击者可通过固定会话攻击(Session Fixation)劫持已验证用户会话。
14
+
15
+ 修复方案:
16
+ 1. 登录成功后创建全新会话:
17
+ session, _ := store.New(r, "session-name")
18
+ session.Values["user"] = user
19
+ session.Save(r, w)
20
+ 2. 在 Save 之前清除旧会话: session.Options.MaxAge = -1
21
+ 3. 为认证成功的会话生成新的 session ID(随机UUID)
22
+ 4. 将 session ID 与用户身份强绑定
23
+ languages:
24
+ - go
25
+ pattern-either:
26
+ - pattern: |
27
+ $SESSION.Values[$KEY] = $USER
28
+ - pattern: |
29
+ $SESSION.Values[$KEY] = $VALUE
30
+ - pattern: |
31
+ session.Values[$KEY] = $VALUE
32
+ metadata:
33
+ cwe: "CWE-384: Session Fixation"
34
+ severity: HIGH
35
+ precision: low
36
+ category: session
37
+ likelihood: HIGH
38
+ impact: HIGH
39
+ owasp: "A07:2021 - Identification and Authentication Failures"
40
+ references:
41
+ - "https://github.com/gorilla/sessions"
42
+ - "https://owasp.org/www-community/attacks/Session_fixation"
43
+
44
+ # ZM-GO-SF-002: Gorilla/Gin Session Cookie 安全属性缺失
45
+ - id: zm-go-sf-002
46
+ severity: HIGH
47
+ message: |
48
+ 检测到 Gorilla sessions 的 cookie 配置中安全属性不完整。
49
+
50
+ - Secure: false → Cookie可被中间人通过HTTP明文传输窃取
51
+ - HttpOnly: false → JavaScript可读取Cookie,XSS可窃取会话
52
+ - SameSite 未设 StrictMode → 跨站请求携带Cookie,易受CSRF
53
+
54
+ 修复方案:
55
+ 1. 生产环境 Secure: true (仅HTTPS)
56
+ 2. HttpOnly: true
57
+ 3. SameSite: http.SameSiteStrictMode
58
+ 4. 设置合理的 MaxAge 和 Path 限制作用域
59
+ 5. 使用 session.Options 统一配置:
60
+ session.Options = &sessions.Options{
61
+ Path: "/",
62
+ MaxAge: 3600,
63
+ HttpOnly: true,
64
+ Secure: true,
65
+ SameSite: http.SameSiteStrictMode,
66
+ }
67
+ languages:
68
+ - go
69
+ pattern-either:
70
+ - pattern: |
71
+ $STORE.Options.HttpOnly = false
72
+ - pattern: |
73
+ $STORE.Options.Secure = false
74
+ - pattern: |
75
+ $OPTS.HttpOnly = false
76
+ - pattern: |
77
+ $OPTS.Secure = false
78
+ - pattern: |
79
+ $SESSION.Options.HttpOnly = false
80
+ - pattern: |
81
+ $SESSION.Options.Secure = false
82
+ - pattern: |
83
+ HttpOnly: false
84
+ - pattern: |
85
+ Secure: false
86
+ metadata:
87
+ cwe: "CWE-384: Session Fixation"
88
+ severity: HIGH
89
+ precision: very-high
90
+ category: session
91
+ likelihood: HIGH
92
+ impact: HIGH
93
+ owasp: "A07:2021 - Identification and Authentication Failures"
94
+ references:
95
+ - "https://github.com/gorilla/sessions"
96
+
97
+ # ZM-GO-SF-003: Gin contrib/sessions cookie配置安全检查
98
+ - id: zm-go-sf-003
99
+ severity: HIGH
100
+ message: |
101
+ 检测到 Gin contrib/sessions 或其他 session store 配置中 Secure/HttpOnly 设置可能不安全。
102
+ 使用 CookieStore 和 FilesystemStore 时需显式设置 Secure 和 HttpOnly 选项。
103
+
104
+ 修复方案:
105
+ store := cookie.NewStore([]byte("secret"))
106
+ store.Options(sessions.Options{
107
+ Path: "/",
108
+ MaxAge: 86400 * 7,
109
+ HttpOnly: true,
110
+ Secure: true,
111
+ SameSite: http.SameSiteStrictMode,
112
+ })
113
+ languages:
114
+ - go
115
+ pattern-either:
116
+ - pattern: cookie.NewStore($KEY)
117
+ - pattern: sessions.NewCookieStore($KEY)
118
+ - pattern: sessions.NewFilesystemStore($PATH, $KEY)
119
+ metadata:
120
+ cwe: "CWE-384: Session Fixation"
121
+ severity: HIGH
122
+ precision: low
123
+ category: session
124
+ likelihood: MEDIUM
125
+ impact: HIGH
126
+ owasp: "A07:2021 - Identification and Authentication Failures"
127
+ references:
128
+ - "https://github.com/gin-gonic/contrib/tree/master/sessions"
@@ -0,0 +1,120 @@
1
+ # CWE-502: Go 不安全反序列化检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: gob.NewDecoder.Decode / json.Unmarshal到interface{} / xml.Decoder
4
+
5
+ rules:
6
+
7
+ # ZM-GO-DESER-001: gob 反序列化外部输入
8
+ - id: zm-go-deser-001
9
+ severity: CRITICAL
10
+ message: |
11
+ 检测到 encoding/gob 的 NewDecoder().Decode() 反序列化操作。
12
+ gob 是Go特有的二进制序列化格式,反序列化用户可控的 gob 数据
13
+ 可能触发 panic 导致DoS,或在复杂类型场景下产生意外行为。
14
+
15
+ 修复方案:
16
+ 1. 仅反序列化可信来源的 gob 数据
17
+ 2. 对不可信数据使用 JSON/Protobuf 等格式替代 gob
18
+ 3. 使用 gob.Register() 注册允许的反序列化类型白名单
19
+ 4. 对输入数据做完整性校验(HMAC签名)
20
+ languages:
21
+ - go
22
+ pattern-either:
23
+ - pattern: gob.NewDecoder($R).Decode($V)
24
+ - pattern: gob.NewDecoder($R).DecodeValue($V)
25
+ metadata:
26
+ cwe: "CWE-502: Deserialization of Untrusted Data"
27
+ severity: CRITICAL
28
+ precision: high
29
+ category: deserialization
30
+ likelihood: MEDIUM
31
+ impact: HIGH
32
+ owasp: "A08:2021 - Software and Data Integrity Failures"
33
+ references:
34
+ - "https://pkg.go.dev/encoding/gob"
35
+ - "https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html"
36
+
37
+ # ZM-GO-DESER-002: json.Unmarshal 到 interface{}
38
+ - id: zm-go-deser-002
39
+ severity: WARNING
40
+ message: |
41
+ 检测到 json.Unmarshal / json.Decoder.Decode 将数据反序列化到
42
+ interface{} 类型或 map[string]interface{} 动态类型。
43
+ 无类型约束的反序列化可能导致类型混淆、DoS(嵌套炸弹),
44
+ 且无法利用编译器类型检查保证数据安全。
45
+
46
+ 修复方案:
47
+ 1. 定义具体的结构体类型接收JSON数据: json.Unmarshal(data, &myStruct)
48
+ 2. 使用 json.Decoder 配合 DisallowUnknownFields() 拒绝未知字段
49
+ 3. 若必须使用动态类型,使用 json.RawMessage 延迟解析
50
+ 4. 对输入大小做限制(http.MaxBytesReader / io.LimitReader)
51
+ languages:
52
+ - go
53
+ pattern-either:
54
+ - pattern: json.Unmarshal($DATA, $V)
55
+ - pattern: $DEC.Decode($V)
56
+ metadata:
57
+ cwe: "CWE-502: Deserialization of Untrusted Data"
58
+ severity: WARNING
59
+ precision: low
60
+ category: deserialization
61
+ likelihood: MEDIUM
62
+ impact: MEDIUM
63
+ owasp: "A08:2021 - Software and Data Integrity Failures"
64
+ references:
65
+ - "https://pkg.go.dev/encoding/json"
66
+
67
+ # ZM-GO-DESER-003: xml.Decoder 外部实体未禁用
68
+ - id: zm-go-deser-003
69
+ severity: HIGH
70
+ message: |
71
+ 检测到 encoding/xml 的 Decoder 反序列化XML数据。
72
+ Go的 xml.Decoder 默认禁用外部实体,但若显式设置
73
+ Decoder.Entity 字段,可能引入 XXE 攻击风险。
74
+
75
+ 修复方案:
76
+ 1. 使用默认的 xml.NewDecoder() 不做额外配置(Go 1.17+ 默认安全)
77
+ 2. 若必须设置 Entity,确保映射仅包含安全值
78
+ 3. 考虑使用更安全的XML解析库或切换到JSON
79
+ languages:
80
+ - go
81
+ pattern-either:
82
+ - pattern: xml.NewDecoder($R).Decode($V)
83
+ - pattern: xml.Unmarshal($DATA, $V)
84
+ metadata:
85
+ cwe: "CWE-502: Deserialization of Untrusted Data"
86
+ severity: HIGH
87
+ precision: medium
88
+ category: deserialization
89
+ likelihood: LOW
90
+ impact: HIGH
91
+ owasp: "A08:2021 - Software and Data Integrity Failures"
92
+ references:
93
+ - "https://pkg.go.dev/encoding/xml"
94
+
95
+ # ZM-GO-DESER-004: binary.Read 二进制反序列化
96
+ - id: zm-go-deser-004
97
+ severity: WARNING
98
+ message: |
99
+ 检测到 encoding/binary 的 Read() 从不可信输入读取二进制数据。
100
+ 若输入攻击者可控,可能构造恶意二进制数据导致越界读取或内存损坏。
101
+
102
+ 修复方案:
103
+ 1. 仅从可信来源读取二进制数据
104
+ 2. 使用 io.LimitReader 限制读取大小
105
+ 3. 对二进制数据做完整性校验(CRC/MD5签名)
106
+ 4. 考虑使用 Protobuf 等有类型信息的序列化格式
107
+ languages:
108
+ - go
109
+ pattern-either:
110
+ - pattern: binary.Read($R, binary.BigEndian, $V)
111
+ - pattern: binary.Read($R, binary.LittleEndian, $V)
112
+ - pattern: binary.Read($R, $ORDER, $V)
113
+ metadata:
114
+ cwe: "CWE-502: Deserialization of Untrusted Data"
115
+ severity: WARNING
116
+ precision: low
117
+ category: deserialization
118
+ likelihood: MEDIUM
119
+ impact: MEDIUM
120
+ owasp: "A08:2021 - Software and Data Integrity Failures"
@@ -0,0 +1,95 @@
1
+ # CWE-78: Go OS 命令注入检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: os/exec.Command 启动Shell执行用户输入、syscall.Exec
4
+
5
+ rules:
6
+
7
+ # ZM-GO-OSCI-001: exec.Command 调用Shell执行变量参数
8
+ - id: zm-go-osci-001
9
+ severity: CRITICAL
10
+ message: |
11
+ 检测到 os/exec 的 Command() 使用 "sh"/"bash"/"cmd" 等Shell解释器
12
+ 且参数中包含变量。攻击者可通过用户输入注入额外命令
13
+ (如 ; id、| nc、$(cat /etc/passwd) 等),实现远程代码执行。
14
+
15
+ 修复方案:
16
+ 1. 使用 exec.Command() 直接调用二进制文件,不通过Shell:
17
+ exec.Command("git", "log", "--oneline") 而非 exec.Command("sh", "-c", "git log")
18
+ 2. 避免将用户输入拼入命令字符串或Shell参数
19
+ 3. 对必须传入Shell的命令,使用 shell-quote 库转义用户输入
20
+ 4. 优先使用 Go 标准库函数替代外部命令(如 os.ReadFile 代替 cat)
21
+ languages:
22
+ - go
23
+ pattern-either:
24
+ - pattern: exec.Command("sh", "-c", $INPUT)
25
+ - pattern: exec.Command("bash", "-c", $INPUT)
26
+ - pattern: exec.Command("zsh", "-c", $INPUT)
27
+ - pattern: exec.Command("/bin/sh", "-c", $INPUT)
28
+ - pattern: exec.Command("/bin/bash", "-c", $INPUT)
29
+ - pattern: exec.Command("cmd", "/C", $INPUT)
30
+ - pattern: exec.Command("cmd", "/c", $INPUT)
31
+ - pattern: exec.Command("cmd.exe", "/C", $INPUT)
32
+ - pattern: exec.Command("powershell", "-Command", $INPUT)
33
+ - pattern: exec.Command("pwsh", "-Command", $INPUT)
34
+ - pattern: exec.Command("powershell.exe", "-Command", $INPUT)
35
+ metadata:
36
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
37
+ severity: CRITICAL
38
+ precision: high
39
+ category: command-injection
40
+ likelihood: HIGH
41
+ impact: CRITICAL
42
+ owasp: "A03:2021 - Injection"
43
+ references:
44
+ - "https://pkg.go.dev/os/exec"
45
+ - "https://owasp.org/www-community/attacks/Command_Injection"
46
+
47
+ # ZM-GO-OSCI-002: syscall.Exec 执行用户可控路径
48
+ - id: zm-go-osci-002
49
+ severity: CRITICAL
50
+ message: |
51
+ 检测到 syscall.Exec() 使用变量作为可执行文件路径。
52
+ syscall.Exec 直接替换当前进程镜像,若路径可控将导致任意代码执行。
53
+
54
+ 修复方案:
55
+ 1. 校验可执行文件路径必须在白名单目录内
56
+ 2. 使用绝对路径替代相对路径
57
+ 3. 迁移至 os/exec 包(syscall 已弃用,Go 1.17+)
58
+ languages:
59
+ - go
60
+ pattern-either:
61
+ - pattern: syscall.Exec($PATH, $ARGS, $ENV)
62
+ - pattern: syscall.Exec($PATH, nil, nil)
63
+ metadata:
64
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
65
+ severity: CRITICAL
66
+ precision: high
67
+ category: command-injection
68
+ likelihood: MEDIUM
69
+ impact: CRITICAL
70
+ owasp: "A03:2021 - Injection"
71
+
72
+ # ZM-GO-OSCI-003: exec.Command 命令名来自变量
73
+ - id: zm-go-osci-003
74
+ severity: HIGH
75
+ message: |
76
+ 检测到 os/exec 的 Command() 第一个参数(命令名)来自变量。
77
+ 若该变量由用户输入控制,攻击者可指定任意可执行文件路径实现代码执行。
78
+
79
+ 修复方案:
80
+ 1. 命令名使用字面量字符串,参数通过后续参数传入
81
+ 2. 对命令名做严格白名单校验
82
+ 3. 避免从用户输入直接构造命令路径
83
+ languages:
84
+ - go
85
+ pattern-either:
86
+ - pattern: exec.Command($CMD, $ARGS)
87
+ - pattern: exec.CommandContext($CTX, $CMD, $ARGS)
88
+ metadata:
89
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
90
+ severity: HIGH
91
+ precision: medium
92
+ category: command-injection
93
+ likelihood: MEDIUM
94
+ impact: HIGH
95
+ owasp: "A03:2021 - Injection"
@@ -0,0 +1,104 @@
1
+ # CWE-79: Go XSS 检测
2
+ # 逐码 ZhuMa V4.1 — Go 通用规则库
3
+ # 检测: template.HTML 标记用户输入为安全 / 使用 text/template 渲染HTML
4
+
5
+ rules:
6
+
7
+ # ZM-GO-XSS-001: template.HTML() 转换用户可控字符串
8
+ - id: zm-go-xss-001
9
+ severity: HIGH
10
+ message: |
11
+ 检测到使用 html/template 的 template.HTML() 类型转换将字符串标记为
12
+ "安全HTML"直接输出。若该字符串包含用户输入,攻击者可注入
13
+ <script>、<img onerror=> 等XSS payload。
14
+
15
+ Go html/template 会自动转义所有字符串输出,但 template.HTML 类型
16
+ 会绕过此保护,直接原样输出。这是Go XSS的第一大根因。
17
+
18
+ 修复方案:
19
+ 1. 删除 template.HTML() 转换,让 html/template 自动转义
20
+ 2. 仅对可信的内部静态HTML片段使用 template.HTML()
21
+ 3. 对用户输入使用 bluemonday 等HTML清洗库后再转换
22
+ 4. 使用 template.JSStr() 替代 template.HTML() 输出到JS上下文
23
+ languages:
24
+ - go
25
+ pattern-either:
26
+ - pattern: template.HTML($INPUT)
27
+ - pattern: template.HTML($VAR)
28
+ metadata:
29
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
30
+ severity: HIGH
31
+ precision: high
32
+ category: xss
33
+ likelihood: MEDIUM
34
+ impact: HIGH
35
+ owasp: "A03:2021 - Injection"
36
+ references:
37
+ - "https://pkg.go.dev/html/template#HTML"
38
+ - "https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"
39
+
40
+ # ZM-GO-XSS-002: template.JS / template.CSS / template.URL 注入
41
+ - id: zm-go-xss-002
42
+ severity: HIGH
43
+ message: |
44
+ 检测到 template.JS() / template.CSS() / template.URL() / template.HTMLAttr()
45
+ 将用户输入标记为安全内容直接插入JS/CSS/URL/属性上下文。
46
+ 各类转换绕过上下文特定的自动转义,可能导致XSS。
47
+
48
+ 修复方案:
49
+ 1. 使用 html/template 默认转义,不手动标记安全类型
50
+ 2. 对JSON数据使用 template.JSStr() 替代 template.JS()
51
+ 3. URL使用 url.QueryEscape() 编码
52
+ 4. 绝对必要时对输入做严格的白名单校验
53
+ languages:
54
+ - go
55
+ pattern-either:
56
+ - pattern: template.JS($INPUT)
57
+ - pattern: template.JSStr($INPUT)
58
+ - pattern: template.CSS($INPUT)
59
+ - pattern: template.URL($INPUT)
60
+ - pattern: template.HTMLAttr($INPUT)
61
+ - pattern: template.Srcset($INPUT)
62
+ metadata:
63
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
64
+ severity: HIGH
65
+ precision: high
66
+ category: xss
67
+ likelihood: MEDIUM
68
+ impact: HIGH
69
+ owasp: "A03:2021 - Injection"
70
+ references:
71
+ - "https://pkg.go.dev/html/template"
72
+
73
+ # ZM-GO-XSS-003: text/template 用于HTML渲染
74
+ - id: zm-go-xss-003
75
+ severity: HIGH
76
+ message: |
77
+ 检测到使用 text/template 进行模板渲染(Template.Execute / Must)。
78
+ text/template 不提供任何HTML自动转义,所有变量直接输出到页面。
79
+ 若模板内容中包含用户输入且输出到HTML页面,将导致XSS漏洞。
80
+
81
+ 修复方案:
82
+ 1. 将 "text/template" 替换为 "html/template"
83
+ 2. html/template 会基于上下文自动选择转义策略(HTML/JS/CSS/URL)
84
+ 3. 两个包的API完全兼容,仅需修改import路径
85
+ languages:
86
+ - go
87
+ pattern-either:
88
+ - pattern: texttemplate.Execute($W, $DATA)
89
+ - pattern: texttemplate.ExecuteTemplate($W, $NAME, $DATA)
90
+ - pattern: template.Must(...)
91
+ - pattern: template.New($NAME)
92
+ - pattern: template.ParseFiles(...)
93
+ - pattern: template.ParseGlob(...)
94
+ metadata:
95
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
96
+ severity: HIGH
97
+ precision: medium
98
+ category: xss
99
+ likelihood: HIGH
100
+ impact: HIGH
101
+ owasp: "A03:2021 - Injection"
102
+ references:
103
+ - "https://pkg.go.dev/text/template"
104
+ - "https://pkg.go.dev/html/template"