@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,108 @@
1
+ # CWE-611: Node.js XML外部实体注入(XXE)检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 2 — JS/TS 规则库
3
+ # 覆盖: libxmljs、xml2js、xml-js、fast-xml-parser
4
+
5
+ rules:
6
+
7
+ # ZM-JS-XXE-001: libxmljs.parseXml 未禁用 noent / xinclude
8
+ - id: zm-js-xxe-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到 libxmljs.parseXml() 可能未禁用外部实体解析。
12
+ 若设置了 noent: true(展开实体)且未同时禁用外部资源加载,攻击者可通过
13
+ 恶意XML读取任意文件(如 /etc/passwd)或发起SSRF。
14
+
15
+ 修复:
16
+ 1. libxmljs.parseXml(xml, { noent: false, noNet: true })
17
+ 2. 或 libxmljs.parseXmlString(xml, { noent: false })
18
+ 3. 禁用 DTD 加载: { dtdload: false, doctype: false }
19
+ 4. 升级 libxmljs 到最新版本,检查安全公告
20
+ languages:
21
+ - javascript
22
+ - typescript
23
+ pattern-either:
24
+ - pattern: libxmljs.parseXml(...)
25
+ - pattern: $LIBXML.parseXml(...)
26
+ - pattern: libxmljs.parseXmlString(...)
27
+ - pattern: $LIBXML.parseXmlString(...)
28
+ - pattern: libxmljs.parseHtml(...)
29
+ - pattern: $LIBXML.parseHtml(...)
30
+ - pattern: $LIBXML.parseXml($REQ.body, ...)
31
+ - pattern: $LIBXML.parseXml($REQ.query, ...)
32
+ - pattern: $LIBXML.parseXmlString($REQ.body, ...)
33
+ - pattern: $LIBXML.parseXmlString($REQ.query, ...)
34
+ metadata:
35
+ cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
36
+ owasp: "A05:2021 - Security Misconfiguration"
37
+ category: xxe
38
+ precision: medium
39
+ references:
40
+ - "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
41
+ - "https://github.com/libxmljs/libxmljs/wiki/Security"
42
+
43
+ # ZM-JS-XXE-002: xml2js.Parser 默认配置不安全
44
+ - id: zm-js-xxe-002
45
+ severity: ERROR
46
+ message: |
47
+ 检测到 xml2js.Parser / xml2js.parseString 可能未禁用实体解析和外部DTD加载。
48
+ 默认 xml2js 本身不解析实体,但底层 sax parser 可能受XXE影响。
49
+
50
+ 修复:
51
+ 1. new xml2js.Parser({ explicitCharkey: true, ... }) 本身较安全
52
+ 2. 如使用 xml2js 配合其他XML解析器,需确保底层解析器禁用DTD/实体
53
+ 3. 升级 xml2js 到 >=0.5.0 版本
54
+ 4. 可选替代: fast-xml-parser (默认安全)
55
+ languages:
56
+ - javascript
57
+ - typescript
58
+ pattern-either:
59
+ - pattern: new xml2js.Parser(...)
60
+ - pattern: xml2js.parseString($REQ.body, ...)
61
+ - pattern: xml2js.parseString($REQ.query, ...)
62
+ - pattern: xml2js.parseString($REQ.params, ...)
63
+ - pattern: $PARSER.parseString($REQ.body, ...)
64
+ - pattern: $PARSER.parseString($REQ.query, ...)
65
+ - pattern: $PARSER.parseString($REQ.params, ...)
66
+ metadata:
67
+ cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
68
+ owasp: "A05:2021 - Security Misconfiguration"
69
+ category: xxe
70
+ precision: medium
71
+ references:
72
+ - "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
73
+
74
+ # ZM-JS-XXE-003: xml-js / fast-xml-parser 用户输入XML解析
75
+ - id: zm-js-xxe-003
76
+ severity: WARNING
77
+ message: |
78
+ 检测到使用 xml-js / fast-xml-parser 解析来自 req.body / req.query 的用户输入XML。
79
+ 虽然 fast-xml-parser 默认不解析DTD/实体(xml-js类似),但仍需注意:
80
+ - fast-xml-parser: 默认 processEntities: false, ignoreAttributes: false 基本安全
81
+ - xml-js: 纯JS实现不解析DTD,但Billion Laughs攻击可能仍影响内存
82
+
83
+ 修复:
84
+ 1. fast-xml-parser: 确认 options 中 processEntities 为 false
85
+ 2. xml-js: 设置大小限制防止Billion Laughs/Quadratic Blowup
86
+ 3. 所有XML解析器: 设置输入大小上限,使用流式解析
87
+ languages:
88
+ - javascript
89
+ - typescript
90
+ pattern-either:
91
+ - pattern: xmljs.xml2js($REQ.body, ...)
92
+ - pattern: xmljs.xml2js($REQ.query, ...)
93
+ - pattern: xmljs.xml2json($REQ.body, ...)
94
+ - pattern: xmljs.xml2json($REQ.query, ...)
95
+ - pattern: convert.xml2js($REQ.body, ...)
96
+ - pattern: convert.xml2json($REQ.body, ...)
97
+ - pattern: XMLParser.parse($REQ.body, ...)
98
+ - pattern: XMLParser.parse($REQ.query, ...)
99
+ - pattern: xmlParser.parse($REQ.body, ...)
100
+ - pattern: xmlParser.parse($REQ.query, ...)
101
+ metadata:
102
+ cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
103
+ owasp: "A05:2021 - Security Misconfiguration"
104
+ category: xxe
105
+ precision: low
106
+ references:
107
+ - "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
108
+ - "https://github.com/NaturalIntelligence/fast-xml-parser"
@@ -0,0 +1,122 @@
1
+ # CWE-639: Node.js 不安全直接对象引用 (IDOR) 检测
2
+ # 逐码 ZhuMa V4.1 Sprint — JS/TS 规则库
3
+ # 覆盖: req.params.id直传DB查询、express路由参数未校验所有权
4
+
5
+ rules:
6
+
7
+ # ZM-JS-IDOR-001: req.params.id 直接传入数据库查询无所有权校验
8
+ - id: zm-js-idor-001
9
+ severity: WARNING
10
+ message: |
11
+ 检测到 Express 路由中 req.params.id 直接传入数据库查询(如 findById / findOne),
12
+ 未发现所有权校验(如关联 currentUser.id 过滤)。
13
+
14
+ 攻击者可通过遍历ID访问其他用户的资源(订单、文档、个人资料等):
15
+ GET /api/orders/123 → 修改为 GET /api/orders/124 可查看他人订单
16
+
17
+ 修复:
18
+ 1. 查询时关联当前用户: Model.findOne({ _id: id, userId: req.user.id })
19
+ 2. 使用中间件校验资源所有权后再执行控制器
20
+ 3. 使用 UUID/nanoid 替代自增ID
21
+ 4. 在数据访问层统一添加所有权过滤
22
+ languages:
23
+ - javascript
24
+ - typescript
25
+ patterns:
26
+ - pattern-either:
27
+ # Mongoose
28
+ - pattern: |
29
+ $MODEL.findById($REQ.params.$ID, ...)
30
+ - pattern: |
31
+ $MODEL.findOne({_id: $REQ.params.$ID, ...}, ...)
32
+ - pattern: |
33
+ $MODEL.findByIdAndUpdate($REQ.params.$ID, ...)
34
+ - pattern: |
35
+ $MODEL.findByIdAndDelete($REQ.params.$ID, ...)
36
+ # Sequelize
37
+ - pattern: |
38
+ $MODEL.findByPk($REQ.params.$ID, ...)
39
+ - pattern: |
40
+ $MODEL.findOne({where: {id: $REQ.params.$ID, ...}}, ...)
41
+ - pattern: |
42
+ $MODEL.destroy({where: {id: $REQ.params.$ID, ...}}, ...)
43
+ # Knex
44
+ - pattern: |
45
+ $DB($TABLE).where('id', $REQ.params.$ID)
46
+ - pattern: |
47
+ $DB($TABLE).where({id: $REQ.params.$ID})
48
+ - pattern-not-inside: |
49
+ {...userId: ..., ...}
50
+ - pattern-not-inside: |
51
+ {...user: ..., ...}
52
+ metadata:
53
+ cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
54
+ owasp: "A01:2021 - Broken Access Control"
55
+ category: idor
56
+ precision: medium
57
+ confidence: high
58
+ references:
59
+ - "https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References"
60
+
61
+ # ZM-JS-IDOR-002: req.body.xxx 资源ID未校验所有权写入
62
+ - id: zm-js-idor-002
63
+ severity: WARNING
64
+ message: |
65
+ 检测到使用 req.body.xxx 中的资源ID进行更新/删除操作,未关联当前用户身份校验。
66
+ 攻击者可修改请求体中的ID字段,越权操作他人的资源。
67
+
68
+ 修复:
69
+ 1. 从认证上下文获取当前用户ID,而非从请求体
70
+ 2. 查询时添加所有权过滤条件
71
+ 3. 使用 JWT token 中提取的用户身份做关联
72
+ languages:
73
+ - javascript
74
+ - typescript
75
+ patterns:
76
+ - pattern-either:
77
+ - pattern: |
78
+ $MODEL.updateOne({_id: $REQ.body.$ID, ...}, ...)
79
+ - pattern: |
80
+ $MODEL.updateMany({_id: $REQ.body.$ID, ...}, ...)
81
+ - pattern: |
82
+ $MODEL.deleteOne({_id: $REQ.body.$ID, ...})
83
+ - pattern: |
84
+ $MODEL.findOneAndUpdate({_id: $REQ.body.$ID, ...}, ...)
85
+ - pattern-not-inside: |
86
+ {...userId: ..., ...}
87
+ - pattern-not-inside: |
88
+ {...user: ..., ...}
89
+ metadata:
90
+ cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
91
+ owasp: "A01:2021 - Broken Access Control"
92
+ category: idor
93
+ precision: medium
94
+ confidence: high
95
+
96
+ # ZM-JS-IDOR-003: GraphQL resolver 直接使用 args.id 无权限校验
97
+ - id: zm-js-idor-003
98
+ severity: WARNING
99
+ message: |
100
+ 检测到 GraphQL resolver 中直接使用 args.id 查询数据库,无所有权校验。
101
+ GraphQL 查询可任意指定ID参数,需在 resolver 中校验资源所属。
102
+
103
+ 修复:
104
+ 1. 在 resolver 中从 context 获取当前用户并关联查询
105
+ 2. 使用 DataLoader 批量加载时自动注入所有权过滤
106
+ 3. 实现 GraphQL shield / 自定义 directive 做权限控制
107
+ languages:
108
+ - javascript
109
+ - typescript
110
+ pattern-either:
111
+ - pattern: |
112
+ $MODEL.findById($ARGS.id, ...)
113
+ - pattern: |
114
+ $MODEL.findOne({_id: $ARGS.id, ...}, ...)
115
+ - pattern: |
116
+ $MODEL.findByPk($ARGS.id, ...)
117
+ metadata:
118
+ cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
119
+ owasp: "A01:2021 - Broken Access Control"
120
+ category: idor
121
+ precision: medium
122
+ confidence: high
@@ -0,0 +1,46 @@
1
+ # CWE-693: Express Helmet 安全头缺失检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JS-SECHEADER-001: Express 应用未使用 helmet 中间件
7
+ - id: zm-js-secheader-001
8
+ severity: INFO
9
+ message: |
10
+ 检测到 Express 应用中未发现 helmet() 中间件的使用。
11
+ helmet 可自动设置多个安全相关 HTTP 响应头(X-Content-Type-Options、
12
+ X-Frame-Options、Content-Security-Policy 等),缺少这些头部降低了
13
+ 应用的纵深防御能力。
14
+
15
+ 修复建议:
16
+ 1. 安装并全局使用 helmet: app.use(helmet())
17
+ 2. 按需配置各中间件(如 helmet.contentSecurityPolicy())
18
+ 3. 至少设置以下头部:
19
+ - X-Content-Type-Options: nosniff
20
+ - X-Frame-Options: DENY
21
+ - Strict-Transport-Security: max-age=31536000
22
+ languages:
23
+ - javascript
24
+ - typescript
25
+ patterns:
26
+ - pattern-either:
27
+ - pattern: |
28
+ const $APP = express();
29
+ ...
30
+ - pattern: |
31
+ const $APP = express();
32
+ ...
33
+ $APP.use(...);
34
+ ...
35
+ - pattern-not-inside: |
36
+ ...
37
+ $APP.use(helmet(...));
38
+ ...
39
+ metadata:
40
+ cwe: "CWE-693: Protection Mechanism Failure"
41
+ owasp: "A05:2021 - Security Misconfiguration"
42
+ category: config
43
+ precision: low
44
+ references:
45
+ - "https://helmetjs.github.io/"
46
+ - "https://owasp.org/www-project-secure-headers/"
@@ -0,0 +1,37 @@
1
+ # CWE-78: Node.js child_process exec/execSync 命令注入检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JS-OSCI-001: child_process exec/execSync 命令字符串拼接注入
7
+ - id: zm-js-osci-001
8
+ severity: ERROR
9
+ message: |
10
+ 检测到 child_process.exec() / execSync() 使用了字符串拼接或模板字符串构造命令。
11
+ 攻击者可通过控制变量注入额外系统命令(如 ; rm -rf / 或 $(whoami))。
12
+
13
+ 修复建议:
14
+ 1. 优先使用 execFile() / spawn() 替代 exec(),参数独立传入避免 Shell 解析
15
+ 2. 如必须使用 exec(),对用户输入做严格白名单校验
16
+ 3. 禁止将用户输入拼接到命令字符串中
17
+ 4. 使用 shell-escape / shell-quote 库对参数进行转义
18
+ languages:
19
+ - javascript
20
+ - typescript
21
+ pattern-either:
22
+ - pattern: exec($X + ...)
23
+ - pattern: exec(... + $X)
24
+ - pattern: execSync($X + ...)
25
+ - pattern: execSync(... + $X)
26
+ - pattern: $CP.exec($X + ...)
27
+ - pattern: $CP.exec(... + $X)
28
+ - pattern: $CP.execSync($X + ...)
29
+ - pattern: $CP.execSync(... + $X)
30
+ metadata:
31
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
32
+ owasp: "A03:2021 - Injection"
33
+ category: command-injection
34
+ precision: medium
35
+ references:
36
+ - "https://owasp.org/www-community/attacks/Command_Injection"
37
+ - "https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback"
@@ -0,0 +1,37 @@
1
+ # CWE-78: Node.js child_process spawn 不安全参数检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JS-OSCI-002: spawn 命令来自变量且开启 shell 选项
7
+ - id: zm-js-osci-002
8
+ severity: ERROR
9
+ message: |
10
+ 检测到 child_process.spawn() 命令参数来自变量且配置了 shell: true 选项。
11
+ 当 shell 选项开启时,命令字符串会被系统 Shell 解析(如 /bin/sh -c),
12
+ 存在命令注入风险。
13
+
14
+ 修复建议:
15
+ 1. 关闭 shell 选项(默认值为 false)
16
+ 2. 命令使用字面量字符串,参数通过 args 数组独立传入
17
+ 3. 对用户输入做严格白名单校验
18
+ languages:
19
+ - javascript
20
+ - typescript
21
+ pattern-either:
22
+ - pattern: |
23
+ spawn($CMD, {..., shell: true, ...})
24
+ - pattern: |
25
+ spawn($CMD, $ARGS, {..., shell: true, ...})
26
+ - pattern: |
27
+ $CP.spawn($CMD, {..., shell: true, ...})
28
+ - pattern: |
29
+ $CP.spawn($CMD, $ARGS, {..., shell: true, ...})
30
+ metadata:
31
+ cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
32
+ owasp: "A03:2021 - Injection"
33
+ category: command-injection
34
+ precision: high
35
+ references:
36
+ - "https://nodejs.org/api/child_process.html#child_processspawncommand-args-options"
37
+ - "https://owasp.org/www-community/attacks/Command_Injection"
@@ -0,0 +1,84 @@
1
+ # CWE-79: DOM-based XSS 检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JS-DOMXSS-001: innerHTML / outerHTML 赋值
7
+ - id: zm-js-domxss-001
8
+ severity: WARNING
9
+ message: |
10
+ 检测到使用 innerHTML 或 outerHTML 赋值操作,可能引入 DOM-based XSS。
11
+ 直接向 innerHTML 设置用户输入会导致浏览器解析并执行内嵌的 <script> 标签。
12
+
13
+ 修复建议:
14
+ 1. 使用 textContent 替代 innerHTML 设置纯文本
15
+ 2. 使用 document.createElement() + appendChild() 安全构建 DOM
16
+ 3. 如必须使用 innerHTML,先用 DOMPurify 对内容消毒
17
+ 4. 使用 Content Security Policy (CSP) 作为纵深防御
18
+ languages:
19
+ - javascript
20
+ - typescript
21
+ pattern-either:
22
+ - pattern: $EL.innerHTML = $X
23
+ - pattern: $EL.outerHTML = $X
24
+ - pattern: $EL.innerHTML += $X
25
+ - pattern: $EL.outerHTML += $X
26
+ metadata:
27
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
28
+ owasp: "A03:2021 - Injection"
29
+ category: xss
30
+ precision: high
31
+ references:
32
+ - "https://owasp.org/www-community/attacks/DOM_Based_XSS"
33
+ - "https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html"
34
+
35
+ # ZM-JS-DOMXSS-002: document.write / document.writeln
36
+ - id: zm-js-domxss-002
37
+ severity: WARNING
38
+ message: |
39
+ 检测到使用 document.write() 或 document.writeln() 写入 DOM。
40
+ 这些 API 会直接向文档写入原始 HTML,若内容由用户控制将导致 XSS。
41
+
42
+ 修复建议:
43
+ 1. 禁止使用 document.write(),使用安全的 DOM API 替代
44
+ 2. document.createElement() + textContent 安全构建内容
45
+ 3. 使用 insertAdjacentHTML 时也需 DOMPurify 消毒
46
+ languages:
47
+ - javascript
48
+ - typescript
49
+ pattern-either:
50
+ - pattern: document.write($X)
51
+ - pattern: document.writeln($X)
52
+ metadata:
53
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
54
+ owasp: "A03:2021 - Injection"
55
+ category: xss
56
+ precision: very-high
57
+ references:
58
+ - "https://developer.mozilla.org/en-US/docs/Web/API/Document/write"
59
+ - "https://owasp.org/www-community/attacks/DOM_Based_XSS"
60
+
61
+ # ZM-JS-DOMXSS-003: insertAdjacentHTML
62
+ - id: zm-js-domxss-003
63
+ severity: WARNING
64
+ message: |
65
+ 检测到使用 insertAdjacentHTML() 方法插入 HTML 内容。
66
+ 与 innerHTML 类似,插入的 HTML 字符串会被解析,存在 DOM XSS 风险。
67
+
68
+ 修复建议:
69
+ 1. 使用 insertAdjacentElement() 替代 insertAdjacentHTML()
70
+ 2. 如必须使用 HTML 插入,用 DOMPurify 消毒后操作
71
+ 3. 优先使用 DOM 创建 API (createElement / createTextNode)
72
+ languages:
73
+ - javascript
74
+ - typescript
75
+ pattern-either:
76
+ - pattern: $EL.insertAdjacentHTML($POS, $X)
77
+ metadata:
78
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
79
+ owasp: "A03:2021 - Injection"
80
+ category: xss
81
+ precision: high
82
+ references:
83
+ - "https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML"
84
+ - "https://owasp.org/www-community/attacks/DOM_Based_XSS"
@@ -0,0 +1,18 @@
1
+ # CWE-79: React dangerouslySetInnerHTML XSS 检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1
3
+
4
+ rules:
5
+
6
+ - id: zm-js-rxss-001
7
+ severity: WARNING
8
+ message: |
9
+ dangerouslySetInnerHTML bypasses React XSS protection — sanitize with DOMPurify first.
10
+ languages:
11
+ - javascript
12
+ - typescript
13
+ pattern: dangerouslySetInnerHTML
14
+ metadata:
15
+ cwe: "CWE-79"
16
+ precision: very-high
17
+ category: xss
18
+ owasp: "A03:2021 - Injection"
@@ -0,0 +1,70 @@
1
+ # CWE-79: Express XSS 模板注入检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
3
+
4
+ rules:
5
+
6
+ # ZM-JS-XSS-001: res.render 直接传入用户可控数据
7
+ - id: zm-js-xss-001
8
+ severity: WARNING
9
+ message: |
10
+ 检测到 res.render() 将 req.body / req.query / req.params 直接传入模板变量。
11
+ 未经过 HTML 实体转义的用户输入在模板中渲染可能导致存储型/反射型 XSS 攻击。
12
+
13
+ 修复建议:
14
+ 1. 对用户输入进行 HTML 实体编码(如使用 DOMPurify / xss 库或模板引擎自动转义)
15
+ 2. 使用 EJS 的 <%= %> 代替 <%- %>(前者自动转义)
16
+ 3. 在模板中避免使用 raw / unescaped 输出模式
17
+ 4. 设置 Content-Security-Policy 响应头作为纵深防御
18
+ languages:
19
+ - javascript
20
+ - typescript
21
+ pattern-either:
22
+ - pattern: |
23
+ res.render($TEMPLATE, {..., $KEY: $REQ.body, ...})
24
+ - pattern: |
25
+ res.render($TEMPLATE, {..., $KEY: $REQ.query, ...})
26
+ - pattern: |
27
+ res.render($TEMPLATE, {..., $KEY: $REQ.params, ...})
28
+ - pattern: |
29
+ res.render($TEMPLATE, $REQ.body)
30
+ - pattern: |
31
+ res.render($TEMPLATE, $REQ.query)
32
+ - pattern: |
33
+ res.render($TEMPLATE, $REQ.params)
34
+ metadata:
35
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
36
+ owasp: "A03:2021 - Injection"
37
+ category: xss
38
+ precision: medium
39
+ references:
40
+ - "https://owasp.org/www-community/attacks/xss/"
41
+ - "https://expressjs.com/en/4x/api.html#res.render"
42
+
43
+ # ZM-JS-XSS-002: res.send 直接输出用户输入
44
+ - id: zm-js-xss-002
45
+ severity: WARNING
46
+ message: |
47
+ 检测到 res.send() 直接输出 req.body / req.query / req.params 中的值。
48
+ 若 Content-Type 为 text/html,可能导致反射型 XSS。
49
+
50
+ 修复建议:
51
+ 1. 避免直接输出用户输入;如需要,使用 HTML 实体编码后输出
52
+ 2. 显式设置 Content-Type: text/plain 防止浏览器解析 HTML
53
+ 3. 使用 res.json() 代替 res.send() 输出 JSON 数据
54
+ languages:
55
+ - javascript
56
+ - typescript
57
+ pattern-either:
58
+ - pattern: res.send($REQ.body)
59
+ - pattern: res.send($REQ.query)
60
+ - pattern: res.send($REQ.params)
61
+ - pattern: res.send($REQ.body.$PROP)
62
+ - pattern: res.send($REQ.query.$PROP)
63
+ - pattern: res.send($REQ.params.$PROP)
64
+ metadata:
65
+ cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
66
+ owasp: "A03:2021 - Injection"
67
+ category: xss
68
+ precision: medium
69
+ references:
70
+ - "https://owasp.org/www-community/attacks/xss/"
@@ -0,0 +1,153 @@
1
+ # CWE-89: Node.js SQL注入检测规则
2
+ # 逐码 ZhuMa V4.1 Sprint 2 — JS/TS 规则库
3
+ # 覆盖: mysql2.query、sequelize.query(raw)、knex.raw、pg.query、sqlite3
4
+
5
+ rules:
6
+
7
+ # ZM-JS-SQLI-001: SQL驱动字符串拼接查询(高精度)
8
+ - id: zm-js-sqli-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到SQL查询使用了字符串拼接或模板字符串构造SQL语句,存在SQL注入风险。
12
+ 攻击者可通过控制拼接变量注入SQL命令,实现数据库脱库、篡改或RCE。
13
+
14
+ 修复:
15
+ 1. 使用参数化查询(Parameterized Query)替代字符串拼接
16
+ 2. mysql2: connection.execute('SELECT * FROM users WHERE id = ?', [userId])
17
+ 3. pg: client.query('SELECT * FROM users WHERE id = $1', [userId])
18
+ 4. 如确实需要动态表名/列名,使用白名单校验
19
+ 5. 禁止 ORDER BY / GROUP BY / LIMIT 使用用户输入直接拼接
20
+ languages:
21
+ - javascript
22
+ - typescript
23
+ pattern-either:
24
+ # mysql2 query/execute 拼接
25
+ - pattern: $CONN.query('SELECT' + $INPUT, ...)
26
+ - pattern: $CONN.query('INSERT' + $INPUT, ...)
27
+ - pattern: $CONN.query('UPDATE' + $INPUT, ...)
28
+ - pattern: $CONN.query('DELETE' + $INPUT, ...)
29
+ - pattern: $CONN.execute('SELECT' + $INPUT, ...)
30
+ - pattern: $CONN.execute('INSERT' + $INPUT, ...)
31
+ - pattern: $CONN.execute('UPDATE' + $INPUT, ...)
32
+ - pattern: $CONN.query($QUERY + $INPUT, ...)
33
+ - pattern: $CONN.execute($QUERY + $INPUT, ...)
34
+ # pg query 拼接
35
+ - pattern: $POOL.query('SELECT' + $INPUT, ...)
36
+ - pattern: $CLIENT.query('SELECT' + $INPUT, ...)
37
+ - pattern: $POOL.query('INSERT' + $INPUT, ...)
38
+ - pattern: $CLIENT.query('INSERT' + $INPUT, ...)
39
+ - pattern: $POOL.query('UPDATE' + $INPUT, ...)
40
+ - pattern: $CLIENT.query('UPDATE' + $INPUT, ...)
41
+ - pattern: $POOL.query('DELETE' + $INPUT, ...)
42
+ - pattern: $CLIENT.query('DELETE' + $INPUT, ...)
43
+ # sqlite3 拼接
44
+ - pattern: $DB.run('SELECT' + $INPUT, ...)
45
+ - pattern: $DB.run('INSERT' + $INPUT, ...)
46
+ - pattern: $DB.run('UPDATE' + $INPUT, ...)
47
+ - pattern: $DB.run('DELETE' + $INPUT, ...)
48
+ - pattern: $DB.get('SELECT' + $INPUT, ...)
49
+ - pattern: $DB.all('SELECT' + $INPUT, ...)
50
+ - pattern: $DB.exec('SELECT' + $INPUT, ...)
51
+ # 模板字符串拼接
52
+ - pattern: $CONN.query(`SELECT ... ${$INPUT}`, ...)
53
+ - pattern: $CLIENT.query(`SELECT ... ${$INPUT}`, ...)
54
+ - pattern: $POOL.query(`SELECT ... ${$INPUT}`, ...)
55
+ - pattern: $DB.run(`SELECT ... ${$INPUT}`, ...)
56
+ - pattern: $DB.all(`SELECT ... ${$INPUT}`, ...)
57
+ metadata:
58
+ cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
59
+ owasp: "A03:2021 - Injection"
60
+ category: sql-injection
61
+ precision: medium
62
+ references:
63
+ - "https://owasp.org/www-community/attacks/SQL_Injection"
64
+ - "https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html"
65
+
66
+ # ZM-JS-SQLI-002: Sequelize.query raw / knex.raw 拼接
67
+ - id: zm-js-sqli-002
68
+ severity: ERROR
69
+ message: |
70
+ 检测到 Sequelize.query(raw: true) 或 knex.raw() 使用了字符串拼接构造SQL。
71
+ 这些方法会直接将字符串作为原始SQL执行,绕过ORM的参数化保护。
72
+
73
+ 修复:
74
+ 1. Sequelize: sequelize.query('SELECT * FROM users WHERE id = ?', { replacements: [userId] })
75
+ 2. Sequelize: sequelize.query('SELECT * FROM users WHERE id = :id', { replacements: { id: userId } })
76
+ 3. Knex: knex.raw('SELECT * FROM users WHERE id = ?', [userId])
77
+ 4. 尽量避免使用 raw query,优先使用 ORM 的链式API
78
+ languages:
79
+ - javascript
80
+ - typescript
81
+ pattern-either:
82
+ - pattern: $SEQ.query($QUERY + $INPUT, ...)
83
+ - pattern: $SEQ.query('SELECT' + $INPUT, ...)
84
+ - pattern: $SEQ.query('INSERT' + $INPUT, ...)
85
+ - pattern: $SEQ.query('UPDATE' + $INPUT, ...)
86
+ - pattern: $SEQ.query('DELETE' + $INPUT, ...)
87
+ - pattern: knex.raw($QUERY + $INPUT, ...)
88
+ - pattern: knex.raw('SELECT' + $INPUT, ...)
89
+ - pattern: knex.raw('INSERT' + $INPUT, ...)
90
+ - pattern: knex.raw('UPDATE' + $INPUT, ...)
91
+ - pattern: knex.raw('DELETE' + $INPUT, ...)
92
+ - pattern: $KNEX.raw('SELECT' + $INPUT, ...)
93
+ - pattern: $KNEX.raw('INSERT' + $INPUT, ...)
94
+ - pattern: $KNEX.raw('UPDATE' + $INPUT, ...)
95
+ - pattern: $KNEX.raw('DELETE' + $INPUT, ...)
96
+ - pattern: $SEQ.query(`SELECT ... ${$INPUT}`, ...)
97
+ - pattern: knex.raw(`SELECT ... ${$INPUT}`, ...)
98
+ metadata:
99
+ cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
100
+ owasp: "A03:2021 - Injection"
101
+ category: sql-injection
102
+ precision: high
103
+ references:
104
+ - "https://sequelize.org/docs/v6/core-concepts/raw-queries/"
105
+ - "https://knexjs.org/guide/raw.html"
106
+
107
+ # ZM-JS-SQLI-003: SQL查询中使用 req.query/params/body 拼接
108
+ - id: zm-js-sqli-003
109
+ severity: ERROR
110
+ message: |
111
+ 检测到SQL查询中直接拼接了 req.query / req.params / req.body 的用户输入。
112
+ 这是SQL注入的最高风险模式。
113
+
114
+ 修复:
115
+ 1. 立即替换为参数化查询:
116
+ db.query('SELECT * FROM users WHERE name = ?', [req.query.name])
117
+ 2. 使用查询构建器: knex.select().from('users').where('name', req.query.name)
118
+ 3. 永远不要将用户输入拼接到SQL字符串中
119
+ languages:
120
+ - javascript
121
+ - typescript
122
+ pattern-either:
123
+ - pattern: $CONN.query($QUERY + $REQ.query.$FIELD, ...)
124
+ - pattern: $CONN.query($QUERY + $REQ.params.$FIELD, ...)
125
+ - pattern: $CONN.query($QUERY + $REQ.body.$FIELD, ...)
126
+ - pattern: $CLIENT.query($QUERY + $REQ.query.$FIELD, ...)
127
+ - pattern: $CLIENT.query($QUERY + $REQ.params.$FIELD, ...)
128
+ - pattern: $CLIENT.query($QUERY + $REQ.body.$FIELD, ...)
129
+ - pattern: $POOL.query($QUERY + $REQ.query.$FIELD, ...)
130
+ - pattern: $POOL.query($QUERY + $REQ.params.$FIELD, ...)
131
+ - pattern: $POOL.query($QUERY + $REQ.body.$FIELD, ...)
132
+ - pattern: $DB.run($QUERY + $REQ.query.$FIELD, ...)
133
+ - pattern: $DB.run($QUERY + $REQ.params.$FIELD, ...)
134
+ - pattern: $DB.run($QUERY + $REQ.body.$FIELD, ...)
135
+ - pattern: $DB.all($QUERY + $REQ.query.$FIELD, ...)
136
+ - pattern: $DB.all($QUERY + $REQ.params.$FIELD, ...)
137
+ - pattern: $DB.all($QUERY + $REQ.body.$FIELD, ...)
138
+ - pattern: $DB.get($QUERY + $REQ.query.$FIELD, ...)
139
+ - pattern: $DB.get($QUERY + $REQ.params.$FIELD, ...)
140
+ - pattern: $DB.get($QUERY + $REQ.body.$FIELD, ...)
141
+ - pattern: knex.raw($QUERY + $REQ.query.$FIELD, ...)
142
+ - pattern: knex.raw($QUERY + $REQ.params.$FIELD, ...)
143
+ - pattern: knex.raw($QUERY + $REQ.body.$FIELD, ...)
144
+ - pattern: $SEQ.query($QUERY + $REQ.query.$FIELD, ...)
145
+ - pattern: $SEQ.query($QUERY + $REQ.params.$FIELD, ...)
146
+ - pattern: $SEQ.query($QUERY + $REQ.body.$FIELD, ...)
147
+ metadata:
148
+ cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
149
+ owasp: "A03:2021 - Injection"
150
+ category: sql-injection
151
+ precision: high
152
+ references:
153
+ - "https://owasp.org/www-community/attacks/SQL_Injection"