@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 @@
1
+ {"version":3,"file":"manifest_scanner.d.ts","sourceRoot":"","sources":["../../src/engine/manifest_scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAyqBD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,EAAE,CA+BpE;AAID;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EAAE,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EAAE,EAC3B,WAAW,EAAE,eAAe,CAAC,UAAU,CAAC,GACvC,eAAe,EAAE,CAKnB"}
@@ -0,0 +1,599 @@
1
+ /**
2
+ * AndroidManifest.xml 安全扫描引擎 — ZhuMa V4
3
+ *
4
+ * 解析 jadx 解码后的 AndroidManifest.xml 并执行 12 项安全检测:
5
+ * 1. debuggable 标志 6. 导出 Service
6
+ * 2. allowBackup 标志 7. 低 targetSdkVersion
7
+ * 3. 导出组件无权限 8. cleartext 流量
8
+ * 4. 导出 ContentProvider 9. 缺失网络安全配置
9
+ * 5. 导出 BroadcastReceiver 10. 危险权限
10
+ * 11. 自定义权限保护级别 12. taskAffinity 劫持
11
+ *
12
+ * 设计原则: regex-first parsing → 优先可用性,而非 XML 解析优雅性
13
+ * jadx 输出的 AndroidManifest.xml 格式可预测且有规律,
14
+ * regex 提取属性比引入 DOM 解析器更稳定,特别是有命名空间歧义时。
15
+ */
16
+ import { readFileSync, existsSync } from 'node:fs';
17
+ // ─── Regex 辅助 ─────────────────────────────────────
18
+ /** 提取 android:name="value" 形式的属性值 */
19
+ function getAttr(xml, name) {
20
+ const re = new RegExp(`android:${name}\\s*=\\s*"([^"]*)"`, 'i');
21
+ const m = re.exec(xml);
22
+ return m ? (m[1] ?? null) : null;
23
+ }
24
+ /** 提取非命名空间前缀的属性,如 package="value" */
25
+ function getRawAttr(xml, name) {
26
+ const re = new RegExp(`\\b${name}\\s*=\\s*"([^"]*)"`, 'i');
27
+ const m = re.exec(xml);
28
+ return m ? (m[1] ?? null) : null;
29
+ }
30
+ /** 提取 android:name="value" 的布尔值版本 */
31
+ function getBoolAttr(xml, name) {
32
+ const v = getAttr(xml, name);
33
+ if (v === null)
34
+ return null;
35
+ return v === 'true';
36
+ }
37
+ /** 提取 android:name="value" 的整数版本 */
38
+ function getIntAttr(xml, name) {
39
+ const v = getAttr(xml, name);
40
+ if (v === null)
41
+ return null;
42
+ const n = parseInt(v, 10);
43
+ return Number.isNaN(n) ? null : n;
44
+ }
45
+ /** 从完整 XML 中截取指定偏移周围的片段作为 evidence */
46
+ function extractSnippet(xml, start, context) {
47
+ const begin = Math.max(0, start - context);
48
+ const end = Math.min(xml.length, start + context * 4);
49
+ let snippet = xml.slice(begin, end);
50
+ // 移除多余空白使片段更紧凑
51
+ snippet = snippet.replace(/\s+/g, ' ').trim();
52
+ if (snippet.length > 300) {
53
+ snippet = snippet.slice(0, 300) + ' ...';
54
+ }
55
+ return snippet;
56
+ }
57
+ // ─── 组件提取 ───────────────────────────────────────
58
+ /**
59
+ * 从 application 块中提取所有组件标签块。
60
+ * 使用交替+反向引用 regex 匹配:
61
+ * <activity ... > ... </activity> 或 <activity ... />
62
+ * <service ... > ... </service> 或 <service ... />
63
+ * <receiver ... > ... </receiver> 或 <receiver ... />
64
+ * <provider ... > ... </provider> 或 <provider ... />
65
+ */
66
+ const COMPONENT_RE = /<(activity|service|receiver|provider)\b[\s\S]*?(?:\/>|<\/\1\s*>)/gi;
67
+ function extractComponents(appBlock) {
68
+ const components = [];
69
+ let m;
70
+ COMPONENT_RE.lastIndex = 0;
71
+ while ((m = COMPONENT_RE.exec(appBlock)) !== null) {
72
+ const tagName = (m[1] ?? '').toLowerCase();
73
+ const fullTag = m[0];
74
+ const openTag = fullTag.match(/^<[^>]*>/)?.[0] ?? fullTag;
75
+ const name = getAttr(openTag, 'name') ?? '';
76
+ const exported = getBoolAttr(openTag, 'exported');
77
+ const permission = getAttr(openTag, 'permission');
78
+ const hasIntentFilter = /<intent-filter\b/i.test(fullTag);
79
+ const taskAffinity = getAttr(openTag, 'taskAffinity') ?? undefined;
80
+ const singleInstance = getAttr(openTag, 'launchMode') === 'singleInstance';
81
+ components.push({
82
+ type: tagName,
83
+ name,
84
+ exported,
85
+ permission,
86
+ hasIntentFilter,
87
+ taskAffinity,
88
+ singleInstance,
89
+ raw: fullTag.slice(0, 600),
90
+ });
91
+ }
92
+ return components;
93
+ }
94
+ // ─── uses-permission 提取 ────────────────────────────
95
+ const USES_PERMISSION_RE = /<uses-permission\b[^>]*\/?\s*>/gi;
96
+ function extractUsesPermissions(xml) {
97
+ const perms = [];
98
+ let m;
99
+ USES_PERMISSION_RE.lastIndex = 0;
100
+ while ((m = USES_PERMISSION_RE.exec(xml)) !== null) {
101
+ const name = getAttr(m[0], 'name');
102
+ if (name)
103
+ perms.push(name);
104
+ }
105
+ return perms;
106
+ }
107
+ // ─── 自定义 permission 提取 ──────────────────────────
108
+ const PERMISSION_BLOCK_RE = /<permission\b[\s\S]*?\/?\s*>/gi;
109
+ function extractCustomPermissions(xml) {
110
+ const result = [];
111
+ let m;
112
+ PERMISSION_BLOCK_RE.lastIndex = 0;
113
+ while ((m = PERMISSION_BLOCK_RE.exec(xml)) !== null) {
114
+ const name = getAttr(m[0], 'name');
115
+ const protectionLevel = getAttr(m[0], 'protectionLevel');
116
+ if (name && protectionLevel) {
117
+ result.push({ name, protectionLevel });
118
+ }
119
+ }
120
+ return result;
121
+ }
122
+ // ─── 主解析函数 ─────────────────────────────────────
123
+ function parseManifest(xml, filePath) {
124
+ // 提取 <manifest> 的 package 属性
125
+ const manifestTag = xml.match(/<manifest\b[^>]*>/)?.[0] ?? '';
126
+ const packageName = getRawAttr(manifestTag, 'package') ?? '';
127
+ // 提取 <application> 块 — 从 <application 到 </application>
128
+ const appMatch = xml.match(/<application\b[\s\S]*?(?:<\/application\s*>|$)/i);
129
+ const appBlock = appMatch?.[0] ?? '';
130
+ const appOpenTag = appBlock.match(/^<[^>]*>/)?.[0] ?? '';
131
+ const debuggable = getBoolAttr(appOpenTag, 'debuggable');
132
+ const allowBackup = getBoolAttr(appOpenTag, 'allowBackup');
133
+ const fullBackupContent = getAttr(appOpenTag, 'fullBackupContent');
134
+ const networkSecurityConfig = getAttr(appOpenTag, 'networkSecurityConfig');
135
+ const usesCleartextTraffic = getBoolAttr(appOpenTag, 'usesCleartextTraffic');
136
+ // uses-sdk
137
+ const sdkTag = xml.match(/<uses-sdk\b[^>]*\/?\s*>/i)?.[0] ?? '';
138
+ const minSdkVersion = getIntAttr(sdkTag, 'minSdkVersion');
139
+ const targetSdkVersion = getIntAttr(sdkTag, 'targetSdkVersion');
140
+ // 组件
141
+ const components = extractComponents(appBlock);
142
+ // 权限
143
+ const permissions = extractUsesPermissions(xml);
144
+ const customPermissions = extractCustomPermissions(xml);
145
+ return {
146
+ packageName,
147
+ debuggable,
148
+ allowBackup,
149
+ fullBackupContent,
150
+ networkSecurityConfig,
151
+ usesCleartextTraffic,
152
+ minSdkVersion,
153
+ targetSdkVersion,
154
+ components,
155
+ permissions,
156
+ customPermissions,
157
+ };
158
+ }
159
+ // ─── 安全检查 ────────────────────────────────────────
160
+ /**
161
+ * 检查 1: debuggable=true → 攻击者可通过 adb 提权、注入代码
162
+ * CWE-489: Leftover Debug Code
163
+ */
164
+ function checkDebuggable(m, xml, filePath) {
165
+ if (m.debuggable !== true)
166
+ return null;
167
+ const idx = xml.indexOf('android:debuggable="true"');
168
+ return {
169
+ id: 'zm-manifest-debuggable',
170
+ severity: 'HIGH',
171
+ title: '应用启用调试模式',
172
+ description: 'android:debuggable="true" 允许任意 USB 连接的攻击者通过 adb 运行任意代码、提取内存数据或注入恶意逻辑。生产版本必须关闭。',
173
+ cwe: 'CWE-489',
174
+ owasp_mobile: 'M8: Code Tampering',
175
+ masvs: 'MASVS-RESILIENCE-2',
176
+ location: { file: filePath, element: '<application>' },
177
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 80),
178
+ remediation: '在 AndroidManifest.xml 中将 android:debuggable 设为 false 或移除该属性(Release 构建自动为 false)。',
179
+ };
180
+ }
181
+ /**
182
+ * 检查 2: allowBackup=true 且未设置 fullBackupContent → 攻击者可通过 adb backup 提取数据
183
+ * CWE-200: Exposure of Sensitive Information
184
+ */
185
+ function checkAllowBackup(m, xml, filePath) {
186
+ if (m.allowBackup !== true)
187
+ return null;
188
+ if (m.fullBackupContent)
189
+ return null; // 显式配置了备份规则 → OK
190
+ const idx = xml.indexOf('android:allowBackup="true"');
191
+ return {
192
+ id: 'zm-manifest-allow-backup',
193
+ severity: 'WARNING',
194
+ title: '应用允许 ADB 完整备份',
195
+ description: 'android:allowBackup="true" 且未设置 android:fullBackupContent 时,攻击者可通过 adb backup 导出应用全部数据(SharedPreferences、数据库、内部存储文件)。',
196
+ cwe: 'CWE-200',
197
+ owasp_mobile: 'M2: Insecure Data Storage',
198
+ masvs: 'MASVS-STORAGE-1',
199
+ location: { file: filePath, element: '<application>' },
200
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 80),
201
+ remediation: '设置 android:allowBackup="false" 禁止备份;如需云备份,使用 android:fullBackupContent="@xml/backup_rules" 排除敏感数据。',
202
+ };
203
+ }
204
+ /**
205
+ * 检查 3: 导出组件未设置 permission → 任意应用可启动
206
+ * CWE-926: Improper Export of Android Application Components
207
+ *
208
+ * Android 12 (API 31)+ 对声明 intent-filter 的组件强制要求显式 exported。
209
+ * 此处检测的是: exported 为 true 或 (有 intent-filter 且 targetSdk < 31) 且无 permission。
210
+ */
211
+ function checkExportedWithoutPermission(m, xml, filePath) {
212
+ const findings = [];
213
+ const targetSdk = m.targetSdkVersion ?? 0;
214
+ for (const comp of m.components) {
215
+ // 判断是否实际导出
216
+ const isExported = comp.exported === true ||
217
+ (comp.exported === null && comp.hasIntentFilter && targetSdk < 31);
218
+ if (!isExported || comp.permission)
219
+ continue;
220
+ // ContentProvider 走单独的更高危检查 (checkExportedProvider)
221
+ if (comp.type === 'provider')
222
+ continue;
223
+ const element = `<${comp.type} android:name="${comp.name}">`;
224
+ const idx = xml.indexOf(comp.name);
225
+ findings.push({
226
+ id: 'zm-manifest-exported-without-permission',
227
+ severity: 'HIGH',
228
+ title: `导出组件缺少权限保护: ${comp.name}`,
229
+ description: `${comp.type} "${comp.name}" 被导出 (android:exported="true") 但未声明 android:permission,` +
230
+ '任意第三方应用均可启动/调用该组件,可能导致功能滥用或数据泄露。',
231
+ cwe: 'CWE-926',
232
+ owasp_mobile: 'M1: Improper Platform Usage',
233
+ masvs: 'MASVS-PLATFORM-1',
234
+ location: { file: filePath, element },
235
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 120),
236
+ remediation: `为 ${comp.name} 添加 android:permission="signature-level-permission" 限制调用方;` +
237
+ '如组件仅内部使用,设置 android:exported="false"。',
238
+ });
239
+ }
240
+ return findings;
241
+ }
242
+ /**
243
+ * 检查 4: 导出 ContentProvider 无权限 → CRITICAL(数据泄漏到任意应用)
244
+ * CWE-926: Improper Export of Android Application Components
245
+ */
246
+ function checkExportedProvider(m, xml, filePath) {
247
+ const findings = [];
248
+ const targetSdk = m.targetSdkVersion ?? 0;
249
+ for (const comp of m.components) {
250
+ if (comp.type !== 'provider')
251
+ continue;
252
+ const isExported = comp.exported === true ||
253
+ (comp.exported === null && targetSdk < 17); // API 17 起 provider 默认 exported=false
254
+ if (!isExported || comp.permission)
255
+ continue;
256
+ const element = `<provider android:name="${comp.name}">`;
257
+ const idx = xml.indexOf(comp.name);
258
+ findings.push({
259
+ id: 'zm-manifest-exported-provider',
260
+ severity: 'CRITICAL',
261
+ title: `ContentProvider 导出无权限: ${comp.name}`,
262
+ description: `ContentProvider "${comp.name}" 被导出且未声明 android:permission,` +
263
+ '任意应用均可通过 ContentResolver 访问该 Provider 的增删改查接口,直接导致大规模数据泄漏。',
264
+ cwe: 'CWE-926',
265
+ owasp_mobile: 'M1: Improper Platform Usage',
266
+ masvs: 'MASVS-PLATFORM-2',
267
+ location: { file: filePath, element },
268
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 120),
269
+ remediation: `为 ${comp.name} 添加 android:permission="signature" 级别的权限保护;` +
270
+ '如仅内部使用,设置 android:exported="false";' +
271
+ '考虑在 query/insert/update/delete 方法中增加调用者 UID 校验。',
272
+ });
273
+ }
274
+ return findings;
275
+ }
276
+ /**
277
+ * 检查 5: 导出 BroadcastReceiver 无权限 → MEDIUM(intent 拦截/伪造)
278
+ * CWE-925: Improper Broadcast Receiver Export
279
+ */
280
+ function checkExportedReceiver(m, xml, filePath) {
281
+ const findings = [];
282
+ const targetSdk = m.targetSdkVersion ?? 0;
283
+ for (const comp of m.components) {
284
+ if (comp.type !== 'receiver')
285
+ continue;
286
+ const isExported = comp.exported === true ||
287
+ (comp.exported === null && comp.hasIntentFilter && targetSdk < 31);
288
+ if (!isExported || comp.permission)
289
+ continue;
290
+ const element = `<receiver android:name="${comp.name}">`;
291
+ const idx = xml.indexOf(comp.name);
292
+ findings.push({
293
+ id: 'zm-manifest-exported-receiver',
294
+ severity: 'MEDIUM',
295
+ title: `BroadcastReceiver 导出无权限: ${comp.name}`,
296
+ description: `BroadcastReceiver "${comp.name}" 被导出且未声明 android:permission,` +
297
+ '任意应用可发送伪造广播,可能触发敏感操作或绕过安全逻辑。',
298
+ cwe: 'CWE-925',
299
+ owasp_mobile: 'M1: Improper Platform Usage',
300
+ masvs: 'MASVS-PLATFORM-1',
301
+ location: { file: filePath, element },
302
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 120),
303
+ remediation: `为 ${comp.name} 添加 android:permission="signature" 或设置 android:exported="false"。`,
304
+ });
305
+ }
306
+ return findings;
307
+ }
308
+ /**
309
+ * 检查 6: 导出 Service 无权限 → MEDIUM(后台利用)
310
+ * CWE-926: Improper Export of Android Application Components
311
+ */
312
+ function checkExportedService(m, xml, filePath) {
313
+ const findings = [];
314
+ const targetSdk = m.targetSdkVersion ?? 0;
315
+ for (const comp of m.components) {
316
+ if (comp.type !== 'service')
317
+ continue;
318
+ const isExported = comp.exported === true ||
319
+ (comp.exported === null && comp.hasIntentFilter && targetSdk < 31);
320
+ if (!isExported || comp.permission)
321
+ continue;
322
+ const element = `<service android:name="${comp.name}">`;
323
+ const idx = xml.indexOf(comp.name);
324
+ findings.push({
325
+ id: 'zm-manifest-exported-service',
326
+ severity: 'MEDIUM',
327
+ title: `Service 导出无权限: ${comp.name}`,
328
+ description: `Service "${comp.name}" 被导出且未声明 android:permission,` +
329
+ '任意应用可绑定/启动该 Service,可能被利用进行后台资源消耗或功能滥用。',
330
+ cwe: 'CWE-926',
331
+ owasp_mobile: 'M1: Improper Platform Usage',
332
+ masvs: 'MASVS-PLATFORM-1',
333
+ location: { file: filePath, element },
334
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 120),
335
+ remediation: `为 ${comp.name} 添加 android:permission 或设置 android:exported="false"。`,
336
+ });
337
+ }
338
+ return findings;
339
+ }
340
+ /**
341
+ * 检查 7: targetSdkVersion < 29 → HIGH
342
+ * 缺失 Android 10+ 安全加固默认值:
343
+ * - scoped storage (分区存储)
344
+ * - 默认阻止 cleartext HTTP 流量
345
+ * - 后台 Activity 启动限制
346
+ * - 不可重置的设备标识符限制
347
+ *
348
+ * CWE-1104: Use of Unmaintained Third Party Components (类比过时SDK)
349
+ */
350
+ function checkLowTargetSdk(m, xml, filePath) {
351
+ const target = m.targetSdkVersion;
352
+ if (target === null || target >= 29)
353
+ return null;
354
+ const sdkTag = xml.match(/<uses-sdk\b[^>]*\/?\s*>/i)?.[0] ?? '';
355
+ const idx = xml.indexOf(sdkTag);
356
+ return {
357
+ id: 'zm-manifest-low-target-sdk',
358
+ severity: 'HIGH',
359
+ title: `targetSdkVersion=${target} 过低(<29)`,
360
+ description: `targetSdkVersion=${target} 低于 API 29 (Android 10),缺失以下安全加固默认行为:` +
361
+ '分区存储 (scoped storage)、默认阻止 HTTP 明文流量、后台 Activity 启动限制、' +
362
+ '不可重置设备标识符保护。Google Play 要求新应用 targetSdk ≥ 34 (Android 14)。',
363
+ cwe: 'CWE-1104',
364
+ owasp_mobile: 'M7: Client Code Quality',
365
+ masvs: 'MASVS-ARCH-2',
366
+ location: { file: filePath, element: '<uses-sdk>' },
367
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 120),
368
+ remediation: `将 targetSdkVersion 升级至 ≥34 (Android 14)。` +
369
+ '测试分区存储兼容性,移除对不可重置标识符(如 IMEI)的依赖,确保所有 HTTPS 证书有效。',
370
+ };
371
+ }
372
+ /**
373
+ * 检查 8: usesCleartextTraffic=true → HIGH
374
+ * Android 9+ 默认禁止 HTTP 明文流量;显式覆盖该行为会暴露中间人攻击面。
375
+ * CWE-319: Cleartext Transmission of Sensitive Information
376
+ */
377
+ function checkCleartextAllowed(m, xml, filePath) {
378
+ if (m.usesCleartextTraffic !== true)
379
+ return null;
380
+ const idx = xml.indexOf('android:usesCleartextTraffic="true"');
381
+ return {
382
+ id: 'zm-manifest-cleartext-allowed',
383
+ severity: 'HIGH',
384
+ title: '应用显式启用明文 HTTP 流量',
385
+ description: 'android:usesCleartextTraffic="true" 允许应用使用 HTTP 明文协议,' +
386
+ '可能被中间人攻击截获凭证/令牌/敏感数据。Android 9+ (targetSdk 28+) 默认阻止 HTTP,' +
387
+ '该属性被显式覆盖以绕过保护。',
388
+ cwe: 'CWE-319',
389
+ owasp_mobile: 'M3: Insecure Communication',
390
+ masvs: 'MASVS-NETWORK-1',
391
+ location: { file: filePath, element: '<application>' },
392
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 80),
393
+ remediation: '移除 android:usesCleartextTraffic="true";所有网络通信使用 HTTPS。' +
394
+ '如有测试环境 HTTP 需求,使用 network_security_config.xml 限定特定域名而非全局放行。',
395
+ };
396
+ }
397
+ /**
398
+ * 检查 9: targetSdk ≥28 且未配置 networkSecurityConfig → MEDIUM
399
+ * 缺少证书固定/HTTPS 强制策略,依赖系统默认 CA 信任链。
400
+ * CWE-295: Improper Certificate Validation
401
+ */
402
+ function checkNoNetworkConfig(m, xml, filePath) {
403
+ if (m.networkSecurityConfig)
404
+ return null;
405
+ const target = m.targetSdkVersion ?? 0;
406
+ if (target < 28)
407
+ return null;
408
+ const idx = xml.indexOf('<application');
409
+ return {
410
+ id: 'zm-manifest-no-network-config',
411
+ severity: 'MEDIUM',
412
+ title: '未配置网络安全策略 (networkSecurityConfig)',
413
+ description: `targetSdk=${target} 但未声明 android:networkSecurityConfig。` +
414
+ '缺失证书固定 (certificate pinning)、自定义信任锚点、域名级 cleartext 控制。' +
415
+ '应用完全依赖系统 CA 信任库,易受恶意 CA 证书攻击。',
416
+ cwe: 'CWE-295',
417
+ owasp_mobile: 'M3: Insecure Communication',
418
+ masvs: 'MASVS-NETWORK-4',
419
+ location: { file: filePath, element: '<application>' },
420
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 150),
421
+ remediation: '创建 res/xml/network_security_config.xml 配置证书固定和域名白名单,' +
422
+ '在 AndroidManifest.xml 中添加 android:networkSecurityConfig="@xml/network_security_config"。',
423
+ };
424
+ }
425
+ /**
426
+ * 检查 10: 危险权限声明 → MEDIUM
427
+ * 声明 CAMERA / RECORD_AUDIO / READ_CONTACTS / ACCESS_FINE_LOCATION / READ_SMS / READ_CALL_LOG 等
428
+ * CWE-359: Exposure of Private Personal Information
429
+ */
430
+ const DANGEROUS_PATTERNS = [
431
+ { pattern: /CAMERA/i, label: 'CAMERA' },
432
+ { pattern: /RECORD_AUDIO/i, label: 'RECORD_AUDIO' },
433
+ { pattern: /READ_CONTACTS/i, label: 'READ_CONTACTS' },
434
+ { pattern: /ACCESS_FINE_LOCATION/i, label: 'ACCESS_FINE_LOCATION' },
435
+ { pattern: /ACCESS_BACKGROUND_LOCATION/i, label: 'ACCESS_BACKGROUND_LOCATION' },
436
+ { pattern: /READ_SMS/i, label: 'READ_SMS' },
437
+ { pattern: /SEND_SMS/i, label: 'SEND_SMS' },
438
+ { pattern: /READ_CALL_LOG/i, label: 'READ_CALL_LOG' },
439
+ { pattern: /READ_EXTERNAL_STORAGE/i, label: 'READ_EXTERNAL_STORAGE' },
440
+ { pattern: /WRITE_EXTERNAL_STORAGE/i, label: 'WRITE_EXTERNAL_STORAGE' },
441
+ { pattern: /READ_PHONE_STATE/i, label: 'READ_PHONE_STATE' },
442
+ { pattern: /BODY_SENSORS/i, label: 'BODY_SENSORS' },
443
+ { pattern: /ACTIVITY_RECOGNITION/i, label: 'ACTIVITY_RECOGNITION' },
444
+ ];
445
+ function checkDangerousPermissions(m, _xml, filePath) {
446
+ const findings = [];
447
+ for (const perm of m.permissions) {
448
+ for (const dp of DANGEROUS_PATTERNS) {
449
+ if (dp.pattern.test(perm)) {
450
+ findings.push({
451
+ id: 'zm-manifest-dangerous-permissions',
452
+ severity: 'MEDIUM',
453
+ title: `声明危险权限: ${dp.label}`,
454
+ description: `应用声明了 ${dp.label} 权限 (${perm})。` +
455
+ '该权限涉及用户隐私数据,应从最小权限原则评估是否确实必要。' +
456
+ 'Android 10+ 对位置/存储权限有额外运行时限制。',
457
+ cwe: 'CWE-359',
458
+ owasp_mobile: 'M4: Insecure Authentication',
459
+ masvs: 'MASVS-PLATFORM-3',
460
+ location: { file: filePath, element: `<uses-permission android:name="${perm}">` },
461
+ evidence: `<uses-permission android:name="${perm}"/>`,
462
+ remediation: `确认 ${dp.label} 权限为业务必须;` +
463
+ '优先使用更细粒度的替代 API(如 MediaStore 替代 READ_EXTERNAL_STORAGE);' +
464
+ '在运行时请求时提供清晰的权限说明 rationale。',
465
+ });
466
+ break; // 一个权限只匹配一个类别
467
+ }
468
+ }
469
+ }
470
+ return findings;
471
+ }
472
+ /**
473
+ * 检查 11: 自定义 permission 使用 protectionLevel="normal" → WARNING
474
+ * "normal" 级别无法阻止恶意应用声明同一权限。
475
+ * 应使用 "signature" 级别确保仅同签名应用可访问。
476
+ * CWE-280: Improper Handling of Insufficient Permissions
477
+ */
478
+ function checkMissingSignaturePermission(m, xml, filePath) {
479
+ const findings = [];
480
+ for (const cp of m.customPermissions) {
481
+ if (cp.protectionLevel === 'dangerous' || cp.protectionLevel.includes('signature')) {
482
+ continue; // dangerous 也需用户交互确认,signature 是预期
483
+ }
484
+ if (cp.protectionLevel === 'normal') {
485
+ const idx = xml.indexOf(cp.name);
486
+ findings.push({
487
+ id: 'zm-manifest-missing-signature-permission',
488
+ severity: 'WARNING',
489
+ title: `自定义权限保护级别过低: ${cp.name}`,
490
+ description: `自定义权限 "${cp.name}" 使用 protectionLevel="normal",` +
491
+ '任意应用声明该权限即可自动获得授权,无法防止恶意应用访问受保护的组件。',
492
+ cwe: 'CWE-280',
493
+ owasp_mobile: 'M1: Improper Platform Usage',
494
+ masvs: 'MASVS-PLATFORM-1',
495
+ location: { file: filePath, element: `<permission android:name="${cp.name}">` },
496
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 130),
497
+ remediation: `将 protectionLevel 改为 "signature" 或 "signatureOrSystem"。`,
498
+ });
499
+ }
500
+ }
501
+ return findings;
502
+ }
503
+ /**
504
+ * 检查 12: Activity 设置 taskAffinity 但未设 singleInstance → MEDIUM
505
+ * StrandHogg 攻击面: 恶意应用可注册相同 taskAffinity 劫持任务栈。
506
+ * CWE-940: Improper Verification of Source of a Communication Channel
507
+ */
508
+ function checkTaskHijacking(m, xml, filePath) {
509
+ const findings = [];
510
+ for (const comp of m.components) {
511
+ if (comp.type !== 'activity')
512
+ continue;
513
+ if (!comp.taskAffinity)
514
+ continue;
515
+ // singleInstance 特有的独立任务栈可缓解 StrandHogg
516
+ if (comp.singleInstance)
517
+ continue;
518
+ const element = `<activity android:name="${comp.name}">`;
519
+ const idx = xml.indexOf(comp.name);
520
+ findings.push({
521
+ id: 'zm-manifest-task-hijacking',
522
+ severity: 'MEDIUM',
523
+ title: `Activity 存在 taskAffinity 劫持风险: ${comp.name}`,
524
+ description: `Activity "${comp.name}" 设置了 android:taskAffinity="${comp.taskAffinity}" 但未设置 ` +
525
+ 'android:launchMode="singleInstance"。恶意应用可注册相同 taskAffinity 并注入伪造 Activity,' +
526
+ '实现 StrandHogg 式任务劫持攻击(钓鱼界面覆盖、凭据窃取)。',
527
+ cwe: 'CWE-940',
528
+ owasp_mobile: 'M1: Improper Platform Usage',
529
+ masvs: 'MASVS-PLATFORM-1',
530
+ location: { file: filePath, element },
531
+ evidence: extractSnippet(xml, idx > 0 ? idx : 0, 130),
532
+ remediation: `设置 android:launchMode="singleInstance" 或移除自定义 taskAffinity;` +
533
+ '在 onCreate() 中检测 isTaskRoot() 并防御性 finish();' +
534
+ '设置 android:exported="false" 如 Activity 不需被外部启动。',
535
+ });
536
+ }
537
+ return findings;
538
+ }
539
+ // ─── 入口函数 ────────────────────────────────────────
540
+ /**
541
+ * 扫描 jadx 输出的 AndroidManifest.xml
542
+ *
543
+ * @param manifestPath - jadx 解码后的 AndroidManifest.xml 路径
544
+ * @returns ManifestFinding[] — 安全发现列表
545
+ * @throws 文件不存在或解析失败时抛出 Error
546
+ */
547
+ export function scanManifest(manifestPath) {
548
+ if (!existsSync(manifestPath)) {
549
+ throw new Error(`AndroidManifest.xml 不存在: ${manifestPath}`);
550
+ }
551
+ const xml = readFileSync(manifestPath, 'utf-8');
552
+ if (xml.trim().length === 0) {
553
+ throw new Error(`AndroidManifest.xml 为空: ${manifestPath}`);
554
+ }
555
+ const manifest = parseManifest(xml, manifestPath);
556
+ const findings = [
557
+ checkDebuggable(manifest, xml, manifestPath),
558
+ checkAllowBackup(manifest, xml, manifestPath),
559
+ checkLowTargetSdk(manifest, xml, manifestPath),
560
+ checkCleartextAllowed(manifest, xml, manifestPath),
561
+ checkNoNetworkConfig(manifest, xml, manifestPath),
562
+ // 组件级检查(每个返回数组)
563
+ ...checkExportedWithoutPermission(manifest, xml, manifestPath),
564
+ ...checkExportedProvider(manifest, xml, manifestPath),
565
+ ...checkExportedReceiver(manifest, xml, manifestPath),
566
+ ...checkExportedService(manifest, xml, manifestPath),
567
+ ...checkDangerousPermissions(manifest, xml, manifestPath),
568
+ ...checkMissingSignaturePermission(manifest, xml, manifestPath),
569
+ ...checkTaskHijacking(manifest, xml, manifestPath),
570
+ ].filter((f) => f !== null);
571
+ return findings;
572
+ }
573
+ // ─── 便捷工具 ────────────────────────────────────────
574
+ /**
575
+ * 按严重程度统计发现数量
576
+ */
577
+ export function countBySeverity(findings) {
578
+ const counts = {
579
+ CRITICAL: 0,
580
+ HIGH: 0,
581
+ WARNING: 0,
582
+ MEDIUM: 0,
583
+ };
584
+ for (const f of findings) {
585
+ counts[f.severity] = (counts[f.severity] ?? 0) + 1;
586
+ }
587
+ return counts;
588
+ }
589
+ /**
590
+ * 按严重程度过滤发现
591
+ */
592
+ export function filterBySeverity(findings, minSeverity) {
593
+ const levels = ['MEDIUM', 'WARNING', 'HIGH', 'CRITICAL'];
594
+ const minIdx = levels.indexOf(minSeverity);
595
+ if (minIdx < 0)
596
+ return findings;
597
+ return findings.filter((f) => levels.indexOf(f.severity) >= minIdx);
598
+ }
599
+ //# sourceMappingURL=manifest_scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest_scanner.js","sourceRoot":"","sources":["../../src/engine/manifest_scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 项目初始化引擎 — V4.1 Sprint 1
3
+ * 自动检测语言/框架/构建工具,生成 .zhuma.yaml
4
+ *
5
+ * 对标 snyk init / murphysec init 一键式体验
6
+ */
7
+ import type { ProjectDetection } from '@zhuma4/sdk';
8
+ interface InitOptions {
9
+ dir?: string;
10
+ language?: string;
11
+ auto?: boolean;
12
+ }
13
+ /**
14
+ * 全维度检测项目
15
+ */
16
+ export declare function detectProject(dir: string): Promise<ProjectDetection>;
17
+ /**
18
+ * 初始化项目 — 主入口
19
+ */
20
+ export declare function initProject(options: InitOptions): Promise<void>;
21
+ export {};
22
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/engine/project.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAuB,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAExF,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqGD;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyC1E;AAyCD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqErE"}