@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.
- package/README.md +42 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +18 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +11 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +96 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/scan_appid.d.ts +20 -0
- package/dist/commands/scan_appid.d.ts.map +1 -0
- package/dist/commands/scan_appid.js +301 -0
- package/dist/commands/scan_appid.js.map +1 -0
- package/dist/commands/scan_manifest.d.ts +13 -0
- package/dist/commands/scan_manifest.d.ts.map +1 -0
- package/dist/commands/scan_manifest.js +103 -0
- package/dist/commands/scan_manifest.js.map +1 -0
- package/dist/engine/api-submit.d.ts +16 -0
- package/dist/engine/api-submit.d.ts.map +1 -0
- package/dist/engine/api-submit.js +66 -0
- package/dist/engine/api-submit.js.map +1 -0
- package/dist/engine/batch_scan.d.ts +36 -0
- package/dist/engine/batch_scan.d.ts.map +1 -0
- package/dist/engine/batch_scan.js +192 -0
- package/dist/engine/batch_scan.js.map +1 -0
- package/dist/engine/config.d.ts +12 -0
- package/dist/engine/config.d.ts.map +1 -0
- package/dist/engine/config.js +27 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/errors.d.ts +36 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +99 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/filter.d.ts +13 -0
- package/dist/engine/filter.d.ts.map +1 -0
- package/dist/engine/filter.js +64 -0
- package/dist/engine/filter.js.map +1 -0
- package/dist/engine/finding_classifier.d.ts +108 -0
- package/dist/engine/finding_classifier.d.ts.map +1 -0
- package/dist/engine/finding_classifier.js +440 -0
- package/dist/engine/finding_classifier.js.map +1 -0
- package/dist/engine/incremental/engine.d.ts +25 -0
- package/dist/engine/incremental/engine.d.ts.map +1 -0
- package/dist/engine/incremental/engine.js +337 -0
- package/dist/engine/incremental/engine.js.map +1 -0
- package/dist/engine/incremental/git-diff.d.ts +19 -0
- package/dist/engine/incremental/git-diff.d.ts.map +1 -0
- package/dist/engine/incremental/git-diff.js +175 -0
- package/dist/engine/incremental/git-diff.js.map +1 -0
- package/dist/engine/incremental/types.d.ts +33 -0
- package/dist/engine/incremental/types.d.ts.map +1 -0
- package/dist/engine/incremental/types.js +11 -0
- package/dist/engine/incremental/types.js.map +1 -0
- package/dist/engine/manifest_scanner.d.ts +48 -0
- package/dist/engine/manifest_scanner.d.ts.map +1 -0
- package/dist/engine/manifest_scanner.js +599 -0
- package/dist/engine/manifest_scanner.js.map +1 -0
- package/dist/engine/project.d.ts +22 -0
- package/dist/engine/project.d.ts.map +1 -0
- package/dist/engine/project.js +279 -0
- package/dist/engine/project.js.map +1 -0
- package/dist/engine/sarif.d.ts +13 -0
- package/dist/engine/sarif.d.ts.map +1 -0
- package/dist/engine/sarif.js +44 -0
- package/dist/engine/sarif.js.map +1 -0
- package/dist/engine/sca-integration.d.ts +36 -0
- package/dist/engine/sca-integration.d.ts.map +1 -0
- package/dist/engine/sca-integration.js +91 -0
- package/dist/engine/sca-integration.js.map +1 -0
- package/dist/engine/scanner.d.ts +18 -0
- package/dist/engine/scanner.d.ts.map +1 -0
- package/dist/engine/scanner.js +138 -0
- package/dist/engine/scanner.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/report/render.d.ts +23 -0
- package/dist/report/render.d.ts.map +1 -0
- package/dist/report/render.js +335 -0
- package/dist/report/render.js.map +1 -0
- package/package.json +41 -0
- package/rules/android/mobile-cleartext-traffic.yaml +46 -0
- package/rules/android/mobile-component-security.yaml +107 -0
- package/rules/android/mobile-crypto-weakness.yaml +139 -0
- package/rules/android/mobile-cwe-1021-tapjacking.yaml +81 -0
- package/rules/android/mobile-cwe-114-dynamic-dex-loading.yaml +41 -0
- package/rules/android/mobile-cwe-200-clipboard-data-leak.yaml +66 -0
- package/rules/android/mobile-cwe-200-debug-builds.yaml +111 -0
- package/rules/android/mobile-cwe-200-log-sensitive-data.yaml +61 -0
- package/rules/android/mobile-cwe-200-webview-debugging.yaml +56 -0
- package/rules/android/mobile-cwe-200-webview-universal-access.yaml +30 -0
- package/rules/android/mobile-cwe-200-window-flags.yaml +96 -0
- package/rules/android/mobile-cwe-22-content-provider-openfile.yaml +73 -0
- package/rules/android/mobile-cwe-22-path-traversal.yaml +86 -0
- package/rules/android/mobile-cwe-287-biometric-weakness.yaml +102 -0
- package/rules/android/mobile-cwe-295-cert-pinning-missing.yaml +78 -0
- package/rules/android/mobile-cwe-295-webview-ssl-bypass.yaml +104 -0
- package/rules/android/mobile-cwe-312-cleartext-storage.yaml +109 -0
- package/rules/android/mobile-cwe-319-cleartext-communication.yaml +84 -0
- package/rules/android/mobile-cwe-321-hardcoded-crypto-keys.yaml +132 -0
- package/rules/android/mobile-cwe-326-short-rsa.yaml +108 -0
- package/rules/android/mobile-cwe-327-rc4-3des.yaml +107 -0
- package/rules/android/mobile-cwe-329-cbc-padding-oracle.yaml +76 -0
- package/rules/android/mobile-cwe-470-reflection-injection.yaml +39 -0
- package/rules/android/mobile-cwe-489-root-detection-weak.yaml +125 -0
- package/rules/android/mobile-cwe-489-stetho-debug.yaml +107 -0
- package/rules/android/mobile-cwe-502-insecure-deserialization.yaml +76 -0
- package/rules/android/mobile-cwe-552-world-readable-files.yaml +63 -0
- package/rules/android/mobile-cwe-749-webview-java-objects.yaml +78 -0
- package/rules/android/mobile-cwe-749-webview-jsbridge.yaml +57 -0
- package/rules/android/mobile-cwe-749-webview-loadurl-injection.yaml +80 -0
- package/rules/android/mobile-cwe-78-command-injection.yaml +77 -0
- package/rules/android/mobile-cwe-780-rsa-no-oaep.yaml +80 -0
- package/rules/android/mobile-cwe-79-webview-setdata.yaml +78 -0
- package/rules/android/mobile-cwe-79-webview-xss.yaml +65 -0
- package/rules/android/mobile-cwe-798-hardcoded-credentials.yaml +108 -0
- package/rules/android/mobile-cwe-89-sql-injection.yaml +100 -0
- package/rules/android/mobile-cwe-927-implicit-intent.yaml +121 -0
- package/rules/android/mobile-cwe-927-ipc-file-provider.yaml +102 -0
- package/rules/android/mobile-cwe-939-deeplink-validation.yaml +76 -0
- package/rules/android/mobile-sdk-google-firebase-open.yaml +117 -0
- package/rules/android/mobile-sdk-tencent-tpns-config-leak.yaml +131 -0
- package/rules/android/mobile-secrets-storage.yaml +136 -0
- package/rules/android/mobile-webview-security.yaml +88 -0
- package/rules/common/cwe-200-sensitive-data-exposure.yaml +61 -0
- package/rules/common/cwe-22-path-traversal.yaml +47 -0
- package/rules/common/cwe-295-ssl-bypass.yaml +217 -0
- package/rules/common/cwe-295-ssl-verification-disabled.yaml +64 -0
- package/rules/common/cwe-306-missing-authentication.yaml +44 -0
- package/rules/common/cwe-326-weak-key-size.yaml +107 -0
- package/rules/common/cwe-327-weak-crypto.yaml +177 -0
- package/rules/common/cwe-328-weak-hash.yaml +96 -0
- package/rules/common/cwe-329-cbc-mode.yaml +26 -0
- package/rules/common/cwe-352-csrf.yaml +23 -0
- package/rules/common/cwe-434-unrestricted-file-upload.yaml +41 -0
- package/rules/common/cwe-502-insecure-deserialization.yaml +44 -0
- package/rules/common/cwe-601-url-redirect.yaml +110 -0
- package/rules/common/cwe-611-xxe.yaml +70 -0
- package/rules/common/cwe-732-incorrect-permission.yaml +49 -0
- package/rules/common/cwe-770-resource-exhaustion.yaml +44 -0
- package/rules/common/cwe-78-os-command-injection.yaml +43 -0
- package/rules/common/cwe-787-out-of-bounds-write.yaml +37 -0
- package/rules/common/cwe-79-xss.yaml +51 -0
- package/rules/common/cwe-862-missing-authorization.yaml +40 -0
- package/rules/common/cwe-89-sqli.yaml +89 -0
- package/rules/common/cwe-918-ssrf.yaml +45 -0
- package/rules/common/cwe-94-code-injection.yaml +59 -0
- package/rules/common/zm-go-cwe22-path-traversal-fs.yaml +117 -0
- package/rules/common/zm-go-cwe22-path-traversal.yaml +103 -0
- package/rules/common/zm-go-cwe307-brute-force.yaml +129 -0
- package/rules/common/zm-go-cwe326-weak-crypto.yaml +124 -0
- package/rules/common/zm-go-cwe327-weak-cipher.yaml +152 -0
- package/rules/common/zm-go-cwe384-session-fixation.yaml +128 -0
- package/rules/common/zm-go-cwe502-deserialization.yaml +120 -0
- package/rules/common/zm-go-cwe78-command-injection.yaml +95 -0
- package/rules/common/zm-go-cwe79-xss.yaml +104 -0
- package/rules/common/zm-go-cwe798-hardcoded-creds.yaml +153 -0
- package/rules/common/zm-go-cwe89-sqli.yaml +89 -0
- package/rules/common/zm-go-cwe918-ssrf.yaml +117 -0
- package/rules/common/zm-java-cwe117-log-injection.yaml +83 -0
- package/rules/common/zm-java-cwe117-logforging.yaml +153 -0
- package/rules/common/zm-java-cwe200-actuator-exposure.yaml +8 -0
- package/rules/common/zm-java-cwe200-info-disclosure.yaml +91 -0
- package/rules/common/zm-java-cwe22-file-depth.yaml +135 -0
- package/rules/common/zm-java-cwe22-path-traversal-spring.yaml +81 -0
- package/rules/common/zm-java-cwe284-missing-auth-spring.yaml +131 -0
- package/rules/common/zm-java-cwe295-webview-ssl.yaml +123 -0
- package/rules/common/zm-java-cwe327-weakcrypto.yaml +197 -0
- package/rules/common/zm-java-cwe347-jwt.yaml +30 -0
- package/rules/common/zm-java-cwe352-csrf-depth.yaml +107 -0
- package/rules/common/zm-java-cwe352-csrf-disabled.yaml +15 -0
- package/rules/common/zm-java-cwe501-trust-boundary.yaml +124 -0
- package/rules/common/zm-java-cwe502-deserial-depth.yaml +128 -0
- package/rules/common/zm-java-cwe502-fastjson.yaml +137 -0
- package/rules/common/zm-java-cwe502-gadget.yaml +158 -0
- package/rules/common/zm-java-cwe502-jndi-injection.yaml +91 -0
- package/rules/common/zm-java-cwe502-shiro.yaml +108 -0
- package/rules/common/zm-java-cwe601-url-redirect-spring.yaml +85 -0
- package/rules/common/zm-java-cwe611-xxe-enhanced.yaml +80 -0
- package/rules/common/zm-java-cwe611-xxe-transformer.yaml +85 -0
- package/rules/common/zm-java-cwe639-idor.yaml +123 -0
- package/rules/common/zm-java-cwe79-xss-depth.yaml +98 -0
- package/rules/common/zm-java-cwe862-authz-depth.yaml +127 -0
- package/rules/common/zm-java-cwe915-mass-assignment.yaml +16 -0
- package/rules/common/zm-java-cwe917-expression-injection.yaml +120 -0
- package/rules/common/zm-java-cwe918-resttemplate.yaml +67 -0
- package/rules/common/zm-java-cwe918-ssrf-depth.yaml +103 -0
- package/rules/common/zm-java-cwe918-ssrf-resttemplate.yaml +77 -0
- package/rules/common/zm-java-cwe918-webclient.yaml +44 -0
- package/rules/common/zm-java-cwe94-ognl.yaml +66 -0
- package/rules/common/zm-java-cwe94-spel-injection.yaml +85 -0
- package/rules/common/zm-java-cwe94-spel.yaml +112 -0
- package/rules/common/zm-java-cwe94-ssti.yaml +22 -0
- package/rules/common/zm-java-cwe942-cors.yaml +15 -0
- package/rules/common/zm-js-cwe1321-prototype-pollution.yaml +61 -0
- package/rules/common/zm-js-cwe200-info-disclosure.yaml +95 -0
- package/rules/common/zm-js-cwe22-path-traversal-fs.yaml +113 -0
- package/rules/common/zm-js-cwe22-pathtraversal.yaml +111 -0
- package/rules/common/zm-js-cwe307-brute-force.yaml +136 -0
- package/rules/common/zm-js-cwe345-postmessage.yaml +75 -0
- package/rules/common/zm-js-cwe347-jwt-weak.yaml +95 -0
- package/rules/common/zm-js-cwe352-csrf.yaml +52 -0
- package/rules/common/zm-js-cwe384-session-fixation.yaml +132 -0
- package/rules/common/zm-js-cwe502-deserialization.yaml +119 -0
- package/rules/common/zm-js-cwe611-xxe.yaml +108 -0
- package/rules/common/zm-js-cwe639-idor.yaml +122 -0
- package/rules/common/zm-js-cwe693-helmet-missing.yaml +46 -0
- package/rules/common/zm-js-cwe78-exec.yaml +37 -0
- package/rules/common/zm-js-cwe78-spawn.yaml +37 -0
- package/rules/common/zm-js-cwe79-domxss.yaml +84 -0
- package/rules/common/zm-js-cwe79-react-xss.yaml +18 -0
- package/rules/common/zm-js-cwe79-xss-ejs.yaml +70 -0
- package/rules/common/zm-js-cwe89-sqli.yaml +153 -0
- package/rules/common/zm-js-cwe915-mass-assignment.yaml +111 -0
- package/rules/common/zm-js-cwe918-ssrf-fetch.yaml +134 -0
- package/rules/common/zm-js-cwe918-ssrf.yaml +132 -0
- package/rules/common/zm-js-cwe94-template-injection.yaml +130 -0
- package/rules/common/zm-js-cwe942-cors.yaml +49 -0
- package/rules/common/zm-js-cwe943-nosql-injection.yaml +52 -0
- package/rules/common/zm-js-cwe95-eval.yaml +59 -0
- package/rules/common/zm-js-cwe95-function-ctor.yaml +31 -0
- package/rules/common/zm-py-cwe22-path-traversal.yaml +86 -0
- package/rules/common/zm-py-cwe327-weak-crypto.yaml +103 -0
- package/rules/common/zm-py-cwe502-pickle.yaml +92 -0
- package/rules/common/zm-py-cwe611-xxe.yaml +100 -0
- package/rules/common/zm-py-cwe78-command-injection.yaml +121 -0
- package/rules/common/zm-py-cwe79-xss.yaml +123 -0
- package/rules/common/zm-py-cwe798-hardcoded-creds.yaml +86 -0
- package/rules/common/zm-py-cwe89-sqli.yaml +59 -0
- package/rules/common/zm-py-cwe918-ssrf.yaml +123 -0
- package/rules/common/zm-py-cwe94-ssti.yaml +87 -0
- package/rules/common/zm-py-cwe943-nosql-injection.yaml +123 -0
- package/rules/iac/ansible/zm-ansible-cwe269-privilege-escalation.yaml +63 -0
- package/rules/iac/ansible/zm-ansible-cwe78-command-injection.yaml +67 -0
- package/rules/iac/ansible/zm-ansible-cwe798-hardcoded-creds.yaml +93 -0
- package/rules/iac/terraform/zm-tf-cwe200-s3-bucket-public.yaml +100 -0
- package/rules/iac/terraform/zm-tf-cwe284-sg-wide-open.yaml +88 -0
- package/rules/iac/terraform/zm-tf-cwe311-iam-wildcard.yaml +83 -0
- package/rules/iac/terraform/zm-tf-cwe319-rds-public.yaml +72 -0
- package/rules/iac/terraform/zm-tf-cwe798-hardcoded-creds.yaml +102 -0
- package/rules/iac/zm-docker-cwe250-root-user.yaml +50 -0
- package/rules/iac/zm-docker-cwe400-resource-limit.yaml +92 -0
- package/rules/iac/zm-docker-security.yaml +104 -0
- package/rules/iac/zm-k8s-cwe200-service-account.yaml +83 -0
- package/rules/iac/zm-k8s-cwe250-privileged.yaml +56 -0
- package/rules/iac/zm-k8s-security.yaml +79 -0
- package/rules/rules_index.yaml.off +477 -0
- package/rules/semgrep-registry/anonymous-ldap-bind.yaml +34 -0
- package/rules/semgrep-registry/bad-hexa-conversion.yaml +32 -0
- package/rules/semgrep-registry/blowfish-insufficient-key-size.yaml +39 -0
- package/rules/semgrep-registry/cbc-padding-oracle.yaml +38 -0
- package/rules/semgrep-registry/command-injection-formatted-runtime-call.yaml +90 -0
- package/rules/semgrep-registry/command-injection-process-builder.yaml +148 -0
- package/rules/semgrep-registry/cookie-missing-httponly.yaml +38 -0
- package/rules/semgrep-registry/cookie-missing-secure-flag.yaml +38 -0
- package/rules/semgrep-registry/crlf-injection-logs.yaml +86 -0
- package/rules/semgrep-registry/dangerous-groovy-shell.yaml +46 -0
- package/rules/semgrep-registry/el-injection.yaml +137 -0
- package/rules/semgrep-registry/formatted-sql-string.yaml +95 -0
- package/rules/semgrep-registry/http-response-splitting.yaml +44 -0
- package/rules/semgrep-registry/index.txt +1 -0
- package/rules/semgrep-registry/insecure-smtp-connection.yaml +34 -0
- package/rules/semgrep-registry/java-reverse-shell.yaml +43 -0
- package/rules/semgrep-registry/jdbc-sql-formatted-string.yaml +120 -0
- package/rules/semgrep-registry/ldap-entry-poisoning.yaml +41 -0
- package/rules/semgrep-registry/ldap-injection.yaml +82 -0
- package/rules/semgrep-registry/md5-used-as-password.yaml +44 -0
- package/rules/semgrep-registry/object-deserialization.yaml +34 -0
- package/rules/semgrep-registry/ognl-injection.yaml +839 -0
- package/rules/semgrep-registry/overly-permissive-file-permission.yaml +49 -0
- package/rules/semgrep-registry/permissive-cors.yaml +77 -0
- package/rules/semgrep-registry/script-engine-injection.yaml +66 -0
- package/rules/semgrep-registry/tainted-cmd-from-http-request.yaml +74 -0
- package/rules/semgrep-registry/tainted-env-from-http-request.yaml +46 -0
- package/rules/semgrep-registry/tainted-ldapi-from-http-request.yaml +42 -0
- package/rules/semgrep-registry/tainted-session-from-http-request.yaml +70 -0
- package/rules/semgrep-registry/tainted-xpath-from-http-request.yaml +38 -0
- package/rules/semgrep-registry/unsafe-reflection.yaml +39 -0
- package/rules/semgrep-registry/unvalidated-redirect.yaml +127 -0
- package/rules/semgrep-registry/url-rewriting.yaml +82 -0
- package/rules/semgrep-registry/weak-ssl-context.yaml +34 -0
- package/rules/semgrep-registry/xml-decoder.yaml +53 -0
- package/rules/semgrep-registry/xssrequestwrapper-is-insecure.yaml +40 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# CWE-200: WebView 远程调试已开启 (Android)
|
|
2
|
+
# 逐码 ZhuMa V4.0 — Android 规则库
|
|
3
|
+
# 来源: V3 审计引擎 VULN-WV-005
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-webview-debugging-enabled
|
|
7
|
+
severity: WARNING
|
|
8
|
+
message: |
|
|
9
|
+
WebView 远程调试 (setWebContentsDebuggingEnabled) 已启用。
|
|
10
|
+
在生产环境中,攻击者可通过 chrome://inspect 直接调试 WebView、注入任意 JavaScript、
|
|
11
|
+
窃取 Cookie/Token 等敏感数据。
|
|
12
|
+
修复: 仅在 BuildConfig.DEBUG 条件下启用;Release 构建必须关闭。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern: |
|
|
17
|
+
$WV.setWebContentsDebuggingEnabled(true)
|
|
18
|
+
- pattern-not: |
|
|
19
|
+
if (BuildConfig.DEBUG) {
|
|
20
|
+
$WV.setWebContentsDebuggingEnabled(true);
|
|
21
|
+
}
|
|
22
|
+
metadata:
|
|
23
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
24
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
25
|
+
masvs: "MASVS-RESILIENCE-2"
|
|
26
|
+
category: android-webview
|
|
27
|
+
precision: medium
|
|
28
|
+
confidence: high
|
|
29
|
+
likelihood: medium
|
|
30
|
+
impact: medium
|
|
31
|
+
source: "V3 Audit Engine - VULN-WV-005"
|
|
32
|
+
references:
|
|
33
|
+
- https://developer.android.com/reference/android/webkit/WebView#setWebContentsDebuggingEnabled(boolean)
|
|
34
|
+
|
|
35
|
+
- id: zm-android-webview-debugging-enabled-kotlin
|
|
36
|
+
severity: WARNING
|
|
37
|
+
message: |
|
|
38
|
+
WebView 远程调试已开启 (Kotlin)。
|
|
39
|
+
生产环境应禁用 WebView 远程调试。
|
|
40
|
+
languages:
|
|
41
|
+
- kotlin
|
|
42
|
+
patterns:
|
|
43
|
+
- pattern: |
|
|
44
|
+
$WV.setWebContentsDebuggingEnabled(true)
|
|
45
|
+
- pattern-not: |
|
|
46
|
+
if (BuildConfig.DEBUG) {
|
|
47
|
+
$WV.setWebContentsDebuggingEnabled(true)
|
|
48
|
+
}
|
|
49
|
+
metadata:
|
|
50
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
51
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
52
|
+
masvs: "MASVS-RESILIENCE-2"
|
|
53
|
+
category: android-webview
|
|
54
|
+
precision: medium
|
|
55
|
+
confidence: high
|
|
56
|
+
source: "V3 Audit Engine - VULN-WV-005"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# CWE-200: WebView setAllowUniversalAccessFromFileURLs (Android)
|
|
2
|
+
# 逐码 ZhuMa V4.0 — Android 规则库
|
|
3
|
+
# 来源: V3 审计引擎 VULN-WV-008
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-webview-universal-access-file-urls
|
|
7
|
+
severity: CRITICAL
|
|
8
|
+
message: |
|
|
9
|
+
检测到 setAllowUniversalAccessFromFileURLs(true) - 极危配置。
|
|
10
|
+
这使得 file:// 页面可通过 XMLHttpRequest 访问任意源,完全绕过同源策略。
|
|
11
|
+
攻击者可通过恶意 file:// 页面窃取本地文件并通过网络发送到攻击者服务器。
|
|
12
|
+
这是 Google 官方声明后悔引入的 API,必须禁用。
|
|
13
|
+
修复: setAllowUniversalAccessFromFileURLs(false);
|
|
14
|
+
languages:
|
|
15
|
+
- java
|
|
16
|
+
pattern: |
|
|
17
|
+
$WV.getSettings().setAllowUniversalAccessFromFileURLs(true)
|
|
18
|
+
metadata:
|
|
19
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
20
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
21
|
+
masvs: "MASVS-PLATFORM-2"
|
|
22
|
+
category: android-webview
|
|
23
|
+
precision: high
|
|
24
|
+
confidence: high
|
|
25
|
+
likelihood: critical
|
|
26
|
+
impact: high
|
|
27
|
+
source: "V3 Audit Engine - VULN-WV-008"
|
|
28
|
+
references:
|
|
29
|
+
- https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs(boolean)
|
|
30
|
+
- https://bugs.chromium.org/p/chromium/issues/detail?id=522896
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# CWE-200: Missing FLAG_SECURE for Sensitive Screens (Android)
|
|
2
|
+
# ZhuMa V4.0 - Android Rule Library
|
|
3
|
+
# Source: ZhuMa V4.1 Rule Expansion - screen capture and clipboard protection
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-activity-no-flag-secure
|
|
7
|
+
severity: MEDIUM
|
|
8
|
+
message: |
|
|
9
|
+
Detected Activity.onCreate() without getWindow().setFlags(FLAG_SECURE).
|
|
10
|
+
Without FLAG_SECURE, the screen content can be captured via screenshot, screen recording,
|
|
11
|
+
or the task switcher thumbnail, exposing sensitive data.
|
|
12
|
+
Remediation: Add getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, ...) in onCreate().
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern-either:
|
|
17
|
+
- pattern: |
|
|
18
|
+
public void onCreate(Bundle $B) {
|
|
19
|
+
...
|
|
20
|
+
super.onCreate($B);
|
|
21
|
+
...
|
|
22
|
+
setContentView($LAYOUT);
|
|
23
|
+
...
|
|
24
|
+
}
|
|
25
|
+
metadata:
|
|
26
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
27
|
+
owasp-mobile: "M2: Insecure Data Storage"
|
|
28
|
+
masvs: "MASVS-STORAGE-4"
|
|
29
|
+
category: android-ui
|
|
30
|
+
precision: low
|
|
31
|
+
confidence: low
|
|
32
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
33
|
+
references:
|
|
34
|
+
- https://cwe.mitre.org/data/definitions/200.html
|
|
35
|
+
- https://developer.android.com/privacy-and-security/risks/screenshots
|
|
36
|
+
|
|
37
|
+
- id: zm-android-sensitive-activity-no-flag-secure
|
|
38
|
+
severity: MEDIUM
|
|
39
|
+
message: |
|
|
40
|
+
Detected an Activity with a sensitive name (password, payment, creditcard, login, auth, transfer)
|
|
41
|
+
that does not use FLAG_SECURE. Screenshots and screen recording can capture credentials or financial data.
|
|
42
|
+
Remediation: Add getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, ...) in onCreate().
|
|
43
|
+
languages:
|
|
44
|
+
- java
|
|
45
|
+
patterns:
|
|
46
|
+
- pattern-either:
|
|
47
|
+
- pattern: |
|
|
48
|
+
class $ACT extends Activity {
|
|
49
|
+
...
|
|
50
|
+
}
|
|
51
|
+
- pattern: |
|
|
52
|
+
class $ACT extends AppCompatActivity {
|
|
53
|
+
...
|
|
54
|
+
}
|
|
55
|
+
- pattern: |
|
|
56
|
+
class $ACT extends FragmentActivity {
|
|
57
|
+
...
|
|
58
|
+
}
|
|
59
|
+
- metavariable-regex:
|
|
60
|
+
metavariable: $ACT
|
|
61
|
+
regex: '(?i)(.*[Pp]assword.*|.*[Pp]ayment.*|.*[Cc]redit[Cc]ard.*|.*[Ll]ogin.*|.*[Aa]uth.*|.*[Tt]ransfer.*|.*[Cc]heckout.*|.*[Ww]allet.*)'
|
|
62
|
+
metadata:
|
|
63
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
64
|
+
owasp-mobile: "M2: Insecure Data Storage"
|
|
65
|
+
masvs: "MASVS-STORAGE-4"
|
|
66
|
+
category: android-ui
|
|
67
|
+
precision: low
|
|
68
|
+
confidence: low
|
|
69
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
70
|
+
references:
|
|
71
|
+
- https://cwe.mitre.org/data/definitions/200.html
|
|
72
|
+
|
|
73
|
+
- id: zm-android-window-flags-no-secure
|
|
74
|
+
severity: MEDIUM
|
|
75
|
+
message: |
|
|
76
|
+
Detected window flag configuration without FLAG_SECURE.
|
|
77
|
+
If this window displays sensitive content (passwords, financial data), it may be captured.
|
|
78
|
+
Remediation: Add WindowManager.LayoutParams.FLAG_SECURE to window flags on sensitive screens.
|
|
79
|
+
languages:
|
|
80
|
+
- java
|
|
81
|
+
patterns:
|
|
82
|
+
- pattern-either:
|
|
83
|
+
- pattern: |
|
|
84
|
+
getWindow().setFlags($FLAGS, $MASK)
|
|
85
|
+
- pattern: |
|
|
86
|
+
getWindow().addFlags($FLAGS)
|
|
87
|
+
metadata:
|
|
88
|
+
cwe: "CWE-200: Exposure of Sensitive Information to an Unauthorized Actor"
|
|
89
|
+
owasp-mobile: "M2: Insecure Data Storage"
|
|
90
|
+
masvs: "MASVS-STORAGE-4"
|
|
91
|
+
category: android-ui
|
|
92
|
+
precision: low
|
|
93
|
+
confidence: low
|
|
94
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
95
|
+
references:
|
|
96
|
+
- https://cwe.mitre.org/data/definitions/200.html
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# CWE-22: Content Provider openFile Path Traversal (Android)
|
|
2
|
+
# ZhuMa V4.0 - Android Rule Library
|
|
3
|
+
# Source: ZhuMa V4.1 Rule Expansion - content provider path traversal hardening
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-openfile-no-path-validation
|
|
7
|
+
severity: HIGH
|
|
8
|
+
message: |
|
|
9
|
+
Detected ContentProvider.openFile() that constructs a file path from Uri without canonical path check.
|
|
10
|
+
An attacker can use "../" sequences in the Uri path to escape the intended directory and read arbitrary files
|
|
11
|
+
(e.g., /data/data/com.other.app/databases/accounts.db) via path traversal.
|
|
12
|
+
Remediation: Resolve to canonical path and verify it starts with the allowed base directory before opening.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern-either:
|
|
17
|
+
- pattern: $URI.getPath()
|
|
18
|
+
- pattern: new File($BASE, $URI.getPath())
|
|
19
|
+
metadata:
|
|
20
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
21
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
22
|
+
masvs: "MASVS-PLATFORM-2"
|
|
23
|
+
category: android-ipc
|
|
24
|
+
precision: low
|
|
25
|
+
confidence: low
|
|
26
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
27
|
+
references:
|
|
28
|
+
- https://cwe.mitre.org/data/definitions/22.html
|
|
29
|
+
|
|
30
|
+
- id: zm-android-contentresolver-access-no-validation
|
|
31
|
+
severity: MEDIUM
|
|
32
|
+
message: |
|
|
33
|
+
Detected ContentResolver accessing a content:// Uri without input validation on the path.
|
|
34
|
+
If the Uri comes from an external source (Intent, deeplink), an attacker can manipulate
|
|
35
|
+
the path to access unauthorized content providers or perform path traversal.
|
|
36
|
+
Remediation: Validate the Uri authority and path against expected values before accessing.
|
|
37
|
+
languages:
|
|
38
|
+
- java
|
|
39
|
+
patterns:
|
|
40
|
+
- pattern-either:
|
|
41
|
+
- pattern: $CR.query($URI, $PROJ, $SEL, $ARGS, $SORT)
|
|
42
|
+
metadata:
|
|
43
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
44
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
45
|
+
masvs: "MASVS-PLATFORM-2"
|
|
46
|
+
category: android-ipc
|
|
47
|
+
precision: low
|
|
48
|
+
confidence: low
|
|
49
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
50
|
+
references:
|
|
51
|
+
- https://cwe.mitre.org/data/definitions/22.html
|
|
52
|
+
|
|
53
|
+
- id: zm-android-file-constructor-user-input
|
|
54
|
+
severity: MEDIUM
|
|
55
|
+
message: |
|
|
56
|
+
Detected File constructor using user-controlled input (Intent data, EditText text, URI parameter).
|
|
57
|
+
Using unsanitized input in file paths enables path traversal attacks to read/write arbitrary files.
|
|
58
|
+
Remediation: Always validate and sanitize user-supplied paths. Use getCanonicalPath() and prefix checks.
|
|
59
|
+
languages:
|
|
60
|
+
- java
|
|
61
|
+
patterns:
|
|
62
|
+
- pattern-either:
|
|
63
|
+
- pattern: new File($BASE, $USER_INPUT)
|
|
64
|
+
metadata:
|
|
65
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
66
|
+
owasp-mobile: "M1: Improper Platform Usage"
|
|
67
|
+
masvs: "MASVS-PLATFORM-2"
|
|
68
|
+
category: android-ipc
|
|
69
|
+
precision: low
|
|
70
|
+
confidence: low
|
|
71
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
72
|
+
references:
|
|
73
|
+
- https://cwe.mitre.org/data/definitions/22.html
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# CWE-22: 路径遍历 / WebView file:// 协议 (Android)
|
|
2
|
+
# 逐码 ZhuMa V4.0 — Android 规则库
|
|
3
|
+
# 来源: V3 审计引擎 VULN-WV-001 / VULN-WV-006
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-webview-file-access-enabled
|
|
7
|
+
severity: CRITICAL
|
|
8
|
+
message: |
|
|
9
|
+
检测到 WebView 允许 file:// 协议访问本地文件。
|
|
10
|
+
结合 JavaScript 启用时,攻击者可通过恶意 HTML 页面读取 APP 私有目录下的任意文件,
|
|
11
|
+
包括 databases/.db (含明文凭据)、shared_prefs/.xml (含 Token) 等。
|
|
12
|
+
修复: setAllowFileAccess(false); 并从 AndroidManifest 中移除 android:allowFileAccess="true"。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern-either:
|
|
17
|
+
- pattern: |
|
|
18
|
+
$WV.getSettings().setAllowFileAccess(true)
|
|
19
|
+
- pattern: |
|
|
20
|
+
$WV.getSettings().setAllowFileAccessFromFileURLs(true)
|
|
21
|
+
- pattern-not: |
|
|
22
|
+
$WV.getSettings().setAllowFileAccess(false)
|
|
23
|
+
metadata:
|
|
24
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')"
|
|
25
|
+
owasp-mobile: "M7: Client Code Quality"
|
|
26
|
+
masvs: "MASVS-PLATFORM-2"
|
|
27
|
+
category: android-webview
|
|
28
|
+
precision: high
|
|
29
|
+
confidence: high
|
|
30
|
+
likelihood: high
|
|
31
|
+
impact: critical
|
|
32
|
+
source: "V3 Audit Engine - VULN-WV-001"
|
|
33
|
+
references:
|
|
34
|
+
- https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)
|
|
35
|
+
- https://dre.vanderbilt.edu/~schmidt/android/android-4.0/out/target/common/docs/doc-comment-check/guide/webapps/managingWebView.html
|
|
36
|
+
|
|
37
|
+
- id: zm-android-webview-file-access-kotlin
|
|
38
|
+
severity: CRITICAL
|
|
39
|
+
message: |
|
|
40
|
+
WebView 文件协议访问已启用 (Kotlin)。
|
|
41
|
+
修复: getSettings().setAllowFileAccess(false)
|
|
42
|
+
languages:
|
|
43
|
+
- kotlin
|
|
44
|
+
patterns:
|
|
45
|
+
- pattern-either:
|
|
46
|
+
- pattern: |
|
|
47
|
+
$WV.getSettings().setAllowFileAccess(true)
|
|
48
|
+
- pattern: |
|
|
49
|
+
$WV.getSettings().setAllowFileAccessFromFileURLs(true)
|
|
50
|
+
metadata:
|
|
51
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')"
|
|
52
|
+
owasp-mobile: "M7: Client Code Quality"
|
|
53
|
+
masvs: "MASVS-PLATFORM-2"
|
|
54
|
+
category: android-webview
|
|
55
|
+
precision: high
|
|
56
|
+
confidence: high
|
|
57
|
+
source: "V3 Audit Engine - VULN-WV-001"
|
|
58
|
+
|
|
59
|
+
- id: zm-android-http-server-path-traversal
|
|
60
|
+
severity: CRITICAL
|
|
61
|
+
message: |
|
|
62
|
+
检测到内嵌 HTTP Server 中用户输入直接构造文件路径,存在路径遍历风险。
|
|
63
|
+
常见于 APK 内嵌的 NanoHTTPD / SimpleWebServer 实现中。
|
|
64
|
+
攻击者可通过 HTTP Request URI 注入 "../" 序列读取任意文件。
|
|
65
|
+
修复: 对用户输入做 canonical path 校验 + 白名单目录限制。
|
|
66
|
+
languages:
|
|
67
|
+
- java
|
|
68
|
+
patterns:
|
|
69
|
+
- pattern-either:
|
|
70
|
+
- pattern: |
|
|
71
|
+
new FileInputStream($BASE + $PARAM)
|
|
72
|
+
- pattern: |
|
|
73
|
+
new File($BASE + $PARAM)
|
|
74
|
+
- metavariable-regex:
|
|
75
|
+
metavariable: $PARAM
|
|
76
|
+
regex: '(?i)(getPath|getParameter|getQuery|getURI|queryParameter|getParam)'
|
|
77
|
+
metadata:
|
|
78
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')"
|
|
79
|
+
owasp-mobile: "M8: Code Tampering"
|
|
80
|
+
masvs: "MASVS-STORAGE-1"
|
|
81
|
+
category: android-storage
|
|
82
|
+
precision: medium
|
|
83
|
+
confidence: medium
|
|
84
|
+
source: "V3 Audit Engine - VULN-LS-003"
|
|
85
|
+
references:
|
|
86
|
+
- https://cwe.mitre.org/data/definitions/22.html
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# CWE-287: Biometric Authentication Weakness (Android)
|
|
2
|
+
# ZhuMa V4.0 - Android Rule Library
|
|
3
|
+
# Source: V3 Audit Engine extension - biometric bypass patterns
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-biometric-no-crypto-object
|
|
7
|
+
severity: HIGH
|
|
8
|
+
message: |
|
|
9
|
+
Detected BiometricPrompt.authenticate() called without a CryptoObject.
|
|
10
|
+
Without CryptoObject, the biometric result can be bypassed via instrumentation or Frida hooking,
|
|
11
|
+
allowing authentication bypass while the app treats it as successful.
|
|
12
|
+
Remediation: Always pass a CryptoObject (Cipher/MessageDigest/Mac/Signature) to authenticate().
|
|
13
|
+
The crypto operation will fail if biometric was tampered with.
|
|
14
|
+
languages:
|
|
15
|
+
- java
|
|
16
|
+
patterns:
|
|
17
|
+
- pattern-either:
|
|
18
|
+
- pattern: $BP.authenticate($PROMPT)
|
|
19
|
+
- pattern: $BP.authenticate($PROMPT, $INFO)
|
|
20
|
+
metadata:
|
|
21
|
+
cwe: "CWE-287: Improper Authentication"
|
|
22
|
+
owasp-mobile: "M4: Insecure Authentication"
|
|
23
|
+
masvs: "MASVS-AUTH-3"
|
|
24
|
+
category: android-auth
|
|
25
|
+
precision: high
|
|
26
|
+
confidence: high
|
|
27
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
28
|
+
references:
|
|
29
|
+
- https://cwe.mitre.org/data/definitions/287.html
|
|
30
|
+
- https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt
|
|
31
|
+
|
|
32
|
+
- id: zm-android-biometric-negative-button-no-crypto
|
|
33
|
+
severity: HIGH
|
|
34
|
+
message: |
|
|
35
|
+
Detected BiometricPrompt.setNegativeButton() used with authenticate() where no CryptoObject is passed.
|
|
36
|
+
The negative button (device credential fallback) without CryptoObject enables downgrade attack -
|
|
37
|
+
an attacker can cancel biometric and fall back to device PIN/pattern, bypassing biometric entirely.
|
|
38
|
+
Remediation: If using setNegativeButton (device credential fallback), ensure CryptoObject is always set.
|
|
39
|
+
languages:
|
|
40
|
+
- java
|
|
41
|
+
patterns:
|
|
42
|
+
- pattern-either:
|
|
43
|
+
- pattern: $PROMPT.setNegativeButton($TEXT, $EXECUTOR, $LISTENER)
|
|
44
|
+
metadata:
|
|
45
|
+
cwe: "CWE-287: Improper Authentication"
|
|
46
|
+
owasp-mobile: "M4: Insecure Authentication"
|
|
47
|
+
masvs: "MASVS-AUTH-3"
|
|
48
|
+
category: android-auth
|
|
49
|
+
precision: medium
|
|
50
|
+
confidence: medium
|
|
51
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
52
|
+
references:
|
|
53
|
+
- https://cwe.mitre.org/data/definitions/287.html
|
|
54
|
+
|
|
55
|
+
- id: zm-android-fingerprint-no-crypto-object
|
|
56
|
+
severity: HIGH
|
|
57
|
+
message: |
|
|
58
|
+
Detected FingerprintManager.authenticate() called without a CryptoObject (legacy biometric API).
|
|
59
|
+
Without CryptoObject, the fingerprint result is vulnerable to bypass via hooking frameworks.
|
|
60
|
+
Remediation: Always pass a CryptoObject to FingerprintManager.authenticate().
|
|
61
|
+
Prefer migrating to BiometricPrompt (AndroidX) which enforces CryptoObject usage more strongly.
|
|
62
|
+
languages:
|
|
63
|
+
- java
|
|
64
|
+
patterns:
|
|
65
|
+
- pattern-either:
|
|
66
|
+
- pattern: $FM.authenticate(null, $CANCEL, 0, $CALLBACK, null)
|
|
67
|
+
- pattern: $FM.authenticate(null, $CANCEL, $FLAGS, $CALLBACK, null)
|
|
68
|
+
metadata:
|
|
69
|
+
cwe: "CWE-287: Improper Authentication"
|
|
70
|
+
owasp-mobile: "M4: Insecure Authentication"
|
|
71
|
+
masvs: "MASVS-AUTH-3"
|
|
72
|
+
category: android-auth
|
|
73
|
+
precision: very-high
|
|
74
|
+
confidence: very-high
|
|
75
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
76
|
+
references:
|
|
77
|
+
- https://cwe.mitre.org/data/definitions/287.html
|
|
78
|
+
- https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager
|
|
79
|
+
|
|
80
|
+
- id: zm-android-keygen-no-user-auth
|
|
81
|
+
severity: HIGH
|
|
82
|
+
message: |
|
|
83
|
+
Detected KeyGenerator or KeyPairGenerator without setUserAuthenticationRequired(true).
|
|
84
|
+
Keys generated without user authentication requirement can be used without biometric/PIN confirmation,
|
|
85
|
+
meaning any code running in the app context can use the key.
|
|
86
|
+
Remediation: Call setUserAuthenticationRequired(true) on the KeyGenParameterSpec.Builder.
|
|
87
|
+
languages:
|
|
88
|
+
- java
|
|
89
|
+
patterns:
|
|
90
|
+
- pattern-either:
|
|
91
|
+
- pattern: new KeyGenParameterSpec.Builder($ALIAS, $PURPOSES)
|
|
92
|
+
metadata:
|
|
93
|
+
cwe: "CWE-287: Improper Authentication"
|
|
94
|
+
owasp-mobile: "M4: Insecure Authentication"
|
|
95
|
+
masvs: "MASVS-CRYPTO-2"
|
|
96
|
+
category: android-crypto
|
|
97
|
+
precision: low
|
|
98
|
+
confidence: low
|
|
99
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
100
|
+
references:
|
|
101
|
+
- https://cwe.mitre.org/data/definitions/287.html
|
|
102
|
+
- https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# CWE-295: Missing Certificate Pinning (Android)
|
|
2
|
+
# ZhuMa V4.0 - Android Rule Library
|
|
3
|
+
# Source: V3 Audit Engine extension - cert pinning gaps
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-okhttp-no-cert-pinner
|
|
7
|
+
severity: MEDIUM
|
|
8
|
+
message: |
|
|
9
|
+
Detected OkHttpClient built without CertificatePinner.
|
|
10
|
+
Without certificate pinning, the app trusts any certificate signed by a system CA,
|
|
11
|
+
making it vulnerable to compromised CAs or corporate MITM proxies.
|
|
12
|
+
Remediation: Add CertificatePinner to the OkHttpClient.Builder with pin hashes for your server certificates.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern-either:
|
|
17
|
+
- pattern: new OkHttpClient.Builder()
|
|
18
|
+
- pattern: new OkHttpClient()
|
|
19
|
+
metadata:
|
|
20
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
21
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
22
|
+
masvs: "MASVS-NETWORK-4"
|
|
23
|
+
category: android-network
|
|
24
|
+
precision: low
|
|
25
|
+
confidence: low
|
|
26
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
27
|
+
references:
|
|
28
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
29
|
+
- https://square.github.io/okhttp/features/https/#certificate-pinning
|
|
30
|
+
|
|
31
|
+
- id: zm-android-httpsurlconnection-no-hostname-verifier
|
|
32
|
+
severity: MEDIUM
|
|
33
|
+
message: |
|
|
34
|
+
Detected HttpsURLConnection used without a custom HostnameVerifier.
|
|
35
|
+
Default hostname verification only checks CN/SAN match; it does not pin to a specific certificate.
|
|
36
|
+
Remediation: Implement a custom HostnameVerifier that validates the certificate public key or SPKI hash.
|
|
37
|
+
languages:
|
|
38
|
+
- java
|
|
39
|
+
patterns:
|
|
40
|
+
- pattern-either:
|
|
41
|
+
- pattern: (HttpsURLConnection) $URL.openConnection()
|
|
42
|
+
metadata:
|
|
43
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
44
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
45
|
+
masvs: "MASVS-NETWORK-4"
|
|
46
|
+
category: android-network
|
|
47
|
+
precision: low
|
|
48
|
+
confidence: low
|
|
49
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
50
|
+
references:
|
|
51
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
52
|
+
|
|
53
|
+
- id: zm-android-trustmanager-empty-check
|
|
54
|
+
severity: HIGH
|
|
55
|
+
message: |
|
|
56
|
+
Detected a TrustManager or X509TrustManager implementation with empty checkServerTrusted() method body.
|
|
57
|
+
This disables all server certificate validation for TLS connections, enabling MITM attacks.
|
|
58
|
+
Remediation: Never leave checkServerTrusted() empty. Implement proper certificate chain validation.
|
|
59
|
+
languages:
|
|
60
|
+
- java
|
|
61
|
+
patterns:
|
|
62
|
+
- pattern-either:
|
|
63
|
+
- pattern: |
|
|
64
|
+
public void checkServerTrusted(X509Certificate[] $CHAIN, String $AUTH) {
|
|
65
|
+
}
|
|
66
|
+
- pattern: |
|
|
67
|
+
public void checkServerTrusted(X509Certificate[] $C, String $S) throws CertificateException { }
|
|
68
|
+
metadata:
|
|
69
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
70
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
71
|
+
masvs: "MASVS-NETWORK-1"
|
|
72
|
+
category: android-network
|
|
73
|
+
precision: very-high
|
|
74
|
+
confidence: very-high
|
|
75
|
+
source: "ZhuMa V4.1 Rule Expansion"
|
|
76
|
+
references:
|
|
77
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
78
|
+
- https://developer.android.com/privacy-and-security/risks/ssl-validation
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# CWE-295: WebView SSL 错误处理 (Android)
|
|
2
|
+
# 逐码 ZhuMa V4.0 — Android 规则库
|
|
3
|
+
# 来源: V3 审计引擎 VULN-LS-004 (TLS 全信任)
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
- id: zm-android-webview-ssl-error-handler-proceed
|
|
7
|
+
severity: CRITICAL
|
|
8
|
+
message: |
|
|
9
|
+
检测到 WebView SSL 错误处理器调用 SslErrorHandler.proceed(),忽略所有证书错误。
|
|
10
|
+
这使得 WebView 中所有 HTTPS 通信暴露于中间人攻击 (MITM)。
|
|
11
|
+
攻击者可通过自签名证书拦截并篡改 WebView 中加载的所有内容。
|
|
12
|
+
修复: 调用 SslErrorHandler.cancel();在 release 构建中绝不应调用 proceed()。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
patterns:
|
|
16
|
+
- pattern-either:
|
|
17
|
+
- pattern: |
|
|
18
|
+
public void onReceivedSslError(WebView $WV, SslErrorHandler $H, SslError $E) {
|
|
19
|
+
$H.proceed();
|
|
20
|
+
}
|
|
21
|
+
- pattern: |
|
|
22
|
+
$WV.setWebViewClient(new WebViewClient() {
|
|
23
|
+
public void onReceivedSslError(WebView $V, SslErrorHandler $H, SslError $E) {
|
|
24
|
+
$H.proceed();
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
metadata:
|
|
28
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
29
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
30
|
+
masvs: "MASVS-NETWORK-1"
|
|
31
|
+
category: android-webview
|
|
32
|
+
precision: very-high
|
|
33
|
+
confidence: very-high
|
|
34
|
+
likelihood: high
|
|
35
|
+
impact: critical
|
|
36
|
+
source: "V3 Audit Engine - VULN-LS-004 (extended)"
|
|
37
|
+
references:
|
|
38
|
+
- https://developer.android.com/reference/android/webkit/SslErrorHandler#proceed()
|
|
39
|
+
- https://developer.android.com/privacy-and-security/risks/ssl-error-handling
|
|
40
|
+
|
|
41
|
+
- id: zm-android-okhttp-client-allowallssltls
|
|
42
|
+
severity: CRITICAL
|
|
43
|
+
message: |
|
|
44
|
+
检测到 OkHttp 客户端配置绕过 SSL 证书和主机名验证。
|
|
45
|
+
典型模式: hostnameVerifier(ALLOW_ALL) + 空 TrustManager。
|
|
46
|
+
这使得所有 HTTPS 通信完全暴露于 MITM 攻击。
|
|
47
|
+
修复: 使用 OkHttp 默认的证书验证;需要证书固定时使用 CertificatePinner。
|
|
48
|
+
参考: https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/
|
|
49
|
+
metadata:
|
|
50
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
51
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
52
|
+
masvs: "MASVS-NETWORK-1"
|
|
53
|
+
category: android-network
|
|
54
|
+
precision: high
|
|
55
|
+
confidence: high
|
|
56
|
+
likelihood: high
|
|
57
|
+
impact: critical
|
|
58
|
+
source: "V3 Audit Engine - baseline scan"
|
|
59
|
+
references:
|
|
60
|
+
- https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/
|
|
61
|
+
languages:
|
|
62
|
+
- java
|
|
63
|
+
patterns:
|
|
64
|
+
- pattern-inside: |
|
|
65
|
+
new OkHttpClient.Builder()
|
|
66
|
+
.hostnameVerifier($HV)
|
|
67
|
+
.sslSocketFactory($SSF, $TM)
|
|
68
|
+
.build()
|
|
69
|
+
- metavariable-regex:
|
|
70
|
+
metavariable: $SSF
|
|
71
|
+
regex: '.*'
|
|
72
|
+
- metavariable-regex:
|
|
73
|
+
metavariable: $TM
|
|
74
|
+
regex: '.*'
|
|
75
|
+
note: |
|
|
76
|
+
此规则检测 OkHttpClient Builder 中同时出现 hostnameVerifier + sslSocketFactory 的模式。
|
|
77
|
+
需结合人工审计确认传入的 TrustManager 和 HostnameVerifier 是否为空实现。
|
|
78
|
+
precision: low
|
|
79
|
+
confidence: low
|
|
80
|
+
|
|
81
|
+
- id: zm-android-httpurlconnection-ssl-bypass
|
|
82
|
+
severity: CRITICAL
|
|
83
|
+
message: |
|
|
84
|
+
检测到 HttpsURLConnection 禁用 SSL 验证。
|
|
85
|
+
通过设置 ALLOW_ALL_HOSTNAME_VERIFIER 和空 TrustManager,
|
|
86
|
+
所有 HTTPS 通信可被中间人攻击者拦截。
|
|
87
|
+
languages:
|
|
88
|
+
- java
|
|
89
|
+
patterns:
|
|
90
|
+
- pattern-either:
|
|
91
|
+
- pattern: |
|
|
92
|
+
HttpsURLConnection.setDefaultHostnameVerifier($ALLOW_ALL)
|
|
93
|
+
- pattern: |
|
|
94
|
+
$CONN.setHostnameVerifier($ALLOW_ALL)
|
|
95
|
+
metadata:
|
|
96
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
97
|
+
owasp-mobile: "M3: Insecure Communication"
|
|
98
|
+
masvs: "MASVS-NETWORK-1"
|
|
99
|
+
category: android-network
|
|
100
|
+
precision: medium
|
|
101
|
+
confidence: medium
|
|
102
|
+
source: "V3 Audit Engine - VULN-LS-004"
|
|
103
|
+
references:
|
|
104
|
+
- https://developer.android.com/privacy-and-security/risks/ssl-validation
|