@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,152 @@
|
|
|
1
|
+
# CWE-327: Go 弱密码模式检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: AES-CBC无认证、ECB模式、CTR无认证、Cipher裸用
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-WEAKCIPHER-001: AES-CBC 无认证加密
|
|
8
|
+
- id: zm-go-weakcipher-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到使用 cipher.NewCBCEncrypter / NewCBCDecrypter 进行CBC模式加密。
|
|
12
|
+
CBC模式仅提供机密性,不提供完整性/认证保护。攻击者可修改密文
|
|
13
|
+
并通过padding oracle攻击恢复明文(如Lucky13、POODLE攻击)。
|
|
14
|
+
CBC模式不满足现代AEAD(认证加密)安全要求。
|
|
15
|
+
|
|
16
|
+
修复方案:
|
|
17
|
+
1. 使用 AES-GCM: cipher.NewGCM() — 内置认证+加密
|
|
18
|
+
gcm, _ := cipher.NewGCM(block)
|
|
19
|
+
ciphertext := gcm.Seal(nil, nonce, plaintext, aad)
|
|
20
|
+
2. 或使用 golang.org/x/crypto/nacl/secretbox (XSalsa20-Poly1305)
|
|
21
|
+
3. 若必须使用CBC,必须配合HMAC-SHA256做 Encrypt-then-MAC:
|
|
22
|
+
ciphertext = iv + enc(plaintext)
|
|
23
|
+
mac = HMAC-SHA256(ciphertext)
|
|
24
|
+
最终输出: ciphertext + mac
|
|
25
|
+
languages:
|
|
26
|
+
- go
|
|
27
|
+
pattern-either:
|
|
28
|
+
- pattern: cipher.NewCBCEncrypter($BLOCK, $IV)
|
|
29
|
+
- pattern: cipher.NewCBCDecrypter($BLOCK, $IV)
|
|
30
|
+
metadata:
|
|
31
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
32
|
+
severity: WARNING
|
|
33
|
+
precision: very-high
|
|
34
|
+
category: crypto
|
|
35
|
+
likelihood: HIGH
|
|
36
|
+
impact: HIGH
|
|
37
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
38
|
+
references:
|
|
39
|
+
- "https://pkg.go.dev/crypto/cipher#NewGCM"
|
|
40
|
+
- "https://en.wikipedia.org/wiki/Padding_oracle_attack"
|
|
41
|
+
|
|
42
|
+
# ZM-GO-WEAKCIPHER-002: ECB模式加密
|
|
43
|
+
- id: zm-go-weakcipher-002
|
|
44
|
+
severity: WARNING
|
|
45
|
+
message: |
|
|
46
|
+
检测到使用 ECB(电子密码本)模式加密。Go标准库不提供ECB实现,
|
|
47
|
+
此检测匹配第三方库或自定义ECB实现。
|
|
48
|
+
ECB模式会产生确定性密文——相同明文块产生相同密文块,
|
|
49
|
+
无法隐藏数据模式,攻击者可从密文中直接识别重复数据。
|
|
50
|
+
|
|
51
|
+
修复方案:
|
|
52
|
+
1. 使用 AES-GCM (cipher.NewGCM) 替代任何ECB实现
|
|
53
|
+
2. AES-GCM 提供: 机密性 + 完整性 + 认证 + 随机IV
|
|
54
|
+
3. 绝对禁止在任何安全敏感场景使用ECB
|
|
55
|
+
4. 参考 NIST SP 800-38A 了解分组密码模式安全特性
|
|
56
|
+
languages:
|
|
57
|
+
- go
|
|
58
|
+
pattern-either:
|
|
59
|
+
- pattern: NewECBEncrypter($BLOCK)
|
|
60
|
+
- pattern: NewECBDecrypter($BLOCK)
|
|
61
|
+
- pattern: ecb.NewEncrypter($BLOCK)
|
|
62
|
+
- pattern: ecb.NewDecrypter($BLOCK)
|
|
63
|
+
metadata:
|
|
64
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
65
|
+
severity: WARNING
|
|
66
|
+
precision: very-high
|
|
67
|
+
category: crypto
|
|
68
|
+
likelihood: MEDIUM
|
|
69
|
+
impact: HIGH
|
|
70
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
71
|
+
references:
|
|
72
|
+
- "https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#ECB"
|
|
73
|
+
|
|
74
|
+
# ZM-GO-WEAKCIPHER-003: AES-CTR 无认证加密
|
|
75
|
+
- id: zm-go-weakcipher-003
|
|
76
|
+
severity: WARNING
|
|
77
|
+
message: |
|
|
78
|
+
检测到使用 cipher.NewCTR() 进行CTR模式加密。
|
|
79
|
+
CTR模式本身仅提供机密性,不提供完整性保护。
|
|
80
|
+
攻击者可对密文进行比特翻转修改明文,且无MAC无法检测篡改。
|
|
81
|
+
|
|
82
|
+
修复方案:
|
|
83
|
+
1. 使用 AES-GCM 替代 CTR 模式
|
|
84
|
+
2. 或使用 Golang 支持的 AEAD 接口: cipher.NewGCM / chacha20poly1305
|
|
85
|
+
3. 若必须用CTR,配合 HMAC-SHA256 实现 Encrypt-then-MAC 认证
|
|
86
|
+
languages:
|
|
87
|
+
- go
|
|
88
|
+
pattern-either:
|
|
89
|
+
- pattern: cipher.NewCTR($BLOCK, $IV)
|
|
90
|
+
metadata:
|
|
91
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
92
|
+
severity: WARNING
|
|
93
|
+
precision: very-high
|
|
94
|
+
category: crypto
|
|
95
|
+
likelihood: HIGH
|
|
96
|
+
impact: HIGH
|
|
97
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
98
|
+
|
|
99
|
+
# ZM-GO-WEAKCIPHER-004: Cipher 裸用(无模式加密)
|
|
100
|
+
- id: zm-go-weakcipher-004
|
|
101
|
+
severity: WARNING
|
|
102
|
+
message: |
|
|
103
|
+
检测到 cipher.Block 接口的 Encrypt/Decrypt 方法直接调用,
|
|
104
|
+
未通过任何分组密码模式包装。裸 Block 仅加密单个16字节块,
|
|
105
|
+
无法处理任意长度数据,且无认证和IV。
|
|
106
|
+
|
|
107
|
+
修复方案:
|
|
108
|
+
1. 始终通过 cipher.NewGCM(block) 等模式包装后使用
|
|
109
|
+
2. 绝对禁止直接调用 block.Encrypt / block.Decrypt 处理业务数据
|
|
110
|
+
3. 正确模式: gcm, _ := cipher.NewGCM(block); gcm.Seal(...)
|
|
111
|
+
languages:
|
|
112
|
+
- go
|
|
113
|
+
pattern-either:
|
|
114
|
+
- pattern: $BLOCK.Encrypt($DST, $SRC)
|
|
115
|
+
- pattern: $BLOCK.Decrypt($DST, $SRC)
|
|
116
|
+
metadata:
|
|
117
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
118
|
+
severity: WARNING
|
|
119
|
+
precision: very-high
|
|
120
|
+
category: crypto
|
|
121
|
+
likelihood: HIGH
|
|
122
|
+
impact: HIGH
|
|
123
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
124
|
+
references:
|
|
125
|
+
- "https://pkg.go.dev/crypto/cipher#Block"
|
|
126
|
+
|
|
127
|
+
# ZM-GO-WEAKCIPHER-005: CFB/OFB 无认证
|
|
128
|
+
- id: zm-go-weakcipher-005
|
|
129
|
+
severity: WARNING
|
|
130
|
+
message: |
|
|
131
|
+
检测到使用 cipher.NewCFBEncrypter / NewOFB 流模式。
|
|
132
|
+
CFB/OFB仅提供机密性,不提供认证保护。不应在现代系统中单独使用。
|
|
133
|
+
OFB模式虽比特翻转影响有限,但仍缺少完整性校验。
|
|
134
|
+
|
|
135
|
+
修复方案:
|
|
136
|
+
1. 使用 cipher.NewGCM() — AEAD 是唯一推荐的新增代码加密模式
|
|
137
|
+
2. 若需流加密,使用 ChaCha20-Poly1305
|
|
138
|
+
3. 旧系统迁移计划加入HMAC认证
|
|
139
|
+
languages:
|
|
140
|
+
- go
|
|
141
|
+
pattern-either:
|
|
142
|
+
- pattern: cipher.NewCFBEncrypter($BLOCK, $IV)
|
|
143
|
+
- pattern: cipher.NewCFBDecrypter($BLOCK, $IV)
|
|
144
|
+
- pattern: cipher.NewOFB($BLOCK, $IV)
|
|
145
|
+
metadata:
|
|
146
|
+
cwe: "CWE-327: Use of a Broken or Risky Cryptographic Algorithm"
|
|
147
|
+
severity: WARNING
|
|
148
|
+
precision: very-high
|
|
149
|
+
category: crypto
|
|
150
|
+
likelihood: MEDIUM
|
|
151
|
+
impact: HIGH
|
|
152
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# CWE-384: Go/Gin 会话固定检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Go 规则库
|
|
3
|
+
# 覆盖: Gin/gorilla session未regenerate、cookie未secure/httpOnly
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-SF-001: Gorilla Sessions 登录后未替换会话ID
|
|
8
|
+
- id: zm-go-sf-001
|
|
9
|
+
severity: HIGH
|
|
10
|
+
message: |
|
|
11
|
+
检测到 gorilla/sessions 在登录/认证成功后未创建新会话或未调用 session.Save() 前
|
|
12
|
+
未设置新的 session ID。
|
|
13
|
+
攻击者可通过固定会话攻击(Session Fixation)劫持已验证用户会话。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 登录成功后创建全新会话:
|
|
17
|
+
session, _ := store.New(r, "session-name")
|
|
18
|
+
session.Values["user"] = user
|
|
19
|
+
session.Save(r, w)
|
|
20
|
+
2. 在 Save 之前清除旧会话: session.Options.MaxAge = -1
|
|
21
|
+
3. 为认证成功的会话生成新的 session ID(随机UUID)
|
|
22
|
+
4. 将 session ID 与用户身份强绑定
|
|
23
|
+
languages:
|
|
24
|
+
- go
|
|
25
|
+
pattern-either:
|
|
26
|
+
- pattern: |
|
|
27
|
+
$SESSION.Values[$KEY] = $USER
|
|
28
|
+
- pattern: |
|
|
29
|
+
$SESSION.Values[$KEY] = $VALUE
|
|
30
|
+
- pattern: |
|
|
31
|
+
session.Values[$KEY] = $VALUE
|
|
32
|
+
metadata:
|
|
33
|
+
cwe: "CWE-384: Session Fixation"
|
|
34
|
+
severity: HIGH
|
|
35
|
+
precision: low
|
|
36
|
+
category: session
|
|
37
|
+
likelihood: HIGH
|
|
38
|
+
impact: HIGH
|
|
39
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
40
|
+
references:
|
|
41
|
+
- "https://github.com/gorilla/sessions"
|
|
42
|
+
- "https://owasp.org/www-community/attacks/Session_fixation"
|
|
43
|
+
|
|
44
|
+
# ZM-GO-SF-002: Gorilla/Gin Session Cookie 安全属性缺失
|
|
45
|
+
- id: zm-go-sf-002
|
|
46
|
+
severity: HIGH
|
|
47
|
+
message: |
|
|
48
|
+
检测到 Gorilla sessions 的 cookie 配置中安全属性不完整。
|
|
49
|
+
|
|
50
|
+
- Secure: false → Cookie可被中间人通过HTTP明文传输窃取
|
|
51
|
+
- HttpOnly: false → JavaScript可读取Cookie,XSS可窃取会话
|
|
52
|
+
- SameSite 未设 StrictMode → 跨站请求携带Cookie,易受CSRF
|
|
53
|
+
|
|
54
|
+
修复方案:
|
|
55
|
+
1. 生产环境 Secure: true (仅HTTPS)
|
|
56
|
+
2. HttpOnly: true
|
|
57
|
+
3. SameSite: http.SameSiteStrictMode
|
|
58
|
+
4. 设置合理的 MaxAge 和 Path 限制作用域
|
|
59
|
+
5. 使用 session.Options 统一配置:
|
|
60
|
+
session.Options = &sessions.Options{
|
|
61
|
+
Path: "/",
|
|
62
|
+
MaxAge: 3600,
|
|
63
|
+
HttpOnly: true,
|
|
64
|
+
Secure: true,
|
|
65
|
+
SameSite: http.SameSiteStrictMode,
|
|
66
|
+
}
|
|
67
|
+
languages:
|
|
68
|
+
- go
|
|
69
|
+
pattern-either:
|
|
70
|
+
- pattern: |
|
|
71
|
+
$STORE.Options.HttpOnly = false
|
|
72
|
+
- pattern: |
|
|
73
|
+
$STORE.Options.Secure = false
|
|
74
|
+
- pattern: |
|
|
75
|
+
$OPTS.HttpOnly = false
|
|
76
|
+
- pattern: |
|
|
77
|
+
$OPTS.Secure = false
|
|
78
|
+
- pattern: |
|
|
79
|
+
$SESSION.Options.HttpOnly = false
|
|
80
|
+
- pattern: |
|
|
81
|
+
$SESSION.Options.Secure = false
|
|
82
|
+
- pattern: |
|
|
83
|
+
HttpOnly: false
|
|
84
|
+
- pattern: |
|
|
85
|
+
Secure: false
|
|
86
|
+
metadata:
|
|
87
|
+
cwe: "CWE-384: Session Fixation"
|
|
88
|
+
severity: HIGH
|
|
89
|
+
precision: very-high
|
|
90
|
+
category: session
|
|
91
|
+
likelihood: HIGH
|
|
92
|
+
impact: HIGH
|
|
93
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
94
|
+
references:
|
|
95
|
+
- "https://github.com/gorilla/sessions"
|
|
96
|
+
|
|
97
|
+
# ZM-GO-SF-003: Gin contrib/sessions cookie配置安全检查
|
|
98
|
+
- id: zm-go-sf-003
|
|
99
|
+
severity: HIGH
|
|
100
|
+
message: |
|
|
101
|
+
检测到 Gin contrib/sessions 或其他 session store 配置中 Secure/HttpOnly 设置可能不安全。
|
|
102
|
+
使用 CookieStore 和 FilesystemStore 时需显式设置 Secure 和 HttpOnly 选项。
|
|
103
|
+
|
|
104
|
+
修复方案:
|
|
105
|
+
store := cookie.NewStore([]byte("secret"))
|
|
106
|
+
store.Options(sessions.Options{
|
|
107
|
+
Path: "/",
|
|
108
|
+
MaxAge: 86400 * 7,
|
|
109
|
+
HttpOnly: true,
|
|
110
|
+
Secure: true,
|
|
111
|
+
SameSite: http.SameSiteStrictMode,
|
|
112
|
+
})
|
|
113
|
+
languages:
|
|
114
|
+
- go
|
|
115
|
+
pattern-either:
|
|
116
|
+
- pattern: cookie.NewStore($KEY)
|
|
117
|
+
- pattern: sessions.NewCookieStore($KEY)
|
|
118
|
+
- pattern: sessions.NewFilesystemStore($PATH, $KEY)
|
|
119
|
+
metadata:
|
|
120
|
+
cwe: "CWE-384: Session Fixation"
|
|
121
|
+
severity: HIGH
|
|
122
|
+
precision: low
|
|
123
|
+
category: session
|
|
124
|
+
likelihood: MEDIUM
|
|
125
|
+
impact: HIGH
|
|
126
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
127
|
+
references:
|
|
128
|
+
- "https://github.com/gin-gonic/contrib/tree/master/sessions"
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# CWE-502: Go 不安全反序列化检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: gob.NewDecoder.Decode / json.Unmarshal到interface{} / xml.Decoder
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-DESER-001: gob 反序列化外部输入
|
|
8
|
+
- id: zm-go-deser-001
|
|
9
|
+
severity: CRITICAL
|
|
10
|
+
message: |
|
|
11
|
+
检测到 encoding/gob 的 NewDecoder().Decode() 反序列化操作。
|
|
12
|
+
gob 是Go特有的二进制序列化格式,反序列化用户可控的 gob 数据
|
|
13
|
+
可能触发 panic 导致DoS,或在复杂类型场景下产生意外行为。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 仅反序列化可信来源的 gob 数据
|
|
17
|
+
2. 对不可信数据使用 JSON/Protobuf 等格式替代 gob
|
|
18
|
+
3. 使用 gob.Register() 注册允许的反序列化类型白名单
|
|
19
|
+
4. 对输入数据做完整性校验(HMAC签名)
|
|
20
|
+
languages:
|
|
21
|
+
- go
|
|
22
|
+
pattern-either:
|
|
23
|
+
- pattern: gob.NewDecoder($R).Decode($V)
|
|
24
|
+
- pattern: gob.NewDecoder($R).DecodeValue($V)
|
|
25
|
+
metadata:
|
|
26
|
+
cwe: "CWE-502: Deserialization of Untrusted Data"
|
|
27
|
+
severity: CRITICAL
|
|
28
|
+
precision: high
|
|
29
|
+
category: deserialization
|
|
30
|
+
likelihood: MEDIUM
|
|
31
|
+
impact: HIGH
|
|
32
|
+
owasp: "A08:2021 - Software and Data Integrity Failures"
|
|
33
|
+
references:
|
|
34
|
+
- "https://pkg.go.dev/encoding/gob"
|
|
35
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html"
|
|
36
|
+
|
|
37
|
+
# ZM-GO-DESER-002: json.Unmarshal 到 interface{}
|
|
38
|
+
- id: zm-go-deser-002
|
|
39
|
+
severity: WARNING
|
|
40
|
+
message: |
|
|
41
|
+
检测到 json.Unmarshal / json.Decoder.Decode 将数据反序列化到
|
|
42
|
+
interface{} 类型或 map[string]interface{} 动态类型。
|
|
43
|
+
无类型约束的反序列化可能导致类型混淆、DoS(嵌套炸弹),
|
|
44
|
+
且无法利用编译器类型检查保证数据安全。
|
|
45
|
+
|
|
46
|
+
修复方案:
|
|
47
|
+
1. 定义具体的结构体类型接收JSON数据: json.Unmarshal(data, &myStruct)
|
|
48
|
+
2. 使用 json.Decoder 配合 DisallowUnknownFields() 拒绝未知字段
|
|
49
|
+
3. 若必须使用动态类型,使用 json.RawMessage 延迟解析
|
|
50
|
+
4. 对输入大小做限制(http.MaxBytesReader / io.LimitReader)
|
|
51
|
+
languages:
|
|
52
|
+
- go
|
|
53
|
+
pattern-either:
|
|
54
|
+
- pattern: json.Unmarshal($DATA, $V)
|
|
55
|
+
- pattern: $DEC.Decode($V)
|
|
56
|
+
metadata:
|
|
57
|
+
cwe: "CWE-502: Deserialization of Untrusted Data"
|
|
58
|
+
severity: WARNING
|
|
59
|
+
precision: low
|
|
60
|
+
category: deserialization
|
|
61
|
+
likelihood: MEDIUM
|
|
62
|
+
impact: MEDIUM
|
|
63
|
+
owasp: "A08:2021 - Software and Data Integrity Failures"
|
|
64
|
+
references:
|
|
65
|
+
- "https://pkg.go.dev/encoding/json"
|
|
66
|
+
|
|
67
|
+
# ZM-GO-DESER-003: xml.Decoder 外部实体未禁用
|
|
68
|
+
- id: zm-go-deser-003
|
|
69
|
+
severity: HIGH
|
|
70
|
+
message: |
|
|
71
|
+
检测到 encoding/xml 的 Decoder 反序列化XML数据。
|
|
72
|
+
Go的 xml.Decoder 默认禁用外部实体,但若显式设置
|
|
73
|
+
Decoder.Entity 字段,可能引入 XXE 攻击风险。
|
|
74
|
+
|
|
75
|
+
修复方案:
|
|
76
|
+
1. 使用默认的 xml.NewDecoder() 不做额外配置(Go 1.17+ 默认安全)
|
|
77
|
+
2. 若必须设置 Entity,确保映射仅包含安全值
|
|
78
|
+
3. 考虑使用更安全的XML解析库或切换到JSON
|
|
79
|
+
languages:
|
|
80
|
+
- go
|
|
81
|
+
pattern-either:
|
|
82
|
+
- pattern: xml.NewDecoder($R).Decode($V)
|
|
83
|
+
- pattern: xml.Unmarshal($DATA, $V)
|
|
84
|
+
metadata:
|
|
85
|
+
cwe: "CWE-502: Deserialization of Untrusted Data"
|
|
86
|
+
severity: HIGH
|
|
87
|
+
precision: medium
|
|
88
|
+
category: deserialization
|
|
89
|
+
likelihood: LOW
|
|
90
|
+
impact: HIGH
|
|
91
|
+
owasp: "A08:2021 - Software and Data Integrity Failures"
|
|
92
|
+
references:
|
|
93
|
+
- "https://pkg.go.dev/encoding/xml"
|
|
94
|
+
|
|
95
|
+
# ZM-GO-DESER-004: binary.Read 二进制反序列化
|
|
96
|
+
- id: zm-go-deser-004
|
|
97
|
+
severity: WARNING
|
|
98
|
+
message: |
|
|
99
|
+
检测到 encoding/binary 的 Read() 从不可信输入读取二进制数据。
|
|
100
|
+
若输入攻击者可控,可能构造恶意二进制数据导致越界读取或内存损坏。
|
|
101
|
+
|
|
102
|
+
修复方案:
|
|
103
|
+
1. 仅从可信来源读取二进制数据
|
|
104
|
+
2. 使用 io.LimitReader 限制读取大小
|
|
105
|
+
3. 对二进制数据做完整性校验(CRC/MD5签名)
|
|
106
|
+
4. 考虑使用 Protobuf 等有类型信息的序列化格式
|
|
107
|
+
languages:
|
|
108
|
+
- go
|
|
109
|
+
pattern-either:
|
|
110
|
+
- pattern: binary.Read($R, binary.BigEndian, $V)
|
|
111
|
+
- pattern: binary.Read($R, binary.LittleEndian, $V)
|
|
112
|
+
- pattern: binary.Read($R, $ORDER, $V)
|
|
113
|
+
metadata:
|
|
114
|
+
cwe: "CWE-502: Deserialization of Untrusted Data"
|
|
115
|
+
severity: WARNING
|
|
116
|
+
precision: low
|
|
117
|
+
category: deserialization
|
|
118
|
+
likelihood: MEDIUM
|
|
119
|
+
impact: MEDIUM
|
|
120
|
+
owasp: "A08:2021 - Software and Data Integrity Failures"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# CWE-78: Go OS 命令注入检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: os/exec.Command 启动Shell执行用户输入、syscall.Exec
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-OSCI-001: exec.Command 调用Shell执行变量参数
|
|
8
|
+
- id: zm-go-osci-001
|
|
9
|
+
severity: CRITICAL
|
|
10
|
+
message: |
|
|
11
|
+
检测到 os/exec 的 Command() 使用 "sh"/"bash"/"cmd" 等Shell解释器
|
|
12
|
+
且参数中包含变量。攻击者可通过用户输入注入额外命令
|
|
13
|
+
(如 ; id、| nc、$(cat /etc/passwd) 等),实现远程代码执行。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 使用 exec.Command() 直接调用二进制文件,不通过Shell:
|
|
17
|
+
exec.Command("git", "log", "--oneline") 而非 exec.Command("sh", "-c", "git log")
|
|
18
|
+
2. 避免将用户输入拼入命令字符串或Shell参数
|
|
19
|
+
3. 对必须传入Shell的命令,使用 shell-quote 库转义用户输入
|
|
20
|
+
4. 优先使用 Go 标准库函数替代外部命令(如 os.ReadFile 代替 cat)
|
|
21
|
+
languages:
|
|
22
|
+
- go
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: exec.Command("sh", "-c", $INPUT)
|
|
25
|
+
- pattern: exec.Command("bash", "-c", $INPUT)
|
|
26
|
+
- pattern: exec.Command("zsh", "-c", $INPUT)
|
|
27
|
+
- pattern: exec.Command("/bin/sh", "-c", $INPUT)
|
|
28
|
+
- pattern: exec.Command("/bin/bash", "-c", $INPUT)
|
|
29
|
+
- pattern: exec.Command("cmd", "/C", $INPUT)
|
|
30
|
+
- pattern: exec.Command("cmd", "/c", $INPUT)
|
|
31
|
+
- pattern: exec.Command("cmd.exe", "/C", $INPUT)
|
|
32
|
+
- pattern: exec.Command("powershell", "-Command", $INPUT)
|
|
33
|
+
- pattern: exec.Command("pwsh", "-Command", $INPUT)
|
|
34
|
+
- pattern: exec.Command("powershell.exe", "-Command", $INPUT)
|
|
35
|
+
metadata:
|
|
36
|
+
cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
|
|
37
|
+
severity: CRITICAL
|
|
38
|
+
precision: high
|
|
39
|
+
category: command-injection
|
|
40
|
+
likelihood: HIGH
|
|
41
|
+
impact: CRITICAL
|
|
42
|
+
owasp: "A03:2021 - Injection"
|
|
43
|
+
references:
|
|
44
|
+
- "https://pkg.go.dev/os/exec"
|
|
45
|
+
- "https://owasp.org/www-community/attacks/Command_Injection"
|
|
46
|
+
|
|
47
|
+
# ZM-GO-OSCI-002: syscall.Exec 执行用户可控路径
|
|
48
|
+
- id: zm-go-osci-002
|
|
49
|
+
severity: CRITICAL
|
|
50
|
+
message: |
|
|
51
|
+
检测到 syscall.Exec() 使用变量作为可执行文件路径。
|
|
52
|
+
syscall.Exec 直接替换当前进程镜像,若路径可控将导致任意代码执行。
|
|
53
|
+
|
|
54
|
+
修复方案:
|
|
55
|
+
1. 校验可执行文件路径必须在白名单目录内
|
|
56
|
+
2. 使用绝对路径替代相对路径
|
|
57
|
+
3. 迁移至 os/exec 包(syscall 已弃用,Go 1.17+)
|
|
58
|
+
languages:
|
|
59
|
+
- go
|
|
60
|
+
pattern-either:
|
|
61
|
+
- pattern: syscall.Exec($PATH, $ARGS, $ENV)
|
|
62
|
+
- pattern: syscall.Exec($PATH, nil, nil)
|
|
63
|
+
metadata:
|
|
64
|
+
cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
|
|
65
|
+
severity: CRITICAL
|
|
66
|
+
precision: high
|
|
67
|
+
category: command-injection
|
|
68
|
+
likelihood: MEDIUM
|
|
69
|
+
impact: CRITICAL
|
|
70
|
+
owasp: "A03:2021 - Injection"
|
|
71
|
+
|
|
72
|
+
# ZM-GO-OSCI-003: exec.Command 命令名来自变量
|
|
73
|
+
- id: zm-go-osci-003
|
|
74
|
+
severity: HIGH
|
|
75
|
+
message: |
|
|
76
|
+
检测到 os/exec 的 Command() 第一个参数(命令名)来自变量。
|
|
77
|
+
若该变量由用户输入控制,攻击者可指定任意可执行文件路径实现代码执行。
|
|
78
|
+
|
|
79
|
+
修复方案:
|
|
80
|
+
1. 命令名使用字面量字符串,参数通过后续参数传入
|
|
81
|
+
2. 对命令名做严格白名单校验
|
|
82
|
+
3. 避免从用户输入直接构造命令路径
|
|
83
|
+
languages:
|
|
84
|
+
- go
|
|
85
|
+
pattern-either:
|
|
86
|
+
- pattern: exec.Command($CMD, $ARGS)
|
|
87
|
+
- pattern: exec.CommandContext($CTX, $CMD, $ARGS)
|
|
88
|
+
metadata:
|
|
89
|
+
cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)"
|
|
90
|
+
severity: HIGH
|
|
91
|
+
precision: medium
|
|
92
|
+
category: command-injection
|
|
93
|
+
likelihood: MEDIUM
|
|
94
|
+
impact: HIGH
|
|
95
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# CWE-79: Go XSS 检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: template.HTML 标记用户输入为安全 / 使用 text/template 渲染HTML
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-XSS-001: template.HTML() 转换用户可控字符串
|
|
8
|
+
- id: zm-go-xss-001
|
|
9
|
+
severity: HIGH
|
|
10
|
+
message: |
|
|
11
|
+
检测到使用 html/template 的 template.HTML() 类型转换将字符串标记为
|
|
12
|
+
"安全HTML"直接输出。若该字符串包含用户输入,攻击者可注入
|
|
13
|
+
<script>、<img onerror=> 等XSS payload。
|
|
14
|
+
|
|
15
|
+
Go html/template 会自动转义所有字符串输出,但 template.HTML 类型
|
|
16
|
+
会绕过此保护,直接原样输出。这是Go XSS的第一大根因。
|
|
17
|
+
|
|
18
|
+
修复方案:
|
|
19
|
+
1. 删除 template.HTML() 转换,让 html/template 自动转义
|
|
20
|
+
2. 仅对可信的内部静态HTML片段使用 template.HTML()
|
|
21
|
+
3. 对用户输入使用 bluemonday 等HTML清洗库后再转换
|
|
22
|
+
4. 使用 template.JSStr() 替代 template.HTML() 输出到JS上下文
|
|
23
|
+
languages:
|
|
24
|
+
- go
|
|
25
|
+
pattern-either:
|
|
26
|
+
- pattern: template.HTML($INPUT)
|
|
27
|
+
- pattern: template.HTML($VAR)
|
|
28
|
+
metadata:
|
|
29
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
|
|
30
|
+
severity: HIGH
|
|
31
|
+
precision: high
|
|
32
|
+
category: xss
|
|
33
|
+
likelihood: MEDIUM
|
|
34
|
+
impact: HIGH
|
|
35
|
+
owasp: "A03:2021 - Injection"
|
|
36
|
+
references:
|
|
37
|
+
- "https://pkg.go.dev/html/template#HTML"
|
|
38
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"
|
|
39
|
+
|
|
40
|
+
# ZM-GO-XSS-002: template.JS / template.CSS / template.URL 注入
|
|
41
|
+
- id: zm-go-xss-002
|
|
42
|
+
severity: HIGH
|
|
43
|
+
message: |
|
|
44
|
+
检测到 template.JS() / template.CSS() / template.URL() / template.HTMLAttr()
|
|
45
|
+
将用户输入标记为安全内容直接插入JS/CSS/URL/属性上下文。
|
|
46
|
+
各类转换绕过上下文特定的自动转义,可能导致XSS。
|
|
47
|
+
|
|
48
|
+
修复方案:
|
|
49
|
+
1. 使用 html/template 默认转义,不手动标记安全类型
|
|
50
|
+
2. 对JSON数据使用 template.JSStr() 替代 template.JS()
|
|
51
|
+
3. URL使用 url.QueryEscape() 编码
|
|
52
|
+
4. 绝对必要时对输入做严格的白名单校验
|
|
53
|
+
languages:
|
|
54
|
+
- go
|
|
55
|
+
pattern-either:
|
|
56
|
+
- pattern: template.JS($INPUT)
|
|
57
|
+
- pattern: template.JSStr($INPUT)
|
|
58
|
+
- pattern: template.CSS($INPUT)
|
|
59
|
+
- pattern: template.URL($INPUT)
|
|
60
|
+
- pattern: template.HTMLAttr($INPUT)
|
|
61
|
+
- pattern: template.Srcset($INPUT)
|
|
62
|
+
metadata:
|
|
63
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
|
|
64
|
+
severity: HIGH
|
|
65
|
+
precision: high
|
|
66
|
+
category: xss
|
|
67
|
+
likelihood: MEDIUM
|
|
68
|
+
impact: HIGH
|
|
69
|
+
owasp: "A03:2021 - Injection"
|
|
70
|
+
references:
|
|
71
|
+
- "https://pkg.go.dev/html/template"
|
|
72
|
+
|
|
73
|
+
# ZM-GO-XSS-003: text/template 用于HTML渲染
|
|
74
|
+
- id: zm-go-xss-003
|
|
75
|
+
severity: HIGH
|
|
76
|
+
message: |
|
|
77
|
+
检测到使用 text/template 进行模板渲染(Template.Execute / Must)。
|
|
78
|
+
text/template 不提供任何HTML自动转义,所有变量直接输出到页面。
|
|
79
|
+
若模板内容中包含用户输入且输出到HTML页面,将导致XSS漏洞。
|
|
80
|
+
|
|
81
|
+
修复方案:
|
|
82
|
+
1. 将 "text/template" 替换为 "html/template"
|
|
83
|
+
2. html/template 会基于上下文自动选择转义策略(HTML/JS/CSS/URL)
|
|
84
|
+
3. 两个包的API完全兼容,仅需修改import路径
|
|
85
|
+
languages:
|
|
86
|
+
- go
|
|
87
|
+
pattern-either:
|
|
88
|
+
- pattern: texttemplate.Execute($W, $DATA)
|
|
89
|
+
- pattern: texttemplate.ExecuteTemplate($W, $NAME, $DATA)
|
|
90
|
+
- pattern: template.Must(...)
|
|
91
|
+
- pattern: template.New($NAME)
|
|
92
|
+
- pattern: template.ParseFiles(...)
|
|
93
|
+
- pattern: template.ParseGlob(...)
|
|
94
|
+
metadata:
|
|
95
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting)"
|
|
96
|
+
severity: HIGH
|
|
97
|
+
precision: medium
|
|
98
|
+
category: xss
|
|
99
|
+
likelihood: HIGH
|
|
100
|
+
impact: HIGH
|
|
101
|
+
owasp: "A03:2021 - Injection"
|
|
102
|
+
references:
|
|
103
|
+
- "https://pkg.go.dev/text/template"
|
|
104
|
+
- "https://pkg.go.dev/html/template"
|