@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,86 @@
|
|
|
1
|
+
# CWE-798: Python 硬编码凭证检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Python 通用规则库
|
|
3
|
+
# 检测: 硬编码 API_KEY / password / token / secret / database URL 含凭证
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-PY-HC-01: 硬编码 API_KEY / SECRET_KEY / TOKEN / PASSWORD
|
|
8
|
+
- id: zm-py-hardcoded-creds-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到变量赋值中硬编码了 API_KEY / SECRET_KEY / TOKEN / PASSWORD 等凭证字符串。
|
|
12
|
+
凭证泄露到代码仓库后攻击者可获取数据库/云服务/第三方 API 访问权限。
|
|
13
|
+
修复: 使用环境变量 os.environ.get("KEY") 或密钥管理服务(Vault/AWS Secrets Manager)存储凭证。
|
|
14
|
+
languages:
|
|
15
|
+
- python
|
|
16
|
+
patterns:
|
|
17
|
+
- pattern: $VAR = "..."
|
|
18
|
+
- metavariable-regex:
|
|
19
|
+
metavariable: $VAR
|
|
20
|
+
regex: ^(API_KEY|API_SECRET|SECRET_KEY|SECRET|TOKEN|PASSWORD|PASSWD|DB_PASSWORD|REDIS_PASSWORD|AWS_SECRET|AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY|ACCESS_KEY|ACCESS_KEY_ID|PRIVATE_KEY|AUTH_TOKEN|CLIENT_SECRET|APP_SECRET)$
|
|
21
|
+
metadata:
|
|
22
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
23
|
+
severity: ERROR
|
|
24
|
+
precision: high
|
|
25
|
+
category: hardcoded-credentials
|
|
26
|
+
likelihood: HIGH
|
|
27
|
+
impact: CRITICAL
|
|
28
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
29
|
+
|
|
30
|
+
# ZM-PY-HC-02: 硬编码 Database URL 含凭证
|
|
31
|
+
- id: zm-py-hardcoded-creds-002
|
|
32
|
+
severity: ERROR
|
|
33
|
+
message: |
|
|
34
|
+
检测到硬编码的数据库连接字符串包含用户名密码(如 mysql://user:pass@host/db)。
|
|
35
|
+
DB 凭证泄露到代码仓库可导致数据库遭未授权访问或数据泄露。
|
|
36
|
+
修复: 使用环境变量或配置中心存储 DB 连接字符串;代码中仅引用变量名。
|
|
37
|
+
languages:
|
|
38
|
+
- python
|
|
39
|
+
pattern-either:
|
|
40
|
+
- pattern: |
|
|
41
|
+
$DATABASE_URL = "mysql://...:...@..."
|
|
42
|
+
- pattern: |
|
|
43
|
+
$DATABASE_URL = "postgresql://...:...@..."
|
|
44
|
+
- pattern: |
|
|
45
|
+
$DATABASE_URL = "mongodb://...:...@..."
|
|
46
|
+
- pattern: |
|
|
47
|
+
$DATABASE_URL = "redis://...:...@..."
|
|
48
|
+
- pattern: |
|
|
49
|
+
$DB_URL = "mysql://...:...@..."
|
|
50
|
+
- pattern: |
|
|
51
|
+
$DB_URL = "postgresql://...:...@..."
|
|
52
|
+
- pattern: |
|
|
53
|
+
$SQLALCHEMY_DATABASE_URI = "mysql://...:...@..."
|
|
54
|
+
- pattern: |
|
|
55
|
+
$SQLALCHEMY_DATABASE_URI = "postgresql://...:...@..."
|
|
56
|
+
metadata:
|
|
57
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
58
|
+
severity: ERROR
|
|
59
|
+
precision: medium
|
|
60
|
+
category: hardcoded-credentials
|
|
61
|
+
likelihood: MEDIUM
|
|
62
|
+
impact: CRITICAL
|
|
63
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
64
|
+
|
|
65
|
+
# ZM-PY-HC-03: 硬编码 JWT_SECRET / 加密密钥
|
|
66
|
+
- id: zm-py-hardcoded-creds-003
|
|
67
|
+
severity: ERROR
|
|
68
|
+
message: |
|
|
69
|
+
检测到硬编码的 JWT_SECRET / ENCRYPTION_KEY 等加密密钥。
|
|
70
|
+
密钥泄露后攻击者可伪造 JWT Token 或解密敏感数据。
|
|
71
|
+
修复: 通过环境变量或密钥管理服务注入密钥;定期轮换密钥。
|
|
72
|
+
languages:
|
|
73
|
+
- python
|
|
74
|
+
patterns:
|
|
75
|
+
- pattern: $VAR = "..."
|
|
76
|
+
- metavariable-regex:
|
|
77
|
+
metavariable: $VAR
|
|
78
|
+
regex: ^(JWT_SECRET|JWT_SECRET_KEY|ENCRYPTION_KEY|FERNET_KEY|AES_KEY|SECRET_KEY_BASE|SECRET_KEY|DJANGO_SECRET_KEY|FLASK_SECRET_KEY)$
|
|
79
|
+
metadata:
|
|
80
|
+
cwe: "CWE-798: Use of Hard-coded Credentials"
|
|
81
|
+
severity: ERROR
|
|
82
|
+
precision: high
|
|
83
|
+
category: hardcoded-credentials
|
|
84
|
+
likelihood: MEDIUM
|
|
85
|
+
impact: CRITICAL
|
|
86
|
+
owasp: "A07:2021 - Identification and Authentication Failures"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# CWE-89: Django SQL 注入检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Python 通用规则库
|
|
3
|
+
# 检测: raw() SQL拼接 / cursor.execute() 字符串格式化注入
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-PY-DJANGO-SQLI-01: Model.objects.raw() SQL 字符串拼接用户输入
|
|
8
|
+
- id: zm-py-django-sqli-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 raw() 中使用格式化拼接用户输入,可导致 SQL 注入。
|
|
12
|
+
攻击者可通过构造恶意参数绕过查询逻辑或拖取数据库。
|
|
13
|
+
修复: 使用 .objects.filter(**kwargs) 或 raw() + params=[] 参数化查询。
|
|
14
|
+
languages:
|
|
15
|
+
- python
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: $M.objects.raw($SQL % request)
|
|
18
|
+
- pattern: $M.objects.raw($SQL.format(request))
|
|
19
|
+
- pattern: $M.objects.raw($SQL + request)
|
|
20
|
+
- pattern: $M.objects.raw(f"...{request.$ATTR}...")
|
|
21
|
+
- pattern: $M.objects.raw("..." % request)
|
|
22
|
+
- pattern: $M.objects.raw("...".format(request))
|
|
23
|
+
- pattern: $M.objects.raw("..." + request)
|
|
24
|
+
metadata:
|
|
25
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
|
|
26
|
+
severity: ERROR
|
|
27
|
+
precision: high
|
|
28
|
+
category: sql-injection
|
|
29
|
+
likelihood: HIGH
|
|
30
|
+
impact: CRITICAL
|
|
31
|
+
owasp: "A03:2021 - Injection"
|
|
32
|
+
|
|
33
|
+
# ZM-PY-DJANGO-SQLI-02: cursor.execute() 字符串格式化注入
|
|
34
|
+
- id: zm-py-django-sqli-002
|
|
35
|
+
severity: ERROR
|
|
36
|
+
message: |
|
|
37
|
+
检测到 cursor.execute() 使用 %s/.format()/f-string 拼接 SQL,可导致 SQL 注入。
|
|
38
|
+
攻击者可注入 UNION SELECT、--注释等绕过认证或窃取数据。
|
|
39
|
+
修复: 使用参数化查询 cursor.execute("SELECT ... WHERE id=%s", [param])。
|
|
40
|
+
languages:
|
|
41
|
+
- python
|
|
42
|
+
pattern-either:
|
|
43
|
+
- pattern: $C.execute("..." % request)
|
|
44
|
+
- pattern: $C.execute("...".format(request))
|
|
45
|
+
- pattern: $C.execute("..." + request)
|
|
46
|
+
- pattern: $C.execute($SQL % request)
|
|
47
|
+
- pattern: $C.execute($SQL.format(request))
|
|
48
|
+
- pattern: $C.execute($SQL + request)
|
|
49
|
+
- pattern: $C.execute(f"...{request.$ATTR}...")
|
|
50
|
+
- pattern: $C.executemany("..." % request)
|
|
51
|
+
- pattern: $C.executemany("...".format(request))
|
|
52
|
+
metadata:
|
|
53
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)"
|
|
54
|
+
severity: ERROR
|
|
55
|
+
precision: high
|
|
56
|
+
category: sql-injection
|
|
57
|
+
likelihood: HIGH
|
|
58
|
+
impact: CRITICAL
|
|
59
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# CWE-918: Python SSRF 服务端请求伪造检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Python 通用规则库
|
|
3
|
+
# 检测: requests.get(userInput) / urllib.request.urlopen(userInput) / httpx.get(userInput)
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-PY-SSRF-01: requests.get/post/put/head 参数来自 request
|
|
8
|
+
- id: zm-py-ssrf-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 requests.get/post/put/head 等方法的 URL 参数来自 HTTP 请求。
|
|
12
|
+
攻击者可构造内网地址(如 http://169.254.169.254/latest/meta-data/)访问云元数据服务或内网服务。
|
|
13
|
+
修复: 对用户输入的 URL 做白名单校验(协议/域名/IP);禁用内网 IP 段(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16)。
|
|
14
|
+
languages:
|
|
15
|
+
- python
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: requests.get(request.args.get(...))
|
|
18
|
+
- pattern: requests.get(request.form.get(...))
|
|
19
|
+
- pattern: requests.get(request.values.get(...))
|
|
20
|
+
- pattern: requests.get(request.data)
|
|
21
|
+
- pattern: requests.get(request.json.get(...))
|
|
22
|
+
- pattern: requests.post(request.args.get(...))
|
|
23
|
+
- pattern: requests.post(request.form.get(...))
|
|
24
|
+
- pattern: requests.post(request.values.get(...))
|
|
25
|
+
- pattern: requests.post(request.data)
|
|
26
|
+
- pattern: requests.put(request.args.get(...))
|
|
27
|
+
- pattern: requests.put(request.form.get(...))
|
|
28
|
+
- pattern: requests.head(request.args.get(...))
|
|
29
|
+
- pattern: requests.head(request.form.get(...))
|
|
30
|
+
- pattern: requests.request($METHOD, request.args.get(...))
|
|
31
|
+
- pattern: requests.request($METHOD, request.form.get(...))
|
|
32
|
+
metadata:
|
|
33
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
34
|
+
severity: ERROR
|
|
35
|
+
precision: high
|
|
36
|
+
category: ssrf
|
|
37
|
+
likelihood: HIGH
|
|
38
|
+
impact: CRITICAL
|
|
39
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
40
|
+
|
|
41
|
+
# ZM-PY-SSRF-02: urllib.request.urlopen() 参数来自 request
|
|
42
|
+
- id: zm-py-ssrf-002
|
|
43
|
+
severity: ERROR
|
|
44
|
+
message: |
|
|
45
|
+
检测到 urllib.request.urlopen() / urlretrieve() 的 URL 参数来自 HTTP 请求。
|
|
46
|
+
urllib 同样支持 file:// 协议,攻击者可读取本地文件。
|
|
47
|
+
修复: 使用 urllib.parse.urlparse() 解析 URL 后做协议和主机白名单校验。
|
|
48
|
+
languages:
|
|
49
|
+
- python
|
|
50
|
+
pattern-either:
|
|
51
|
+
- pattern: urllib.request.urlopen(request.args.get(...))
|
|
52
|
+
- pattern: urllib.request.urlopen(request.form.get(...))
|
|
53
|
+
- pattern: urllib.request.urlopen(request.values.get(...))
|
|
54
|
+
- pattern: urllib.request.urlopen(request.data)
|
|
55
|
+
- pattern: urllib.request.urlretrieve(request.args.get(...), ...)
|
|
56
|
+
- pattern: urllib.request.urlretrieve(request.form.get(...), ...)
|
|
57
|
+
- pattern: urllib.request.urlopen($BASE + request.args.get(...))
|
|
58
|
+
- pattern: urllib.request.urlopen($BASE + request.form.get(...))
|
|
59
|
+
- pattern: urllib.request.urlopen(f"...{request.args.get(...)}...")
|
|
60
|
+
- pattern: urllib.request.urlopen(f"...{request.form.get(...)}...")
|
|
61
|
+
- pattern: urllib.urlopen(request.args.get(...))
|
|
62
|
+
- pattern: urllib.urlopen(request.form.get(...))
|
|
63
|
+
- pattern: urllib2.urlopen(request.args.get(...))
|
|
64
|
+
- pattern: urllib2.urlopen(request.form.get(...))
|
|
65
|
+
metadata:
|
|
66
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
67
|
+
severity: ERROR
|
|
68
|
+
precision: high
|
|
69
|
+
category: ssrf
|
|
70
|
+
likelihood: HIGH
|
|
71
|
+
impact: CRITICAL
|
|
72
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
73
|
+
|
|
74
|
+
# ZM-PY-SSRF-03: httpx.get/post 参数来自 request
|
|
75
|
+
- id: zm-py-ssrf-003
|
|
76
|
+
severity: ERROR
|
|
77
|
+
message: |
|
|
78
|
+
检测到 httpx.get/post/AsyncClient 的 URL 参数来自 HTTP 请求。
|
|
79
|
+
httpx 同样可能被利用进行 SSRF 攻击访问内网服务或云元数据。
|
|
80
|
+
修复: 校验用户输入 URL 协议仅允许 http/https;禁止解析到内网 IP。
|
|
81
|
+
languages:
|
|
82
|
+
- python
|
|
83
|
+
pattern-either:
|
|
84
|
+
- pattern: httpx.get(request.args.get(...))
|
|
85
|
+
- pattern: httpx.get(request.form.get(...))
|
|
86
|
+
- pattern: httpx.get(request.values.get(...))
|
|
87
|
+
- pattern: httpx.post(request.args.get(...))
|
|
88
|
+
- pattern: httpx.post(request.form.get(...))
|
|
89
|
+
- pattern: httpx.AsyncClient().get(request.args.get(...))
|
|
90
|
+
- pattern: httpx.AsyncClient().get(request.form.get(...))
|
|
91
|
+
- pattern: httpx.AsyncClient().post(request.args.get(...))
|
|
92
|
+
- pattern: httpx.AsyncClient().post(request.form.get(...))
|
|
93
|
+
metadata:
|
|
94
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
95
|
+
severity: ERROR
|
|
96
|
+
precision: high
|
|
97
|
+
category: ssrf
|
|
98
|
+
likelihood: HIGH
|
|
99
|
+
impact: CRITICAL
|
|
100
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
101
|
+
|
|
102
|
+
# ZM-PY-SSRF-04: aiohttp.ClientSession().get() 参数来自 request
|
|
103
|
+
- id: zm-py-ssrf-004
|
|
104
|
+
severity: ERROR
|
|
105
|
+
message: |
|
|
106
|
+
检测到 aiohttp.ClientSession().get/post 的 URL 参数来自 HTTP 请求。
|
|
107
|
+
异步 HTTP 客户端同样存在 SSRF 风险。
|
|
108
|
+
修复: 对用户输入 URL 做严格白名单校验;禁止访问内网地址段。
|
|
109
|
+
languages:
|
|
110
|
+
- python
|
|
111
|
+
pattern-either:
|
|
112
|
+
- pattern: aiohttp.ClientSession().get(request.args.get(...))
|
|
113
|
+
- pattern: aiohttp.ClientSession().get(request.form.get(...))
|
|
114
|
+
- pattern: aiohttp.ClientSession().post(request.args.get(...))
|
|
115
|
+
- pattern: aiohttp.ClientSession().post(request.form.get(...))
|
|
116
|
+
metadata:
|
|
117
|
+
cwe: "CWE-918: Server-Side Request Forgery (SSRF)"
|
|
118
|
+
severity: ERROR
|
|
119
|
+
precision: high
|
|
120
|
+
category: ssrf
|
|
121
|
+
likelihood: HIGH
|
|
122
|
+
impact: CRITICAL
|
|
123
|
+
owasp: "A10:2021 - Server-Side Request Forgery"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# CWE-94: Flask/Jinja2 Server-Side Template Injection (SSTI) 检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Python 通用规则库
|
|
3
|
+
# 检测: render_template_string / jinja2.Template 用户输入注入点
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-PY-SSTI-01: render_template_string() 参数来自 request
|
|
8
|
+
- id: zm-py-ssti-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 render_template_string() 参数来自 HTTP 请求。
|
|
12
|
+
攻击者可注入 Jinja2 模板语法 {{config}} {{''.__class__.__mro__[2].__subclasses__()}}
|
|
13
|
+
读取敏感配置或实现 RCE。
|
|
14
|
+
修复: 禁止将用户输入传入 render_template_string();使用 render_template() + 模板文件。
|
|
15
|
+
languages:
|
|
16
|
+
- python
|
|
17
|
+
pattern-either:
|
|
18
|
+
- pattern: flask.render_template_string(request.args.get(...))
|
|
19
|
+
- pattern: flask.render_template_string(request.form.get(...))
|
|
20
|
+
- pattern: flask.render_template_string(request.values.get(...))
|
|
21
|
+
- pattern: render_template_string(request.args.get(...))
|
|
22
|
+
- pattern: render_template_string(request.form.get(...))
|
|
23
|
+
- pattern: render_template_string(request.values.get(...))
|
|
24
|
+
- pattern: render_template_string(request.data)
|
|
25
|
+
- pattern: render_template_string(request.get_json().get(...))
|
|
26
|
+
- pattern: render_template_string(request.json.get(...))
|
|
27
|
+
metadata:
|
|
28
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
29
|
+
severity: ERROR
|
|
30
|
+
precision: high
|
|
31
|
+
category: ssti
|
|
32
|
+
likelihood: HIGH
|
|
33
|
+
impact: CRITICAL
|
|
34
|
+
owasp: "A03:2021 - Injection"
|
|
35
|
+
|
|
36
|
+
# ZM-PY-SSTI-02: jinja2.Template() 用户输入直接作为模板
|
|
37
|
+
- id: zm-py-ssti-002
|
|
38
|
+
severity: ERROR
|
|
39
|
+
message: |
|
|
40
|
+
检测到 jinja2.Template() 直接使用用户输入作为模板字符串。
|
|
41
|
+
攻击者可嵌入 SSTI payload 实现任意代码执行。
|
|
42
|
+
修复: 不要将用户输入作为模板字符串;使用预定义模板文件 + 变量绑定。
|
|
43
|
+
languages:
|
|
44
|
+
- python
|
|
45
|
+
pattern-either:
|
|
46
|
+
- pattern: jinja2.Template(request.args.get(...)).render()
|
|
47
|
+
- pattern: jinja2.Template(request.form.get(...)).render()
|
|
48
|
+
- pattern: jinja2.Template(request.values.get(...)).render()
|
|
49
|
+
- pattern: Template(request.args.get(...)).render()
|
|
50
|
+
- pattern: Template(request.form.get(...)).render()
|
|
51
|
+
- pattern: Template(request.values.get(...)).render()
|
|
52
|
+
metadata:
|
|
53
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
54
|
+
severity: ERROR
|
|
55
|
+
precision: high
|
|
56
|
+
category: ssti
|
|
57
|
+
likelihood: HIGH
|
|
58
|
+
impact: CRITICAL
|
|
59
|
+
owasp: "A03:2021 - Injection"
|
|
60
|
+
|
|
61
|
+
# ZM-PY-SSTI-03: Markup() 包装用户输入(等效模板 |safe 过滤器)
|
|
62
|
+
- id: zm-py-ssti-003
|
|
63
|
+
severity: WARNING
|
|
64
|
+
message: |
|
|
65
|
+
检测到 flask.Markup() / markupsafe.Markup() 包装用户输入,等效模板 |safe 过滤器。
|
|
66
|
+
绕过自动转义后,用户 HTML/JS 将直接渲染导致 XSS,若含 Jinja2 语法则升级为 SSTI。
|
|
67
|
+
修复: 移除 Markup() 包装使用默认自动转义。
|
|
68
|
+
languages:
|
|
69
|
+
- python
|
|
70
|
+
pattern-either:
|
|
71
|
+
- pattern: flask.Markup(request.args.get(...))
|
|
72
|
+
- pattern: flask.Markup(request.form.get(...))
|
|
73
|
+
- pattern: flask.Markup(request.values.get(...))
|
|
74
|
+
- pattern: markupsafe.Markup(request.args.get(...))
|
|
75
|
+
- pattern: markupsafe.Markup(request.form.get(...))
|
|
76
|
+
- pattern: markupsafe.Markup(request.values.get(...))
|
|
77
|
+
- pattern: Markup(request.args.get(...))
|
|
78
|
+
- pattern: Markup(request.form.get(...))
|
|
79
|
+
- pattern: Markup(request.values.get(...))
|
|
80
|
+
metadata:
|
|
81
|
+
cwe: "CWE-94: Improper Control of Generation of Code (Code Injection)"
|
|
82
|
+
severity: WARNING
|
|
83
|
+
precision: medium
|
|
84
|
+
category: ssti
|
|
85
|
+
likelihood: MEDIUM
|
|
86
|
+
impact: HIGH
|
|
87
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# CWE-943: Python NoSQL 注入检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 — Python 通用规则库
|
|
3
|
+
# 检测: $where / $regex / $ne 用户输入直接传入 MongoDB/PyMongo/Motor 查询构造
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-PY-NOSQL-01: MongoDB $where 操作符 + 用户输入
|
|
8
|
+
- id: zm-py-nosql-injection-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 MongoDB 查询中使用 $where 操作符且参数来自 HTTP 请求。
|
|
12
|
+
$where 允许执行任意 JavaScript 表达式,攻击者可注入恶意 JS 代码获取全量数据或执行 DoS。
|
|
13
|
+
修复: 禁止在查询中使用 $where;如确需复杂查询使用 $expr + 聚合管道替代。
|
|
14
|
+
languages:
|
|
15
|
+
- python
|
|
16
|
+
pattern-either:
|
|
17
|
+
- pattern: |
|
|
18
|
+
{"$where": request.args.get(...)}
|
|
19
|
+
- pattern: |
|
|
20
|
+
{"$where": request.form.get(...)}
|
|
21
|
+
- pattern: |
|
|
22
|
+
{"$where": request.values.get(...)}
|
|
23
|
+
- pattern: |
|
|
24
|
+
{"$where": request.data}
|
|
25
|
+
- pattern: |
|
|
26
|
+
{"$where": $USER_VAR}
|
|
27
|
+
- pattern: '$COLL.find({"$where": request.args.get(...)})'
|
|
28
|
+
- pattern: '$COLL.find({"$where": request.form.get(...)})'
|
|
29
|
+
- pattern: '$COLL.find({"$where": request.values.get(...)})'
|
|
30
|
+
- pattern: '$COLL.find({"$where": $USER_VAR})'
|
|
31
|
+
metadata:
|
|
32
|
+
cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
|
|
33
|
+
severity: ERROR
|
|
34
|
+
precision: high
|
|
35
|
+
category: nosql-injection
|
|
36
|
+
likelihood: HIGH
|
|
37
|
+
impact: CRITICAL
|
|
38
|
+
owasp: "A03:2021 - Injection"
|
|
39
|
+
|
|
40
|
+
# ZM-PY-NOSQL-02: MongoDB $regex 操作符 + 用户输入
|
|
41
|
+
- id: zm-py-nosql-injection-002
|
|
42
|
+
severity: WARNING
|
|
43
|
+
message: |
|
|
44
|
+
检测到 MongoDB 查询中 $regex 操作符参数来自 HTTP 请求。
|
|
45
|
+
攻击者可构造 ^ 锚点绕过正则匹配或 ReDoS 正则拒绝服务攻击耗尽 CPU。
|
|
46
|
+
修复: 对用户输入做正则特殊字符转义(re.escape);限制正则复杂度。
|
|
47
|
+
languages:
|
|
48
|
+
- python
|
|
49
|
+
pattern-either:
|
|
50
|
+
- pattern: |
|
|
51
|
+
{"$regex": request.args.get(...)}
|
|
52
|
+
- pattern: |
|
|
53
|
+
{"$regex": request.form.get(...)}
|
|
54
|
+
- pattern: |
|
|
55
|
+
{"$regex": request.values.get(...)}
|
|
56
|
+
- pattern: '$COLL.find({"$KEY": {"$regex": request.args.get(...)}})'
|
|
57
|
+
- pattern: '$COLL.find({"$KEY": {"$regex": request.form.get(...)}})'
|
|
58
|
+
- pattern: '$COLL.find({"$KEY": {"$regex": request.values.get(...)}})'
|
|
59
|
+
metadata:
|
|
60
|
+
cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
|
|
61
|
+
severity: WARNING
|
|
62
|
+
precision: medium
|
|
63
|
+
category: nosql-injection
|
|
64
|
+
likelihood: MEDIUM
|
|
65
|
+
impact: HIGH
|
|
66
|
+
owasp: "A03:2021 - Injection"
|
|
67
|
+
|
|
68
|
+
# ZM-PY-NOSQL-03: MongoDB 查询操作符 $ne / $gt / $lt 直接由用户输入构造
|
|
69
|
+
- id: zm-py-nosql-injection-003
|
|
70
|
+
severity: WARNING
|
|
71
|
+
message: |
|
|
72
|
+
检测到 MongoDB 查询字典直接由 HTTP 请求参数构造,攻击者可注入 $ne 等操作符绕过认证/授权。
|
|
73
|
+
例如 POST {"username":"admin","password":{"$ne":""}} 可绕过登录。
|
|
74
|
+
修复: 使用 mongo-sanitize 或 mquery 库清理用户输入中的 $ 前缀操作符;对输入做类型校验。
|
|
75
|
+
languages:
|
|
76
|
+
- python
|
|
77
|
+
pattern-either:
|
|
78
|
+
- pattern: $COLL.find_one(request.json)
|
|
79
|
+
- pattern: $COLL.find_one(request.get_json())
|
|
80
|
+
- pattern: $COLL.find_one(request.args)
|
|
81
|
+
- pattern: $COLL.find_one(request.form)
|
|
82
|
+
- pattern: $COLL.find(request.json)
|
|
83
|
+
- pattern: $COLL.find(request.get_json())
|
|
84
|
+
- pattern: $COLL.find(request.args)
|
|
85
|
+
- pattern: $COLL.find(request.form)
|
|
86
|
+
- pattern: $COLL.find(request.POST)
|
|
87
|
+
- pattern: $COLL.find_one(request.POST)
|
|
88
|
+
metadata:
|
|
89
|
+
cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
|
|
90
|
+
severity: WARNING
|
|
91
|
+
precision: high
|
|
92
|
+
category: nosql-injection
|
|
93
|
+
likelihood: HIGH
|
|
94
|
+
impact: HIGH
|
|
95
|
+
owasp: "A03:2021 - Injection"
|
|
96
|
+
|
|
97
|
+
# ZM-PY-NOSQL-04: Motor (Async MongoDB) 查询 + 用户输入
|
|
98
|
+
- id: zm-py-nosql-injection-004
|
|
99
|
+
severity: WARNING
|
|
100
|
+
message: |
|
|
101
|
+
检测到 Motor (异步 MongoDB 驱动) 的 find/find_one 查询参数直接来自 HTTP 请求。
|
|
102
|
+
攻击者可注入 $ne/$gt/$where 等操作符实现 NoSQL 注入。
|
|
103
|
+
修复: 对查询条件中的用户输入做类型校验和 $ 操作符过滤。
|
|
104
|
+
languages:
|
|
105
|
+
- python
|
|
106
|
+
pattern-either:
|
|
107
|
+
- pattern: motor.motor_asyncio.AsyncIOMotorCollection.find(request.json)
|
|
108
|
+
- pattern: motor.motor_asyncio.AsyncIOMotorCollection.find_one(request.json)
|
|
109
|
+
- pattern: $COLL.find(request.args.get(...))
|
|
110
|
+
- pattern: $COLL.find(request.form.get(...))
|
|
111
|
+
- pattern: '$COLL.find({"$KEY": request.args.get(...)})'
|
|
112
|
+
- pattern: '$COLL.find({"$KEY": request.form.get(...)})'
|
|
113
|
+
- pattern: '$COLL.find({"$KEY": request.values.get(...)})'
|
|
114
|
+
- pattern: '$COLL.find_one({"$KEY": request.args.get(...)})'
|
|
115
|
+
- pattern: '$COLL.find_one({"$KEY": request.form.get(...)})'
|
|
116
|
+
metadata:
|
|
117
|
+
cwe: "CWE-943: Improper Neutralization of Special Elements in Data Query Logic"
|
|
118
|
+
severity: WARNING
|
|
119
|
+
precision: medium
|
|
120
|
+
category: nosql-injection
|
|
121
|
+
likelihood: MEDIUM
|
|
122
|
+
impact: HIGH
|
|
123
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# 逐码 ZhuMa IaC 规则 — Ansible 权限提升检测
|
|
2
|
+
# V4.1 Sprint — CWE-269: Improper Privilege Management
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
# ZM-ANSIBLE-CWE269-001: become: yes 未限制 become_user
|
|
6
|
+
- id: zm-ansible-cwe269-privesc-001
|
|
7
|
+
severity: HIGH
|
|
8
|
+
message: |
|
|
9
|
+
Ansible Playbook 中 `become: yes` 未同时指定 `become_user` — 默认升级为 root 用户执行所有任务。
|
|
10
|
+
应在 Play 或 Task 级别明确指定 `become_user` 为最小权限所需的非 root 用户:
|
|
11
|
+
```yaml
|
|
12
|
+
become: yes
|
|
13
|
+
become_user: appuser
|
|
14
|
+
```
|
|
15
|
+
languages:
|
|
16
|
+
- generic
|
|
17
|
+
pattern: |
|
|
18
|
+
become: yes
|
|
19
|
+
pattern-not: |
|
|
20
|
+
become_user: $USER
|
|
21
|
+
metadata:
|
|
22
|
+
cwe: "CWE-269: Improper Privilege Management"
|
|
23
|
+
category: iac-ansible
|
|
24
|
+
precision: medium
|
|
25
|
+
confidence: high
|
|
26
|
+
tags: [ansible, privilege-escalation, become, root]
|
|
27
|
+
|
|
28
|
+
# ZM-ANSIBLE-CWE269-002: become: true (另一种写法)
|
|
29
|
+
- id: zm-ansible-cwe269-privesc-002
|
|
30
|
+
severity: HIGH
|
|
31
|
+
message: |
|
|
32
|
+
Ansible Playbook 中 `become: true` 未限制 `become_user` — 可能意外升级为 root。
|
|
33
|
+
明确指定 `become_user` 并确保目标用户具有完成任务的必要权限而不需要完整 root 权限。
|
|
34
|
+
languages:
|
|
35
|
+
- generic
|
|
36
|
+
pattern: |
|
|
37
|
+
become: true
|
|
38
|
+
pattern-not: |
|
|
39
|
+
become_user: $USER
|
|
40
|
+
metadata:
|
|
41
|
+
cwe: "CWE-269: Improper Privilege Management"
|
|
42
|
+
category: iac-ansible
|
|
43
|
+
precision: medium
|
|
44
|
+
confidence: high
|
|
45
|
+
tags: [ansible, privilege-escalation, become, root]
|
|
46
|
+
|
|
47
|
+
# ZM-ANSIBLE-CWE269-003: become_method: su 配合 become: yes
|
|
48
|
+
- id: zm-ansible-cwe269-privesc-003
|
|
49
|
+
severity: MEDIUM
|
|
50
|
+
message: |
|
|
51
|
+
Ansible 使用 `become_method: su` — su 方法对密码处理不够安全,且通常意味着直接升级为 root。
|
|
52
|
+
优先使用 `become_method: sudo` 并配合 `/etc/sudoers` 中的细粒度 sudo 规则,
|
|
53
|
+
仅授予必要命令的执行权限,遵循最小权限原则。
|
|
54
|
+
languages:
|
|
55
|
+
- generic
|
|
56
|
+
pattern: |
|
|
57
|
+
become_method: su
|
|
58
|
+
metadata:
|
|
59
|
+
cwe: "CWE-269: Improper Privilege Management"
|
|
60
|
+
category: iac-ansible
|
|
61
|
+
precision: very-high
|
|
62
|
+
confidence: high
|
|
63
|
+
tags: [ansible, privilege-escalation, become_method, su]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 逐码 ZhuMa IaC 规则 — Ansible Shell/Command 注入检测
|
|
2
|
+
# V4.1 Sprint — CWE-78: OS Command Injection
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
# ZM-ANSIBLE-CWE78-001: shell 模块 + 未经 quote 的变量
|
|
6
|
+
- id: zm-ansible-cwe78-cmdi-001
|
|
7
|
+
severity: CRITICAL
|
|
8
|
+
message: |
|
|
9
|
+
Ansible `shell` 模块中使用了未经 `quote` 过滤的变量 `{{ user_input }}` — 攻击者可通过变量注入任意 Shell 命令。
|
|
10
|
+
对所有用户可控变量使用 `{{ var | quote }}` 过滤器,或将命令重构为 `command` 模块(天然不调用 Shell)。
|
|
11
|
+
示例修复:
|
|
12
|
+
```yaml
|
|
13
|
+
shell: echo {{ user_input | quote }}
|
|
14
|
+
```
|
|
15
|
+
languages:
|
|
16
|
+
- generic
|
|
17
|
+
pattern-either:
|
|
18
|
+
- pattern: |
|
|
19
|
+
shell: "{{ $VAR }}"
|
|
20
|
+
- pattern: |
|
|
21
|
+
shell: "...{{ $VAR }}..."
|
|
22
|
+
metadata:
|
|
23
|
+
cwe: "CWE-78: OS Command Injection"
|
|
24
|
+
category: iac-ansible
|
|
25
|
+
precision: medium
|
|
26
|
+
confidence: high
|
|
27
|
+
tags: [ansible, command-injection, shell, variable]
|
|
28
|
+
|
|
29
|
+
# ZM-ANSIBLE-CWE78-002: command 模块 + 直接变量拼接
|
|
30
|
+
- id: zm-ansible-cwe78-cmdi-002
|
|
31
|
+
severity: HIGH
|
|
32
|
+
message: |
|
|
33
|
+
Ansible `command` 模块中直接拼接用户变量 `{{ user_input }}` — 虽然不经过 Shell,但攻击者仍可注入命令参数。
|
|
34
|
+
使用 `{{ var | quote }}` 或将变量作为 `args` 传递以限制注入面。
|
|
35
|
+
languages:
|
|
36
|
+
- generic
|
|
37
|
+
pattern-either:
|
|
38
|
+
- pattern: |
|
|
39
|
+
command: "...{{ $VAR }}..."
|
|
40
|
+
- pattern: |
|
|
41
|
+
command: "{{ $VAR }}"
|
|
42
|
+
metadata:
|
|
43
|
+
cwe: "CWE-78: OS Command Injection"
|
|
44
|
+
category: iac-ansible
|
|
45
|
+
precision: medium
|
|
46
|
+
confidence: high
|
|
47
|
+
tags: [ansible, command-injection, command, variable]
|
|
48
|
+
|
|
49
|
+
# ZM-ANSIBLE-CWE78-003: raw 模块 + 变量
|
|
50
|
+
- id: zm-ansible-cwe78-cmdi-003
|
|
51
|
+
severity: CRITICAL
|
|
52
|
+
message: |
|
|
53
|
+
Ansible `raw` 模块直接执行 SSH 命令,并将变量 `{{ user_input }}` 直接拼入命令 — 等同于远程命令执行。
|
|
54
|
+
`raw` 模块应避免使用用户变量。如必须使用,请用 `{{ var | quote }}` 并在任务文档中记录理由。
|
|
55
|
+
languages:
|
|
56
|
+
- generic
|
|
57
|
+
pattern-either:
|
|
58
|
+
- pattern: |
|
|
59
|
+
raw: "...{{ $VAR }}..."
|
|
60
|
+
- pattern: |
|
|
61
|
+
raw: "{{ $VAR }}"
|
|
62
|
+
metadata:
|
|
63
|
+
cwe: "CWE-78: OS Command Injection"
|
|
64
|
+
category: iac-ansible
|
|
65
|
+
precision: medium
|
|
66
|
+
confidence: high
|
|
67
|
+
tags: [ansible, command-injection, raw, rce]
|