@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,89 @@
|
|
|
1
|
+
# CWE-89: SQL 注入检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-SQLI-001: JDBC Statement 字符串拼接
|
|
7
|
+
- id: zm-java-sqli-001
|
|
8
|
+
severity: CRITICAL
|
|
9
|
+
message: |
|
|
10
|
+
检测到 JDBC Statement 使用字符串拼接构造 SQL 查询。
|
|
11
|
+
攻击者可通过控制变量注入恶意 SQL 语句。
|
|
12
|
+
应使用 PreparedStatement + 参数化查询。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
Statement $STMT = $CONN.createStatement();
|
|
18
|
+
...
|
|
19
|
+
$STMT.executeQuery($SQL + $PARAM);
|
|
20
|
+
- pattern: |
|
|
21
|
+
Statement $STMT = $CONN.createStatement();
|
|
22
|
+
...
|
|
23
|
+
$STMT.execute($SQL + $PARAM);
|
|
24
|
+
- pattern: |
|
|
25
|
+
Statement $STMT = $CONN.createStatement();
|
|
26
|
+
...
|
|
27
|
+
$STMT.executeUpdate($SQL + $PARAM);
|
|
28
|
+
metadata:
|
|
29
|
+
cwe: "CWE-89: SQL Injection"
|
|
30
|
+
owasp: "A03:2021 - Injection"
|
|
31
|
+
precision: very-high
|
|
32
|
+
|
|
33
|
+
# ZM-JAVA-SQLI-002: MyBatis ${} 动态 SQL (非预编译)
|
|
34
|
+
- id: zm-java-sqli-002
|
|
35
|
+
severity: CRITICAL
|
|
36
|
+
message: |
|
|
37
|
+
MyBatis 使用 ${} 语法进行字符串替换而非预编译参数绑定。
|
|
38
|
+
除非是 ORDER BY / GROUP BY 等无法参数化的场景,否则应使用 #{}。
|
|
39
|
+
languages:
|
|
40
|
+
- java
|
|
41
|
+
pattern-either:
|
|
42
|
+
- pattern: |
|
|
43
|
+
@$ANNOTATION("...${...$EXPR}...")
|
|
44
|
+
metadata:
|
|
45
|
+
cwe: "CWE-89: SQL Injection"
|
|
46
|
+
owasp: "A03:2021 - Injection"
|
|
47
|
+
precision: high
|
|
48
|
+
|
|
49
|
+
# ZM-JAVA-SQLI-003: JdbcTemplate 字符串拼接
|
|
50
|
+
- id: zm-java-sqli-003
|
|
51
|
+
severity: HIGH
|
|
52
|
+
message: |
|
|
53
|
+
JdbcTemplate 使用字符串拼接构造 SQL 查询。
|
|
54
|
+
应使用参数化查询:jdbcTemplate.query(sql, params, mapper)
|
|
55
|
+
languages:
|
|
56
|
+
- java
|
|
57
|
+
pattern-either:
|
|
58
|
+
- pattern: |
|
|
59
|
+
$T.jdbcTemplate.query($SQL + $PARAM, ...);
|
|
60
|
+
- pattern: |
|
|
61
|
+
$T.jdbcTemplate.update($SQL + $PARAM, ...);
|
|
62
|
+
- pattern: |
|
|
63
|
+
$T.jdbcTemplate.queryForObject($SQL + $PARAM, ...);
|
|
64
|
+
metadata:
|
|
65
|
+
cwe: "CWE-89: SQL Injection"
|
|
66
|
+
owasp: "A03:2021 - Injection"
|
|
67
|
+
precision: high
|
|
68
|
+
|
|
69
|
+
# ZM-JAVA-SQLI-004: String.format 构造 SQL
|
|
70
|
+
- id: zm-java-sqli-004
|
|
71
|
+
severity: HIGH
|
|
72
|
+
message: |
|
|
73
|
+
String.format() 构造 SQL 查询,参数值直接拼接。
|
|
74
|
+
应使用 PreparedStatement 参数化。
|
|
75
|
+
languages:
|
|
76
|
+
- java
|
|
77
|
+
pattern-either:
|
|
78
|
+
- pattern: |
|
|
79
|
+
$SQL = String.format("...SELECT...%s...", $PARAM);
|
|
80
|
+
...
|
|
81
|
+
$STMT.executeQuery($SQL);
|
|
82
|
+
- pattern: |
|
|
83
|
+
$SQL = String.format("...INSERT...%s...", $PARAM);
|
|
84
|
+
...
|
|
85
|
+
$STMT.executeUpdate($SQL);
|
|
86
|
+
metadata:
|
|
87
|
+
cwe: "CWE-89: SQL Injection"
|
|
88
|
+
owasp: "A03:2021 - Injection"
|
|
89
|
+
precision: medium
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# CWE-918: 服务端请求伪造 (SSRF) 检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-SSRF-001: HttpURLConnection URL 用户可控
|
|
7
|
+
- id: zm-java-ssrf-001
|
|
8
|
+
severity: HIGH
|
|
9
|
+
message: |
|
|
10
|
+
检测到 HttpURLConnection 打开的 URL 可能包含用户输入。
|
|
11
|
+
攻击者可能利用 SSRF 访问内网资源 (如 http://169.254.169.254/)。
|
|
12
|
+
应对 URL 进行白名单校验,禁止访问内网/本地地址。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
(HttpURLConnection) new URL($URL).openConnection();
|
|
18
|
+
- pattern: |
|
|
19
|
+
HttpURLConnection $CONN = (HttpURLConnection) new URL($URL).openConnection();
|
|
20
|
+
- pattern: |
|
|
21
|
+
new URL($URL).openConnection();
|
|
22
|
+
metadata:
|
|
23
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
24
|
+
owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
|
|
25
|
+
precision: medium
|
|
26
|
+
|
|
27
|
+
# ZM-JAVA-SSRF-002: RestTemplate URL 用户可控
|
|
28
|
+
- id: zm-java-ssrf-002
|
|
29
|
+
severity: MEDIUM
|
|
30
|
+
message: |
|
|
31
|
+
检测到 RestTemplate 请求的 URL 可能由用户输入构造。
|
|
32
|
+
应校验目标 URL 域名白名单,拒绝内网地址。
|
|
33
|
+
languages:
|
|
34
|
+
- java
|
|
35
|
+
pattern-either:
|
|
36
|
+
- pattern: |
|
|
37
|
+
$RT.getForObject($URL, ...);
|
|
38
|
+
- pattern: |
|
|
39
|
+
$RT.postForObject($URL, ...);
|
|
40
|
+
- pattern: |
|
|
41
|
+
$RT.exchange($URL, ...);
|
|
42
|
+
metadata:
|
|
43
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
44
|
+
owasp: "A10:2021 - Server-Side Request Forgery (SSRF)"
|
|
45
|
+
precision: low
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# CWE-94: 代码注入检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.0 Alpha — 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JAVA-CI-001: ScriptEngine.eval 用户输入
|
|
7
|
+
- id: zm-java-ci-001
|
|
8
|
+
severity: CRITICAL
|
|
9
|
+
message: |
|
|
10
|
+
检测到 ScriptEngine.eval() 可能执行用户可控的脚本代码。
|
|
11
|
+
攻击者可注入恶意脚本实现任意代码执行。
|
|
12
|
+
避免使用动态脚本执行;如必须使用,需严格白名单校验输入内容。
|
|
13
|
+
languages:
|
|
14
|
+
- java
|
|
15
|
+
pattern-either:
|
|
16
|
+
- pattern: |
|
|
17
|
+
$ENGINE.eval($SCRIPT);
|
|
18
|
+
- pattern: |
|
|
19
|
+
$ENGINE.eval($SCRIPT + $PARAM);
|
|
20
|
+
metadata:
|
|
21
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
22
|
+
owasp: "A03:2021 - Injection"
|
|
23
|
+
precision: high
|
|
24
|
+
|
|
25
|
+
# ZM-JAVA-CI-002: GroovyShell 动态执行
|
|
26
|
+
- id: zm-java-ci-002
|
|
27
|
+
severity: CRITICAL
|
|
28
|
+
message: |
|
|
29
|
+
检测到 GroovyShell 可能执行用户可控的脚本代码。
|
|
30
|
+
GroovyShell 不应接收外部输入;应使用 SafeGroovyMethods 或禁用 import 等特性。
|
|
31
|
+
languages:
|
|
32
|
+
- java
|
|
33
|
+
pattern-either:
|
|
34
|
+
- pattern: |
|
|
35
|
+
new GroovyShell().evaluate($SCRIPT);
|
|
36
|
+
- pattern: |
|
|
37
|
+
new GroovyShell().parse($SCRIPT);
|
|
38
|
+
metadata:
|
|
39
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
40
|
+
owasp: "A03:2021 - Injection"
|
|
41
|
+
precision: high
|
|
42
|
+
|
|
43
|
+
# ZM-JAVA-CI-003: Runtime.exec 编译执行 (命令注入也可归为此类)
|
|
44
|
+
- id: zm-java-ci-003
|
|
45
|
+
severity: MEDIUM
|
|
46
|
+
message: |
|
|
47
|
+
检测到 Class.forName 动态加载类,可能被利用进行代码注入。
|
|
48
|
+
动态类加载应使用白名单限制可加载的类型。
|
|
49
|
+
languages:
|
|
50
|
+
- java
|
|
51
|
+
pattern-either:
|
|
52
|
+
- pattern: |
|
|
53
|
+
Class.forName($NAME).newInstance();
|
|
54
|
+
- pattern: |
|
|
55
|
+
Class.forName($NAME);
|
|
56
|
+
metadata:
|
|
57
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
58
|
+
owasp: "A03:2021 - Injection"
|
|
59
|
+
precision: low
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# CWE-22: Go 路径穿越深度检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Go 规则库
|
|
3
|
+
# 覆盖: os.MkdirAll + userInput、filepath.Clean无效化、archive/zip ZipSlip
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-PT-DEPTH-001: os.MkdirAll 用户输入目录创建
|
|
8
|
+
- id: zm-go-pt-depth-001
|
|
9
|
+
severity: HIGH
|
|
10
|
+
message: |
|
|
11
|
+
检测到 os.MkdirAll / os.Mkdir 使用用户可控的目录路径参数。
|
|
12
|
+
攻击者可通过 ../../ 穿越创建任意目录,可能用于植入webshell或覆盖系统文件。
|
|
13
|
+
|
|
14
|
+
修复方案:
|
|
15
|
+
1. 使用 filepath.Clean() 规范化路径后验证基础目录前缀:
|
|
16
|
+
cleaned := filepath.Clean(filepath.Join(baseDir, userInput))
|
|
17
|
+
if !strings.HasPrefix(cleaned, filepath.Clean(baseDir)) { return error }
|
|
18
|
+
2. 使用 filepath.Base() 仅提取目录名部分
|
|
19
|
+
3. 限制目录名白名单(字母数字+特定符号)
|
|
20
|
+
4. 禁止用户输入直接作为目录路径
|
|
21
|
+
languages:
|
|
22
|
+
- go
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: os.MkdirAll($INPUT, $PERM)
|
|
25
|
+
- pattern: os.Mkdir($INPUT, $PERM)
|
|
26
|
+
- pattern: os.MkdirTemp($DIR, $INPUT)
|
|
27
|
+
- pattern: os.MkdirTemp($INPUT, $PATTERN)
|
|
28
|
+
metadata:
|
|
29
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
30
|
+
severity: HIGH
|
|
31
|
+
precision: medium
|
|
32
|
+
category: path-traversal
|
|
33
|
+
likelihood: HIGH
|
|
34
|
+
impact: HIGH
|
|
35
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
36
|
+
references:
|
|
37
|
+
- "https://pkg.go.dev/os#MkdirAll"
|
|
38
|
+
|
|
39
|
+
# ZM-GO-PT-DEPTH-002: archive/zip ZipSlip 检测
|
|
40
|
+
- id: zm-go-pt-depth-002
|
|
41
|
+
severity: HIGH
|
|
42
|
+
message: |
|
|
43
|
+
检测到 ZIP 解压操作中未对压缩包内文件名做路径穿越校验(ZipSlip漏洞)。
|
|
44
|
+
攻击者可构造包含 ../ 路径的恶意ZIP文件,解压时写入任意目录。
|
|
45
|
+
|
|
46
|
+
典型漏洞模式:
|
|
47
|
+
for _, f := range reader.File {
|
|
48
|
+
dst := filepath.Join(targetDir, f.Name)
|
|
49
|
+
os.MkdirAll(filepath.Dir(dst), 0755)
|
|
50
|
+
// 未校验 dst 是否在 targetDir 内!
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
修复方案:
|
|
54
|
+
1. 使用 filepath.Clean 规范化后校验前缀:
|
|
55
|
+
dst := filepath.Clean(filepath.Join(targetDir, f.Name))
|
|
56
|
+
if !strings.HasPrefix(dst, filepath.Clean(targetDir)+string(os.PathSeparator)) {
|
|
57
|
+
return errors.New("invalid file path")
|
|
58
|
+
}
|
|
59
|
+
2. 使用 f.FileInfo().Name() 或 filepath.Base(f.Name) 去除路径部分
|
|
60
|
+
3. 使用专门的ZipSlip防护库
|
|
61
|
+
languages:
|
|
62
|
+
- go
|
|
63
|
+
pattern-either:
|
|
64
|
+
- pattern: filepath.Join($DIR, $ZIPFILE.Name)
|
|
65
|
+
- pattern: filepath.Join($DIR, $F.Name)
|
|
66
|
+
- pattern: filepath.Join($DEST, $HEADER.Name)
|
|
67
|
+
- pattern: path.Join($DIR, $ZIPFILE.Name)
|
|
68
|
+
metadata:
|
|
69
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
70
|
+
severity: HIGH
|
|
71
|
+
precision: high
|
|
72
|
+
category: path-traversal
|
|
73
|
+
likelihood: HIGH
|
|
74
|
+
impact: HIGH
|
|
75
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
76
|
+
references:
|
|
77
|
+
- "https://snyk.io/research/zip-slip-vulnerability"
|
|
78
|
+
- "https://pkg.go.dev/archive/zip"
|
|
79
|
+
|
|
80
|
+
# ZM-GO-PT-DEPTH-003: filepath.Clean 后未做前缀校验(无效化)
|
|
81
|
+
- id: zm-go-pt-depth-003
|
|
82
|
+
severity: WARNING
|
|
83
|
+
message: |
|
|
84
|
+
检测到使用 filepath.Clean 规范化路径但未验证结果路径的基础目录前缀。
|
|
85
|
+
仅使用 filepath.Clean 不足以防止路径穿越——需要配合 HasPrefix 校验。
|
|
86
|
+
|
|
87
|
+
错误示例:
|
|
88
|
+
cleanPath := filepath.Clean(filepath.Join(baseDir, userInput))
|
|
89
|
+
os.Open(cleanPath) // ← 未校验 cleanPath 是否在 baseDir 内
|
|
90
|
+
|
|
91
|
+
正确示例:
|
|
92
|
+
cleanPath := filepath.Clean(filepath.Join(baseDir, userInput))
|
|
93
|
+
cleanBase := filepath.Clean(baseDir)
|
|
94
|
+
if !strings.HasPrefix(cleanPath, cleanBase) {
|
|
95
|
+
return nil, errors.New("invalid path")
|
|
96
|
+
}
|
|
97
|
+
os.Open(cleanPath)
|
|
98
|
+
|
|
99
|
+
修复方案:
|
|
100
|
+
1. filepath.Clean 后添加 HasPrefix 校验
|
|
101
|
+
2. 使用 filepath.Rel 计算相对路径并检查是否以 .. 开头
|
|
102
|
+
3. 对用户输入做字符白名单过滤
|
|
103
|
+
languages:
|
|
104
|
+
- go
|
|
105
|
+
pattern-either:
|
|
106
|
+
- pattern: filepath.Clean($INPUT)
|
|
107
|
+
- pattern: path.Clean($INPUT)
|
|
108
|
+
metadata:
|
|
109
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
110
|
+
severity: WARNING
|
|
111
|
+
precision: low
|
|
112
|
+
category: path-traversal
|
|
113
|
+
likelihood: MEDIUM
|
|
114
|
+
impact: HIGH
|
|
115
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
116
|
+
references:
|
|
117
|
+
- "https://pkg.go.dev/path/filepath#Clean"
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# CWE-22: Go 路径穿越检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: os.Open / ioutil.ReadFile 用户输入路径、path.Join 未验证
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-PT-001: os.Open / os.ReadFile / ioutil.ReadFile 动态文件路径
|
|
8
|
+
- id: zm-go-pt-001
|
|
9
|
+
severity: HIGH
|
|
10
|
+
message: |
|
|
11
|
+
检测到文件读取操作(os.Open / os.ReadFile / ioutil.ReadFile)
|
|
12
|
+
使用变量作为文件路径。若该变量来自用户输入(HTTP请求参数、
|
|
13
|
+
API输入等),攻击者可通过 ../ 穿越目录读取任意文件(如 /etc/passwd)。
|
|
14
|
+
|
|
15
|
+
修复方案:
|
|
16
|
+
1. 使用 filepath.Clean() 规范化路径后,验证是否在允许的基础目录内:
|
|
17
|
+
cleaned := filepath.Clean(userPath)
|
|
18
|
+
if !strings.HasPrefix(cleaned, baseDir) { return error }
|
|
19
|
+
2. 使用 filepath.Base() 仅提取文件名,丢弃路径部分
|
|
20
|
+
3. 对用户输入的文件名做白名单校验
|
|
21
|
+
4. 将文件存储在非Web可访问目录中
|
|
22
|
+
languages:
|
|
23
|
+
- go
|
|
24
|
+
pattern-either:
|
|
25
|
+
- pattern: os.Open($PATH)
|
|
26
|
+
- pattern: os.OpenFile($PATH, $FLAG, $PERM)
|
|
27
|
+
- pattern: os.ReadFile($PATH)
|
|
28
|
+
- pattern: ioutil.ReadFile($PATH)
|
|
29
|
+
- pattern: ioutil.ReadDir($PATH)
|
|
30
|
+
- pattern: os.ReadDir($PATH)
|
|
31
|
+
metadata:
|
|
32
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
33
|
+
severity: HIGH
|
|
34
|
+
precision: medium
|
|
35
|
+
category: path-traversal
|
|
36
|
+
likelihood: HIGH
|
|
37
|
+
impact: HIGH
|
|
38
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
39
|
+
references:
|
|
40
|
+
- "https://pkg.go.dev/path/filepath#Clean"
|
|
41
|
+
- "https://owasp.org/www-community/attacks/Path_Traversal"
|
|
42
|
+
|
|
43
|
+
# ZM-GO-PT-002: path.Join 未做路径前缀验证
|
|
44
|
+
- id: zm-go-pt-002
|
|
45
|
+
severity: HIGH
|
|
46
|
+
message: |
|
|
47
|
+
检测到使用 path.Join 或 filepath.Join 拼接用户可控的路径组件。
|
|
48
|
+
Join 仅规范化路径分隔符,不会阻止 ../ 穿越。
|
|
49
|
+
攻击者可通过输入 ../../etc/passwd 绕过 Join 保护。
|
|
50
|
+
|
|
51
|
+
修复方案:
|
|
52
|
+
1. 在 Join 之后使用 filepath.Clean() + HasPrefix 验证:
|
|
53
|
+
fullPath := filepath.Clean(filepath.Join(baseDir, userInput))
|
|
54
|
+
if !strings.HasPrefix(fullPath, filepath.Clean(baseDir)) { return error }
|
|
55
|
+
2. 使用 filepath.Rel() 计算相对路径并检查是否以 .. 开头
|
|
56
|
+
3. 对用户输入做字符白名单(仅允许字母数字和特定符号)
|
|
57
|
+
languages:
|
|
58
|
+
- go
|
|
59
|
+
pattern-either:
|
|
60
|
+
- pattern: filepath.Join($BASE, $INPUT)
|
|
61
|
+
- pattern: path.Join($BASE, $INPUT)
|
|
62
|
+
- pattern: filepath.Join($INPUT, $SUFFIX)
|
|
63
|
+
- pattern: path.Join($INPUT, $SUFFIX)
|
|
64
|
+
metadata:
|
|
65
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
66
|
+
severity: HIGH
|
|
67
|
+
precision: medium
|
|
68
|
+
category: path-traversal
|
|
69
|
+
likelihood: HIGH
|
|
70
|
+
impact: HIGH
|
|
71
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
72
|
+
references:
|
|
73
|
+
- "https://pkg.go.dev/path/filepath#Join"
|
|
74
|
+
|
|
75
|
+
# ZM-GO-PT-003: http.ServeFile / http.FileServer 动态目录
|
|
76
|
+
- id: zm-go-pt-003
|
|
77
|
+
severity: HIGH
|
|
78
|
+
message: |
|
|
79
|
+
检测到 http.ServeFile 或 http.FileServer 使用动态路径提供静态文件。
|
|
80
|
+
若目录路径可由用户控制,攻击者可通过路径穿越访问Web根目录之外的
|
|
81
|
+
任意文件(配置文件、源码、数据库等)。
|
|
82
|
+
|
|
83
|
+
修复方案:
|
|
84
|
+
1. 使用 http.Dir() 包装目录: http.FileServer(http.Dir("/safe/path"))
|
|
85
|
+
2. 确保 root 目录为绝对路径且不可由用户控制
|
|
86
|
+
3. 配合 http.StripPrefix 限制访问范围
|
|
87
|
+
4. 对敏感目录设置 dotfiles 访问控制
|
|
88
|
+
languages:
|
|
89
|
+
- go
|
|
90
|
+
pattern-either:
|
|
91
|
+
- pattern: http.ServeFile($W, $R, $PATH)
|
|
92
|
+
- pattern: http.FileServer(http.Dir($DIR))
|
|
93
|
+
- pattern: http.FileServer(http.Dir($VAR))
|
|
94
|
+
metadata:
|
|
95
|
+
cwe: "CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)"
|
|
96
|
+
severity: HIGH
|
|
97
|
+
precision: medium
|
|
98
|
+
category: path-traversal
|
|
99
|
+
likelihood: MEDIUM
|
|
100
|
+
impact: HIGH
|
|
101
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
102
|
+
references:
|
|
103
|
+
- "https://pkg.go.dev/net/http#FileServer"
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# CWE-307: Go 暴力破解防护缺失检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — Go 规则库
|
|
3
|
+
# 覆盖: bcrypt cost<10、登录无rate limit、JWT secret太短
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-BF-001: bcrypt cost 过低
|
|
8
|
+
- id: zm-go-bf-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到 bcrypt.GenerateFromPassword 的 cost 参数 < 10。
|
|
12
|
+
cost 过低使哈希计算速度过快,攻击者可高效进行离线暴力破解。
|
|
13
|
+
|
|
14
|
+
OWASP 建议 bcrypt cost >= 10 (2024年建议 >= 12)。
|
|
15
|
+
|
|
16
|
+
修复方案:
|
|
17
|
+
1. 将 cost 提升至 >= 12: bcrypt.GenerateFromPassword(password, 12)
|
|
18
|
+
2. 考虑使用 argon2 替代(更抗GPU/ASIC)
|
|
19
|
+
3. 定期评估并上调 cost 值(随硬件性能提升)
|
|
20
|
+
4. 使用 bcrypt.DefaultCost(10) 作为最低标准
|
|
21
|
+
languages:
|
|
22
|
+
- go
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 1)
|
|
25
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 2)
|
|
26
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 3)
|
|
27
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 4)
|
|
28
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 5)
|
|
29
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 6)
|
|
30
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 7)
|
|
31
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 8)
|
|
32
|
+
- pattern: bcrypt.GenerateFromPassword($PASS, 9)
|
|
33
|
+
metadata:
|
|
34
|
+
cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
|
|
35
|
+
severity: WARNING
|
|
36
|
+
precision: very-high
|
|
37
|
+
category: brute-force
|
|
38
|
+
likelihood: HIGH
|
|
39
|
+
impact: MEDIUM
|
|
40
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
41
|
+
references:
|
|
42
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"
|
|
43
|
+
- "https://pkg.go.dev/golang.org/x/crypto/bcrypt"
|
|
44
|
+
|
|
45
|
+
# ZM-GO-BF-002: 登录接口无 rate limit
|
|
46
|
+
- id: zm-go-bf-002
|
|
47
|
+
severity: HIGH
|
|
48
|
+
message: |
|
|
49
|
+
检测到 Gin/Echo/标准库登录路由处理函数中未使用 rate limiter 中间件。
|
|
50
|
+
攻击者可对登录接口发起暴力破解攻击,尝试大量用户名/密码组合。
|
|
51
|
+
|
|
52
|
+
修复方案:
|
|
53
|
+
1. 使用 tollbooth / go-redis/redis_rate 等限流库:
|
|
54
|
+
limiter := tollbooth.NewLimiter(5, nil)
|
|
55
|
+
limiter.SetIPLookups([]string{"X-Forwarded-For", "RemoteAddr", "X-Real-IP"})
|
|
56
|
+
router.POST("/login", tollbooth.LimitFuncHandler(limiter, loginHandler))
|
|
57
|
+
2. 基于用户名/IP的渐进式延迟
|
|
58
|
+
3. 实现账户锁定策略(连续N次失败锁定M分钟)
|
|
59
|
+
4. 添加验证码机制
|
|
60
|
+
languages:
|
|
61
|
+
- go
|
|
62
|
+
pattern-either:
|
|
63
|
+
- pattern: |
|
|
64
|
+
$ROUTER.POST("/login", $HANDLER)
|
|
65
|
+
- pattern: |
|
|
66
|
+
$ROUTER.GET("/login", $HANDLER)
|
|
67
|
+
- pattern: |
|
|
68
|
+
$G.POST("/login", $HANDLER)
|
|
69
|
+
- pattern: |
|
|
70
|
+
$E.POST("/login", $HANDLER)
|
|
71
|
+
- pattern: |
|
|
72
|
+
http.HandleFunc("/login", $HANDLER)
|
|
73
|
+
- pattern: |
|
|
74
|
+
$MUX.HandleFunc("/login", $HANDLER)
|
|
75
|
+
metadata:
|
|
76
|
+
cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
|
|
77
|
+
severity: HIGH
|
|
78
|
+
precision: low
|
|
79
|
+
category: brute-force
|
|
80
|
+
likelihood: HIGH
|
|
81
|
+
impact: HIGH
|
|
82
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
83
|
+
references:
|
|
84
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html"
|
|
85
|
+
|
|
86
|
+
# ZM-GO-BF-003: JWT HMAC secret 过短
|
|
87
|
+
- id: zm-go-bf-003
|
|
88
|
+
severity: HIGH
|
|
89
|
+
message: |
|
|
90
|
+
检测到 JWT 签名密钥(HMAC secret)可能为硬编码短字符串(如 "secret" / "mykey")。
|
|
91
|
+
过短的 HMAC 密钥可被暴力破解,攻击者可伪造任意 JWT token。
|
|
92
|
+
|
|
93
|
+
HMAC-SHA256 密钥最低要求 256 bits (32 bytes)。
|
|
94
|
+
|
|
95
|
+
修复方案:
|
|
96
|
+
1. 密钥长度 >= 32 字节: jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
97
|
+
2. 从环境变量/密钥管理服务加载密钥
|
|
98
|
+
3. 使用 RSA/ECDSA 非对称签名替代对称签名
|
|
99
|
+
4. 禁止硬编码密钥字符串
|
|
100
|
+
languages:
|
|
101
|
+
- go
|
|
102
|
+
pattern-either:
|
|
103
|
+
- pattern: |
|
|
104
|
+
[]byte("secret")
|
|
105
|
+
- pattern: |
|
|
106
|
+
[]byte("mykey")
|
|
107
|
+
- pattern: |
|
|
108
|
+
[]byte("key")
|
|
109
|
+
- pattern: |
|
|
110
|
+
[]byte("password")
|
|
111
|
+
- pattern: |
|
|
112
|
+
[]byte("jwt-secret")
|
|
113
|
+
- pattern: |
|
|
114
|
+
[]byte("secret-key")
|
|
115
|
+
- pattern: |
|
|
116
|
+
[]byte("my-secret")
|
|
117
|
+
- pattern: |
|
|
118
|
+
[]byte("my_secret_key")
|
|
119
|
+
metadata:
|
|
120
|
+
cwe: "CWE-307: Improper Restriction of Excessive Authentication Attempts"
|
|
121
|
+
severity: HIGH
|
|
122
|
+
precision: medium
|
|
123
|
+
category: brute-force
|
|
124
|
+
likelihood: MEDIUM
|
|
125
|
+
impact: CRITICAL
|
|
126
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
127
|
+
references:
|
|
128
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html"
|
|
129
|
+
- "https://pkg.go.dev/github.com/golang-jwt/jwt/v5"
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# CWE-326: Go 弱加密算法检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Go 通用规则库
|
|
3
|
+
# 检测: crypto/md5、crypto/sha1、crypto/des、crypto/rc4 使用
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-GO-WEAKCRYPTO-001: MD5 哈希算法使用
|
|
8
|
+
- id: zm-go-weakcrypto-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到使用 crypto/md5 哈希算法。
|
|
12
|
+
MD5 已被证实存在碰撞攻击(2004年王小云),SHA-1 也于2017年
|
|
13
|
+
被Google实现首个碰撞攻击(SHAttered)。
|
|
14
|
+
MD5 不应用于安全场景(密码存储、数字签名、证书验证、完整性校验)。
|
|
15
|
+
|
|
16
|
+
修复方案:
|
|
17
|
+
1. 数字签名/完整性校验: crypto/sha256 或 crypto/sha512
|
|
18
|
+
2. 密码存储: golang.org/x/crypto/bcrypt 或 argon2
|
|
19
|
+
3. HMAC: crypto/hmac + sha256
|
|
20
|
+
4. 若仅用于非安全用途(如哈希表键),添加 //nolint 注释忽略
|
|
21
|
+
languages:
|
|
22
|
+
- go
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: md5.New()
|
|
25
|
+
- pattern: md5.Sum($DATA)
|
|
26
|
+
- pattern: md5Sum($DATA)
|
|
27
|
+
metadata:
|
|
28
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
29
|
+
severity: WARNING
|
|
30
|
+
precision: very-high
|
|
31
|
+
category: crypto
|
|
32
|
+
likelihood: HIGH
|
|
33
|
+
impact: HIGH
|
|
34
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
35
|
+
references:
|
|
36
|
+
- "https://shattered.io/"
|
|
37
|
+
- "https://cwe.mitre.org/data/definitions/326.html"
|
|
38
|
+
|
|
39
|
+
# ZM-GO-WEAKCRYPTO-002: SHA-1 哈希算法使用
|
|
40
|
+
- id: zm-go-weakcrypto-002
|
|
41
|
+
severity: WARNING
|
|
42
|
+
message: |
|
|
43
|
+
检测到使用 crypto/sha1 哈希算法。
|
|
44
|
+
SHA-1 已被 Google 实现碰撞攻击(SHAttered, 2017)。
|
|
45
|
+
主流浏览器和CA机构已于2017年停止信任SHA-1证书。
|
|
46
|
+
SHA-1 不应用于数字签名、证书或密码存储。
|
|
47
|
+
|
|
48
|
+
修复方案:
|
|
49
|
+
1. 升级至 crypto/sha256 或更安全的哈希算法
|
|
50
|
+
2. 密码存储使用 bcrypt/argon2
|
|
51
|
+
3. 签名场景使用 SHA256withRSA 或 ECDSA
|
|
52
|
+
languages:
|
|
53
|
+
- go
|
|
54
|
+
pattern-either:
|
|
55
|
+
- pattern: sha1.New()
|
|
56
|
+
- pattern: sha1.Sum($DATA)
|
|
57
|
+
- pattern: sha1Sum($DATA)
|
|
58
|
+
metadata:
|
|
59
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
60
|
+
severity: WARNING
|
|
61
|
+
precision: very-high
|
|
62
|
+
category: crypto
|
|
63
|
+
likelihood: HIGH
|
|
64
|
+
impact: HIGH
|
|
65
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
66
|
+
references:
|
|
67
|
+
- "https://shattered.io/"
|
|
68
|
+
- "https://www.schneier.com/blog/archives/2005/02/sha1_broken.html"
|
|
69
|
+
|
|
70
|
+
# ZM-GO-WEAKCRYPTO-003: DES 对称加密使用
|
|
71
|
+
- id: zm-go-weakcrypto-003
|
|
72
|
+
severity: WARNING
|
|
73
|
+
message: |
|
|
74
|
+
检测到使用 crypto/des 对称加密算法。
|
|
75
|
+
DES 使用56位密钥(有效仅56位),现代硬件可在数小时内暴力破解。
|
|
76
|
+
Triple DES (3DES) 也仅提供112位有效安全强度,且存在Sweet32攻击。
|
|
77
|
+
不符合 NIST SP 800-131A Rev.2 标准。
|
|
78
|
+
|
|
79
|
+
修复方案:
|
|
80
|
+
1. 使用 crypto/aes + GCM 模式: AES-256-GCM
|
|
81
|
+
2. 使用 nacl/secretbox (XSalsa20-Poly1305)
|
|
82
|
+
3. 迁移所有 DES 加密数据到 AES
|
|
83
|
+
languages:
|
|
84
|
+
- go
|
|
85
|
+
pattern-either:
|
|
86
|
+
- pattern: des.NewCipher($KEY)
|
|
87
|
+
- pattern: des.NewTripleDESCipher($KEY)
|
|
88
|
+
metadata:
|
|
89
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
90
|
+
severity: WARNING
|
|
91
|
+
precision: very-high
|
|
92
|
+
category: crypto
|
|
93
|
+
likelihood: HIGH
|
|
94
|
+
impact: CRITICAL
|
|
95
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
96
|
+
references:
|
|
97
|
+
- "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf"
|
|
98
|
+
|
|
99
|
+
# ZM-GO-WEAKCRYPTO-004: RC4 流密码使用
|
|
100
|
+
- id: zm-go-weakcrypto-004
|
|
101
|
+
severity: WARNING
|
|
102
|
+
message: |
|
|
103
|
+
检测到使用 crypto/rc4 流密码。
|
|
104
|
+
RC4 存在已知的密钥流偏向性攻击(2013年RFC 7465已禁止在TLS中使用RC4)。
|
|
105
|
+
流密码本身的使用模式若不正确也易引入重放攻击。
|
|
106
|
+
|
|
107
|
+
修复方案:
|
|
108
|
+
1. 使用 AES-GCM(认证加密)替代RC4
|
|
109
|
+
2. 或使用 ChaCha20-Poly1305 (golang.org/x/crypto/chacha20poly1305)
|
|
110
|
+
3. 所有敏感数据使用AEAD(带关联数据的认证加密)模式
|
|
111
|
+
languages:
|
|
112
|
+
- go
|
|
113
|
+
pattern-either:
|
|
114
|
+
- pattern: rc4.NewCipher($KEY)
|
|
115
|
+
metadata:
|
|
116
|
+
cwe: "CWE-326: Inadequate Encryption Strength"
|
|
117
|
+
severity: WARNING
|
|
118
|
+
precision: very-high
|
|
119
|
+
category: crypto
|
|
120
|
+
likelihood: MEDIUM
|
|
121
|
+
impact: HIGH
|
|
122
|
+
owasp: "A02:2021 - Cryptographic Failures"
|
|
123
|
+
references:
|
|
124
|
+
- "https://datatracker.ietf.org/doc/rfc7465/"
|