@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,135 @@
|
|
|
1
|
+
# CWE-22/434/73 文件操作深度覆盖: 路径遍历全量sink + 文件上传危险模式
|
|
2
|
+
|
|
3
|
+
rules:
|
|
4
|
+
|
|
5
|
+
# ZM-JAVA-FILE-READ-001: Files.read/readAllBytes/readString 路径由用户可控
|
|
6
|
+
- id: zm-java-file-read-001
|
|
7
|
+
severity: HIGH
|
|
8
|
+
message: |
|
|
9
|
+
Files.readXXX / FileInputStream 使用用户可控路径——路径遍历/任意文件读取。
|
|
10
|
+
校验路径不以 ../ 开头,规范化后验证在允许的根目录内。
|
|
11
|
+
languages:
|
|
12
|
+
- java
|
|
13
|
+
pattern-either:
|
|
14
|
+
- pattern: Files.readAllBytes($PATH)
|
|
15
|
+
- pattern: Files.readString($PATH)
|
|
16
|
+
- pattern: Files.readAllLines($PATH)
|
|
17
|
+
- pattern: Files.newInputStream($PATH)
|
|
18
|
+
- pattern: new FileInputStream($PATH)
|
|
19
|
+
metadata:
|
|
20
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
21
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
22
|
+
precision: medium
|
|
23
|
+
tags: [path-traversal, file-read, nio]
|
|
24
|
+
|
|
25
|
+
# ZM-JAVA-FILE-WRITE-001: Files.write 路径可控
|
|
26
|
+
- id: zm-java-file-write-001
|
|
27
|
+
severity: CRITICAL
|
|
28
|
+
message: |
|
|
29
|
+
Files.write/FileOutputStream 使用用户可控路径——任意文件写入,可getshell。
|
|
30
|
+
同路径遍历规则校验路径在允许范围内,且不要接受完整文件名。
|
|
31
|
+
languages:
|
|
32
|
+
- java
|
|
33
|
+
pattern-either:
|
|
34
|
+
- pattern: Files.write($PATH, $CONTENT)
|
|
35
|
+
- pattern: Files.newOutputStream($PATH)
|
|
36
|
+
- pattern: new FileOutputStream($PATH)
|
|
37
|
+
- pattern: $FILE.createNewFile()
|
|
38
|
+
metadata:
|
|
39
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
40
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
41
|
+
precision: medium
|
|
42
|
+
tags: [path-traversal, file-write, rce]
|
|
43
|
+
|
|
44
|
+
# ZM-JAVA-FILE-DELETE-001: Files.delete/deleteIfExists 路径可控
|
|
45
|
+
- id: zm-java-file-delete-001
|
|
46
|
+
severity: MEDIUM
|
|
47
|
+
message: |
|
|
48
|
+
Files.delete/deleteIfExists 使用用户可控路径——可删除任意文件。
|
|
49
|
+
校验路径在白名单内,使用 UUID 文件名避免路径注入。
|
|
50
|
+
languages:
|
|
51
|
+
- java
|
|
52
|
+
pattern-either:
|
|
53
|
+
- pattern: Files.delete($PATH)
|
|
54
|
+
- pattern: Files.deleteIfExists($PATH)
|
|
55
|
+
- pattern: $FILE.delete()
|
|
56
|
+
metadata:
|
|
57
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
58
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
59
|
+
precision: medium
|
|
60
|
+
tags: [path-traversal, file-delete]
|
|
61
|
+
|
|
62
|
+
# ZM-JAVA-UPLOAD-PATH-001: MultipartFile transferTo 使用用户可控路径
|
|
63
|
+
- id: zm-java-upload-path-001
|
|
64
|
+
severity: CRITICAL
|
|
65
|
+
message: |
|
|
66
|
+
MultipartFile.transferTo() 目标路径使用原始文件名 + 用户可控目录——可覆盖任意文件。
|
|
67
|
+
使用 UUID 重命名上传文件,并确保上传目录在配置的 uploads/ 根内。
|
|
68
|
+
languages:
|
|
69
|
+
- java
|
|
70
|
+
pattern-either:
|
|
71
|
+
- pattern: $FILE.transferTo(new File($PATH));
|
|
72
|
+
- pattern: $FILE.transferTo($DEST);
|
|
73
|
+
metadata:
|
|
74
|
+
cwe: "CWE-434: Unrestricted Upload of File with Dangerous Type"
|
|
75
|
+
owasp: "A03:2021 - Injection"
|
|
76
|
+
precision: high
|
|
77
|
+
tags: [file-upload, path-traversal]
|
|
78
|
+
references:
|
|
79
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
|
|
80
|
+
|
|
81
|
+
# ZM-JAVA-UPLOAD-EXT-001: 文件上传缺少扩展名校验
|
|
82
|
+
- id: zm-java-upload-ext-001
|
|
83
|
+
severity: HIGH
|
|
84
|
+
message: |
|
|
85
|
+
MultipartFile.getOriginalFilename() 直接用于存储——未校验扩展名/Content-Type。
|
|
86
|
+
限制允许的文件类型(白名单),校验 Magic Bytes,禁止 .jsp/.exe/.sh 等可执行后缀。
|
|
87
|
+
languages:
|
|
88
|
+
- java
|
|
89
|
+
pattern-either:
|
|
90
|
+
- pattern: $FILE.getOriginalFilename()
|
|
91
|
+
- pattern: $PART.getOriginalFilename()
|
|
92
|
+
metadata:
|
|
93
|
+
cwe: "CWE-434: Unrestricted Upload of File with Dangerous Type"
|
|
94
|
+
owasp: "A03:2021 - Injection"
|
|
95
|
+
precision: low
|
|
96
|
+
tags: [file-upload, extension-bypass]
|
|
97
|
+
references:
|
|
98
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
|
|
99
|
+
|
|
100
|
+
# ZM-JAVA-ZIP-SLIP-001: ZipEntry 解压前未校验路径
|
|
101
|
+
- id: zm-java-zip-slip-001
|
|
102
|
+
severity: CRITICAL
|
|
103
|
+
message: |
|
|
104
|
+
ZipEntry.getName() 直接用于 new File(outputDir, entryName) —— 可触发 Zip Slip 路径穿越。
|
|
105
|
+
规范化后再校验:new File(outputDir, entryName).getCanonicalPath().startsWith(outputDir)
|
|
106
|
+
languages:
|
|
107
|
+
- java
|
|
108
|
+
pattern-either:
|
|
109
|
+
- pattern: new File($OUTDIR, $ENTRY.getName())
|
|
110
|
+
- pattern: |
|
|
111
|
+
$ENTRY = $ZIP.getNextEntry();
|
|
112
|
+
...
|
|
113
|
+
new File($DIR, $ENTRY);
|
|
114
|
+
metadata:
|
|
115
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
116
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
117
|
+
precision: high
|
|
118
|
+
tags: [zip-slip, path-traversal, rce]
|
|
119
|
+
references:
|
|
120
|
+
- https://snyk.io/research/zip-slip-vulnerability
|
|
121
|
+
|
|
122
|
+
# ZM-JAVA-TEMP-FILE-001: 临时文件使用已弃用 API
|
|
123
|
+
- id: zm-java-temp-file-001
|
|
124
|
+
severity: LOW
|
|
125
|
+
message: |
|
|
126
|
+
File.createTempFile 前缀/后缀固定且无 SecureRandom — 临时文件名可预测。
|
|
127
|
+
迁移到 Files.createTempFile() 并指定 SecureRandom 前缀。
|
|
128
|
+
languages:
|
|
129
|
+
- java
|
|
130
|
+
pattern: File.createTempFile($PREFIX, $SUFFIX)
|
|
131
|
+
metadata:
|
|
132
|
+
cwe: "CWE-377: Insecure Temporary File"
|
|
133
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
134
|
+
precision: high
|
|
135
|
+
tags: [temp-file, race-condition]
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# CWE-22: Path Traversal — Spring-specific sinks
|
|
2
|
+
# ZhuMa V4.1 — complement zm-java-cwe22-file-depth.yaml
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-PATH-SPRING-001: ClassPathResource with user-controlled path
|
|
7
|
+
- id: zm-java-path-spring-001
|
|
8
|
+
severity: MEDIUM
|
|
9
|
+
message: |
|
|
10
|
+
Spring ClassPathResource constructed with user input — path traversal into classpath resources.
|
|
11
|
+
Attacker can read application.properties or other sensitive classpath files.
|
|
12
|
+
Fix: validate path against whitelist; use ResourcePatternResolver with allowed prefix.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
new ClassPathResource($REQ.getParameter(...))
|
|
18
|
+
- pattern: |
|
|
19
|
+
new ClassPathResource($STR + $REQ.getParameter(...))
|
|
20
|
+
- pattern: |
|
|
21
|
+
new ClassPathResource($REQ.getParameter(...)).getInputStream()
|
|
22
|
+
metadata:
|
|
23
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
24
|
+
severity: MEDIUM
|
|
25
|
+
precision: high
|
|
26
|
+
category: path-traversal
|
|
27
|
+
likelihood: MEDIUM
|
|
28
|
+
impact: MEDIUM
|
|
29
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
30
|
+
|
|
31
|
+
# ZM-JAVA-PATH-SPRING-002: FileSystemResource with user-controlled path
|
|
32
|
+
- id: zm-java-path-spring-002
|
|
33
|
+
severity: HIGH
|
|
34
|
+
message: |
|
|
35
|
+
Spring FileSystemResource constructed with user input — arbitrary file read/write on filesystem.
|
|
36
|
+
Attacker can traverse to read /etc/passwd or application config files.
|
|
37
|
+
Fix: normalize path and verify it stays within allowed directory root.
|
|
38
|
+
languages:
|
|
39
|
+
- java
|
|
40
|
+
pattern-either:
|
|
41
|
+
- pattern: |
|
|
42
|
+
new FileSystemResource($REQ.getParameter(...))
|
|
43
|
+
- pattern: |
|
|
44
|
+
new FileSystemResource($DIR + $REQ.getParameter(...))
|
|
45
|
+
- pattern: |
|
|
46
|
+
new FileSystemResource($REQ.getParameter(...)).getFile()
|
|
47
|
+
- pattern: |
|
|
48
|
+
new FileSystemResource($REQ.getParameter(...)).getInputStream()
|
|
49
|
+
metadata:
|
|
50
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
51
|
+
severity: HIGH
|
|
52
|
+
precision: high
|
|
53
|
+
category: path-traversal
|
|
54
|
+
likelihood: MEDIUM
|
|
55
|
+
impact: HIGH
|
|
56
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
57
|
+
|
|
58
|
+
# ZM-JAVA-PATH-SPRING-003: ServletContext.getRealPath() with user input
|
|
59
|
+
- id: zm-java-path-spring-003
|
|
60
|
+
severity: HIGH
|
|
61
|
+
message: |
|
|
62
|
+
ServletContext.getRealPath() with user-controlled virtual path — discloses server filesystem layout.
|
|
63
|
+
Attackers can map internal file structure; combined with file write leads to RCE.
|
|
64
|
+
Fix: never pass user input to getRealPath(); use fixed virtual paths or config-based resource mapping.
|
|
65
|
+
languages:
|
|
66
|
+
- java
|
|
67
|
+
pattern-either:
|
|
68
|
+
- pattern: |
|
|
69
|
+
$CTX.getRealPath($REQ.getParameter(...))
|
|
70
|
+
- pattern: |
|
|
71
|
+
$CTX.getRealPath($STR + $REQ.getParameter(...))
|
|
72
|
+
- pattern: |
|
|
73
|
+
$REQ.getServletContext().getRealPath($REQ.getParameter(...))
|
|
74
|
+
metadata:
|
|
75
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory"
|
|
76
|
+
severity: HIGH
|
|
77
|
+
precision: high
|
|
78
|
+
category: path-traversal
|
|
79
|
+
likelihood: MEDIUM
|
|
80
|
+
impact: HIGH
|
|
81
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# CWE-284/862: Missing Authorization — Spring Security deeper patterns
|
|
2
|
+
# ZhuMa V4.1 — complement zm-java-cwe862-authz-depth.yaml and cwe200-actuator-exposure.yaml
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-AUTHZ-SPRING-001: WebSecurityConfig permitAll on sensitive paths
|
|
7
|
+
- id: zm-java-authz-spring-001
|
|
8
|
+
severity: HIGH
|
|
9
|
+
message: |
|
|
10
|
+
Spring Security WebSecurityConfig uses requestMatchers(...).permitAll() on paths likely to be sensitive.
|
|
11
|
+
Check if these endpoints should be authenticated (e.g. /api/admin, /manage, /internal).
|
|
12
|
+
Fix: require authentication for sensitive paths; use hasRole/hasAuthority for admin endpoints.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
$HTTP.requestMatchers("/api/**").permitAll()
|
|
18
|
+
- pattern: |
|
|
19
|
+
$HTTP.requestMatchers("/admin/**").permitAll()
|
|
20
|
+
- pattern: |
|
|
21
|
+
$HTTP.requestMatchers("/manage/**").permitAll()
|
|
22
|
+
- pattern: |
|
|
23
|
+
$HTTP.requestMatchers("/internal/**").permitAll()
|
|
24
|
+
- pattern: |
|
|
25
|
+
$HTTP.requestMatchers("/graphql").permitAll()
|
|
26
|
+
- pattern: |
|
|
27
|
+
$HTTP.anyRequest().permitAll()
|
|
28
|
+
metadata:
|
|
29
|
+
cwe: "CWE-284: Improper Access Control"
|
|
30
|
+
severity: HIGH
|
|
31
|
+
precision: high
|
|
32
|
+
category: authorization
|
|
33
|
+
likelihood: MEDIUM
|
|
34
|
+
impact: HIGH
|
|
35
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
36
|
+
|
|
37
|
+
# ZM-JAVA-AUTHZ-SPRING-002: POST/PUT/DELETE endpoints without method security
|
|
38
|
+
- id: zm-java-authz-spring-002
|
|
39
|
+
severity: HIGH
|
|
40
|
+
message: |
|
|
41
|
+
Spring MVC controller has state-changing endpoints (@PostMapping/@PutMapping/@DeleteMapping) without @PreAuthorize.
|
|
42
|
+
These write operations should be explicitly protected with role-based authorization.
|
|
43
|
+
Fix: add @PreAuthorize("hasRole('ADMIN')") or @Secured("ROLE_ADMIN") to write endpoints.
|
|
44
|
+
languages:
|
|
45
|
+
- java
|
|
46
|
+
pattern-either:
|
|
47
|
+
- pattern: |
|
|
48
|
+
@$CTRL
|
|
49
|
+
class $CLASS {
|
|
50
|
+
...
|
|
51
|
+
@PostMapping($PATH)
|
|
52
|
+
$RET $METHOD(...) {
|
|
53
|
+
...
|
|
54
|
+
}
|
|
55
|
+
...
|
|
56
|
+
}
|
|
57
|
+
- pattern: |
|
|
58
|
+
@$CTRL
|
|
59
|
+
class $CLASS {
|
|
60
|
+
...
|
|
61
|
+
@PutMapping($PATH)
|
|
62
|
+
$RET $METHOD(...) {
|
|
63
|
+
...
|
|
64
|
+
}
|
|
65
|
+
...
|
|
66
|
+
}
|
|
67
|
+
- pattern: |
|
|
68
|
+
@$CTRL
|
|
69
|
+
class $CLASS {
|
|
70
|
+
...
|
|
71
|
+
@DeleteMapping($PATH)
|
|
72
|
+
$RET $METHOD(...) {
|
|
73
|
+
...
|
|
74
|
+
}
|
|
75
|
+
...
|
|
76
|
+
}
|
|
77
|
+
pattern-not: |
|
|
78
|
+
@$CTRL
|
|
79
|
+
class $CLASS {
|
|
80
|
+
...
|
|
81
|
+
@PreAuthorize($X)
|
|
82
|
+
}
|
|
83
|
+
metadata:
|
|
84
|
+
cwe: "CWE-862: Missing Authorization"
|
|
85
|
+
severity: HIGH
|
|
86
|
+
precision: medium
|
|
87
|
+
category: authorization
|
|
88
|
+
likelihood: HIGH
|
|
89
|
+
impact: HIGH
|
|
90
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
91
|
+
references:
|
|
92
|
+
- "https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html"
|
|
93
|
+
|
|
94
|
+
# ZM-JAVA-AUTHZ-SPRING-003: @EnableWebSecurity without @EnableMethodSecurity
|
|
95
|
+
- id: zm-java-authz-spring-003
|
|
96
|
+
severity: MEDIUM
|
|
97
|
+
message: |
|
|
98
|
+
SecurityConfig annotated with @EnableWebSecurity but missing @EnableMethodSecurity.
|
|
99
|
+
Without method-level security, @PreAuthorize annotations on controllers have no effect.
|
|
100
|
+
Fix: add @EnableMethodSecurity (Spring Security 6+) or @EnableGlobalMethodSecurity(prePostEnabled = true).
|
|
101
|
+
languages:
|
|
102
|
+
- java
|
|
103
|
+
patterns:
|
|
104
|
+
- pattern: |
|
|
105
|
+
@Configuration
|
|
106
|
+
@EnableWebSecurity
|
|
107
|
+
class $CLASS {
|
|
108
|
+
...
|
|
109
|
+
}
|
|
110
|
+
- pattern-not: |
|
|
111
|
+
@Configuration
|
|
112
|
+
@EnableWebSecurity
|
|
113
|
+
@EnableMethodSecurity
|
|
114
|
+
class $CLASS {
|
|
115
|
+
...
|
|
116
|
+
}
|
|
117
|
+
- pattern-not: |
|
|
118
|
+
@Configuration
|
|
119
|
+
@EnableWebSecurity
|
|
120
|
+
@EnableGlobalMethodSecurity
|
|
121
|
+
class $CLASS {
|
|
122
|
+
...
|
|
123
|
+
}
|
|
124
|
+
metadata:
|
|
125
|
+
cwe: "CWE-284: Improper Access Control"
|
|
126
|
+
severity: MEDIUM
|
|
127
|
+
precision: medium
|
|
128
|
+
category: authorization
|
|
129
|
+
likelihood: MEDIUM
|
|
130
|
+
impact: MEDIUM
|
|
131
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# CWE-295: Java SSL/TLS 不安全配置检测 (WebView / 自定义TrustManager)
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Java 规则库
|
|
3
|
+
# 覆盖: AllowAllHostnameVerifier/TrustAllX509TrustManager实现
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JAVA-SSL-001: TrustAll / AllowAll X509TrustManager 实现
|
|
8
|
+
- id: zm-java-ssl-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到自定义 X509TrustManager 实现中绕过所有证书校验
|
|
12
|
+
(checkClientTrusted / checkServerTrusted 为空方法体)。
|
|
13
|
+
这等效于禁用SSL/TLS证书验证,允许中间人攻击(MITM)。
|
|
14
|
+
|
|
15
|
+
攻击者可通过伪造证书拦截加密通信,窃取敏感数据。
|
|
16
|
+
|
|
17
|
+
修复:
|
|
18
|
+
1. 删除自定义的空 TrustManager 实现
|
|
19
|
+
2. 使用系统默认的 TrustManagerFactory
|
|
20
|
+
3. 如确需自定义信任,仅添加特定证书(用 KeyStore 加载)
|
|
21
|
+
4. Android: 使用 network_security_config.xml 配置证书固定
|
|
22
|
+
languages:
|
|
23
|
+
- java
|
|
24
|
+
pattern-either:
|
|
25
|
+
- pattern: |
|
|
26
|
+
new X509TrustManager() {
|
|
27
|
+
...
|
|
28
|
+
public void checkClientTrusted(...) {}
|
|
29
|
+
...
|
|
30
|
+
public void checkServerTrusted(...) {}
|
|
31
|
+
...
|
|
32
|
+
}
|
|
33
|
+
- pattern: |
|
|
34
|
+
new X509TrustManager() {
|
|
35
|
+
...
|
|
36
|
+
public void checkClientTrusted(...) { }
|
|
37
|
+
...
|
|
38
|
+
public void checkServerTrusted(...) { }
|
|
39
|
+
...
|
|
40
|
+
}
|
|
41
|
+
metadata:
|
|
42
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
43
|
+
severity: ERROR
|
|
44
|
+
precision: very-high
|
|
45
|
+
category: ssl
|
|
46
|
+
likelihood: HIGH
|
|
47
|
+
impact: CRITICAL
|
|
48
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
49
|
+
references:
|
|
50
|
+
- "https://developer.android.com/training/articles/security-config"
|
|
51
|
+
- "https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning"
|
|
52
|
+
|
|
53
|
+
# ZM-JAVA-SSL-002: HostnameVerifier 绕过 ALLOW_ALL
|
|
54
|
+
- id: zm-java-ssl-002
|
|
55
|
+
severity: ERROR
|
|
56
|
+
message: |
|
|
57
|
+
检测到使用 ALLOW_ALL_HOSTNAME_VERIFIER 或 hostnameVerifier 始终返回 true。
|
|
58
|
+
这绕过了SSL/TLS的主机名验证,允许攻击者使用任意证书冒充合法服务。
|
|
59
|
+
|
|
60
|
+
涉及的API:
|
|
61
|
+
- SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
|
|
62
|
+
- HttpsURLConnection.setDefaultHostnameVerifier
|
|
63
|
+
- OkHttpClient.Builder.hostnameVerifier
|
|
64
|
+
- Apache SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
|
|
65
|
+
|
|
66
|
+
修复:
|
|
67
|
+
1. 移除 ALLOW_ALL_HOSTNAME_VERIFIER 使用默认验证器
|
|
68
|
+
2. 使用 OkHostnameVerifier / DefaultHostnameVerifier
|
|
69
|
+
3. Android: 使用 network_security_config.xml
|
|
70
|
+
languages:
|
|
71
|
+
- java
|
|
72
|
+
pattern-either:
|
|
73
|
+
- pattern: ALLOW_ALL_HOSTNAME_VERIFIER
|
|
74
|
+
- pattern: new HostnameVerifier() { ... return true; ... }
|
|
75
|
+
- pattern: $BUILDER.hostnameVerifier($HV)
|
|
76
|
+
- pattern: $CONN.setHostnameVerifier($HV)
|
|
77
|
+
metadata:
|
|
78
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
79
|
+
severity: ERROR
|
|
80
|
+
precision: very-high
|
|
81
|
+
category: ssl
|
|
82
|
+
likelihood: HIGH
|
|
83
|
+
impact: CRITICAL
|
|
84
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
85
|
+
references:
|
|
86
|
+
- "https://developer.android.com/training/articles/security-ssl"
|
|
87
|
+
|
|
88
|
+
# ZM-JAVA-SSL-003: Android WebView 不安全SSL配置
|
|
89
|
+
- id: zm-java-ssl-003
|
|
90
|
+
severity: ERROR
|
|
91
|
+
message: |
|
|
92
|
+
检测到 Android WebView 中 onReceivedSslError handler 调用 handler.proceed(),
|
|
93
|
+
忽略 SSL 证书错误继续加载页面。攻击者可利用中间人攻击窃取 WebView 中的敏感数据。
|
|
94
|
+
|
|
95
|
+
修复:
|
|
96
|
+
1. 删除 handler.proceed() 调用,使用 handler.cancel()
|
|
97
|
+
2. 使用 Android Network Security Config 配置证书固定:
|
|
98
|
+
<network-security-config>
|
|
99
|
+
<domain-config>
|
|
100
|
+
<domain includeSubdomains="true">example.com</domain>
|
|
101
|
+
<pin-set>
|
|
102
|
+
<pin digest="SHA-256">...</pin>
|
|
103
|
+
</pin-set>
|
|
104
|
+
</domain-config>
|
|
105
|
+
</network-security-config>
|
|
106
|
+
3. 仅在 debug 构建中使用 proceed()
|
|
107
|
+
languages:
|
|
108
|
+
- java
|
|
109
|
+
pattern-either:
|
|
110
|
+
- pattern: $HANDLER.proceed()
|
|
111
|
+
- pattern: handler.proceed()
|
|
112
|
+
- pattern: $SV.proceed()
|
|
113
|
+
metadata:
|
|
114
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
115
|
+
severity: ERROR
|
|
116
|
+
precision: very-high
|
|
117
|
+
category: ssl
|
|
118
|
+
likelihood: HIGH
|
|
119
|
+
impact: CRITICAL
|
|
120
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
121
|
+
references:
|
|
122
|
+
- "https://developer.android.com/training/articles/security-ssl"
|
|
123
|
+
- "https://developer.android.com/training/articles/security-config"
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# CWE-327: 弱加密算法深度检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — 通用规则库
|
|
3
|
+
# 检测: Cipher.getInstance("DES"/"RC4"/"Blowfish") 及不安全的密钥派生/密码学误用
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-001: Cipher.getInstance 弱算法 (增强版)
|
|
8
|
+
- id: zm-java-weakcrypto-deep-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到 Cipher.getInstance() 使用了已淘汰或存在已知缺陷的加密算法。
|
|
12
|
+
包括: DES (56位密钥,可暴力破解)、RC2 (64位块,已淘汰)、RC4 (密钥流偏向性)、
|
|
13
|
+
Blowfish (64位块,Sweet32攻击)、ARCFOUR (RC4别名)。
|
|
14
|
+
这些算法不符合现代安全标准,应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 对称加密: Cipher.getInstance("AES/GCM/NoPadding")
|
|
17
|
+
2. 使用 256 位密钥 + 12 字节随机 IV
|
|
18
|
+
3. 参考 NIST SP 800-131A Rev.2 算法生命周期
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
pattern-either:
|
|
22
|
+
- pattern: Cipher.getInstance("DES")
|
|
23
|
+
- pattern: Cipher.getInstance("DES/")
|
|
24
|
+
- pattern: Cipher.getInstance("RC2")
|
|
25
|
+
- pattern: Cipher.getInstance("RC4")
|
|
26
|
+
- pattern: Cipher.getInstance("Blowfish")
|
|
27
|
+
- pattern: Cipher.getInstance("ARCFOUR")
|
|
28
|
+
- pattern: Cipher.getInstance("DESede")
|
|
29
|
+
- pattern: Cipher.getInstance("DESede/")
|
|
30
|
+
- pattern: Cipher.getInstance("3DES")
|
|
31
|
+
- pattern: Cipher.getInstance("3DES/")
|
|
32
|
+
metadata:
|
|
33
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
34
|
+
severity: WARNING
|
|
35
|
+
precision: very-high
|
|
36
|
+
category: crypto
|
|
37
|
+
likelihood: HIGH
|
|
38
|
+
impact: HIGH
|
|
39
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
40
|
+
references:
|
|
41
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
|
|
42
|
+
- "https://sweet32.info/"
|
|
43
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
44
|
+
|
|
45
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-002: KeyGenerator 弱算法
|
|
46
|
+
- id: zm-java-weakcrypto-deep-002
|
|
47
|
+
severity: WARNING
|
|
48
|
+
message: |
|
|
49
|
+
检测到 KeyGenerator.getInstance() 使用了弱加密算法。
|
|
50
|
+
DES/RC2/Blowfish 密钥生成器意味着意图使用弱加密算法。
|
|
51
|
+
应迁移至 KeyGenerator.getInstance("AES") 配合 256 位密钥。
|
|
52
|
+
languages:
|
|
53
|
+
- java
|
|
54
|
+
pattern-either:
|
|
55
|
+
- pattern: KeyGenerator.getInstance("DES")
|
|
56
|
+
- pattern: KeyGenerator.getInstance("RC2")
|
|
57
|
+
- pattern: KeyGenerator.getInstance("Blowfish")
|
|
58
|
+
- pattern: KeyGenerator.getInstance("DESede")
|
|
59
|
+
- pattern: KeyGenerator.getInstance("RC4")
|
|
60
|
+
metadata:
|
|
61
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
62
|
+
severity: WARNING
|
|
63
|
+
precision: very-high
|
|
64
|
+
category: crypto
|
|
65
|
+
likelihood: HIGH
|
|
66
|
+
impact: HIGH
|
|
67
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
68
|
+
|
|
69
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-003: 自定义/非标准加密实现
|
|
70
|
+
- id: zm-java-weakcrypto-deep-003
|
|
71
|
+
severity: WARNING
|
|
72
|
+
message: |
|
|
73
|
+
检测到自定义或非标准加密类调用(非 javax.crypto.Cipher)。
|
|
74
|
+
自定义加密实现通常存在严重的密码学缺陷(弱密钥派生、错误模式、旁信道)。
|
|
75
|
+
除非经过专业密码学审计,否则应使用标准库 Cipher/AES-GCM。
|
|
76
|
+
修复方案:
|
|
77
|
+
1. 使用 javax.crypto.Cipher 标准 API
|
|
78
|
+
2. 使用经过认证的加密库(如 Google Tink, Bouncy Castle)
|
|
79
|
+
3. 禁止自研加密算法
|
|
80
|
+
languages:
|
|
81
|
+
- java
|
|
82
|
+
pattern-either:
|
|
83
|
+
- pattern: |
|
|
84
|
+
new $CUSTOMCIPHER(...).encrypt(...)
|
|
85
|
+
- pattern: |
|
|
86
|
+
new $CUSTOMCIPHER(...).decrypt(...)
|
|
87
|
+
- pattern: |
|
|
88
|
+
$CIPHER.encrypt(...)
|
|
89
|
+
- pattern: |
|
|
90
|
+
$CIPHER.decrypt(...)
|
|
91
|
+
paths:
|
|
92
|
+
include:
|
|
93
|
+
- "**/*.java"
|
|
94
|
+
metadata:
|
|
95
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
96
|
+
severity: WARNING
|
|
97
|
+
precision: low
|
|
98
|
+
category: crypto
|
|
99
|
+
likelihood: MEDIUM
|
|
100
|
+
impact: HIGH
|
|
101
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
102
|
+
|
|
103
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-004: 弱密码哈希 (MD5/SHA-1)
|
|
104
|
+
- id: zm-java-weakcrypto-deep-004
|
|
105
|
+
severity: WARNING
|
|
106
|
+
message: |
|
|
107
|
+
检测到使用 MessageDigest.getInstance("MD5") 或 ("SHA-1") 进行密码哈希。
|
|
108
|
+
MD5 和 SHA-1 已可被碰撞攻击,不应用于安全场景(密码存储、数字签名)。
|
|
109
|
+
应使用 bcrypt、scrypt、Argon2 (密码哈希) 或 SHA-256/SHA-3 (完整性校验)。
|
|
110
|
+
修复方案:
|
|
111
|
+
1. 密码存储: BCryptPasswordEncoder / Argon2PasswordEncoder
|
|
112
|
+
2. 完整性校验: MessageDigest.getInstance("SHA-256") 或 "SHA-512"
|
|
113
|
+
3. 数字签名: Signature.getInstance("SHA256withRSA")
|
|
114
|
+
languages:
|
|
115
|
+
- java
|
|
116
|
+
pattern-either:
|
|
117
|
+
- pattern: MessageDigest.getInstance("MD5")
|
|
118
|
+
- pattern: MessageDigest.getInstance("SHA-1")
|
|
119
|
+
- pattern: MessageDigest.getInstance("SHA1")
|
|
120
|
+
- pattern: DigestUtils.md5Hex(...)
|
|
121
|
+
- pattern: DigestUtils.sha1Hex(...)
|
|
122
|
+
- pattern: new DigestUtils("MD5")
|
|
123
|
+
- pattern: new DigestUtils("SHA-1")
|
|
124
|
+
metadata:
|
|
125
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
126
|
+
severity: WARNING
|
|
127
|
+
precision: very-high
|
|
128
|
+
category: crypto
|
|
129
|
+
likelihood: HIGH
|
|
130
|
+
impact: HIGH
|
|
131
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
132
|
+
references:
|
|
133
|
+
- "https://shattered.io/"
|
|
134
|
+
- "https://cwe.mitre.org/data/definitions/328.html"
|
|
135
|
+
|
|
136
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-005: SecureRandom 不安全种子
|
|
137
|
+
- id: zm-java-weakcrypto-deep-005
|
|
138
|
+
severity: WARNING
|
|
139
|
+
message: |
|
|
140
|
+
检测到 SecureRandom 使用了固定或可预测的种子 (setSeed)。
|
|
141
|
+
固定种子会导致"随机"数可被完全预测,破坏加密安全性。
|
|
142
|
+
SecureRandom 默认使用操作系统熵源,无需手动设置种子。
|
|
143
|
+
修复方案:
|
|
144
|
+
1. 移除手动 setSeed() 调用,使用默认构造的 SecureRandom
|
|
145
|
+
2. 若必须设置种子,使用 System.nanoTime() + 硬件熵源混合
|
|
146
|
+
3. 确保在 Linux 上 /dev/urandom 可用
|
|
147
|
+
languages:
|
|
148
|
+
- java
|
|
149
|
+
pattern-either:
|
|
150
|
+
- pattern: |
|
|
151
|
+
new SecureRandom($BYTES).setSeed(...)
|
|
152
|
+
- pattern: |
|
|
153
|
+
$SR = new SecureRandom();
|
|
154
|
+
...
|
|
155
|
+
$SR.setSeed($SEED);
|
|
156
|
+
...
|
|
157
|
+
- pattern: |
|
|
158
|
+
new SecureRandom(0)
|
|
159
|
+
metadata:
|
|
160
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
161
|
+
severity: WARNING
|
|
162
|
+
precision: medium
|
|
163
|
+
category: crypto
|
|
164
|
+
likelihood: MEDIUM
|
|
165
|
+
impact: MEDIUM
|
|
166
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
167
|
+
|
|
168
|
+
# ZM-JAVA-WEAKCRYPTO-DEEP-006: 硬编码 AES/DES 密钥
|
|
169
|
+
- id: zm-java-weakcrypto-deep-006
|
|
170
|
+
severity: WARNING
|
|
171
|
+
message: |
|
|
172
|
+
检测到 SecretKeySpec 使用了字面量字符串作为密钥材料,属于硬编码密钥。
|
|
173
|
+
硬编码密钥一旦泄露(如代码仓库公开),攻击者可解密所有受保护数据。
|
|
174
|
+
修复方案:
|
|
175
|
+
1. 密钥从环境变量或密钥管理服务 (KMS) 获取
|
|
176
|
+
2. 使用 KeyStore / Vault 等安全密钥存储
|
|
177
|
+
3. 密钥应在部署时自动生成,每个环境独立
|
|
178
|
+
4. 参考 NIST SP 800-57 密钥管理最佳实践
|
|
179
|
+
languages:
|
|
180
|
+
- java
|
|
181
|
+
pattern-either:
|
|
182
|
+
- pattern: |
|
|
183
|
+
new SecretKeySpec("...".getBytes(), $ALG)
|
|
184
|
+
- pattern: |
|
|
185
|
+
new SecretKeySpec($KEY_STR.getBytes(), "AES")
|
|
186
|
+
- pattern: |
|
|
187
|
+
new SecretKeySpec($KEY_STR.getBytes(), "DES")
|
|
188
|
+
- pattern: |
|
|
189
|
+
new SecretKeySpec("...".getBytes("..."), $ALG)
|
|
190
|
+
metadata:
|
|
191
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
192
|
+
severity: WARNING
|
|
193
|
+
precision: medium
|
|
194
|
+
category: crypto
|
|
195
|
+
likelihood: MEDIUM
|
|
196
|
+
impact: CRITICAL
|
|
197
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# CWE-347: JWT 安全配置缺陷
|
|
2
|
+
rules:
|
|
3
|
+
- id: zm-java-jwt-01
|
|
4
|
+
severity: WARNING
|
|
5
|
+
message: JWT Parser 未调用 requireIssuer/requireAudience,可能接受任意发行者的令牌。
|
|
6
|
+
languages: [java]
|
|
7
|
+
pattern-either:
|
|
8
|
+
- pattern: Jwts.parser().setSigningKey($KEY).parseClaimsJws($TOKEN)
|
|
9
|
+
- pattern: Jwts.parserBuilder().setSigningKey($KEY).build().parseClaimsJws($TOKEN)
|
|
10
|
+
metadata: { cwe: "CWE-347", precision: medium, category: auth, owasp: "A02:2021 - Cryptographic Failures" }
|
|
11
|
+
|
|
12
|
+
- id: zm-java-jwt-02
|
|
13
|
+
severity: ERROR
|
|
14
|
+
message: JWT 签名密钥硬编码为字符串,可被攻击者伪造令牌。
|
|
15
|
+
languages: [java]
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: Keys.hmacShaKeyFor("$KEY".getBytes())
|
|
18
|
+
- pattern: Keys.hmacShaKeyFor($STR.getBytes())
|
|
19
|
+
- pattern: Keys.secretKeyFor(SignatureAlgorithm.$ALG)
|
|
20
|
+
metadata: { cwe: "CWE-347", precision: medium, category: crypto, owasp: "A02:2021" }
|
|
21
|
+
|
|
22
|
+
- id: zm-java-jwt-03
|
|
23
|
+
severity: WARNING
|
|
24
|
+
message: JWT 解析中接受过期令牌 acceptExpiredAt() / 允许宽松时间窗口。
|
|
25
|
+
languages: [java]
|
|
26
|
+
pattern-either:
|
|
27
|
+
- pattern: $PARSER.setAllowedClockSkewSeconds($N)
|
|
28
|
+
- pattern: $PARSER.setSigningKey($KEY).parseClaimsJws($TOKEN)
|
|
29
|
+
- pattern: Jwts.parserBuilder().setAllowedClockSkewSeconds($N).build()
|
|
30
|
+
metadata: { cwe: "CWE-347", precision: low, category: auth, owasp: "A02:2021" }
|