@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
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @zhuma4/cli
2
+
3
+ 逐码 CLI — 命令行代码安全审计工具 (SAST + SCA)
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install -g @zhuma4/cli
9
+ ```
10
+
11
+ 要求: Node.js >= 18, Semgrep >= 1.168
12
+
13
+ ## 快速开始
14
+
15
+ ```bash
16
+ # 扫描当前目录
17
+ zhuma scan .
18
+
19
+ # 输出 SARIF 格式
20
+ zhuma scan . --output sarif
21
+
22
+ # 只显示 ERROR 级别
23
+ zhuma scan . --only critical
24
+
25
+ # SCA 软件成分分析
26
+ zhuma scan . --sca
27
+ ```
28
+
29
+ ## 规则集
30
+
31
+ 内置 **200+ 自研 SAST 规则**,覆盖:
32
+
33
+ - 🔵 **Java** (104 规则) — SQL注入/SSRF/XXE/反序列化/SpEL/Shiro/Fastjson
34
+ - 🟡 **JavaScript/TypeScript** (27 规则) — XSS/SSRF/命令注入/原型污染/JWT安全
35
+ - 🐍 **Python** (11 规则) — SSTI/Pickle反序列化/命令注入/SQL注入
36
+ - 🐹 **Go** (12 规则) — XSS/命令注入/路径穿越/SSRF
37
+ - 📱 **Android** (43 规则) — OWASP Mobile Top 10
38
+ - 🏗️ **IaC** (14 规则) — Terraform/Ansible/Docker/K8s
39
+
40
+ ## 许可
41
+
42
+ Apache-2.0 — 北京众安天下科技有限公司 · 猎鹰情报威胁中心
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,aAAa,SAmBvB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Command } from 'commander';
2
+ export const configCommand = new Command('config')
3
+ .description('管理逐码扫描配置')
4
+ .addCommand(new Command('show')
5
+ .description('显示当前配置')
6
+ .action(async () => {
7
+ const { showConfig } = await import('../engine/config.js');
8
+ await showConfig();
9
+ }))
10
+ .addCommand(new Command('set')
11
+ .description('设置配置项')
12
+ .argument('<key>', '配置键名')
13
+ .argument('<value>', '配置值')
14
+ .action(async (key, value) => {
15
+ const { setConfig } = await import('../engine/config.js');
16
+ await setConfig(key, value);
17
+ }));
18
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,UAAU,CAAC;KACvB,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,WAAW,CAAC,QAAQ,CAAC;KACrB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC3D,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC,CAAC,CACL;KACA,UAAU,CACT,IAAI,OAAO,CAAC,KAAK,CAAC;KACf,WAAW,CAAC,OAAO,CAAC;KACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KACzB,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;KAC1B,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;IAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC,CAAC,CACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,WAAW,SAQpB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ export const initCommand = new Command('init')
3
+ .description('初始化项目的逐码扫描配置,自动检测语言和框架')
4
+ .option('-d, --dir <path>', '项目目录路径', process.cwd())
5
+ .option('-l, --language <lang>', '手动指定语言 (java|js|ts|py|go)')
6
+ .option('--auto', '全自动模式:检测并立即生成配置,无需确认')
7
+ .action(async (options) => {
8
+ const { initProject } = await import('../engine/project.js');
9
+ await initProject(options);
10
+ });
11
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACnD,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC7D,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const scanCommand: Command;
3
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SA2FpB,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { Command } from 'commander';
2
+ import { createHash } from 'node:crypto';
3
+ export const scanCommand = new Command('scan')
4
+ .description('对目标项目执行代码安全审计')
5
+ .argument('[path]', '项目路径', process.cwd())
6
+ .option('-o, --output <format>', '输出格式 (json|html|sarif)', 'html')
7
+ .option('-r, --rules <path>', '自定义规则目录')
8
+ .option('--only <severity>', '仅报告该严重等级以上的 (critical|high|medium|low)')
9
+ .option('--quick', '快速模式 — 仅运行 L0 规则')
10
+ .option('--incremental', '增量扫描 — 仅扫描变更文件')
11
+ .option('--sca', '启用 SCA 依赖分析')
12
+ .option('--api <url>', '提交扫描结果到远程 API 服务端')
13
+ .option('--no-color', '禁用颜色输出')
14
+ .option('--batch <dir>', '批量模式 — 扫描目录下所有子项目')
15
+ .option('--concurrency <N>', '批量并发数 (默认 1)', '1')
16
+ .option('--timeout <M>', '每项目超时秒数 (默认 300)', '300')
17
+ .action(async (target, options) => {
18
+ // 批量模式
19
+ if (options.batch) {
20
+ const { batchScan } = await import('../engine/batch_scan.js');
21
+ await batchScan({
22
+ batchDir: options.batch,
23
+ output: options.output,
24
+ concurrency: parseInt(String(options.concurrency ?? '1'), 10),
25
+ timeout: parseInt(String(options.timeout ?? '300'), 10),
26
+ rules: options.rules,
27
+ only: options.only,
28
+ quick: options.quick,
29
+ });
30
+ return;
31
+ }
32
+ // 单项目模式
33
+ let result;
34
+ if (options.incremental) {
35
+ // ── V4.1 增量扫描模式 ──
36
+ const { runIncrementalScan } = await import('../engine/incremental/engine.js');
37
+ result = await runIncrementalScan(target, {
38
+ target,
39
+ output: options.output,
40
+ rules: options.rules,
41
+ quick: options.quick,
42
+ only: options.only,
43
+ incremental: true,
44
+ sca: options.sca,
45
+ });
46
+ }
47
+ else {
48
+ const { runScan } = await import('../engine/scanner.js');
49
+ result = await runScan(target, {
50
+ target,
51
+ output: options.output,
52
+ rules: options.rules,
53
+ quick: options.quick,
54
+ only: options.only,
55
+ incremental: options.incremental,
56
+ sca: options.sca,
57
+ });
58
+ }
59
+ // V4.1: 远程 API 上报
60
+ if (options.api) {
61
+ const { submitToApi } = await import('../engine/api-submit.js');
62
+ const projectId = createHash('md5').update(target).digest('hex');
63
+ const submitResult = await submitToApi(options.api, projectId, result);
64
+ if (submitResult.error) {
65
+ console.log(`\n⚠️ API 上报失败: ${submitResult.error}`);
66
+ }
67
+ else {
68
+ console.log(`\n📤 已上报 ${submitResult.findingsInserted} 个发现到 ${options.api}`);
69
+ console.log(` Scan ID: ${submitResult.scanId}`);
70
+ }
71
+ }
72
+ // V4.1: 终端摘要(HTML 模式下也展示关键数据)
73
+ if (!options.output || options.output === 'html') {
74
+ const inc = result.incremental;
75
+ if (inc && inc.filesReused > 0) {
76
+ console.log(`\n${'─'.repeat(56)}`);
77
+ console.log(` ⚡ 已扫描 ${inc.filesChanged}/${inc.filesTotal} 文件(增量),复用 ${inc.filesReused} 文件缓存结果,耗时 ${(result.durationMs / 1000).toFixed(1)}s`);
78
+ }
79
+ else if (inc) {
80
+ console.log(`\n${'─'.repeat(56)}`);
81
+ console.log(` ⚡ 已扫描 ${inc.filesTotal} 文件(全量基线建立),耗时 ${(result.durationMs / 1000).toFixed(1)}s`);
82
+ }
83
+ else {
84
+ console.log(`\n${'─'.repeat(50)}`);
85
+ }
86
+ console.log(` 📊 ${result.total} 个发现 | 🔴 ${result.bySeverity?.CRITICAL ?? 0} 🟠 ${result.bySeverity?.HIGH ?? 0} 🟡 ${result.bySeverity?.MEDIUM ?? 0} 🔵 ${result.bySeverity?.LOW ?? 0}`);
87
+ console.log(` 📄 报告: ${result.outputPath}`);
88
+ if (inc) {
89
+ console.log(`${'─'.repeat(56)}\n`);
90
+ }
91
+ else {
92
+ console.log(`${'─'.repeat(50)}\n`);
93
+ }
94
+ }
95
+ });
96
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 逐码 scan:appid — AppID 感知扫描命令
3
+ *
4
+ * 对 jadx 反编译的 APK 项目执行扫描,自动解析 AndroidManifest.xml
5
+ * 按 applicationId 将 findings 分类为 APP/SDK/UNKNOWN
6
+ *
7
+ * Usage:
8
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path>
9
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path> --app-only
10
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path> --output json
11
+ *
12
+ * 核心价值:
13
+ * - 80%+ findings 来自三方 SDK,传统白名单过滤不可靠
14
+ * - AppID 边界引擎基于 applicationId + 组件声明精确区分 APP/SDK
15
+ * - 支持 --app-only 仅输出应用自身代码的 findings
16
+ * - 输出分类统计 (APP/SDK/UNKNOWN 分布)
17
+ */
18
+ import { Command } from 'commander';
19
+ export declare const scanAppIdCommand: Command;
20
+ //# sourceMappingURL=scan_appid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan_appid.d.ts","sourceRoot":"","sources":["../../src/commands/scan_appid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,gBAAgB,SAwGzB,CAAC"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * 逐码 scan:appid — AppID 感知扫描命令
3
+ *
4
+ * 对 jadx 反编译的 APK 项目执行扫描,自动解析 AndroidManifest.xml
5
+ * 按 applicationId 将 findings 分类为 APP/SDK/UNKNOWN
6
+ *
7
+ * Usage:
8
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path>
9
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path> --app-only
10
+ * zhuma scan:appid <jadx_output_dir> --appid <manifest_path> --output json
11
+ *
12
+ * 核心价值:
13
+ * - 80%+ findings 来自三方 SDK,传统白名单过滤不可靠
14
+ * - AppID 边界引擎基于 applicationId + 组件声明精确区分 APP/SDK
15
+ * - 支持 --app-only 仅输出应用自身代码的 findings
16
+ * - 输出分类统计 (APP/SDK/UNKNOWN 分布)
17
+ */
18
+ import { Command } from 'commander';
19
+ import chalk from 'chalk';
20
+ import ora from 'ora';
21
+ import { writeFileSync } from 'node:fs';
22
+ import { resolve } from 'node:path';
23
+ import { existsSync } from 'node:fs';
24
+ import { extractApplicationId, getComponentPackages, classifyFindings, filterByClassification, getClassificationStats, } from '../engine/finding_classifier.js';
25
+ export const scanAppIdCommand = new Command('scan:appid')
26
+ .description('AppID 感知扫描 — 自动区分 APP/SDK/UNKNOWN findings')
27
+ .argument('[path]', 'jadx 反编译输出目录 (sources/)', process.cwd())
28
+ .requiredOption('--appid <manifest>', 'AndroidManifest.xml 路径 (jadx 输出中的 resources/AndroidManifest.xml)')
29
+ .option('-o, --output <format>', '输出格式 (json|html)', 'json')
30
+ .option('-r, --rules <path>', '自定义规则目录')
31
+ .option('--only <severity>', '仅报告该严重等级以上的 (critical|high|medium|low)')
32
+ .option('--quick', '快速模式 — 仅运行 L0 规则')
33
+ .option('--app-only', '仅输出 APP 分类的 findings (忽略 SDK 和 UNKNOWN)')
34
+ .option('--no-app-only', '输出全部分类 findings (默认)')
35
+ .option('--include-unknown', '输出中保留 UNKNOWN 分类 findings (默认仅输出 APP + SDK)')
36
+ .option('--stats-only', '仅输出分类统计 (不输出具体 findings)')
37
+ .action(async (target, options) => {
38
+ const manifestPath = resolve(options.appid);
39
+ const appOnly = options.appOnly;
40
+ const includeUnknown = options.includeUnknown;
41
+ const statsOnly = options.statsOnly;
42
+ // 验证 manifest
43
+ const spinner = ora('解析 AndroidManifest.xml...').start();
44
+ let appId;
45
+ let componentPrefixes;
46
+ try {
47
+ appId = extractApplicationId(manifestPath);
48
+ componentPrefixes = getComponentPackages(manifestPath);
49
+ }
50
+ catch (err) {
51
+ spinner.fail(`解析 AndroidManifest.xml 失败: ${err.message}`);
52
+ process.exit(1);
53
+ }
54
+ spinner.succeed(`Application ID: ${chalk.cyan(appId)} (${componentPrefixes.size} 个组件包前缀)`);
55
+ // 运行 Semgrep 扫描
56
+ spinner.start('执行 Semgrep 扫描...');
57
+ let sarifOutput;
58
+ try {
59
+ // 直接调用 Semgrep --json (非 --sarif),获取可分类的 raw results
60
+ sarifOutput = await runSemgrepJson(target, options.rules || undefined, options.only || undefined, options.quick || undefined);
61
+ }
62
+ catch (err) {
63
+ spinner.fail(`扫描失败: ${err.message}`);
64
+ process.exit(1);
65
+ }
66
+ spinner.succeed('扫描完成');
67
+ // 解析 Semgrep JSON
68
+ const rawResults = sarifOutput.results ?? [];
69
+ spinner.info(`原始 findings: ${rawResults.length} 条`);
70
+ // 分类
71
+ spinner.start('执行 AppID 分类...');
72
+ const classified = classifyFindings(rawResults, manifestPath);
73
+ const stats = getClassificationStats(classified);
74
+ spinner.succeed('分类完成');
75
+ // 应用筛选
76
+ let outputFindings = classified;
77
+ if (appOnly) {
78
+ outputFindings = filterByClassification(classified, ['APP']);
79
+ }
80
+ else if (!includeUnknown) {
81
+ outputFindings = filterByClassification(classified, ['APP', 'SDK']);
82
+ }
83
+ // 打印统计
84
+ printClassificationSummary(stats, outputFindings.length);
85
+ // 输出
86
+ if (statsOnly) {
87
+ // 仅统计,不写文件
88
+ return;
89
+ }
90
+ if (options.output === 'html') {
91
+ spinner.start('生成 HTML 报告...');
92
+ const html = buildAppIdHtmlReport(target, appId, stats, outputFindings);
93
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
94
+ const outPath = `zhuma_appid_report_${timestamp}.html`;
95
+ writeFileSync(outPath, html, 'utf-8');
96
+ spinner.succeed(`报告已保存: ${chalk.green(outPath)}`);
97
+ }
98
+ else {
99
+ // JSON 输出
100
+ spinner.start('生成 JSON 报告...');
101
+ const outPath = `${target.replace(/[\\/]/g, '_')}_zhuma_appid.json`;
102
+ const jsonOutput = {
103
+ applicationId: appId,
104
+ stats: {
105
+ total: stats.total,
106
+ app: stats.app,
107
+ sdk: stats.sdk,
108
+ unknown: stats.unknown,
109
+ appPercent: stats.total > 0 ? ((stats.app / stats.total) * 100).toFixed(1) + '%' : '0%',
110
+ sdkPercent: stats.total > 0 ? ((stats.sdk / stats.total) * 100).toFixed(1) + '%' : '0%',
111
+ unknownPercent: stats.total > 0 ? ((stats.unknown / stats.total) * 100).toFixed(1) + '%' : '0%',
112
+ byConfidence: stats.byConfidence,
113
+ bySource: stats.bySource,
114
+ },
115
+ findings: outputFindings,
116
+ };
117
+ writeFileSync(outPath, JSON.stringify(jsonOutput, null, 2), 'utf-8');
118
+ spinner.succeed(`报告已保存: ${chalk.green(outPath)}`);
119
+ }
120
+ });
121
+ // ─── Helper: 运行 Semgrep --json ─────────────────────────
122
+ async function runSemgrepJson(target, rules, onlySeverity, quick) {
123
+ const { spawn } = await import('node:child_process');
124
+ const { resolve: resolvePath, join } = await import('node:path');
125
+ const SEMGREP_BIN = process.platform === 'win32' ? 'pysemgrep' : 'semgrep';
126
+ // 规则目录
127
+ const rulesDir = rules
128
+ ? resolvePath(rules)
129
+ : resolvePath(join(import.meta.dirname ?? '.', '..', '..', '..', 'rules', 'common'));
130
+ const targetPath = resolvePath(target);
131
+ if (!existsSync(targetPath)) {
132
+ throw new Error(`目标路径不存在: ${target}`);
133
+ }
134
+ const args = ['scan', '--config', rulesDir, '--json', '--quiet', '--no-git-ignore'];
135
+ // severity filter
136
+ if (onlySeverity) {
137
+ const levelMap = {
138
+ critical: 'ERROR', high: 'WARNING', medium: 'INFO', low: 'NOTE',
139
+ };
140
+ const sev = levelMap[onlySeverity.toLowerCase()];
141
+ if (sev)
142
+ args.push('--severity', sev);
143
+ }
144
+ if (quick && !onlySeverity)
145
+ args.push('--severity', 'WARNING');
146
+ args.push(targetPath);
147
+ return new Promise((resolvePromise, rejectPromise) => {
148
+ const child = spawn(SEMGREP_BIN, args, {
149
+ stdio: ['ignore', 'pipe', 'pipe'],
150
+ timeout: 15 * 60 * 1000,
151
+ env: {
152
+ ...process.env,
153
+ PYTHONUTF8: '1',
154
+ PYTHONIOENCODING: 'utf-8',
155
+ },
156
+ });
157
+ let stdout = '';
158
+ let stderr = '';
159
+ child.stdout.on('data', (d) => { stdout += d.toString(); });
160
+ child.stderr.on('data', (d) => { stderr += d.toString(); });
161
+ child.on('close', (code) => {
162
+ if (code !== 0 && code !== 1) {
163
+ rejectPromise(new Error(`Semgrep 异常退出 (exit ${code}): ${stderr.slice(-500)}`));
164
+ return;
165
+ }
166
+ try {
167
+ resolvePromise(JSON.parse(stdout));
168
+ }
169
+ catch {
170
+ rejectPromise(new Error(`Semgrep JSON 解析失败: ${stdout.slice(0, 300)}`));
171
+ }
172
+ });
173
+ child.on('error', (err) => {
174
+ rejectPromise(err.code === 'ENOENT'
175
+ ? new Error('未找到 Semgrep CLI。请执行: pip install semgrep')
176
+ : new Error(`Semgrep 启动失败: ${err.message}`));
177
+ });
178
+ });
179
+ }
180
+ // ─── Console Output ──────────────────────────────────────
181
+ function printClassificationSummary(stats, filteredCount) {
182
+ console.log('');
183
+ console.log(chalk.bold('━━━ AppID 分类统计 ━━━'));
184
+ console.log('');
185
+ // 分类分布
186
+ const total = stats.total || 1;
187
+ const appBar = bar(stats.app / total);
188
+ const sdkBar = bar(stats.sdk / total);
189
+ const unkBar = bar(stats.unknown / total);
190
+ console.log(` ${chalk.green('APP')} ${String(stats.app).padStart(5)} ${appBar} ${((stats.app / total) * 100).toFixed(1)}%`);
191
+ console.log(` ${chalk.yellow('SDK')} ${String(stats.sdk).padStart(5)} ${sdkBar} ${((stats.sdk / total) * 100).toFixed(1)}%`);
192
+ console.log(` ${chalk.gray('UNKNOWN')} ${String(stats.unknown).padStart(5)} ${unkBar} ${((stats.unknown / total) * 100).toFixed(1)}%`);
193
+ console.log('');
194
+ console.log(` 输出 findings: ${chalk.bold(String(filteredCount))} (原始 ${stats.total})`);
195
+ console.log('');
196
+ // 置信度分布
197
+ if (Object.keys(stats.byConfidence).length > 0) {
198
+ console.log(chalk.dim(' 置信度分布:'));
199
+ for (const [level, count] of Object.entries(stats.byConfidence).sort()) {
200
+ console.log(chalk.dim(` ${level.padEnd(10)} ${count}`));
201
+ }
202
+ console.log('');
203
+ }
204
+ // 来源分布
205
+ if (Object.keys(stats.bySource).length > 0) {
206
+ console.log(chalk.dim(' 来源分布:'));
207
+ for (const [src, count] of Object.entries(stats.bySource).sort()) {
208
+ console.log(chalk.dim(` ${src.padEnd(16)} ${count}`));
209
+ }
210
+ console.log('');
211
+ }
212
+ }
213
+ function bar(ratio, width = 20) {
214
+ const filled = Math.round(ratio * width);
215
+ return chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(width - filled));
216
+ }
217
+ // ─── HTML Report Builder ─────────────────────────────────
218
+ function buildAppIdHtmlReport(target, appId, stats, findings) {
219
+ const classColors = {
220
+ APP: '#27ae60',
221
+ SDK: '#f39c12',
222
+ UNKNOWN: '#95a5a6',
223
+ };
224
+ const badge = (cls) => `<span style="display:inline-block;padding:3px 10px;border-radius:12px;font-size:.76em;font-weight:600;color:#fff;background:${classColors[cls] ?? '#6c757d'}">${cls}</span>`;
225
+ const findingRows = findings.map((f) => `
226
+ <tr>
227
+ <td>${badge(f.classification)}</td>
228
+ <td><span style="font-size:.78em;color:#6c757d">${esc(f.confidence)}</span></td>
229
+ <td><code>${esc(f.check_id)}</code></td>
230
+ <td>${esc(f.message)}</td>
231
+ <td><code style="font-size:.76em">${esc(f.path)}:${f.line}</code></td>
232
+ <td style="font-size:.72em;color:#6c757d">${esc(f.reason)}</td>
233
+ </tr>
234
+ `).join('');
235
+ return `<!DOCTYPE html>
236
+ <html lang="zh-CN">
237
+ <head>
238
+ <meta charset="UTF-8">
239
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
240
+ <title>逐码 AppID 感知扫描报告</title>
241
+ <style>
242
+ * { margin:0; padding:0; box-sizing:border-box; }
243
+ body { background: #f5f8fc; color: #495057; font: 14px/1.7 "PingFang SC",-apple-system,"Microsoft YaHei",sans-serif; }
244
+ .cover { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 60px 40px 50px; text-align: center; color: #fff; }
245
+ .cover h1 { font-size: 2em; font-weight: 800; margin-bottom: 6px; }
246
+ .cover .subtitle { opacity: .85; font-size: .9em; }
247
+ .wrap { max-width: 1100px; margin: 0 auto; padding: 28px 24px 60px; }
248
+ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px,1fr)); gap: 16px; margin: 16px 0 28px; }
249
+ .stat-card { background: #fff; border: 1px solid #e4ecf6; border-radius: 12px; padding: 20px; text-align: center; box-shadow: 0 1px 3px rgba(0,0,0,.06); }
250
+ .stat-card .num { font-size: 2.3em; font-weight: 800; }
251
+ .stat-card .label { font-size: .8em; color: #6c757d; margin-top: 4px; text-transform: uppercase; }
252
+ .stat-card.app .num { color: #27ae60; }
253
+ .stat-card.sdk .num { color: #f39c12; }
254
+ .stat-card.unk .num { color: #95a5a6; }
255
+ table { width:100%; border-collapse:collapse; margin:18px 0; border-radius:12px; overflow:hidden; box-shadow: 0 1px 3px rgba(0,0,0,.06); }
256
+ thead th { background: linear-gradient(180deg,#f4f9ff,#eaf2fc); color:#1a6dff; font-weight:700; font-size:.82em; text-transform:uppercase; padding:12px 14px; text-align:left; border-bottom:2px solid #d0dff5; }
257
+ tbody td { padding:10px 14px; border-bottom:1px solid #eef3f9; font-size:.88em; }
258
+ tbody tr:hover td { background:#f6faff; }
259
+ code { background:#f0f5fb; padding:2px 7px; border-radius:4px; font-family:"Fira Code",Consolas,monospace; font-size:.84em; color:#1a6dff; }
260
+ h2 { color:#1a1a2e; margin:28px 0 10px; font-size:1.2em; }
261
+ .footer { margin-top:36px; padding-top:18px; border-top:1px solid #e0e7f0; text-align:center; color:#6c757d; font-size:.8em; }
262
+ </style>
263
+ </head>
264
+ <body>
265
+ <div class="cover">
266
+ <h1>逐码 AppID 感知扫描报告</h1>
267
+ <div class="subtitle">${esc(target)} · Application ID: ${esc(appId)} · ${new Date().toLocaleString('zh-CN')}</div>
268
+ </div>
269
+ <div class="wrap">
270
+ <h2>📊 分类统计</h2>
271
+ <div class="stats">
272
+ <div class="stat-card app"><div class="num">${stats.app}</div><div class="label">🟢 APP</div></div>
273
+ <div class="stat-card sdk"><div class="num">${stats.sdk}</div><div class="label">🟠 SDK</div></div>
274
+ <div class="stat-card unk"><div class="num">${stats.unknown}</div><div class="label">⚪ UNKNOWN</div></div>
275
+ <div class="stat-card"><div class="num">${stats.total}</div><div class="label">总计</div></div>
276
+ </div>
277
+ <p style="color:#6c757d;font-size:.84em">
278
+ APP 占比: ${stats.total > 0 ? ((stats.app / stats.total) * 100).toFixed(1) : 0}% |
279
+ SDK 占比: ${stats.total > 0 ? ((stats.sdk / stats.total) * 100).toFixed(1) : 0}% |
280
+ UNKNOWN 占比: ${stats.total > 0 ? ((stats.unknown / stats.total) * 100).toFixed(1) : 0}%
281
+ </p>
282
+
283
+ <h2>📋 发现详情</h2>
284
+ <table>
285
+ <thead><tr><th>分类</th><th>置信度</th><th>规则</th><th>描述</th><th>位置</th><th>原因</th></tr></thead>
286
+ <tbody>
287
+ ${findingRows || '<tr><td colspan="6" style="text-align:center;color:#6c757d;padding:28px;">✅ 无发现</td></tr>'}
288
+ </tbody>
289
+ </table>
290
+
291
+ <div class="footer">
292
+ <p>由 <strong>逐码 ZhuMa V4.1 AppID Engine</strong> 生成 · 众安天下 · 猎鹰情报威胁中心</p>
293
+ </div>
294
+ </div>
295
+ </body>
296
+ </html>`;
297
+ }
298
+ function esc(s) {
299
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
300
+ }
301
+ //# sourceMappingURL=scan_appid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan_appid.js","sourceRoot":"","sources":["../../src/commands/scan_appid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * scan_manifest CLI — 独立 AndroidManifest.xml 安全扫描命令
3
+ *
4
+ * Usage:
5
+ * zhuma scan-manifest <path> # 扫描单个文件
6
+ * zhuma scan-manifest <path> --json # JSON 输出
7
+ * zhuma scan-manifest <path> --only HIGH # 仅返回 HIGH 及以上
8
+ *
9
+ * 扫描 jadx 解码后的 AndroidManifest.xml 并输出安全发现。
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare const scanManifestCommand: Command;
13
+ //# sourceMappingURL=scan_manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan_manifest.d.ts","sourceRoot":"","sources":["../../src/commands/scan_manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,mBAAmB,SAyF5B,CAAC"}