@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,153 @@
|
|
|
1
|
+
# CWE-798: Go 硬编码凭据检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: 常量/变量中硬编码密码、API密钥、Token、数据库连接串
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-HC-001: const 声明硬编码凭据
|
|
8
|
+
- id: zm-go-hc-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 const 常量声明中硬编码了凭据(密码、API密钥、Token等)。
|
|
12
|
+
硬编码凭据会随代码提交到版本控制系统,一旦仓库公开或内部泄露,
|
|
13
|
+
攻击者可获取数据库、云服务等敏感系统的访问权限。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 使用环境变量: os.Getenv("DB_PASSWORD")
|
|
17
|
+
2. 使用密钥管理服务(Vault / AWS Secrets Manager / K8s Secrets)
|
|
18
|
+
3. 使用配置文件(.env)+ .gitignore 排除
|
|
19
|
+
4. 部署时由 CI/CD 注入凭据,禁止写入源码
|
|
20
|
+
5. 对已泄漏的硬编码凭据立即轮换
|
|
21
|
+
languages:
|
|
22
|
+
- go
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: |
|
|
25
|
+
const $PASSWORD = "..."
|
|
26
|
+
- pattern: |
|
|
27
|
+
const $APIKEY = "..."
|
|
28
|
+
- pattern: |
|
|
29
|
+
const $SECRET = "..."
|
|
30
|
+
- pattern: |
|
|
31
|
+
const $TOKEN = "..."
|
|
32
|
+
- pattern: |
|
|
33
|
+
const $ACCESSKEY = "..."
|
|
34
|
+
- pattern: |
|
|
35
|
+
const $PRIVATEKEY = "..."
|
|
36
|
+
- pattern: |
|
|
37
|
+
const $DSN = "..."
|
|
38
|
+
- pattern: |
|
|
39
|
+
const $CONNSTR = "..."
|
|
40
|
+
metadata:
|
|
41
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
42
|
+
severity: ERROR
|
|
43
|
+
precision: high
|
|
44
|
+
category: hardcoded-credentials
|
|
45
|
+
likelihood: HIGH
|
|
46
|
+
impact: CRITICAL
|
|
47
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
48
|
+
references:
|
|
49
|
+
- "https://cwe.mitre.org/data/definitions/798.html"
|
|
50
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html"
|
|
51
|
+
|
|
52
|
+
# ZM-GO-HC-002: var 声明硬编码凭据
|
|
53
|
+
- id: zm-go-hc-002
|
|
54
|
+
severity: ERROR
|
|
55
|
+
message: |
|
|
56
|
+
检测到 var 变量声明中硬编码了凭据。
|
|
57
|
+
与 const 类似,var 声明的硬编码凭据同样会随代码提交暴露。
|
|
58
|
+
即使变量名使用了缩写(如 pwd、passwd、ak/sk),本质风险相同。
|
|
59
|
+
|
|
60
|
+
修复方案:
|
|
61
|
+
1. 使用环境变量或密钥管理服务
|
|
62
|
+
2. var password = os.Getenv("DB_PASSWORD")
|
|
63
|
+
3. 禁止在源码中留下任何形式的明文凭据
|
|
64
|
+
languages:
|
|
65
|
+
- go
|
|
66
|
+
pattern-either:
|
|
67
|
+
- pattern: |
|
|
68
|
+
var $PASSWORD = "..."
|
|
69
|
+
- pattern: |
|
|
70
|
+
var $APIKEY = "..."
|
|
71
|
+
- pattern: |
|
|
72
|
+
var $SECRET = "..."
|
|
73
|
+
- pattern: |
|
|
74
|
+
var $TOKEN = "..."
|
|
75
|
+
- pattern: |
|
|
76
|
+
var $ACCESSKEY = "..."
|
|
77
|
+
- pattern: |
|
|
78
|
+
var $PRIVATEKEY = "..."
|
|
79
|
+
- pattern: |
|
|
80
|
+
var $DSN = "..."
|
|
81
|
+
- pattern: |
|
|
82
|
+
var $CONNSTR = "..."
|
|
83
|
+
metadata:
|
|
84
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
85
|
+
severity: ERROR
|
|
86
|
+
precision: high
|
|
87
|
+
category: hardcoded-credentials
|
|
88
|
+
likelihood: HIGH
|
|
89
|
+
impact: CRITICAL
|
|
90
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
91
|
+
|
|
92
|
+
# ZM-GO-HC-003: 短赋值硬编码凭据
|
|
93
|
+
- id: zm-go-hc-003
|
|
94
|
+
severity: ERROR
|
|
95
|
+
message: |
|
|
96
|
+
检测到短变量声明(:=)中硬编码了凭据字符串。
|
|
97
|
+
常见场景: apiKey := "sk-xxx..." / password := "admin123" 等。
|
|
98
|
+
这些凭据会随Git历史永久留存。
|
|
99
|
+
|
|
100
|
+
修复方案:
|
|
101
|
+
1. 使用 os.Getenv() 从环境变量读取
|
|
102
|
+
2. 使用 viper/koanf 从配置文件读取并排除 .gitignore
|
|
103
|
+
3. 使用密钥管理服务(KMS)动态获取
|
|
104
|
+
languages:
|
|
105
|
+
- go
|
|
106
|
+
pattern-either:
|
|
107
|
+
- pattern: $PASSWORD := "..."
|
|
108
|
+
- pattern: $APIKEY := "..."
|
|
109
|
+
- pattern: $SECRET := "..."
|
|
110
|
+
- pattern: $TOKEN := "..."
|
|
111
|
+
- pattern: $ACCESSKEY := "..."
|
|
112
|
+
- pattern: $PRIVATEKEY := "..."
|
|
113
|
+
- pattern: $DSN := "..."
|
|
114
|
+
- pattern: $CONNSTR := "..."
|
|
115
|
+
metadata:
|
|
116
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
117
|
+
severity: ERROR
|
|
118
|
+
precision: high
|
|
119
|
+
category: hardcoded-credentials
|
|
120
|
+
likelihood: HIGH
|
|
121
|
+
impact: CRITICAL
|
|
122
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
123
|
+
|
|
124
|
+
# ZM-GO-HC-004: 赋值语句硬编码凭据
|
|
125
|
+
- id: zm-go-hc-004
|
|
126
|
+
severity: WARNING
|
|
127
|
+
message: |
|
|
128
|
+
检测到赋值语句中将字面量字符串赋给类凭据变量名。
|
|
129
|
+
包括 db.ConnString / client.Secret / config.Token 等间接凭据暴露。
|
|
130
|
+
|
|
131
|
+
修复方案:
|
|
132
|
+
1. 从外部配置中心/环境变量读取
|
|
133
|
+
2. 使用结构体标签 + viper 绑定配置项
|
|
134
|
+
3. 代码审查确认为测试 mock 数据则标记为误报
|
|
135
|
+
languages:
|
|
136
|
+
- go
|
|
137
|
+
pattern-either:
|
|
138
|
+
- pattern: $OBJ.Password = "..."
|
|
139
|
+
- pattern: $OBJ.ApiKey = "..."
|
|
140
|
+
- pattern: $OBJ.Secret = "..."
|
|
141
|
+
- pattern: $OBJ.Token = "..."
|
|
142
|
+
- pattern: $OBJ.AccessKey = "..."
|
|
143
|
+
- pattern: $OBJ.PrivateKey = "..."
|
|
144
|
+
- pattern: $OBJ.DSN = "..."
|
|
145
|
+
- pattern: $OBJ.ConnString = "..."
|
|
146
|
+
metadata:
|
|
147
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
148
|
+
severity: WARNING
|
|
149
|
+
precision: medium
|
|
150
|
+
category: hardcoded-credentials
|
|
151
|
+
likelihood: MEDIUM
|
|
152
|
+
impact: CRITICAL
|
|
153
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# CWE-89: Go SQL 注入检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: database/sql Query/Exec/QueryRow 字符串拼接构造SQL
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-SQLI-001: db.Query() 字符串拼接SQL注入
|
|
8
|
+
- id: zm-go-sqli-001
|
|
9
|
+
severity: CRITICAL
|
|
10
|
+
message: |
|
|
11
|
+
检测到 database/sql 的 Query() 方法使用了字符串拼接构造SQL语句。
|
|
12
|
+
攻击者可通过用户输入注入恶意SQL(如 UNION SELECT、-- 注释符等),
|
|
13
|
+
绕过认证、窃取数据或破坏数据库。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 使用参数化查询: db.Query("SELECT * FROM users WHERE id = ?", userID)
|
|
17
|
+
2. 禁止使用字符串拼接构造SQL(+、fmt.Sprintf)
|
|
18
|
+
3. 对表名/列名等动态标识符使用白名单校验
|
|
19
|
+
4. 参考 OWASP SQL 注入防御指南
|
|
20
|
+
languages:
|
|
21
|
+
- go
|
|
22
|
+
pattern-either:
|
|
23
|
+
- pattern: $DB.Query($SQL + $VAR)
|
|
24
|
+
- pattern: $DB.Query($VAR + $SQL)
|
|
25
|
+
- pattern: $DB.Query(fmt.Sprintf(...))
|
|
26
|
+
metadata:
|
|
27
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
|
|
28
|
+
severity: CRITICAL
|
|
29
|
+
precision: high
|
|
30
|
+
category: sql-injection
|
|
31
|
+
likelihood: HIGH
|
|
32
|
+
impact: CRITICAL
|
|
33
|
+
owasp: "A03:2021 - Injection"
|
|
34
|
+
references:
|
|
35
|
+
- "https://go.dev/doc/database/sql-injection"
|
|
36
|
+
- "https://owasp.org/www-community/attacks/SQL_Injection"
|
|
37
|
+
|
|
38
|
+
# ZM-GO-SQLI-002: db.Exec() 字符串拼接SQL注入
|
|
39
|
+
- id: zm-go-sqli-002
|
|
40
|
+
severity: CRITICAL
|
|
41
|
+
message: |
|
|
42
|
+
检测到 database/sql 的 Exec() 方法使用了字符串拼接或 fmt.Sprintf
|
|
43
|
+
构造SQL语句。Exec 常用于 INSERT/UPDATE/DELETE,注入可能造成数据
|
|
44
|
+
被篡改或删除。
|
|
45
|
+
|
|
46
|
+
修复方案:
|
|
47
|
+
1. 使用参数化查询: db.Exec("UPDATE users SET name = ? WHERE id = ?", name, id)
|
|
48
|
+
2. 禁止将变量直接拼入SQL字符串
|
|
49
|
+
3. 使用 ORM 框架(GORM/Ent)的内置安全查询方法
|
|
50
|
+
languages:
|
|
51
|
+
- go
|
|
52
|
+
pattern-either:
|
|
53
|
+
- pattern: $DB.Exec($SQL + $VAR)
|
|
54
|
+
- pattern: $DB.Exec($VAR + $SQL)
|
|
55
|
+
- pattern: $DB.Exec(fmt.Sprintf(...))
|
|
56
|
+
metadata:
|
|
57
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
|
|
58
|
+
severity: CRITICAL
|
|
59
|
+
precision: high
|
|
60
|
+
category: sql-injection
|
|
61
|
+
likelihood: HIGH
|
|
62
|
+
impact: CRITICAL
|
|
63
|
+
owasp: "A03:2021 - Injection"
|
|
64
|
+
|
|
65
|
+
# ZM-GO-SQLI-003: db.QueryRow() 字符串拼接SQL注入
|
|
66
|
+
- id: zm-go-sqli-003
|
|
67
|
+
severity: CRITICAL
|
|
68
|
+
message: |
|
|
69
|
+
检测到 database/sql 的 QueryRow() 方法使用了字符串拼接构造SQL。
|
|
70
|
+
QueryRow 用于单行查询场景(如登录认证),注入可直接绕过认证。
|
|
71
|
+
|
|
72
|
+
修复方案:
|
|
73
|
+
1. db.QueryRow("SELECT * FROM users WHERE id = ?", userID)
|
|
74
|
+
2. 使用命名参数: sql.Named("id", userID)
|
|
75
|
+
3. 对动态排序/分组字段做白名单映射
|
|
76
|
+
languages:
|
|
77
|
+
- go
|
|
78
|
+
pattern-either:
|
|
79
|
+
- pattern: $DB.QueryRow($SQL + $VAR)
|
|
80
|
+
- pattern: $DB.QueryRow($VAR + $SQL)
|
|
81
|
+
- pattern: $DB.QueryRow(fmt.Sprintf(...))
|
|
82
|
+
metadata:
|
|
83
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
|
|
84
|
+
severity: CRITICAL
|
|
85
|
+
precision: high
|
|
86
|
+
category: sql-injection
|
|
87
|
+
likelihood: HIGH
|
|
88
|
+
impact: CRITICAL
|
|
89
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# CWE-918: Go SSRF 深度检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Go 规则库
|
|
3
|
+
# 覆盖: http.Get(userInput)/http.Post/httputil.ReverseProxy/c.Param→http.Get
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-SSRF-001: net/http Get/Post/Head 用户输入URL
|
|
8
|
+
- id: zm-go-ssrf-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 net/http 客户端函数(http.Get / http.Post / http.Head / http.NewRequest)的URL参数
|
|
12
|
+
由用户输入(HTTP请求参数)控制,存在SSRF(服务端请求伪造)风险。
|
|
13
|
+
攻击者可控制目标URL使服务器发起对内网服务的恶意请求,绕过防火墙访问内部资源
|
|
14
|
+
(如 http://169.254.169.254/latest/meta-data/ 获取云环境元数据)。
|
|
15
|
+
|
|
16
|
+
修复方案:
|
|
17
|
+
1. 对用户传入的URL做白名单校验,仅允许预设的外部域名
|
|
18
|
+
2. 使用 url.Parse() 解析后校验 hostname 白名单
|
|
19
|
+
3. 解析DNS后校验目标IP是否在内网地址段
|
|
20
|
+
4. 配置防火墙禁止服务器访问内网地址(169.254.0.0/16, 10.0.0.0/8, 127.0.0.0/8等)
|
|
21
|
+
5. 禁用不必要的HTTP重定向跟踪
|
|
22
|
+
languages:
|
|
23
|
+
- go
|
|
24
|
+
pattern-either:
|
|
25
|
+
- pattern: http.Get($PARAM)
|
|
26
|
+
- pattern: http.Post($PARAM, $CONTENT, $BODY)
|
|
27
|
+
- pattern: http.Head($PARAM)
|
|
28
|
+
- pattern: http.NewRequest($METHOD, $PARAM, $BODY)
|
|
29
|
+
- pattern: http.NewRequestWithContext($CTX, $METHOD, $PARAM, $BODY)
|
|
30
|
+
metadata:
|
|
31
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
32
|
+
severity: ERROR
|
|
33
|
+
precision: medium
|
|
34
|
+
category: ssrf
|
|
35
|
+
likelihood: HIGH
|
|
36
|
+
impact: HIGH
|
|
37
|
+
owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
|
|
38
|
+
references:
|
|
39
|
+
- "https://pkg.go.dev/net/http"
|
|
40
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html"
|
|
41
|
+
|
|
42
|
+
# ZM-GO-SSRF-002: Gin c.Param / c.Query 直传HTTP客户端
|
|
43
|
+
- id: zm-go-ssrf-002
|
|
44
|
+
severity: ERROR
|
|
45
|
+
message: |
|
|
46
|
+
检测到 Gin 框架的 c.Param / c.Query / c.PostForm 返回值直接作为HTTP客户端请求URL。
|
|
47
|
+
攻击者可通过控制URL参数发起SSRF攻击。
|
|
48
|
+
|
|
49
|
+
典型的危险模式:
|
|
50
|
+
func handler(c *gin.Context) {
|
|
51
|
+
url := c.Query("url")
|
|
52
|
+
resp, _ := http.Get(url) // ← SSRF
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
修复方案:
|
|
56
|
+
1. 使用URL白名单映射替代用户直接输入URL
|
|
57
|
+
2. 解析URL后校验hostname白名单
|
|
58
|
+
3. 使用 http.NewRequest 后设置自定义 Dialer 过滤内网IP
|
|
59
|
+
4. 禁止用户控制完整URL,仅允许选择预定义的端点
|
|
60
|
+
languages:
|
|
61
|
+
- go
|
|
62
|
+
pattern-either:
|
|
63
|
+
- pattern: http.Get(c.Param($KEY))
|
|
64
|
+
- pattern: http.Get(c.Query($KEY))
|
|
65
|
+
- pattern: http.Post(c.Param($KEY), $TYPE, $BODY)
|
|
66
|
+
- pattern: http.Post(c.Query($KEY), $TYPE, $BODY)
|
|
67
|
+
- pattern: http.NewRequest($METHOD, c.Param($KEY), $BODY)
|
|
68
|
+
- pattern: http.NewRequest($METHOD, c.Query($KEY), $BODY)
|
|
69
|
+
- pattern: http.NewRequestWithContext($CTX, $METHOD, c.Param($KEY), $BODY)
|
|
70
|
+
- pattern: http.NewRequestWithContext($CTX, $METHOD, c.Query($KEY), $BODY)
|
|
71
|
+
- pattern: http.Head(c.Query($KEY))
|
|
72
|
+
metadata:
|
|
73
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
74
|
+
severity: ERROR
|
|
75
|
+
precision: high
|
|
76
|
+
category: ssrf
|
|
77
|
+
likelihood: HIGH
|
|
78
|
+
impact: HIGH
|
|
79
|
+
owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
|
|
80
|
+
references:
|
|
81
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html"
|
|
82
|
+
|
|
83
|
+
# ZM-GO-SSRF-003: httputil.ReverseProxy 用户可控目标
|
|
84
|
+
- id: zm-go-ssrf-003
|
|
85
|
+
severity: ERROR
|
|
86
|
+
message: |
|
|
87
|
+
检测到 httputil.ReverseProxy 的 Director 函数中 URL 由用户输入控制。
|
|
88
|
+
攻击者可控制反向代理的目标地址,将请求转发到内网服务。
|
|
89
|
+
|
|
90
|
+
典型的危险模式:
|
|
91
|
+
func handler(c *gin.Context) {
|
|
92
|
+
target := c.Query("target")
|
|
93
|
+
url, _ := url.Parse(target)
|
|
94
|
+
proxy := httputil.NewSingleHostReverseProxy(url)
|
|
95
|
+
proxy.ServeHTTP(c.Writer, c.Request)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
修复方案:
|
|
99
|
+
1. 使用固定的反向代理目标白名单
|
|
100
|
+
2. 禁止用户输入决定代理目标
|
|
101
|
+
3. 如需动态路由,使用预定义的 target 映射表(按 path 或 header)
|
|
102
|
+
4. 修改 Director 前校验目标 URL 的白名单
|
|
103
|
+
languages:
|
|
104
|
+
- go
|
|
105
|
+
pattern-either:
|
|
106
|
+
- pattern: httputil.NewSingleHostReverseProxy(url.Parse($INPUT))
|
|
107
|
+
- pattern: httputil.ReverseProxy{...}
|
|
108
|
+
metadata:
|
|
109
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
110
|
+
severity: ERROR
|
|
111
|
+
precision: medium
|
|
112
|
+
category: ssrf
|
|
113
|
+
likelihood: HIGH
|
|
114
|
+
impact: HIGH
|
|
115
|
+
owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
|
|
116
|
+
references:
|
|
117
|
+
- "https://pkg.go.dev/net/http/httputil#ReverseProxy"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# CWE-117: Log Injection — deeper patterns beyond basic log-forging
|
|
2
|
+
# ZhuMa V4.1 — complement zm-java-cwe117-logforging.yaml
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-LOG-DEEP-001: MDC.put() with user input (log tampering)
|
|
7
|
+
- id: zm-java-log-deep-001
|
|
8
|
+
severity: WARNING
|
|
9
|
+
message: |
|
|
10
|
+
MDC.put() receives raw HTTP parameter — attacker injects CRLF into structured log context.
|
|
11
|
+
This pollutes all subsequent log entries in the thread with attacker-controlled values.
|
|
12
|
+
Fix: sanitize user input before MDC.put(): strip \r \n and limit value length.
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
MDC.put($KEY, $REQ.getParameter(...))
|
|
18
|
+
- pattern: |
|
|
19
|
+
MDC.put($KEY, $REQ.getHeader(...))
|
|
20
|
+
- pattern: |
|
|
21
|
+
org.slf4j.MDC.put($KEY, $REQ.getParameter(...))
|
|
22
|
+
metadata:
|
|
23
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
24
|
+
severity: WARNING
|
|
25
|
+
precision: high
|
|
26
|
+
category: log-injection
|
|
27
|
+
likelihood: HIGH
|
|
28
|
+
impact: LOW
|
|
29
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
30
|
+
|
|
31
|
+
# ZM-JAVA-LOG-DEEP-002: User input concatenated inside log message string
|
|
32
|
+
- id: zm-java-log-deep-002
|
|
33
|
+
severity: WARNING
|
|
34
|
+
message: |
|
|
35
|
+
String concatenation with user input inside log method argument — CRLF log injection.
|
|
36
|
+
Even if not directly at log call, the concatenated string with \r\n can forge log entries.
|
|
37
|
+
Fix: use parameterized logging: log.info("user={}", request.getParameter("user")).
|
|
38
|
+
languages:
|
|
39
|
+
- java
|
|
40
|
+
pattern-either:
|
|
41
|
+
- pattern: |
|
|
42
|
+
log.info($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
43
|
+
- pattern: |
|
|
44
|
+
log.warn($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
45
|
+
- pattern: |
|
|
46
|
+
log.error($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
47
|
+
- pattern: |
|
|
48
|
+
LOGGER.info($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
49
|
+
- pattern: |
|
|
50
|
+
LOGGER.warn($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
51
|
+
- pattern: |
|
|
52
|
+
LOGGER.error($PREFIX + $REQ.getParameter(...) + $SUFFIX)
|
|
53
|
+
metadata:
|
|
54
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
55
|
+
severity: WARNING
|
|
56
|
+
precision: medium
|
|
57
|
+
category: log-injection
|
|
58
|
+
likelihood: HIGH
|
|
59
|
+
impact: LOW
|
|
60
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
61
|
+
|
|
62
|
+
# ZM-JAVA-LOG-DEEP-003: Log4j2 MessageFactory/StructuredDataMessage with user input
|
|
63
|
+
- id: zm-java-log-deep-003
|
|
64
|
+
severity: WARNING
|
|
65
|
+
message: |
|
|
66
|
+
Log4j2 structured logging message contains user-supplied data without sanitization.
|
|
67
|
+
Attackers may inject forged log levels, timestamps, or structured fields via CRLF in user input.
|
|
68
|
+
Fix: sanitize user input to remove \r \n \t before inclusion in structured log messages.
|
|
69
|
+
languages:
|
|
70
|
+
- java
|
|
71
|
+
pattern-either:
|
|
72
|
+
- pattern: |
|
|
73
|
+
logger.printf($LEVEL, $FMT, $REQ.getParameter(...))
|
|
74
|
+
- pattern: |
|
|
75
|
+
logger.log($LEVEL, $REQ.getParameter(...))
|
|
76
|
+
metadata:
|
|
77
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
78
|
+
severity: WARNING
|
|
79
|
+
precision: medium
|
|
80
|
+
category: log-injection
|
|
81
|
+
likelihood: MEDIUM
|
|
82
|
+
impact: LOW
|
|
83
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# CWE-117: 日志注入 (Log Forging) 检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — 通用规则库
|
|
3
|
+
# 检测: log.info/warn/error() 参数含 request.getParameter() 未经 sanitize
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JAVA-LF-001: Log4j/SLF4J 日志直接输出用户输入
|
|
8
|
+
- id: zm-java-lf-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到日志方法(log.info/warn/error/debug)直接输出 HTTP 请求参数,未经任何清洗处理。
|
|
12
|
+
攻击者可构造包含换行符 (CRLF: %0d%0a) 的输入,注入伪造的日志条目或污染日志分析系统。
|
|
13
|
+
日志注入攻击可导致:
|
|
14
|
+
- 伪造日志记录,干扰攻击溯源
|
|
15
|
+
- 注入恶意日志条目误导安全监控
|
|
16
|
+
- 在 Log4j2 中触发 JNDI 查找(Log4Shell, CVE-2021-44228)
|
|
17
|
+
修复方案:
|
|
18
|
+
1. 对用户输入进行换行符过滤: input.replaceAll("[\\r\\n]", "_")
|
|
19
|
+
2. 使用日志框架的参数化占位符(如 log.info("user={}", sanitizedInput))
|
|
20
|
+
3. 实现自定义日志 Appender 过滤 CRLF 字符
|
|
21
|
+
4. 限制日志字段长度,防止日志膨胀
|
|
22
|
+
languages:
|
|
23
|
+
- java
|
|
24
|
+
pattern-either:
|
|
25
|
+
- pattern: |
|
|
26
|
+
log.info($REQ.getParameter(...))
|
|
27
|
+
- pattern: |
|
|
28
|
+
log.warn($REQ.getParameter(...))
|
|
29
|
+
- pattern: |
|
|
30
|
+
log.error($REQ.getParameter(...))
|
|
31
|
+
- pattern: |
|
|
32
|
+
log.debug($REQ.getParameter(...))
|
|
33
|
+
- pattern: |
|
|
34
|
+
LOG.info($REQ.getParameter(...))
|
|
35
|
+
- pattern: |
|
|
36
|
+
LOG.warn($REQ.getParameter(...))
|
|
37
|
+
- pattern: |
|
|
38
|
+
LOG.error($REQ.getParameter(...))
|
|
39
|
+
- pattern: |
|
|
40
|
+
LOG.debug($REQ.getParameter(...))
|
|
41
|
+
- pattern: |
|
|
42
|
+
logger.info($REQ.getParameter(...))
|
|
43
|
+
- pattern: |
|
|
44
|
+
logger.warn($REQ.getParameter(...))
|
|
45
|
+
- pattern: |
|
|
46
|
+
logger.error($REQ.getParameter(...))
|
|
47
|
+
- pattern: |
|
|
48
|
+
logger.debug($REQ.getParameter(...))
|
|
49
|
+
- pattern: |
|
|
50
|
+
LOGGER.info($REQ.getParameter(...))
|
|
51
|
+
- pattern: |
|
|
52
|
+
LOGGER.warn($REQ.getParameter(...))
|
|
53
|
+
- pattern: |
|
|
54
|
+
LOGGER.error($REQ.getParameter(...))
|
|
55
|
+
- pattern: |
|
|
56
|
+
LOGGER.debug($REQ.getParameter(...))
|
|
57
|
+
metadata:
|
|
58
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
59
|
+
severity: WARNING
|
|
60
|
+
precision: high
|
|
61
|
+
category: data-exposure
|
|
62
|
+
likelihood: HIGH
|
|
63
|
+
impact: MEDIUM
|
|
64
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
65
|
+
references:
|
|
66
|
+
- "https://cwe.mitre.org/data/definitions/117.html"
|
|
67
|
+
- "https://owasp.org/www-community/attacks/Log_Injection"
|
|
68
|
+
|
|
69
|
+
# ZM-JAVA-LF-002: 日志拼接用户输入 (CRLF 注入)
|
|
70
|
+
- id: zm-java-lf-002
|
|
71
|
+
severity: WARNING
|
|
72
|
+
message: |
|
|
73
|
+
检测到日志方法参数中拼接了 HTTP 请求参数。攻击者可在参数值中注入换行符 (%0d%0a)
|
|
74
|
+
来伪造日志条目,污染日志完整性。
|
|
75
|
+
修复方案:
|
|
76
|
+
1. 使用参数化日志: log.info("user input: {}", request.getParameter("name"))
|
|
77
|
+
2. 或先对输入做 CRLF 过滤: input.replace("\r", "").replace("\n", "")
|
|
78
|
+
3. 在日志 Appender 层统一过滤特殊字符
|
|
79
|
+
languages:
|
|
80
|
+
- java
|
|
81
|
+
pattern-either:
|
|
82
|
+
- pattern: |
|
|
83
|
+
log.info(... + $REQ.getParameter(...) + ...)
|
|
84
|
+
- pattern: |
|
|
85
|
+
log.warn(... + $REQ.getParameter(...) + ...)
|
|
86
|
+
- pattern: |
|
|
87
|
+
log.error(... + $REQ.getParameter(...) + ...)
|
|
88
|
+
- pattern: |
|
|
89
|
+
log.debug(... + $REQ.getParameter(...) + ...)
|
|
90
|
+
metadata:
|
|
91
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
92
|
+
severity: WARNING
|
|
93
|
+
precision: medium
|
|
94
|
+
category: data-exposure
|
|
95
|
+
likelihood: HIGH
|
|
96
|
+
impact: MEDIUM
|
|
97
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
98
|
+
|
|
99
|
+
# ZM-JAVA-LF-003: System.out/err 直接输出用户输入
|
|
100
|
+
- id: zm-java-lf-003
|
|
101
|
+
severity: WARNING
|
|
102
|
+
message: |
|
|
103
|
+
检测到 System.out.println() 或 System.err.println() 直接输出 HTTP 请求参数。
|
|
104
|
+
虽然控制台输出不一定构成日志注入,但若输出被重定向到日志文件,可被利用进行日志伪造。
|
|
105
|
+
修复方案:
|
|
106
|
+
1. 避免在生产环境使用 System.out.println()
|
|
107
|
+
2. 使用规范的日志框架(SLF4J/Log4j2)
|
|
108
|
+
3. 对输出内容进行 sanitize
|
|
109
|
+
languages:
|
|
110
|
+
- java
|
|
111
|
+
pattern-either:
|
|
112
|
+
- pattern: |
|
|
113
|
+
System.out.println($REQ.getParameter(...))
|
|
114
|
+
- pattern: |
|
|
115
|
+
System.err.println($REQ.getParameter(...))
|
|
116
|
+
- pattern: |
|
|
117
|
+
System.out.print($REQ.getParameter(...))
|
|
118
|
+
- pattern: |
|
|
119
|
+
System.err.print($REQ.getParameter(...))
|
|
120
|
+
metadata:
|
|
121
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
122
|
+
severity: WARNING
|
|
123
|
+
precision: high
|
|
124
|
+
category: data-exposure
|
|
125
|
+
likelihood: HIGH
|
|
126
|
+
impact: LOW
|
|
127
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
128
|
+
|
|
129
|
+
# ZM-JAVA-LF-004: e.printStackTrace() 泄露敏感信息
|
|
130
|
+
- id: zm-java-lf-004
|
|
131
|
+
severity: WARNING
|
|
132
|
+
message: |
|
|
133
|
+
检测到 e.printStackTrace() 调用。printStackTrace() 会将完整堆栈(含敏感类路径、方法名、
|
|
134
|
+
内部逻辑)输出到 stderr,若未妥善处理可能泄露到客户端或日志,被攻击者利用。
|
|
135
|
+
修复方案:
|
|
136
|
+
1. 使用 log.error("error message", e) 替代 printStackTrace()
|
|
137
|
+
2. 确保日志系统不将堆栈信息返回给客户端
|
|
138
|
+
3. 在生产环境使用统一的异常处理机制(@ControllerAdvice)
|
|
139
|
+
languages:
|
|
140
|
+
- java
|
|
141
|
+
pattern-either:
|
|
142
|
+
- pattern: |
|
|
143
|
+
$E.printStackTrace()
|
|
144
|
+
- pattern: |
|
|
145
|
+
$E.printStackTrace(...);
|
|
146
|
+
metadata:
|
|
147
|
+
cwe: "CWE-117: Improper Output Neutralization for Logs"
|
|
148
|
+
severity: WARNING
|
|
149
|
+
precision: very-high
|
|
150
|
+
category: data-exposure
|
|
151
|
+
likelihood: HIGH
|
|
152
|
+
impact: LOW
|
|
153
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# CWE-200: Spring Boot Actuator 敏感端点暴露
|
|
2
|
+
rules:
|
|
3
|
+
- id: zm-java-act-02
|
|
4
|
+
severity: WARNING
|
|
5
|
+
message: SecurityConfig permits all Actuator endpoints - /actuator/env /actuator/heapdump externally accessible.
|
|
6
|
+
languages: [java]
|
|
7
|
+
pattern: EndpointRequest.toAnyEndpoint().permitAll()
|
|
8
|
+
metadata: { cwe: "CWE-200", precision: very-high, category: config, owasp: "A05:2021" }
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# CWE-200 信息泄露深度覆盖 (v2): 敏感配置、调试端点、Stacktrace暴露
|
|
2
|
+
|
|
3
|
+
rules:
|
|
4
|
+
|
|
5
|
+
# ZM-JAVA-STACKTRACE-001: 未捕获异常直接输出到HTTP响应
|
|
6
|
+
- id: zm-java-stacktrace-001
|
|
7
|
+
severity: MEDIUM
|
|
8
|
+
message: |
|
|
9
|
+
e.printStackTrace() 输出到 System.err,而 Spring Boot 默认将 stderr 路由到 HTTP 响应体。
|
|
10
|
+
替换为结构化日志(SLF4J)并只返回通用错误消息。
|
|
11
|
+
languages:
|
|
12
|
+
- java
|
|
13
|
+
pattern-either:
|
|
14
|
+
- pattern: $E.printStackTrace();
|
|
15
|
+
- pattern: $E.printStackTrace($WRITER);
|
|
16
|
+
metadata:
|
|
17
|
+
cwe: "CWE-200: Exposure of Sensitive Information Through Stack Trace"
|
|
18
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
19
|
+
precision: high
|
|
20
|
+
tags: [info-disclosure, stacktrace, error-handling]
|
|
21
|
+
|
|
22
|
+
# ZM-JAVA-CONSOLE-001: System.out/System.err 直接输出敏感变量
|
|
23
|
+
- id: zm-java-console-001
|
|
24
|
+
severity: LOW
|
|
25
|
+
message: |
|
|
26
|
+
System.out/err 在控制器中使用——通常用于调试(密码/令牌/token 关键词)。
|
|
27
|
+
生产环境应使用 SLF4J/Logback 的级别过滤。
|
|
28
|
+
languages:
|
|
29
|
+
- java
|
|
30
|
+
pattern-either:
|
|
31
|
+
- pattern: System.out.println($X);
|
|
32
|
+
- pattern: System.err.println($X);
|
|
33
|
+
metadata:
|
|
34
|
+
cwe: "CWE-200: Exposure of Sensitive Information"
|
|
35
|
+
owasp: "A09:2021 - Security Logging and Monitoring Failures"
|
|
36
|
+
precision: low
|
|
37
|
+
tags: [info-disclosure, console, debug]
|
|
38
|
+
|
|
39
|
+
# ZM-JAVA-SPRING-DEVTOOLS-001: Spring DevTools 远程调试在生产环境启用
|
|
40
|
+
- id: zm-java-devtools-001
|
|
41
|
+
severity: HIGH
|
|
42
|
+
message: |
|
|
43
|
+
spring-boot-devtools 在生产 classpath 中——Remote Restart 可被利用执行任意代码。
|
|
44
|
+
移除生产环境的 devtools 依赖或设置 `spring.devtools.remote.enabled=false`。
|
|
45
|
+
languages:
|
|
46
|
+
- java
|
|
47
|
+
pattern: |
|
|
48
|
+
import org.springframework.boot.devtools.$X;
|
|
49
|
+
metadata:
|
|
50
|
+
cwe: "CWE-200: Exposure of Sensitive Information"
|
|
51
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
52
|
+
precision: very-high
|
|
53
|
+
tags: [info-disclosure, devtools, rce]
|
|
54
|
+
|
|
55
|
+
# ZM-JAVA-ERROR-PAGE-001: 自定义错误页面中泄露内部路径/类名
|
|
56
|
+
- id: zm-java-error-page-001
|
|
57
|
+
severity: LOW
|
|
58
|
+
message: |
|
|
59
|
+
ResponseEntity 构造中可能包含 `e.getMessage()` — 泄露内部类名/路径。
|
|
60
|
+
生产环境返回通用错误消息 `"Internal Server Error"` 而非异常消息。
|
|
61
|
+
languages:
|
|
62
|
+
- java
|
|
63
|
+
pattern-either:
|
|
64
|
+
- pattern: |
|
|
65
|
+
return ResponseEntity.status(500).body($E.getMessage());
|
|
66
|
+
- pattern: |
|
|
67
|
+
ResponseEntity.status($CODE).body($E.getMessage())
|
|
68
|
+
metadata:
|
|
69
|
+
cwe: "CWE-200: Exposure of Sensitive Information"
|
|
70
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
71
|
+
precision: medium
|
|
72
|
+
tags: [info-disclosure, error-page, spring-boot]
|
|
73
|
+
|
|
74
|
+
# ZM-JAVA-CORS-WILDCARD: CORS Access-Control-Allow-Origin 为 * + credentials
|
|
75
|
+
- id: zm-java-cors-wildcard-001
|
|
76
|
+
severity: MEDIUM
|
|
77
|
+
message: |
|
|
78
|
+
CORS origin 为 "*" 且 allowCredentials=true——违反 W3C CORS 规范,
|
|
79
|
+
浏览器将拒绝该响应,配置无效。改为显式列出受信任 origin。
|
|
80
|
+
languages:
|
|
81
|
+
- java
|
|
82
|
+
pattern-either:
|
|
83
|
+
- pattern: |
|
|
84
|
+
@CrossOrigin(origins = "*")
|
|
85
|
+
- pattern: |
|
|
86
|
+
@CrossOrigin(origins = {"*"})
|
|
87
|
+
metadata:
|
|
88
|
+
cwe: "CWE-200: Exposure of Sensitive Information"
|
|
89
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
90
|
+
precision: very-high
|
|
91
|
+
tags: [cors, misconfiguration]
|