@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,86 @@
1
+ # CWE-798: Python 硬编码凭证检测
2
+ # 逐码 ZhuMa V4.1 — Python 通用规则库
3
+ # 检测: 硬编码 API_KEY / password / token / secret / database URL 含凭证
4
+
5
+ rules:
6
+
7
+ # ZM-PY-HC-01: 硬编码 API_KEY / SECRET_KEY / TOKEN / PASSWORD
8
+ - id: zm-py-hardcoded-creds-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到变量赋值中硬编码了 API_KEY / SECRET_KEY / TOKEN / PASSWORD 等凭证字符串。
12
+ 凭证泄露到代码仓库后攻击者可获取数据库/云服务/第三方 API 访问权限。
13
+ 修复: 使用环境变量 os.environ.get("KEY") 或密钥管理服务(Vault/AWS Secrets Manager)存储凭证。
14
+ languages:
15
+ - python
16
+ patterns:
17
+ - pattern: $VAR = "..."
18
+ - metavariable-regex:
19
+ metavariable: $VAR
20
+ regex: ^(API_KEY|API_SECRET|SECRET_KEY|SECRET|TOKEN|PASSWORD|PASSWD|DB_PASSWORD|REDIS_PASSWORD|AWS_SECRET|AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY|ACCESS_KEY|ACCESS_KEY_ID|PRIVATE_KEY|AUTH_TOKEN|CLIENT_SECRET|APP_SECRET)$
21
+ metadata:
22
+ cwe: "CWE-798: Use of Hard-coded Credentials"
23
+ severity: ERROR
24
+ precision: high
25
+ category: hardcoded-credentials
26
+ likelihood: HIGH
27
+ impact: CRITICAL
28
+ owasp: "A07:2021 - Identification and Authentication Failures"
29
+
30
+ # ZM-PY-HC-02: 硬编码 Database URL 含凭证
31
+ - id: zm-py-hardcoded-creds-002
32
+ severity: ERROR
33
+ message: |
34
+ 检测到硬编码的数据库连接字符串包含用户名密码(如 mysql://user:pass@host/db)。
35
+ DB 凭证泄露到代码仓库可导致数据库遭未授权访问或数据泄露。
36
+ 修复: 使用环境变量或配置中心存储 DB 连接字符串;代码中仅引用变量名。
37
+ languages:
38
+ - python
39
+ pattern-either:
40
+ - pattern: |
41
+ $DATABASE_URL = "mysql://...:...@..."
42
+ - pattern: |
43
+ $DATABASE_URL = "postgresql://...:...@..."
44
+ - pattern: |
45
+ $DATABASE_URL = "mongodb://...:...@..."
46
+ - pattern: |
47
+ $DATABASE_URL = "redis://...:...@..."
48
+ - pattern: |
49
+ $DB_URL = "mysql://...:...@..."
50
+ - pattern: |
51
+ $DB_URL = "postgresql://...:...@..."
52
+ - pattern: |
53
+ $SQLALCHEMY_DATABASE_URI = "mysql://...:...@..."
54
+ - pattern: |
55
+ $SQLALCHEMY_DATABASE_URI = "postgresql://...:...@..."
56
+ metadata:
57
+ cwe: "CWE-798: Use of Hard-coded Credentials"
58
+ severity: ERROR
59
+ precision: medium
60
+ category: hardcoded-credentials
61
+ likelihood: MEDIUM
62
+ impact: CRITICAL
63
+ owasp: "A07:2021 - Identification and Authentication Failures"
64
+
65
+ # ZM-PY-HC-03: 硬编码 JWT_SECRET / 加密密钥
66
+ - id: zm-py-hardcoded-creds-003
67
+ severity: ERROR
68
+ message: |
69
+ 检测到硬编码的 JWT_SECRET / ENCRYPTION_KEY 等加密密钥。
70
+ 密钥泄露后攻击者可伪造 JWT Token 或解密敏感数据。
71
+ 修复: 通过环境变量或密钥管理服务注入密钥;定期轮换密钥。
72
+ languages:
73
+ - python
74
+ patterns:
75
+ - pattern: $VAR = "..."
76
+ - metavariable-regex:
77
+ metavariable: $VAR
78
+ regex: ^(JWT_SECRET|JWT_SECRET_KEY|ENCRYPTION_KEY|FERNET_KEY|AES_KEY|SECRET_KEY_BASE|SECRET_KEY|DJANGO_SECRET_KEY|FLASK_SECRET_KEY)$
79
+ metadata:
80
+ cwe: "CWE-798: Use of Hard-coded Credentials"
81
+ severity: ERROR
82
+ precision: high
83
+ category: hardcoded-credentials
84
+ likelihood: MEDIUM
85
+ impact: CRITICAL
86
+ owasp: "A07:2021 - Identification and Authentication Failures"
@@ -0,0 +1,59 @@
1
+ # CWE-89: Django SQL 注入检测
2
+ # 逐码 ZhuMa V4.1 — Python 通用规则库
3
+ # 检测: raw() SQL拼接 / cursor.execute() 字符串格式化注入
4
+
5
+ rules:
6
+
7
+ # ZM-PY-DJANGO-SQLI-01: Model.objects.raw() SQL 字符串拼接用户输入
8
+ - id: zm-py-django-sqli-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到 raw() 中使用格式化拼接用户输入,可导致 SQL 注入。
12
+ 攻击者可通过构造恶意参数绕过查询逻辑或拖取数据库。
13
+ 修复: 使用 .objects.filter(**kwargs) 或 raw() + params=[] 参数化查询。
14
+ languages:
15
+ - python
16
+ pattern-either:
17
+ - pattern: $M.objects.raw($SQL % request)
18
+ - pattern: $M.objects.raw($SQL.format(request))
19
+ - pattern: $M.objects.raw($SQL + request)
20
+ - pattern: $M.objects.raw(f"...{request.$ATTR}...")
21
+ - pattern: $M.objects.raw("..." % request)
22
+ - pattern: $M.objects.raw("...".format(request))
23
+ - pattern: $M.objects.raw("..." + request)
24
+ metadata:
25
+ cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
26
+ severity: ERROR
27
+ precision: high
28
+ category: sql-injection
29
+ likelihood: HIGH
30
+ impact: CRITICAL
31
+ owasp: "A03:2021 - Injection"
32
+
33
+ # ZM-PY-DJANGO-SQLI-02: cursor.execute() 字符串格式化注入
34
+ - id: zm-py-django-sqli-002
35
+ severity: ERROR
36
+ message: |
37
+ 检测到 cursor.execute() 使用 %s/.format()/f-string 拼接 SQL,可导致 SQL 注入。
38
+ 攻击者可注入 UNION SELECT、--注释等绕过认证或窃取数据。
39
+ 修复: 使用参数化查询 cursor.execute("SELECT ... WHERE id=%s", [param])。
40
+ languages:
41
+ - python
42
+ pattern-either:
43
+ - pattern: $C.execute("..." % request)
44
+ - pattern: $C.execute("...".format(request))
45
+ - pattern: $C.execute("..." + request)
46
+ - pattern: $C.execute($SQL % request)
47
+ - pattern: $C.execute($SQL.format(request))
48
+ - pattern: $C.execute($SQL + request)
49
+ - pattern: $C.execute(f"...{request.$ATTR}...")
50
+ - pattern: $C.executemany("..." % request)
51
+ - pattern: $C.executemany("...".format(request))
52
+ metadata:
53
+ cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
54
+ severity: ERROR
55
+ precision: high
56
+ category: sql-injection
57
+ likelihood: HIGH
58
+ impact: CRITICAL
59
+ owasp: "A03:2021 - Injection"
@@ -0,0 +1,123 @@
1
+ # CWE-918: Python SSRF 服务端请求伪造检测
2
+ # 逐码 ZhuMa V4.1 — Python 通用规则库
3
+ # 检测: requests.get(userInput) / urllib.request.urlopen(userInput) / httpx.get(userInput)
4
+
5
+ rules:
6
+
7
+ # ZM-PY-SSRF-01: requests.get/post/put/head 参数来自 request
8
+ - id: zm-py-ssrf-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到 requests.get/post/put/head 等方法的 URL 参数来自 HTTP 请求。
12
+ 攻击者可构造内网地址(如 http://169.254.169.254/latest/meta-data/)访问云元数据服务或内网服务。
13
+ 修复: 对用户输入的 URL 做白名单校验(协议/域名/IP);禁用内网 IP 段(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16)。
14
+ languages:
15
+ - python
16
+ pattern-either:
17
+ - pattern: requests.get(request.args.get(...))
18
+ - pattern: requests.get(request.form.get(...))
19
+ - pattern: requests.get(request.values.get(...))
20
+ - pattern: requests.get(request.data)
21
+ - pattern: requests.get(request.json.get(...))
22
+ - pattern: requests.post(request.args.get(...))
23
+ - pattern: requests.post(request.form.get(...))
24
+ - pattern: requests.post(request.values.get(...))
25
+ - pattern: requests.post(request.data)
26
+ - pattern: requests.put(request.args.get(...))
27
+ - pattern: requests.put(request.form.get(...))
28
+ - pattern: requests.head(request.args.get(...))
29
+ - pattern: requests.head(request.form.get(...))
30
+ - pattern: requests.request($METHOD, request.args.get(...))
31
+ - pattern: requests.request($METHOD, request.form.get(...))
32
+ metadata:
33
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
34
+ severity: ERROR
35
+ precision: high
36
+ category: ssrf
37
+ likelihood: HIGH
38
+ impact: CRITICAL
39
+ owasp: "A10:2021 - Server-Side Request Forgery"
40
+
41
+ # ZM-PY-SSRF-02: urllib.request.urlopen() 参数来自 request
42
+ - id: zm-py-ssrf-002
43
+ severity: ERROR
44
+ message: |
45
+ 检测到 urllib.request.urlopen() / urlretrieve() 的 URL 参数来自 HTTP 请求。
46
+ urllib 同样支持 file:// 协议,攻击者可读取本地文件。
47
+ 修复: 使用 urllib.parse.urlparse() 解析 URL 后做协议和主机白名单校验。
48
+ languages:
49
+ - python
50
+ pattern-either:
51
+ - pattern: urllib.request.urlopen(request.args.get(...))
52
+ - pattern: urllib.request.urlopen(request.form.get(...))
53
+ - pattern: urllib.request.urlopen(request.values.get(...))
54
+ - pattern: urllib.request.urlopen(request.data)
55
+ - pattern: urllib.request.urlretrieve(request.args.get(...), ...)
56
+ - pattern: urllib.request.urlretrieve(request.form.get(...), ...)
57
+ - pattern: urllib.request.urlopen($BASE + request.args.get(...))
58
+ - pattern: urllib.request.urlopen($BASE + request.form.get(...))
59
+ - pattern: urllib.request.urlopen(f"...{request.args.get(...)}...")
60
+ - pattern: urllib.request.urlopen(f"...{request.form.get(...)}...")
61
+ - pattern: urllib.urlopen(request.args.get(...))
62
+ - pattern: urllib.urlopen(request.form.get(...))
63
+ - pattern: urllib2.urlopen(request.args.get(...))
64
+ - pattern: urllib2.urlopen(request.form.get(...))
65
+ metadata:
66
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
67
+ severity: ERROR
68
+ precision: high
69
+ category: ssrf
70
+ likelihood: HIGH
71
+ impact: CRITICAL
72
+ owasp: "A10:2021 - Server-Side Request Forgery"
73
+
74
+ # ZM-PY-SSRF-03: httpx.get/post 参数来自 request
75
+ - id: zm-py-ssrf-003
76
+ severity: ERROR
77
+ message: |
78
+ 检测到 httpx.get/post/AsyncClient 的 URL 参数来自 HTTP 请求。
79
+ httpx 同样可能被利用进行 SSRF 攻击访问内网服务或云元数据。
80
+ 修复: 校验用户输入 URL 协议仅允许 http/https;禁止解析到内网 IP。
81
+ languages:
82
+ - python
83
+ pattern-either:
84
+ - pattern: httpx.get(request.args.get(...))
85
+ - pattern: httpx.get(request.form.get(...))
86
+ - pattern: httpx.get(request.values.get(...))
87
+ - pattern: httpx.post(request.args.get(...))
88
+ - pattern: httpx.post(request.form.get(...))
89
+ - pattern: httpx.AsyncClient().get(request.args.get(...))
90
+ - pattern: httpx.AsyncClient().get(request.form.get(...))
91
+ - pattern: httpx.AsyncClient().post(request.args.get(...))
92
+ - pattern: httpx.AsyncClient().post(request.form.get(...))
93
+ metadata:
94
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
95
+ severity: ERROR
96
+ precision: high
97
+ category: ssrf
98
+ likelihood: HIGH
99
+ impact: CRITICAL
100
+ owasp: "A10:2021 - Server-Side Request Forgery"
101
+
102
+ # ZM-PY-SSRF-04: aiohttp.ClientSession().get() 参数来自 request
103
+ - id: zm-py-ssrf-004
104
+ severity: ERROR
105
+ message: |
106
+ 检测到 aiohttp.ClientSession().get/post 的 URL 参数来自 HTTP 请求。
107
+ 异步 HTTP 客户端同样存在 SSRF 风险。
108
+ 修复: 对用户输入 URL 做严格白名单校验;禁止访问内网地址段。
109
+ languages:
110
+ - python
111
+ pattern-either:
112
+ - pattern: aiohttp.ClientSession().get(request.args.get(...))
113
+ - pattern: aiohttp.ClientSession().get(request.form.get(...))
114
+ - pattern: aiohttp.ClientSession().post(request.args.get(...))
115
+ - pattern: aiohttp.ClientSession().post(request.form.get(...))
116
+ metadata:
117
+ cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
118
+ severity: ERROR
119
+ precision: high
120
+ category: ssrf
121
+ likelihood: HIGH
122
+ impact: CRITICAL
123
+ owasp: "A10:2021 - Server-Side Request Forgery"
@@ -0,0 +1,87 @@
1
+ # CWE-94: Flask/Jinja2 Server-Side Template Injection (SSTI) 检测
2
+ # 逐码 ZhuMa V4.1 — Python 通用规则库
3
+ # 检测: render_template_string / jinja2.Template 用户输入注入点
4
+
5
+ rules:
6
+
7
+ # ZM-PY-SSTI-01: render_template_string() 参数来自 request
8
+ - id: zm-py-ssti-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到 render_template_string() 参数来自 HTTP 请求。
12
+ 攻击者可注入 Jinja2 模板语法 {{config}} {{''.__class__.__mro__[2].__subclasses__()}}
13
+ 读取敏感配置或实现 RCE。
14
+ 修复: 禁止将用户输入传入 render_template_string();使用 render_template() + 模板文件。
15
+ languages:
16
+ - python
17
+ pattern-either:
18
+ - pattern: flask.render_template_string(request.args.get(...))
19
+ - pattern: flask.render_template_string(request.form.get(...))
20
+ - pattern: flask.render_template_string(request.values.get(...))
21
+ - pattern: render_template_string(request.args.get(...))
22
+ - pattern: render_template_string(request.form.get(...))
23
+ - pattern: render_template_string(request.values.get(...))
24
+ - pattern: render_template_string(request.data)
25
+ - pattern: render_template_string(request.get_json().get(...))
26
+ - pattern: render_template_string(request.json.get(...))
27
+ metadata:
28
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
29
+ severity: ERROR
30
+ precision: high
31
+ category: ssti
32
+ likelihood: HIGH
33
+ impact: CRITICAL
34
+ owasp: "A03:2021 - Injection"
35
+
36
+ # ZM-PY-SSTI-02: jinja2.Template() 用户输入直接作为模板
37
+ - id: zm-py-ssti-002
38
+ severity: ERROR
39
+ message: |
40
+ 检测到 jinja2.Template() 直接使用用户输入作为模板字符串。
41
+ 攻击者可嵌入 SSTI payload 实现任意代码执行。
42
+ 修复: 不要将用户输入作为模板字符串;使用预定义模板文件 + 变量绑定。
43
+ languages:
44
+ - python
45
+ pattern-either:
46
+ - pattern: jinja2.Template(request.args.get(...)).render()
47
+ - pattern: jinja2.Template(request.form.get(...)).render()
48
+ - pattern: jinja2.Template(request.values.get(...)).render()
49
+ - pattern: Template(request.args.get(...)).render()
50
+ - pattern: Template(request.form.get(...)).render()
51
+ - pattern: Template(request.values.get(...)).render()
52
+ metadata:
53
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
54
+ severity: ERROR
55
+ precision: high
56
+ category: ssti
57
+ likelihood: HIGH
58
+ impact: CRITICAL
59
+ owasp: "A03:2021 - Injection"
60
+
61
+ # ZM-PY-SSTI-03: Markup() 包装用户输入(等效模板 |safe 过滤器)
62
+ - id: zm-py-ssti-003
63
+ severity: WARNING
64
+ message: |
65
+ 检测到 flask.Markup() / markupsafe.Markup() 包装用户输入,等效模板 |safe 过滤器。
66
+ 绕过自动转义后,用户 HTML/JS 将直接渲染导致 XSS,若含 Jinja2 语法则升级为 SSTI。
67
+ 修复: 移除 Markup() 包装使用默认自动转义。
68
+ languages:
69
+ - python
70
+ pattern-either:
71
+ - pattern: flask.Markup(request.args.get(...))
72
+ - pattern: flask.Markup(request.form.get(...))
73
+ - pattern: flask.Markup(request.values.get(...))
74
+ - pattern: markupsafe.Markup(request.args.get(...))
75
+ - pattern: markupsafe.Markup(request.form.get(...))
76
+ - pattern: markupsafe.Markup(request.values.get(...))
77
+ - pattern: Markup(request.args.get(...))
78
+ - pattern: Markup(request.form.get(...))
79
+ - pattern: Markup(request.values.get(...))
80
+ metadata:
81
+ cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
82
+ severity: WARNING
83
+ precision: medium
84
+ category: ssti
85
+ likelihood: MEDIUM
86
+ impact: HIGH
87
+ owasp: "A03:2021 - Injection"
@@ -0,0 +1,123 @@
1
+ # CWE-943: Python NoSQL 注入检测
2
+ # 逐码 ZhuMa V4.1 — Python 通用规则库
3
+ # 检测: $where / $regex / $ne 用户输入直接传入 MongoDB/PyMongo/Motor 查询构造
4
+
5
+ rules:
6
+
7
+ # ZM-PY-NOSQL-01: MongoDB $where 操作符 + 用户输入
8
+ - id: zm-py-nosql-injection-001
9
+ severity: ERROR
10
+ message: |
11
+ 检测到 MongoDB 查询中使用 $where 操作符且参数来自 HTTP 请求。
12
+ $where 允许执行任意 JavaScript 表达式,攻击者可注入恶意 JS 代码获取全量数据或执行 DoS。
13
+ 修复: 禁止在查询中使用 $where;如确需复杂查询使用 $expr + 聚合管道替代。
14
+ languages:
15
+ - python
16
+ pattern-either:
17
+ - pattern: |
18
+ {"$where": request.args.get(...)}
19
+ - pattern: |
20
+ {"$where": request.form.get(...)}
21
+ - pattern: |
22
+ {"$where": request.values.get(...)}
23
+ - pattern: |
24
+ {"$where": request.data}
25
+ - pattern: |
26
+ {"$where": $USER_VAR}
27
+ - pattern: '$COLL.find({"$where": request.args.get(...)})'
28
+ - pattern: '$COLL.find({"$where": request.form.get(...)})'
29
+ - pattern: '$COLL.find({"$where": request.values.get(...)})'
30
+ - pattern: '$COLL.find({"$where": $USER_VAR})'
31
+ metadata:
32
+ cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
33
+ severity: ERROR
34
+ precision: high
35
+ category: nosql-injection
36
+ likelihood: HIGH
37
+ impact: CRITICAL
38
+ owasp: "A03:2021 - Injection"
39
+
40
+ # ZM-PY-NOSQL-02: MongoDB $regex 操作符 + 用户输入
41
+ - id: zm-py-nosql-injection-002
42
+ severity: WARNING
43
+ message: |
44
+ 检测到 MongoDB 查询中 $regex 操作符参数来自 HTTP 请求。
45
+ 攻击者可构造 ^ 锚点绕过正则匹配或 ReDoS 正则拒绝服务攻击耗尽 CPU。
46
+ 修复: 对用户输入做正则特殊字符转义(re.escape);限制正则复杂度。
47
+ languages:
48
+ - python
49
+ pattern-either:
50
+ - pattern: |
51
+ {"$regex": request.args.get(...)}
52
+ - pattern: |
53
+ {"$regex": request.form.get(...)}
54
+ - pattern: |
55
+ {"$regex": request.values.get(...)}
56
+ - pattern: '$COLL.find({"$KEY": {"$regex": request.args.get(...)}})'
57
+ - pattern: '$COLL.find({"$KEY": {"$regex": request.form.get(...)}})'
58
+ - pattern: '$COLL.find({"$KEY": {"$regex": request.values.get(...)}})'
59
+ metadata:
60
+ cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
61
+ severity: WARNING
62
+ precision: medium
63
+ category: nosql-injection
64
+ likelihood: MEDIUM
65
+ impact: HIGH
66
+ owasp: "A03:2021 - Injection"
67
+
68
+ # ZM-PY-NOSQL-03: MongoDB 查询操作符 $ne / $gt / $lt 直接由用户输入构造
69
+ - id: zm-py-nosql-injection-003
70
+ severity: WARNING
71
+ message: |
72
+ 检测到 MongoDB 查询字典直接由 HTTP 请求参数构造,攻击者可注入 $ne 等操作符绕过认证/授权。
73
+ 例如 POST {"username":"admin","password":{"$ne":""}} 可绕过登录。
74
+ 修复: 使用 mongo-sanitize 或 mquery 库清理用户输入中的 $ 前缀操作符;对输入做类型校验。
75
+ languages:
76
+ - python
77
+ pattern-either:
78
+ - pattern: $COLL.find_one(request.json)
79
+ - pattern: $COLL.find_one(request.get_json())
80
+ - pattern: $COLL.find_one(request.args)
81
+ - pattern: $COLL.find_one(request.form)
82
+ - pattern: $COLL.find(request.json)
83
+ - pattern: $COLL.find(request.get_json())
84
+ - pattern: $COLL.find(request.args)
85
+ - pattern: $COLL.find(request.form)
86
+ - pattern: $COLL.find(request.POST)
87
+ - pattern: $COLL.find_one(request.POST)
88
+ metadata:
89
+ cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
90
+ severity: WARNING
91
+ precision: high
92
+ category: nosql-injection
93
+ likelihood: HIGH
94
+ impact: HIGH
95
+ owasp: "A03:2021 - Injection"
96
+
97
+ # ZM-PY-NOSQL-04: Motor (Async MongoDB) 查询 + 用户输入
98
+ - id: zm-py-nosql-injection-004
99
+ severity: WARNING
100
+ message: |
101
+ 检测到 Motor (异步 MongoDB 驱动) 的 find/find_one 查询参数直接来自 HTTP 请求。
102
+ 攻击者可注入 $ne/$gt/$where 等操作符实现 NoSQL 注入。
103
+ 修复: 对查询条件中的用户输入做类型校验和 $ 操作符过滤。
104
+ languages:
105
+ - python
106
+ pattern-either:
107
+ - pattern: motor.motor_asyncio.AsyncIOMotorCollection.find(request.json)
108
+ - pattern: motor.motor_asyncio.AsyncIOMotorCollection.find_one(request.json)
109
+ - pattern: $COLL.find(request.args.get(...))
110
+ - pattern: $COLL.find(request.form.get(...))
111
+ - pattern: '$COLL.find({"$KEY": request.args.get(...)})'
112
+ - pattern: '$COLL.find({"$KEY": request.form.get(...)})'
113
+ - pattern: '$COLL.find({"$KEY": request.values.get(...)})'
114
+ - pattern: '$COLL.find_one({"$KEY": request.args.get(...)})'
115
+ - pattern: '$COLL.find_one({"$KEY": request.form.get(...)})'
116
+ metadata:
117
+ cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
118
+ severity: WARNING
119
+ precision: medium
120
+ category: nosql-injection
121
+ likelihood: MEDIUM
122
+ impact: HIGH
123
+ owasp: "A03:2021 - Injection"
@@ -0,0 +1,63 @@
1
+ # 逐码 ZhuMa IaC 规则 — Ansible 权限提升检测
2
+ # V4.1 Sprint — CWE-269: Improper Privilege Management
3
+
4
+ rules:
5
+ # ZM-ANSIBLE-CWE269-001: become: yes 未限制 become_user
6
+ - id: zm-ansible-cwe269-privesc-001
7
+ severity: HIGH
8
+ message: |
9
+ Ansible Playbook 中 `become: yes` 未同时指定 `become_user` — 默认升级为 root 用户执行所有任务。
10
+ 应在 Play 或 Task 级别明确指定 `become_user` 为最小权限所需的非 root 用户:
11
+ ```yaml
12
+ become: yes
13
+ become_user: appuser
14
+ ```
15
+ languages:
16
+ - generic
17
+ pattern: |
18
+ become: yes
19
+ pattern-not: |
20
+ become_user: $USER
21
+ metadata:
22
+ cwe: "CWE-269: Improper Privilege Management"
23
+ category: iac-ansible
24
+ precision: medium
25
+ confidence: high
26
+ tags: [ansible, privilege-escalation, become, root]
27
+
28
+ # ZM-ANSIBLE-CWE269-002: become: true (另一种写法)
29
+ - id: zm-ansible-cwe269-privesc-002
30
+ severity: HIGH
31
+ message: |
32
+ Ansible Playbook 中 `become: true` 未限制 `become_user` — 可能意外升级为 root。
33
+ 明确指定 `become_user` 并确保目标用户具有完成任务的必要权限而不需要完整 root 权限。
34
+ languages:
35
+ - generic
36
+ pattern: |
37
+ become: true
38
+ pattern-not: |
39
+ become_user: $USER
40
+ metadata:
41
+ cwe: "CWE-269: Improper Privilege Management"
42
+ category: iac-ansible
43
+ precision: medium
44
+ confidence: high
45
+ tags: [ansible, privilege-escalation, become, root]
46
+
47
+ # ZM-ANSIBLE-CWE269-003: become_method: su 配合 become: yes
48
+ - id: zm-ansible-cwe269-privesc-003
49
+ severity: MEDIUM
50
+ message: |
51
+ Ansible 使用 `become_method: su` — su 方法对密码处理不够安全,且通常意味着直接升级为 root。
52
+ 优先使用 `become_method: sudo` 并配合 `/etc/sudoers` 中的细粒度 sudo 规则,
53
+ 仅授予必要命令的执行权限,遵循最小权限原则。
54
+ languages:
55
+ - generic
56
+ pattern: |
57
+ become_method: su
58
+ metadata:
59
+ cwe: "CWE-269: Improper Privilege Management"
60
+ category: iac-ansible
61
+ precision: very-high
62
+ confidence: high
63
+ tags: [ansible, privilege-escalation, become_method, su]
@@ -0,0 +1,67 @@
1
+ # 逐码 ZhuMa IaC 规则 — Ansible Shell/Command 注入检测
2
+ # V4.1 Sprint — CWE-78: OS Command Injection
3
+
4
+ rules:
5
+ # ZM-ANSIBLE-CWE78-001: shell 模块 + 未经 quote 的变量
6
+ - id: zm-ansible-cwe78-cmdi-001
7
+ severity: CRITICAL
8
+ message: |
9
+ Ansible `shell` 模块中使用了未经 `quote` 过滤的变量 `{{ user_input }}` — 攻击者可通过变量注入任意 Shell 命令。
10
+ 对所有用户可控变量使用 `{{ var | quote }}` 过滤器,或将命令重构为 `command` 模块(天然不调用 Shell)。
11
+ 示例修复:
12
+ ```yaml
13
+ shell: echo {{ user_input | quote }}
14
+ ```
15
+ languages:
16
+ - generic
17
+ pattern-either:
18
+ - pattern: |
19
+ shell: "{{ $VAR }}"
20
+ - pattern: |
21
+ shell: "...{{ $VAR }}..."
22
+ metadata:
23
+ cwe: "CWE-78: OS Command Injection"
24
+ category: iac-ansible
25
+ precision: medium
26
+ confidence: high
27
+ tags: [ansible, command-injection, shell, variable]
28
+
29
+ # ZM-ANSIBLE-CWE78-002: command 模块 + 直接变量拼接
30
+ - id: zm-ansible-cwe78-cmdi-002
31
+ severity: HIGH
32
+ message: |
33
+ Ansible `command` 模块中直接拼接用户变量 `{{ user_input }}` — 虽然不经过 Shell,但攻击者仍可注入命令参数。
34
+ 使用 `{{ var | quote }}` 或将变量作为 `args` 传递以限制注入面。
35
+ languages:
36
+ - generic
37
+ pattern-either:
38
+ - pattern: |
39
+ command: "...{{ $VAR }}..."
40
+ - pattern: |
41
+ command: "{{ $VAR }}"
42
+ metadata:
43
+ cwe: "CWE-78: OS Command Injection"
44
+ category: iac-ansible
45
+ precision: medium
46
+ confidence: high
47
+ tags: [ansible, command-injection, command, variable]
48
+
49
+ # ZM-ANSIBLE-CWE78-003: raw 模块 + 变量
50
+ - id: zm-ansible-cwe78-cmdi-003
51
+ severity: CRITICAL
52
+ message: |
53
+ Ansible `raw` 模块直接执行 SSH 命令,并将变量 `{{ user_input }}` 直接拼入命令 — 等同于远程命令执行。
54
+ `raw` 模块应避免使用用户变量。如必须使用,请用 `{{ var | quote }}` 并在任务文档中记录理由。
55
+ languages:
56
+ - generic
57
+ pattern-either:
58
+ - pattern: |
59
+ raw: "...{{ $VAR }}..."
60
+ - pattern: |
61
+ raw: "{{ $VAR }}"
62
+ metadata:
63
+ cwe: "CWE-78: OS Command Injection"
64
+ category: iac-ansible
65
+ precision: medium
66
+ confidence: high
67
+ tags: [ansible, command-injection, raw, rce]