@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,217 @@
|
|
|
1
|
+
# CWE-295: SSL/TLS 证书验证绕过
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
#
|
|
4
|
+
# 禁用或绕过 SSL/TLS 证书验证使应用完全暴露于中间人攻击(MITM)。
|
|
5
|
+
# 攻击者可拦截并篡改所有传输的数据——包括凭证、会话令牌和加密密钥。
|
|
6
|
+
# 任何时候都不应在生产代码中绕过证书验证。
|
|
7
|
+
|
|
8
|
+
rules:
|
|
9
|
+
|
|
10
|
+
# ZM-JAVA-SSLVERIFY-001: 全信任 TrustManager(空校验)
|
|
11
|
+
- id: zm-java-sslverify-001
|
|
12
|
+
severity: CRITICAL
|
|
13
|
+
message: |
|
|
14
|
+
检测到 X509TrustManager 实现但 checkServerTrusted / checkClientTrusted 方法体为空。
|
|
15
|
+
这相当于完全信任任何证书,攻击者可通过 MITM 攻击拦截所有 TLS 流量。
|
|
16
|
+
移除此自定义 TrustManager,使用系统默认证书链验证。
|
|
17
|
+
|
|
18
|
+
修复示例:
|
|
19
|
+
// 删除自定义空 TrustManager
|
|
20
|
+
// 使用默认 TrustManagerFactory:
|
|
21
|
+
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
|
|
22
|
+
TrustManagerFactory.getDefaultAlgorithm());
|
|
23
|
+
tmf.init((KeyStore) null);
|
|
24
|
+
SSLContext ctx = SSLContext.getInstance("TLS");
|
|
25
|
+
ctx.init(null, tmf.getTrustManagers(), new SecureRandom());
|
|
26
|
+
|
|
27
|
+
参考:
|
|
28
|
+
- CWE-295: https://cwe.mitre.org/data/definitions/295.html
|
|
29
|
+
- Android Security: Network Security Configuration: https://developer.android.com/training/articles/security-config
|
|
30
|
+
languages:
|
|
31
|
+
- java
|
|
32
|
+
pattern-either:
|
|
33
|
+
- pattern: |
|
|
34
|
+
new X509TrustManager() {
|
|
35
|
+
...
|
|
36
|
+
public void checkServerTrusted(...) {}
|
|
37
|
+
...
|
|
38
|
+
public void checkClientTrusted(...) {}
|
|
39
|
+
...
|
|
40
|
+
}
|
|
41
|
+
- pattern: |
|
|
42
|
+
new X509TrustManager() {
|
|
43
|
+
...
|
|
44
|
+
public void checkClientTrusted(...) {}
|
|
45
|
+
...
|
|
46
|
+
public void checkServerTrusted(...) {}
|
|
47
|
+
...
|
|
48
|
+
}
|
|
49
|
+
- pattern: |
|
|
50
|
+
new X509TrustManager() {
|
|
51
|
+
...
|
|
52
|
+
public void checkServerTrusted(...) { }
|
|
53
|
+
...
|
|
54
|
+
}
|
|
55
|
+
- pattern: |
|
|
56
|
+
new X509TrustManager() {
|
|
57
|
+
...
|
|
58
|
+
public void checkClientTrusted(...) { }
|
|
59
|
+
...
|
|
60
|
+
}
|
|
61
|
+
- pattern: |
|
|
62
|
+
class $CLASS implements X509TrustManager {
|
|
63
|
+
...
|
|
64
|
+
public void checkServerTrusted(...) { }
|
|
65
|
+
...
|
|
66
|
+
}
|
|
67
|
+
metadata:
|
|
68
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
69
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
70
|
+
precision: very-high
|
|
71
|
+
industries: ["common"]
|
|
72
|
+
tags:
|
|
73
|
+
- crypto
|
|
74
|
+
- tls
|
|
75
|
+
- ssl
|
|
76
|
+
- certificate-validation
|
|
77
|
+
- mitm
|
|
78
|
+
references:
|
|
79
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
80
|
+
- https://developer.android.com/training/articles/security-config
|
|
81
|
+
|
|
82
|
+
# ZM-JAVA-SSLVERIFY-002: HostnameVerifier 全部接受
|
|
83
|
+
- id: zm-java-sslverify-002
|
|
84
|
+
severity: HIGH
|
|
85
|
+
message: |
|
|
86
|
+
检测到 HostnameVerifier 实现始终返回 true,或使用 ALLOW_ALL_HOSTNAME_VERIFIER。
|
|
87
|
+
这会绕过主机名验证,使得 MITM 攻击者可以通过任意证书伪装成合法服务器。
|
|
88
|
+
生产代码不得使用此类验证器;仅在测试环境中临时使用。
|
|
89
|
+
|
|
90
|
+
修复示例:
|
|
91
|
+
// 删除自定义 HostnameVerifier
|
|
92
|
+
// 使用默认 hostname 验证即可:
|
|
93
|
+
HttpsURLConnection.setDefaultHostnameVerifier(
|
|
94
|
+
HttpsURLConnection.getDefaultHostnameVerifier());
|
|
95
|
+
|
|
96
|
+
参考:
|
|
97
|
+
- CWE-295: https://cwe.mitre.org/data/definitions/295.html
|
|
98
|
+
- Android HostnameVerifier: https://developer.android.com/reference/javax/net/ssl/HostnameVerifier
|
|
99
|
+
languages:
|
|
100
|
+
- java
|
|
101
|
+
pattern-either:
|
|
102
|
+
- pattern: |
|
|
103
|
+
new HostnameVerifier() {
|
|
104
|
+
...
|
|
105
|
+
public boolean verify(...) {
|
|
106
|
+
...
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
...
|
|
110
|
+
}
|
|
111
|
+
- pattern: |
|
|
112
|
+
public boolean verify(...) {
|
|
113
|
+
...
|
|
114
|
+
return true;
|
|
115
|
+
...
|
|
116
|
+
}
|
|
117
|
+
- pattern: |
|
|
118
|
+
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
|
|
119
|
+
- pattern: |
|
|
120
|
+
$CONN.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
|
|
121
|
+
metadata:
|
|
122
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
123
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
124
|
+
precision: very-high
|
|
125
|
+
industries: ["common"]
|
|
126
|
+
tags:
|
|
127
|
+
- crypto
|
|
128
|
+
- tls
|
|
129
|
+
- ssl
|
|
130
|
+
- hostname-verification
|
|
131
|
+
- mitm
|
|
132
|
+
references:
|
|
133
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
134
|
+
- https://developer.android.com/reference/javax/net/ssl/HostnameVerifier
|
|
135
|
+
|
|
136
|
+
# ZM-JAVA-SSLVERIFY-003: allowAllHostnames() 调用
|
|
137
|
+
- id: zm-java-sslverify-003
|
|
138
|
+
severity: HIGH
|
|
139
|
+
message: |
|
|
140
|
+
检测到 Apache HttpClient 的 allowAllHostnames() 调用,绕过主机名验证。
|
|
141
|
+
这使得 MITM 攻击者可使用任意证书伪装为合法服务器。
|
|
142
|
+
删除此调用以使用默认主机名验证。
|
|
143
|
+
|
|
144
|
+
修复示例:
|
|
145
|
+
// 删除 .allowAllHostnames() 调用
|
|
146
|
+
// HttpClient 4.3+ 默认执行严格主机名验证
|
|
147
|
+
|
|
148
|
+
参考:
|
|
149
|
+
- CWE-295: https://cwe.mitre.org/data/definitions/295.html
|
|
150
|
+
- Apache HttpClient SSL Guide: https://hc.apache.org/httpcomponents-client-4.5.x/ssl-tls.html
|
|
151
|
+
languages:
|
|
152
|
+
- java
|
|
153
|
+
pattern-either:
|
|
154
|
+
- pattern: |
|
|
155
|
+
$BUILDER.allowAllHostnames()
|
|
156
|
+
- pattern: |
|
|
157
|
+
$B.allowAllHostnames()
|
|
158
|
+
- pattern: |
|
|
159
|
+
$HTTP.allowAllHostnames()
|
|
160
|
+
metadata:
|
|
161
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
162
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
163
|
+
precision: high
|
|
164
|
+
industries: ["common"]
|
|
165
|
+
tags:
|
|
166
|
+
- crypto
|
|
167
|
+
- tls
|
|
168
|
+
- ssl
|
|
169
|
+
- apache-httpclient
|
|
170
|
+
- hostname-verification
|
|
171
|
+
references:
|
|
172
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
173
|
+
- https://hc.apache.org/httpcomponents-client-4.5.x/ssl-tls.html
|
|
174
|
+
|
|
175
|
+
# ZM-JAVA-SSLVERIFY-004: SSLContext.init 空 TrustManager
|
|
176
|
+
- id: zm-java-sslverify-004
|
|
177
|
+
severity: CRITICAL
|
|
178
|
+
message: |
|
|
179
|
+
检测到 SSLContext.init() 传入包含空 TrustManager 的数组。
|
|
180
|
+
空 TrustManager 意味着不验证服务器证书链,完全暴露于 MITM 攻击。
|
|
181
|
+
使用 TrustManagerFactory 从系统信任库加载默认 TrustManager。
|
|
182
|
+
|
|
183
|
+
修复示例:
|
|
184
|
+
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
|
|
185
|
+
TrustManagerFactory.getDefaultAlgorithm());
|
|
186
|
+
tmf.init((KeyStore) null);
|
|
187
|
+
SSLContext ctx = SSLContext.getInstance("TLS");
|
|
188
|
+
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
|
|
189
|
+
|
|
190
|
+
参考:
|
|
191
|
+
- CWE-295: https://cwe.mitre.org/data/definitions/295.html
|
|
192
|
+
- OWASP TLS Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html
|
|
193
|
+
languages:
|
|
194
|
+
- java
|
|
195
|
+
pattern-either:
|
|
196
|
+
- pattern: |
|
|
197
|
+
SSLContext.getInstance("$TLS").init($KM, new TrustManager[]{$NULL_TM}, $RANDOM)
|
|
198
|
+
- pattern: |
|
|
199
|
+
$CTX.init($KM, new TrustManager[]{$NULL_TM}, $RANDOM)
|
|
200
|
+
- pattern: |
|
|
201
|
+
$CTX.init($KM, new TrustManager[] {$NULL_TM}, $RANDOM)
|
|
202
|
+
- pattern: |
|
|
203
|
+
$CTX.init($KM, new TrustManager[]{new X509TrustManager(), ...}, $RANDOM)
|
|
204
|
+
metadata:
|
|
205
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
206
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
207
|
+
precision: very-high
|
|
208
|
+
industries: ["common"]
|
|
209
|
+
tags:
|
|
210
|
+
- crypto
|
|
211
|
+
- tls
|
|
212
|
+
- ssl
|
|
213
|
+
- trust-manager
|
|
214
|
+
- mitm
|
|
215
|
+
references:
|
|
216
|
+
- https://cwe.mitre.org/data/definitions/295.html
|
|
217
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# CWE-295: SSL 证书验证禁用检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-SSL-001: 信任所有证书 TrustManager
|
|
7
|
+
- id: zm-java-ssl-001
|
|
8
|
+
severity: HIGH
|
|
9
|
+
message: |
|
|
10
|
+
检测到 X509TrustManager 实现中信任所有证书 (checkClientTrusted/checkServerTrusted 为空)。
|
|
11
|
+
这将导致 SSL/TLS 中间人攻击 (MITM)。
|
|
12
|
+
必须正确验证证书链和主机名。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
new X509TrustManager() {
|
|
18
|
+
...
|
|
19
|
+
public void checkClientTrusted(...) {}
|
|
20
|
+
public void checkServerTrusted(...) {}
|
|
21
|
+
...
|
|
22
|
+
};
|
|
23
|
+
metadata:
|
|
24
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
25
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
26
|
+
precision: very-high
|
|
27
|
+
|
|
28
|
+
# ZM-JAVA-SSL-002: HostnameVerifier 返回 true
|
|
29
|
+
- id: zm-java-ssl-002
|
|
30
|
+
severity: HIGH
|
|
31
|
+
message: |
|
|
32
|
+
检测到 HostnameVerifier 总是返回 true,绕过主机名验证。
|
|
33
|
+
应使用默认的浏览器兼容主机名验证器。
|
|
34
|
+
languages:
|
|
35
|
+
- java
|
|
36
|
+
pattern-either:
|
|
37
|
+
- pattern: |
|
|
38
|
+
new HostnameVerifier() {
|
|
39
|
+
...
|
|
40
|
+
public boolean verify(...) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
...
|
|
44
|
+
};
|
|
45
|
+
metadata:
|
|
46
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
47
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
48
|
+
precision: very-high
|
|
49
|
+
|
|
50
|
+
# ZM-JAVA-SSL-003: SSLContext 使用 ALLOW_ALL_HOSTNAME_VERIFIER
|
|
51
|
+
- id: zm-java-ssl-003
|
|
52
|
+
severity: HIGH
|
|
53
|
+
message: |
|
|
54
|
+
检测到使用 ALLOW_ALL_HOSTNAME_VERIFIER 禁用主机名验证。
|
|
55
|
+
中间人攻击者可伪造证书劫持加密通信。
|
|
56
|
+
languages:
|
|
57
|
+
- java
|
|
58
|
+
pattern-either:
|
|
59
|
+
- pattern: |
|
|
60
|
+
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
|
|
61
|
+
metadata:
|
|
62
|
+
cwe: "CWE-295: Improper Certificate Validation"
|
|
63
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
64
|
+
precision: very-high
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CWE-306: 关键功能缺少身份验证检测规则 (Sprint 2)
|
|
2
|
+
# 已知限制: Semgrep Java parser 不支持 pattern-not-inside 配合注解 (Parse_error)
|
|
3
|
+
# 无法自动排除已有 @PreAuthorize/@Secured 的方法
|
|
4
|
+
# FPR 28.6% 为已知可接受水平,人工审查可快速过滤
|
|
5
|
+
|
|
6
|
+
rules:
|
|
7
|
+
|
|
8
|
+
# ZM-JAVA-MA-001: @RestController + @GetMapping/@PostMapping 无 @PreAuthorize
|
|
9
|
+
- id: zm-java-ma-001
|
|
10
|
+
severity: MEDIUM
|
|
11
|
+
message: |
|
|
12
|
+
@GetMapping/@PostMapping 方法缺少认证注解。应检查是否已添加 @PreAuthorize/@Secured。
|
|
13
|
+
如已有安全注解且本规则误报,人工忽略。
|
|
14
|
+
languages:
|
|
15
|
+
- java
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: |
|
|
18
|
+
@GetMapping(...)
|
|
19
|
+
public $RET $METHOD(...) {
|
|
20
|
+
...
|
|
21
|
+
}
|
|
22
|
+
- pattern: |
|
|
23
|
+
@PostMapping(...)
|
|
24
|
+
public $RET $METHOD(...) {
|
|
25
|
+
...
|
|
26
|
+
}
|
|
27
|
+
metadata:
|
|
28
|
+
cwe: "CWE-306: Missing Authentication for Critical Function"
|
|
29
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
30
|
+
precision: low
|
|
31
|
+
|
|
32
|
+
# ZM-JAVA-MA-002: Spring Security 配置无认证要求
|
|
33
|
+
- id: zm-java-ma-002
|
|
34
|
+
severity: MEDIUM
|
|
35
|
+
message: |
|
|
36
|
+
Spring Security permitAll() 允许未认证访问,需审查是否所有敏感端点都要求认证。
|
|
37
|
+
languages:
|
|
38
|
+
- java
|
|
39
|
+
pattern-either:
|
|
40
|
+
- pattern: $HTTP.authorizeRequests().anyRequest().permitAll()
|
|
41
|
+
metadata:
|
|
42
|
+
cwe: "CWE-306: Missing Authentication for Critical Function"
|
|
43
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
44
|
+
precision: low
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# CWE-326: Inadequate Encryption Strength
|
|
2
|
+
# ZhuMa V4.0 Alpha -- Common Rules
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-WEAKKEY-001: AES key size < 128 bits
|
|
7
|
+
- id: zm-java-weakkey-001
|
|
8
|
+
severity: CRITICAL
|
|
9
|
+
message: |
|
|
10
|
+
AES key size below 128 bits detected. NIST SP 800-57 Part 1 requires >= 128-bit
|
|
11
|
+
security strength. Standard AES key lengths are 128, 192, or 256 bits.
|
|
12
|
+
Production environments should use AES-256.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
$KG.init(64)
|
|
18
|
+
- pattern: |
|
|
19
|
+
$KG.init(96)
|
|
20
|
+
- pattern: |
|
|
21
|
+
$KG.init(8)
|
|
22
|
+
- pattern: |
|
|
23
|
+
$KG.init(16)
|
|
24
|
+
- pattern: |
|
|
25
|
+
$KG.init(32)
|
|
26
|
+
- pattern: |
|
|
27
|
+
$KG.init(40)
|
|
28
|
+
- pattern: |
|
|
29
|
+
$KG.init(48)
|
|
30
|
+
- pattern: |
|
|
31
|
+
$KG.init(56)
|
|
32
|
+
- pattern: |
|
|
33
|
+
$KG.init(80)
|
|
34
|
+
- pattern: |
|
|
35
|
+
$KG.init(112)
|
|
36
|
+
- pattern: |
|
|
37
|
+
$KG.init(127)
|
|
38
|
+
metadata:
|
|
39
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
40
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
41
|
+
precision: very-high
|
|
42
|
+
industries:
|
|
43
|
+
- common
|
|
44
|
+
references:
|
|
45
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf"
|
|
46
|
+
- "https://cwe.mitre.org/data/definitions/326.html"
|
|
47
|
+
|
|
48
|
+
# ZM-JAVA-WEAKKEY-002: RSA key size < 2048 bits
|
|
49
|
+
- id: zm-java-weakkey-002
|
|
50
|
+
severity: CRITICAL
|
|
51
|
+
message: |
|
|
52
|
+
RSA key size below 2048 bits detected. NIST SP 800-131A Rev.2 requires RSA >= 2048.
|
|
53
|
+
RSA-512/768/1024 have been demonstrated factorable.
|
|
54
|
+
Use 2048, 3072, or 4096 bits.
|
|
55
|
+
languages:
|
|
56
|
+
- java
|
|
57
|
+
pattern-either:
|
|
58
|
+
- pattern: |
|
|
59
|
+
$KPG.initialize(512)
|
|
60
|
+
- pattern: |
|
|
61
|
+
$KPG.initialize(768)
|
|
62
|
+
- pattern: |
|
|
63
|
+
$KPG.initialize(1024)
|
|
64
|
+
- pattern: |
|
|
65
|
+
$KPG.initialize(1536)
|
|
66
|
+
- pattern: |
|
|
67
|
+
$KPG.initialize(2047)
|
|
68
|
+
metadata:
|
|
69
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
70
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
71
|
+
precision: very-high
|
|
72
|
+
industries:
|
|
73
|
+
- common
|
|
74
|
+
references:
|
|
75
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
|
|
76
|
+
- "https://cwe.mitre.org/data/definitions/326.html"
|
|
77
|
+
|
|
78
|
+
# ZM-JAVA-WEAKKEY-003: EC key size < 256 bits
|
|
79
|
+
- id: zm-java-weakkey-003
|
|
80
|
+
severity: HIGH
|
|
81
|
+
message: |
|
|
82
|
+
EC key size below 256 bits detected. NIST SP 800-57 recommends >= 256-bit curves.
|
|
83
|
+
secp192r1/secp224r1 provide < 128-bit equivalent security.
|
|
84
|
+
Use secp256r1 (P-256), secp384r1 (P-384), secp521r1 (P-521), or Curve25519.
|
|
85
|
+
languages:
|
|
86
|
+
- java
|
|
87
|
+
pattern-either:
|
|
88
|
+
- pattern: |
|
|
89
|
+
$KPG.initialize(192)
|
|
90
|
+
- pattern: |
|
|
91
|
+
$KPG.initialize(224)
|
|
92
|
+
- pattern: |
|
|
93
|
+
$KPG.initialize(128)
|
|
94
|
+
- pattern: |
|
|
95
|
+
$KPG.initialize(160)
|
|
96
|
+
- pattern: |
|
|
97
|
+
$KPG.initialize(255)
|
|
98
|
+
metadata:
|
|
99
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
100
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
101
|
+
precision: high
|
|
102
|
+
industries:
|
|
103
|
+
- common
|
|
104
|
+
references:
|
|
105
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf"
|
|
106
|
+
- "https://safecurves.cr.yp.to/"
|
|
107
|
+
- "https://cwe.mitre.org/data/definitions/326.html"
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# CWE-327: 使用破解或危险的加密算法
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-WEAKCRYPTO-001: DES/3DES 加密
|
|
7
|
+
- id: zm-java-weakcrypto-001
|
|
8
|
+
severity: CRITICAL
|
|
9
|
+
message: |
|
|
10
|
+
使用了 DES/3DES 加密算法,该算法已被破解且密钥长度不足。
|
|
11
|
+
DES 使用 56 位有效密钥,可在数小时内暴力破解;3DES 仅提供 112 位等效安全性。
|
|
12
|
+
应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
|
|
13
|
+
参考: NIST SP 800-131A Rev.2 已废止 DES/3DES。
|
|
14
|
+
languages:
|
|
15
|
+
- java
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: Cipher.getInstance("DES")
|
|
18
|
+
- pattern: Cipher.getInstance("DESede")
|
|
19
|
+
- pattern: Cipher.getInstance("3DES")
|
|
20
|
+
- pattern: KeyGenerator.getInstance("DES")
|
|
21
|
+
- pattern: Cipher.getInstance("DES/CBC/PKCS5Padding")
|
|
22
|
+
- pattern: Cipher.getInstance("DES/CBC/NoPadding")
|
|
23
|
+
- pattern: Cipher.getInstance("DES/ECB/PKCS5Padding")
|
|
24
|
+
- pattern: Cipher.getInstance("DES/ECB/NoPadding")
|
|
25
|
+
- pattern: Cipher.getInstance("DESede/CBC/PKCS5Padding")
|
|
26
|
+
- pattern: Cipher.getInstance("DESede/ECB/PKCS5Padding")
|
|
27
|
+
metadata:
|
|
28
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
29
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
30
|
+
precision: very-high
|
|
31
|
+
industries:
|
|
32
|
+
- common
|
|
33
|
+
references:
|
|
34
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
|
|
35
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
36
|
+
|
|
37
|
+
# ZM-JAVA-WEAKCRYPTO-002: RC2/RC4/Blowfish 弱算法
|
|
38
|
+
- id: zm-java-weakcrypto-002
|
|
39
|
+
severity: CRITICAL
|
|
40
|
+
message: |
|
|
41
|
+
使用了 RC2/RC4/Blowfish 弱加密算法。
|
|
42
|
+
RC4 存在严重密码学缺陷(偏向性密钥流),RC2 为 64 位分组密码已被淘汰,
|
|
43
|
+
Blowfish 使用 64 位分组大小易受 Sweet32 生日攻击。
|
|
44
|
+
应迁移至 AES-256-GCM 或 ChaCha20-Poly1305。
|
|
45
|
+
languages:
|
|
46
|
+
- java
|
|
47
|
+
pattern-either:
|
|
48
|
+
- pattern: Cipher.getInstance("RC2")
|
|
49
|
+
- pattern: Cipher.getInstance("RC4")
|
|
50
|
+
- pattern: Cipher.getInstance("Blowfish")
|
|
51
|
+
- pattern: Cipher.getInstance("RC2/CBC/PKCS5Padding")
|
|
52
|
+
- pattern: Cipher.getInstance("Blowfish/CBC/PKCS5Padding")
|
|
53
|
+
- pattern: KeyGenerator.getInstance("RC2")
|
|
54
|
+
- pattern: KeyGenerator.getInstance("Blowfish")
|
|
55
|
+
metadata:
|
|
56
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
57
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
58
|
+
precision: very-high
|
|
59
|
+
industries:
|
|
60
|
+
- common
|
|
61
|
+
references:
|
|
62
|
+
- "https://sweet32.info/"
|
|
63
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
64
|
+
|
|
65
|
+
# ZM-JAVA-WEAKCRYPTO-003: 无认证加密模式 ECB
|
|
66
|
+
- id: zm-java-weakcrypto-003
|
|
67
|
+
severity: HIGH
|
|
68
|
+
message: |
|
|
69
|
+
使用了 ECB 模式进行对称加密,该模式不提供数据认证且无法隐藏数据模式。
|
|
70
|
+
相同的明文块会产生相同的密文块,可遭受块重放攻击和模式分析攻击。
|
|
71
|
+
应使用 GCM(Galois/Counter Mode)或 CTR+CBC 配合 HMAC 提供认证加密。
|
|
72
|
+
languages:
|
|
73
|
+
- java
|
|
74
|
+
pattern-either:
|
|
75
|
+
- pattern: Cipher.getInstance("AES/ECB/NoPadding")
|
|
76
|
+
- pattern: Cipher.getInstance("AES/ECB/PKCS5Padding")
|
|
77
|
+
- pattern: Cipher.getInstance("AES/ECB/ISO10126Padding")
|
|
78
|
+
- pattern: Cipher.getInstance("DES/ECB/NoPadding")
|
|
79
|
+
- pattern: Cipher.getInstance("DES/ECB/PKCS5Padding")
|
|
80
|
+
- pattern: Cipher.getInstance("DESede/ECB/NoPadding")
|
|
81
|
+
- pattern: Cipher.getInstance("DESede/ECB/PKCS5Padding")
|
|
82
|
+
- pattern: Cipher.getInstance("Blowfish/ECB/NoPadding")
|
|
83
|
+
- pattern: Cipher.getInstance("Blowfish/ECB/PKCS5Padding")
|
|
84
|
+
- pattern: Cipher.getInstance("RC2/ECB/PKCS5Padding")
|
|
85
|
+
- pattern: Cipher.getInstance("RSA/ECB/NoPadding")
|
|
86
|
+
- pattern: Cipher.getInstance("RSA/ECB/PKCS1Padding")
|
|
87
|
+
metadata:
|
|
88
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
89
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
90
|
+
precision: high
|
|
91
|
+
industries:
|
|
92
|
+
- common
|
|
93
|
+
references:
|
|
94
|
+
- "https://csrc.nist.gov/pubs/sp/800/38/d/final"
|
|
95
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
96
|
+
|
|
97
|
+
# ZM-JAVA-WEAKCRYPTO-004: RSA 不安全配置
|
|
98
|
+
- id: zm-java-weakcrypto-004
|
|
99
|
+
severity: HIGH
|
|
100
|
+
message: |
|
|
101
|
+
使用了不安全的 RSA 配置:密钥长度不足 2048 位或使用 PKCS1Padding 填充模式。
|
|
102
|
+
RSA-1024 在 2024 年已被认为可破解,PKCS1Padding 易受 Bleichenbacher 选择密文攻击。
|
|
103
|
+
应使用 RSA-2048(最低要求)或 RSA-4096,搭配 OAEPWithSHA-256AndMGF1Padding。
|
|
104
|
+
NIST SP 800-131A Rev.2 要求 RSA 密钥 ≥ 2048 位。
|
|
105
|
+
languages:
|
|
106
|
+
- java
|
|
107
|
+
pattern-either:
|
|
108
|
+
- pattern: Cipher.getInstance("RSA")
|
|
109
|
+
- pattern: Cipher.getInstance("RSA/ECB/PKCS1Padding")
|
|
110
|
+
- pattern: Cipher.getInstance("RSA/ECB/NoPadding")
|
|
111
|
+
- pattern: Cipher.getInstance("RSA/NONE/PKCS1Padding")
|
|
112
|
+
- pattern: Cipher.getInstance("RSA/NONE/NoPadding")
|
|
113
|
+
metadata:
|
|
114
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
115
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
116
|
+
precision: high
|
|
117
|
+
industries:
|
|
118
|
+
- common
|
|
119
|
+
references:
|
|
120
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
|
|
121
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
122
|
+
|
|
123
|
+
# ZM-JAVA-WEAKCRYPTO-005: JWT Algorithm=none
|
|
124
|
+
- id: zm-java-weakcrypto-005
|
|
125
|
+
severity: CRITICAL
|
|
126
|
+
message: |
|
|
127
|
+
JWT 使用 algorithm="none" 或在未校验算法前设置签名密钥,可能导致 JWT 算法混淆攻击。
|
|
128
|
+
攻击者可将 algorithm 修改为 "none" 绕过签名验证,或使用公钥算法混淆为 HMAC 实现伪造签名。
|
|
129
|
+
必须在解析 JWT 前显式限制 algorithm,使用 .requireAlgorithm() 或 .verifyWith() 明确指定算法。
|
|
130
|
+
参考: CVE-2015-9235, CVE-2016-5431(alg=none 攻击)。
|
|
131
|
+
languages:
|
|
132
|
+
- java
|
|
133
|
+
pattern-either:
|
|
134
|
+
- pattern: |
|
|
135
|
+
Jwts.parser().setSigningKey(...)
|
|
136
|
+
- pattern: |
|
|
137
|
+
Jwts.parserBuilder().setSigningKey(...)
|
|
138
|
+
- pattern: Jwts.parser().parseClaimsJwt(...)
|
|
139
|
+
metadata:
|
|
140
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
141
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
142
|
+
precision: high
|
|
143
|
+
industries:
|
|
144
|
+
- common
|
|
145
|
+
references:
|
|
146
|
+
- "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-9235"
|
|
147
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|
|
148
|
+
- "https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/"
|
|
149
|
+
|
|
150
|
+
# ZM-JAVA-WEAKCRYPTO-006: 固定 IV / 硬编码 IV
|
|
151
|
+
- id: zm-java-weakcrypto-006
|
|
152
|
+
severity: HIGH
|
|
153
|
+
message: |
|
|
154
|
+
使用了硬编码或静态初始化向量(IV),严重削弱 CBC/GCM 等模式的安全性。
|
|
155
|
+
对于 CBC 模式,固定 IV 使加密确定性化,可遭受块重放攻击和选择明文攻击(如 BEAST)。
|
|
156
|
+
对于 GCM 模式,IV 重用会完全破坏认证加密的安全性,泄露明文 XOR 结果。
|
|
157
|
+
必须为每次加密使用 CSPRNG 生成随机 IV(如 SecureRandom),并将 IV 随密文一起存储。
|
|
158
|
+
languages:
|
|
159
|
+
- java
|
|
160
|
+
patterns:
|
|
161
|
+
- pattern: |
|
|
162
|
+
new IvParameterSpec($BYTES)
|
|
163
|
+
- pattern: |
|
|
164
|
+
new GCMParameterSpec(..., $BYTES)
|
|
165
|
+
- pattern: |
|
|
166
|
+
new IvParameterSpec("...".getBytes())
|
|
167
|
+
- pattern: |
|
|
168
|
+
new IvParameterSpec(new byte[]{...})
|
|
169
|
+
metadata:
|
|
170
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
171
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
172
|
+
precision: high
|
|
173
|
+
industries:
|
|
174
|
+
- common
|
|
175
|
+
references:
|
|
176
|
+
- "https://csrc.nist.gov/glossary/term/initialization_vector"
|
|
177
|
+
- "https://cwe.mitre.org/data/definitions/327.html"
|