@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,108 @@
|
|
|
1
|
+
# CWE-611: Node.js XML外部实体注入(XXE)检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 2 — JS/TS 规则库
|
|
3
|
+
# 覆盖: libxmljs、xml2js、xml-js、fast-xml-parser
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JS-XXE-001: libxmljs.parseXml 未禁用 noent / xinclude
|
|
8
|
+
- id: zm-js-xxe-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到 libxmljs.parseXml() 可能未禁用外部实体解析。
|
|
12
|
+
若设置了 noent: true(展开实体)且未同时禁用外部资源加载,攻击者可通过
|
|
13
|
+
恶意XML读取任意文件(如 /etc/passwd)或发起SSRF。
|
|
14
|
+
|
|
15
|
+
修复:
|
|
16
|
+
1. libxmljs.parseXml(xml, { noent: false, noNet: true })
|
|
17
|
+
2. 或 libxmljs.parseXmlString(xml, { noent: false })
|
|
18
|
+
3. 禁用 DTD 加载: { dtdload: false, doctype: false }
|
|
19
|
+
4. 升级 libxmljs 到最新版本,检查安全公告
|
|
20
|
+
languages:
|
|
21
|
+
- javascript
|
|
22
|
+
- typescript
|
|
23
|
+
pattern-either:
|
|
24
|
+
- pattern: libxmljs.parseXml(...)
|
|
25
|
+
- pattern: $LIBXML.parseXml(...)
|
|
26
|
+
- pattern: libxmljs.parseXmlString(...)
|
|
27
|
+
- pattern: $LIBXML.parseXmlString(...)
|
|
28
|
+
- pattern: libxmljs.parseHtml(...)
|
|
29
|
+
- pattern: $LIBXML.parseHtml(...)
|
|
30
|
+
- pattern: $LIBXML.parseXml($REQ.body, ...)
|
|
31
|
+
- pattern: $LIBXML.parseXml($REQ.query, ...)
|
|
32
|
+
- pattern: $LIBXML.parseXmlString($REQ.body, ...)
|
|
33
|
+
- pattern: $LIBXML.parseXmlString($REQ.query, ...)
|
|
34
|
+
metadata:
|
|
35
|
+
cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
|
|
36
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
37
|
+
category: xxe
|
|
38
|
+
precision: medium
|
|
39
|
+
references:
|
|
40
|
+
- "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
|
|
41
|
+
- "https://github.com/libxmljs/libxmljs/wiki/Security"
|
|
42
|
+
|
|
43
|
+
# ZM-JS-XXE-002: xml2js.Parser 默认配置不安全
|
|
44
|
+
- id: zm-js-xxe-002
|
|
45
|
+
severity: ERROR
|
|
46
|
+
message: |
|
|
47
|
+
检测到 xml2js.Parser / xml2js.parseString 可能未禁用实体解析和外部DTD加载。
|
|
48
|
+
默认 xml2js 本身不解析实体,但底层 sax parser 可能受XXE影响。
|
|
49
|
+
|
|
50
|
+
修复:
|
|
51
|
+
1. new xml2js.Parser({ explicitCharkey: true, ... }) 本身较安全
|
|
52
|
+
2. 如使用 xml2js 配合其他XML解析器,需确保底层解析器禁用DTD/实体
|
|
53
|
+
3. 升级 xml2js 到 >=0.5.0 版本
|
|
54
|
+
4. 可选替代: fast-xml-parser (默认安全)
|
|
55
|
+
languages:
|
|
56
|
+
- javascript
|
|
57
|
+
- typescript
|
|
58
|
+
pattern-either:
|
|
59
|
+
- pattern: new xml2js.Parser(...)
|
|
60
|
+
- pattern: xml2js.parseString($REQ.body, ...)
|
|
61
|
+
- pattern: xml2js.parseString($REQ.query, ...)
|
|
62
|
+
- pattern: xml2js.parseString($REQ.params, ...)
|
|
63
|
+
- pattern: $PARSER.parseString($REQ.body, ...)
|
|
64
|
+
- pattern: $PARSER.parseString($REQ.query, ...)
|
|
65
|
+
- pattern: $PARSER.parseString($REQ.params, ...)
|
|
66
|
+
metadata:
|
|
67
|
+
cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
|
|
68
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
69
|
+
category: xxe
|
|
70
|
+
precision: medium
|
|
71
|
+
references:
|
|
72
|
+
- "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
|
|
73
|
+
|
|
74
|
+
# ZM-JS-XXE-003: xml-js / fast-xml-parser 用户输入XML解析
|
|
75
|
+
- id: zm-js-xxe-003
|
|
76
|
+
severity: WARNING
|
|
77
|
+
message: |
|
|
78
|
+
检测到使用 xml-js / fast-xml-parser 解析来自 req.body / req.query 的用户输入XML。
|
|
79
|
+
虽然 fast-xml-parser 默认不解析DTD/实体(xml-js类似),但仍需注意:
|
|
80
|
+
- fast-xml-parser: 默认 processEntities: false, ignoreAttributes: false 基本安全
|
|
81
|
+
- xml-js: 纯JS实现不解析DTD,但Billion Laughs攻击可能仍影响内存
|
|
82
|
+
|
|
83
|
+
修复:
|
|
84
|
+
1. fast-xml-parser: 确认 options 中 processEntities 为 false
|
|
85
|
+
2. xml-js: 设置大小限制防止Billion Laughs/Quadratic Blowup
|
|
86
|
+
3. 所有XML解析器: 设置输入大小上限,使用流式解析
|
|
87
|
+
languages:
|
|
88
|
+
- javascript
|
|
89
|
+
- typescript
|
|
90
|
+
pattern-either:
|
|
91
|
+
- pattern: xmljs.xml2js($REQ.body, ...)
|
|
92
|
+
- pattern: xmljs.xml2js($REQ.query, ...)
|
|
93
|
+
- pattern: xmljs.xml2json($REQ.body, ...)
|
|
94
|
+
- pattern: xmljs.xml2json($REQ.query, ...)
|
|
95
|
+
- pattern: convert.xml2js($REQ.body, ...)
|
|
96
|
+
- pattern: convert.xml2json($REQ.body, ...)
|
|
97
|
+
- pattern: XMLParser.parse($REQ.body, ...)
|
|
98
|
+
- pattern: XMLParser.parse($REQ.query, ...)
|
|
99
|
+
- pattern: xmlParser.parse($REQ.body, ...)
|
|
100
|
+
- pattern: xmlParser.parse($REQ.query, ...)
|
|
101
|
+
metadata:
|
|
102
|
+
cwe: "CWE-611: Improper Restriction of XML External Entity Reference"
|
|
103
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
104
|
+
category: xxe
|
|
105
|
+
precision: low
|
|
106
|
+
references:
|
|
107
|
+
- "https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing"
|
|
108
|
+
- "https://github.com/NaturalIntelligence/fast-xml-parser"
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# CWE-639: Node.js 不安全直接对象引用 (IDOR) 检测
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint — JS/TS 规则库
|
|
3
|
+
# 覆盖: req.params.id直传DB查询、express路由参数未校验所有权
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JS-IDOR-001: req.params.id 直接传入数据库查询无所有权校验
|
|
8
|
+
- id: zm-js-idor-001
|
|
9
|
+
severity: WARNING
|
|
10
|
+
message: |
|
|
11
|
+
检测到 Express 路由中 req.params.id 直接传入数据库查询(如 findById / findOne),
|
|
12
|
+
未发现所有权校验(如关联 currentUser.id 过滤)。
|
|
13
|
+
|
|
14
|
+
攻击者可通过遍历ID访问其他用户的资源(订单、文档、个人资料等):
|
|
15
|
+
GET /api/orders/123 → 修改为 GET /api/orders/124 可查看他人订单
|
|
16
|
+
|
|
17
|
+
修复:
|
|
18
|
+
1. 查询时关联当前用户: Model.findOne({ _id: id, userId: req.user.id })
|
|
19
|
+
2. 使用中间件校验资源所有权后再执行控制器
|
|
20
|
+
3. 使用 UUID/nanoid 替代自增ID
|
|
21
|
+
4. 在数据访问层统一添加所有权过滤
|
|
22
|
+
languages:
|
|
23
|
+
- javascript
|
|
24
|
+
- typescript
|
|
25
|
+
patterns:
|
|
26
|
+
- pattern-either:
|
|
27
|
+
# Mongoose
|
|
28
|
+
- pattern: |
|
|
29
|
+
$MODEL.findById($REQ.params.$ID, ...)
|
|
30
|
+
- pattern: |
|
|
31
|
+
$MODEL.findOne({_id: $REQ.params.$ID, ...}, ...)
|
|
32
|
+
- pattern: |
|
|
33
|
+
$MODEL.findByIdAndUpdate($REQ.params.$ID, ...)
|
|
34
|
+
- pattern: |
|
|
35
|
+
$MODEL.findByIdAndDelete($REQ.params.$ID, ...)
|
|
36
|
+
# Sequelize
|
|
37
|
+
- pattern: |
|
|
38
|
+
$MODEL.findByPk($REQ.params.$ID, ...)
|
|
39
|
+
- pattern: |
|
|
40
|
+
$MODEL.findOne({where: {id: $REQ.params.$ID, ...}}, ...)
|
|
41
|
+
- pattern: |
|
|
42
|
+
$MODEL.destroy({where: {id: $REQ.params.$ID, ...}}, ...)
|
|
43
|
+
# Knex
|
|
44
|
+
- pattern: |
|
|
45
|
+
$DB($TABLE).where('id', $REQ.params.$ID)
|
|
46
|
+
- pattern: |
|
|
47
|
+
$DB($TABLE).where({id: $REQ.params.$ID})
|
|
48
|
+
- pattern-not-inside: |
|
|
49
|
+
{...userId: ..., ...}
|
|
50
|
+
- pattern-not-inside: |
|
|
51
|
+
{...user: ..., ...}
|
|
52
|
+
metadata:
|
|
53
|
+
cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
|
|
54
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
55
|
+
category: idor
|
|
56
|
+
precision: medium
|
|
57
|
+
confidence: high
|
|
58
|
+
references:
|
|
59
|
+
- "https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References"
|
|
60
|
+
|
|
61
|
+
# ZM-JS-IDOR-002: req.body.xxx 资源ID未校验所有权写入
|
|
62
|
+
- id: zm-js-idor-002
|
|
63
|
+
severity: WARNING
|
|
64
|
+
message: |
|
|
65
|
+
检测到使用 req.body.xxx 中的资源ID进行更新/删除操作,未关联当前用户身份校验。
|
|
66
|
+
攻击者可修改请求体中的ID字段,越权操作他人的资源。
|
|
67
|
+
|
|
68
|
+
修复:
|
|
69
|
+
1. 从认证上下文获取当前用户ID,而非从请求体
|
|
70
|
+
2. 查询时添加所有权过滤条件
|
|
71
|
+
3. 使用 JWT token 中提取的用户身份做关联
|
|
72
|
+
languages:
|
|
73
|
+
- javascript
|
|
74
|
+
- typescript
|
|
75
|
+
patterns:
|
|
76
|
+
- pattern-either:
|
|
77
|
+
- pattern: |
|
|
78
|
+
$MODEL.updateOne({_id: $REQ.body.$ID, ...}, ...)
|
|
79
|
+
- pattern: |
|
|
80
|
+
$MODEL.updateMany({_id: $REQ.body.$ID, ...}, ...)
|
|
81
|
+
- pattern: |
|
|
82
|
+
$MODEL.deleteOne({_id: $REQ.body.$ID, ...})
|
|
83
|
+
- pattern: |
|
|
84
|
+
$MODEL.findOneAndUpdate({_id: $REQ.body.$ID, ...}, ...)
|
|
85
|
+
- pattern-not-inside: |
|
|
86
|
+
{...userId: ..., ...}
|
|
87
|
+
- pattern-not-inside: |
|
|
88
|
+
{...user: ..., ...}
|
|
89
|
+
metadata:
|
|
90
|
+
cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
|
|
91
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
92
|
+
category: idor
|
|
93
|
+
precision: medium
|
|
94
|
+
confidence: high
|
|
95
|
+
|
|
96
|
+
# ZM-JS-IDOR-003: GraphQL resolver 直接使用 args.id 无权限校验
|
|
97
|
+
- id: zm-js-idor-003
|
|
98
|
+
severity: WARNING
|
|
99
|
+
message: |
|
|
100
|
+
检测到 GraphQL resolver 中直接使用 args.id 查询数据库,无所有权校验。
|
|
101
|
+
GraphQL 查询可任意指定ID参数,需在 resolver 中校验资源所属。
|
|
102
|
+
|
|
103
|
+
修复:
|
|
104
|
+
1. 在 resolver 中从 context 获取当前用户并关联查询
|
|
105
|
+
2. 使用 DataLoader 批量加载时自动注入所有权过滤
|
|
106
|
+
3. 实现 GraphQL shield / 自定义 directive 做权限控制
|
|
107
|
+
languages:
|
|
108
|
+
- javascript
|
|
109
|
+
- typescript
|
|
110
|
+
pattern-either:
|
|
111
|
+
- pattern: |
|
|
112
|
+
$MODEL.findById($ARGS.id, ...)
|
|
113
|
+
- pattern: |
|
|
114
|
+
$MODEL.findOne({_id: $ARGS.id, ...}, ...)
|
|
115
|
+
- pattern: |
|
|
116
|
+
$MODEL.findByPk($ARGS.id, ...)
|
|
117
|
+
metadata:
|
|
118
|
+
cwe: "CWE-639: Authorization Bypass Through User-Controlled Key"
|
|
119
|
+
owasp: "A01:2021 - Broken Access Control"
|
|
120
|
+
category: idor
|
|
121
|
+
precision: medium
|
|
122
|
+
confidence: high
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# CWE-693: Express Helmet 安全头缺失检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JS-SECHEADER-001: Express 应用未使用 helmet 中间件
|
|
7
|
+
- id: zm-js-secheader-001
|
|
8
|
+
severity: INFO
|
|
9
|
+
message: |
|
|
10
|
+
检测到 Express 应用中未发现 helmet() 中间件的使用。
|
|
11
|
+
helmet 可自动设置多个安全相关 HTTP 响应头(X-Content-Type-Options、
|
|
12
|
+
X-Frame-Options、Content-Security-Policy 等),缺少这些头部降低了
|
|
13
|
+
应用的纵深防御能力。
|
|
14
|
+
|
|
15
|
+
修复建议:
|
|
16
|
+
1. 安装并全局使用 helmet: app.use(helmet())
|
|
17
|
+
2. 按需配置各中间件(如 helmet.contentSecurityPolicy())
|
|
18
|
+
3. 至少设置以下头部:
|
|
19
|
+
- X-Content-Type-Options: nosniff
|
|
20
|
+
- X-Frame-Options: DENY
|
|
21
|
+
- Strict-Transport-Security: max-age=31536000
|
|
22
|
+
languages:
|
|
23
|
+
- javascript
|
|
24
|
+
- typescript
|
|
25
|
+
patterns:
|
|
26
|
+
- pattern-either:
|
|
27
|
+
- pattern: |
|
|
28
|
+
const $APP = express();
|
|
29
|
+
...
|
|
30
|
+
- pattern: |
|
|
31
|
+
const $APP = express();
|
|
32
|
+
...
|
|
33
|
+
$APP.use(...);
|
|
34
|
+
...
|
|
35
|
+
- pattern-not-inside: |
|
|
36
|
+
...
|
|
37
|
+
$APP.use(helmet(...));
|
|
38
|
+
...
|
|
39
|
+
metadata:
|
|
40
|
+
cwe: "CWE-693: Protection Mechanism Failure"
|
|
41
|
+
owasp: "A05:2021 - Security Misconfiguration"
|
|
42
|
+
category: config
|
|
43
|
+
precision: low
|
|
44
|
+
references:
|
|
45
|
+
- "https://helmetjs.github.io/"
|
|
46
|
+
- "https://owasp.org/www-project-secure-headers/"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# CWE-78: Node.js child_process exec/execSync 命令注入检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JS-OSCI-001: child_process exec/execSync 命令字符串拼接注入
|
|
7
|
+
- id: zm-js-osci-001
|
|
8
|
+
severity: ERROR
|
|
9
|
+
message: |
|
|
10
|
+
检测到 child_process.exec() / execSync() 使用了字符串拼接或模板字符串构造命令。
|
|
11
|
+
攻击者可通过控制变量注入额外系统命令(如 ; rm -rf / 或 $(whoami))。
|
|
12
|
+
|
|
13
|
+
修复建议:
|
|
14
|
+
1. 优先使用 execFile() / spawn() 替代 exec(),参数独立传入避免 Shell 解析
|
|
15
|
+
2. 如必须使用 exec(),对用户输入做严格白名单校验
|
|
16
|
+
3. 禁止将用户输入拼接到命令字符串中
|
|
17
|
+
4. 使用 shell-escape / shell-quote 库对参数进行转义
|
|
18
|
+
languages:
|
|
19
|
+
- javascript
|
|
20
|
+
- typescript
|
|
21
|
+
pattern-either:
|
|
22
|
+
- pattern: exec($X + ...)
|
|
23
|
+
- pattern: exec(... + $X)
|
|
24
|
+
- pattern: execSync($X + ...)
|
|
25
|
+
- pattern: execSync(... + $X)
|
|
26
|
+
- pattern: $CP.exec($X + ...)
|
|
27
|
+
- pattern: $CP.exec(... + $X)
|
|
28
|
+
- pattern: $CP.execSync($X + ...)
|
|
29
|
+
- pattern: $CP.execSync(... + $X)
|
|
30
|
+
metadata:
|
|
31
|
+
cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
|
|
32
|
+
owasp: "A03:2021 - Injection"
|
|
33
|
+
category: command-injection
|
|
34
|
+
precision: medium
|
|
35
|
+
references:
|
|
36
|
+
- "https://owasp.org/www-community/attacks/Command_Injection"
|
|
37
|
+
- "https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# CWE-78: Node.js child_process spawn 不安全参数检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JS-OSCI-002: spawn 命令来自变量且开启 shell 选项
|
|
7
|
+
- id: zm-js-osci-002
|
|
8
|
+
severity: ERROR
|
|
9
|
+
message: |
|
|
10
|
+
检测到 child_process.spawn() 命令参数来自变量且配置了 shell: true 选项。
|
|
11
|
+
当 shell 选项开启时,命令字符串会被系统 Shell 解析(如 /bin/sh -c),
|
|
12
|
+
存在命令注入风险。
|
|
13
|
+
|
|
14
|
+
修复建议:
|
|
15
|
+
1. 关闭 shell 选项(默认值为 false)
|
|
16
|
+
2. 命令使用字面量字符串,参数通过 args 数组独立传入
|
|
17
|
+
3. 对用户输入做严格白名单校验
|
|
18
|
+
languages:
|
|
19
|
+
- javascript
|
|
20
|
+
- typescript
|
|
21
|
+
pattern-either:
|
|
22
|
+
- pattern: |
|
|
23
|
+
spawn($CMD, {..., shell: true, ...})
|
|
24
|
+
- pattern: |
|
|
25
|
+
spawn($CMD, $ARGS, {..., shell: true, ...})
|
|
26
|
+
- pattern: |
|
|
27
|
+
$CP.spawn($CMD, {..., shell: true, ...})
|
|
28
|
+
- pattern: |
|
|
29
|
+
$CP.spawn($CMD, $ARGS, {..., shell: true, ...})
|
|
30
|
+
metadata:
|
|
31
|
+
cwe: "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
|
|
32
|
+
owasp: "A03:2021 - Injection"
|
|
33
|
+
category: command-injection
|
|
34
|
+
precision: high
|
|
35
|
+
references:
|
|
36
|
+
- "https://nodejs.org/api/child_process.html#child_processspawncommand-args-options"
|
|
37
|
+
- "https://owasp.org/www-community/attacks/Command_Injection"
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# CWE-79: DOM-based XSS 检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JS-DOMXSS-001: innerHTML / outerHTML 赋值
|
|
7
|
+
- id: zm-js-domxss-001
|
|
8
|
+
severity: WARNING
|
|
9
|
+
message: |
|
|
10
|
+
检测到使用 innerHTML 或 outerHTML 赋值操作,可能引入 DOM-based XSS。
|
|
11
|
+
直接向 innerHTML 设置用户输入会导致浏览器解析并执行内嵌的 <script> 标签。
|
|
12
|
+
|
|
13
|
+
修复建议:
|
|
14
|
+
1. 使用 textContent 替代 innerHTML 设置纯文本
|
|
15
|
+
2. 使用 document.createElement() + appendChild() 安全构建 DOM
|
|
16
|
+
3. 如必须使用 innerHTML,先用 DOMPurify 对内容消毒
|
|
17
|
+
4. 使用 Content Security Policy (CSP) 作为纵深防御
|
|
18
|
+
languages:
|
|
19
|
+
- javascript
|
|
20
|
+
- typescript
|
|
21
|
+
pattern-either:
|
|
22
|
+
- pattern: $EL.innerHTML = $X
|
|
23
|
+
- pattern: $EL.outerHTML = $X
|
|
24
|
+
- pattern: $EL.innerHTML += $X
|
|
25
|
+
- pattern: $EL.outerHTML += $X
|
|
26
|
+
metadata:
|
|
27
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
|
|
28
|
+
owasp: "A03:2021 - Injection"
|
|
29
|
+
category: xss
|
|
30
|
+
precision: high
|
|
31
|
+
references:
|
|
32
|
+
- "https://owasp.org/www-community/attacks/DOM_Based_XSS"
|
|
33
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html"
|
|
34
|
+
|
|
35
|
+
# ZM-JS-DOMXSS-002: document.write / document.writeln
|
|
36
|
+
- id: zm-js-domxss-002
|
|
37
|
+
severity: WARNING
|
|
38
|
+
message: |
|
|
39
|
+
检测到使用 document.write() 或 document.writeln() 写入 DOM。
|
|
40
|
+
这些 API 会直接向文档写入原始 HTML,若内容由用户控制将导致 XSS。
|
|
41
|
+
|
|
42
|
+
修复建议:
|
|
43
|
+
1. 禁止使用 document.write(),使用安全的 DOM API 替代
|
|
44
|
+
2. document.createElement() + textContent 安全构建内容
|
|
45
|
+
3. 使用 insertAdjacentHTML 时也需 DOMPurify 消毒
|
|
46
|
+
languages:
|
|
47
|
+
- javascript
|
|
48
|
+
- typescript
|
|
49
|
+
pattern-either:
|
|
50
|
+
- pattern: document.write($X)
|
|
51
|
+
- pattern: document.writeln($X)
|
|
52
|
+
metadata:
|
|
53
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
|
|
54
|
+
owasp: "A03:2021 - Injection"
|
|
55
|
+
category: xss
|
|
56
|
+
precision: very-high
|
|
57
|
+
references:
|
|
58
|
+
- "https://developer.mozilla.org/en-US/docs/Web/API/Document/write"
|
|
59
|
+
- "https://owasp.org/www-community/attacks/DOM_Based_XSS"
|
|
60
|
+
|
|
61
|
+
# ZM-JS-DOMXSS-003: insertAdjacentHTML
|
|
62
|
+
- id: zm-js-domxss-003
|
|
63
|
+
severity: WARNING
|
|
64
|
+
message: |
|
|
65
|
+
检测到使用 insertAdjacentHTML() 方法插入 HTML 内容。
|
|
66
|
+
与 innerHTML 类似,插入的 HTML 字符串会被解析,存在 DOM XSS 风险。
|
|
67
|
+
|
|
68
|
+
修复建议:
|
|
69
|
+
1. 使用 insertAdjacentElement() 替代 insertAdjacentHTML()
|
|
70
|
+
2. 如必须使用 HTML 插入,用 DOMPurify 消毒后操作
|
|
71
|
+
3. 优先使用 DOM 创建 API (createElement / createTextNode)
|
|
72
|
+
languages:
|
|
73
|
+
- javascript
|
|
74
|
+
- typescript
|
|
75
|
+
pattern-either:
|
|
76
|
+
- pattern: $EL.insertAdjacentHTML($POS, $X)
|
|
77
|
+
metadata:
|
|
78
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
|
|
79
|
+
owasp: "A03:2021 - Injection"
|
|
80
|
+
category: xss
|
|
81
|
+
precision: high
|
|
82
|
+
references:
|
|
83
|
+
- "https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML"
|
|
84
|
+
- "https://owasp.org/www-community/attacks/DOM_Based_XSS"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# CWE-79: React dangerouslySetInnerHTML XSS 检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
- id: zm-js-rxss-001
|
|
7
|
+
severity: WARNING
|
|
8
|
+
message: |
|
|
9
|
+
dangerouslySetInnerHTML bypasses React XSS protection — sanitize with DOMPurify first.
|
|
10
|
+
languages:
|
|
11
|
+
- javascript
|
|
12
|
+
- typescript
|
|
13
|
+
pattern: dangerouslySetInnerHTML
|
|
14
|
+
metadata:
|
|
15
|
+
cwe: "CWE-79"
|
|
16
|
+
precision: very-high
|
|
17
|
+
category: xss
|
|
18
|
+
owasp: "A03:2021 - Injection"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# CWE-79: Express XSS 模板注入检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 1 — JS/TS 通用规则库
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
|
|
6
|
+
# ZM-JS-XSS-001: res.render 直接传入用户可控数据
|
|
7
|
+
- id: zm-js-xss-001
|
|
8
|
+
severity: WARNING
|
|
9
|
+
message: |
|
|
10
|
+
检测到 res.render() 将 req.body / req.query / req.params 直接传入模板变量。
|
|
11
|
+
未经过 HTML 实体转义的用户输入在模板中渲染可能导致存储型/反射型 XSS 攻击。
|
|
12
|
+
|
|
13
|
+
修复建议:
|
|
14
|
+
1. 对用户输入进行 HTML 实体编码(如使用 DOMPurify / xss 库或模板引擎自动转义)
|
|
15
|
+
2. 使用 EJS 的 <%= %> 代替 <%- %>(前者自动转义)
|
|
16
|
+
3. 在模板中避免使用 raw / unescaped 输出模式
|
|
17
|
+
4. 设置 Content-Security-Policy 响应头作为纵深防御
|
|
18
|
+
languages:
|
|
19
|
+
- javascript
|
|
20
|
+
- typescript
|
|
21
|
+
pattern-either:
|
|
22
|
+
- pattern: |
|
|
23
|
+
res.render($TEMPLATE, {..., $KEY: $REQ.body, ...})
|
|
24
|
+
- pattern: |
|
|
25
|
+
res.render($TEMPLATE, {..., $KEY: $REQ.query, ...})
|
|
26
|
+
- pattern: |
|
|
27
|
+
res.render($TEMPLATE, {..., $KEY: $REQ.params, ...})
|
|
28
|
+
- pattern: |
|
|
29
|
+
res.render($TEMPLATE, $REQ.body)
|
|
30
|
+
- pattern: |
|
|
31
|
+
res.render($TEMPLATE, $REQ.query)
|
|
32
|
+
- pattern: |
|
|
33
|
+
res.render($TEMPLATE, $REQ.params)
|
|
34
|
+
metadata:
|
|
35
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
|
|
36
|
+
owasp: "A03:2021 - Injection"
|
|
37
|
+
category: xss
|
|
38
|
+
precision: medium
|
|
39
|
+
references:
|
|
40
|
+
- "https://owasp.org/www-community/attacks/xss/"
|
|
41
|
+
- "https://expressjs.com/en/4x/api.html#res.render"
|
|
42
|
+
|
|
43
|
+
# ZM-JS-XSS-002: res.send 直接输出用户输入
|
|
44
|
+
- id: zm-js-xss-002
|
|
45
|
+
severity: WARNING
|
|
46
|
+
message: |
|
|
47
|
+
检测到 res.send() 直接输出 req.body / req.query / req.params 中的值。
|
|
48
|
+
若 Content-Type 为 text/html,可能导致反射型 XSS。
|
|
49
|
+
|
|
50
|
+
修复建议:
|
|
51
|
+
1. 避免直接输出用户输入;如需要,使用 HTML 实体编码后输出
|
|
52
|
+
2. 显式设置 Content-Type: text/plain 防止浏览器解析 HTML
|
|
53
|
+
3. 使用 res.json() 代替 res.send() 输出 JSON 数据
|
|
54
|
+
languages:
|
|
55
|
+
- javascript
|
|
56
|
+
- typescript
|
|
57
|
+
pattern-either:
|
|
58
|
+
- pattern: res.send($REQ.body)
|
|
59
|
+
- pattern: res.send($REQ.query)
|
|
60
|
+
- pattern: res.send($REQ.params)
|
|
61
|
+
- pattern: res.send($REQ.body.$PROP)
|
|
62
|
+
- pattern: res.send($REQ.query.$PROP)
|
|
63
|
+
- pattern: res.send($REQ.params.$PROP)
|
|
64
|
+
metadata:
|
|
65
|
+
cwe: "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
|
|
66
|
+
owasp: "A03:2021 - Injection"
|
|
67
|
+
category: xss
|
|
68
|
+
precision: medium
|
|
69
|
+
references:
|
|
70
|
+
- "https://owasp.org/www-community/attacks/xss/"
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# CWE-89: Node.js SQL注入检测规则
|
|
2
|
+
# 逐码 ZhuMa V4.1 Sprint 2 — JS/TS 规则库
|
|
3
|
+
# 覆盖: mysql2.query、sequelize.query(raw)、knex.raw、pg.query、sqlite3
|
|
4
|
+
|
|
5
|
+
rules:
|
|
6
|
+
|
|
7
|
+
# ZM-JS-SQLI-001: SQL驱动字符串拼接查询(高精度)
|
|
8
|
+
- id: zm-js-sqli-001
|
|
9
|
+
severity: ERROR
|
|
10
|
+
message: |
|
|
11
|
+
检测到SQL查询使用了字符串拼接或模板字符串构造SQL语句,存在SQL注入风险。
|
|
12
|
+
攻击者可通过控制拼接变量注入SQL命令,实现数据库脱库、篡改或RCE。
|
|
13
|
+
|
|
14
|
+
修复:
|
|
15
|
+
1. 使用参数化查询(Parameterized Query)替代字符串拼接
|
|
16
|
+
2. mysql2: connection.execute('SELECT * FROM users WHERE id = ?', [userId])
|
|
17
|
+
3. pg: client.query('SELECT * FROM users WHERE id = $1', [userId])
|
|
18
|
+
4. 如确实需要动态表名/列名,使用白名单校验
|
|
19
|
+
5. 禁止 ORDER BY / GROUP BY / LIMIT 使用用户输入直接拼接
|
|
20
|
+
languages:
|
|
21
|
+
- javascript
|
|
22
|
+
- typescript
|
|
23
|
+
pattern-either:
|
|
24
|
+
# mysql2 query/execute 拼接
|
|
25
|
+
- pattern: $CONN.query('SELECT' + $INPUT, ...)
|
|
26
|
+
- pattern: $CONN.query('INSERT' + $INPUT, ...)
|
|
27
|
+
- pattern: $CONN.query('UPDATE' + $INPUT, ...)
|
|
28
|
+
- pattern: $CONN.query('DELETE' + $INPUT, ...)
|
|
29
|
+
- pattern: $CONN.execute('SELECT' + $INPUT, ...)
|
|
30
|
+
- pattern: $CONN.execute('INSERT' + $INPUT, ...)
|
|
31
|
+
- pattern: $CONN.execute('UPDATE' + $INPUT, ...)
|
|
32
|
+
- pattern: $CONN.query($QUERY + $INPUT, ...)
|
|
33
|
+
- pattern: $CONN.execute($QUERY + $INPUT, ...)
|
|
34
|
+
# pg query 拼接
|
|
35
|
+
- pattern: $POOL.query('SELECT' + $INPUT, ...)
|
|
36
|
+
- pattern: $CLIENT.query('SELECT' + $INPUT, ...)
|
|
37
|
+
- pattern: $POOL.query('INSERT' + $INPUT, ...)
|
|
38
|
+
- pattern: $CLIENT.query('INSERT' + $INPUT, ...)
|
|
39
|
+
- pattern: $POOL.query('UPDATE' + $INPUT, ...)
|
|
40
|
+
- pattern: $CLIENT.query('UPDATE' + $INPUT, ...)
|
|
41
|
+
- pattern: $POOL.query('DELETE' + $INPUT, ...)
|
|
42
|
+
- pattern: $CLIENT.query('DELETE' + $INPUT, ...)
|
|
43
|
+
# sqlite3 拼接
|
|
44
|
+
- pattern: $DB.run('SELECT' + $INPUT, ...)
|
|
45
|
+
- pattern: $DB.run('INSERT' + $INPUT, ...)
|
|
46
|
+
- pattern: $DB.run('UPDATE' + $INPUT, ...)
|
|
47
|
+
- pattern: $DB.run('DELETE' + $INPUT, ...)
|
|
48
|
+
- pattern: $DB.get('SELECT' + $INPUT, ...)
|
|
49
|
+
- pattern: $DB.all('SELECT' + $INPUT, ...)
|
|
50
|
+
- pattern: $DB.exec('SELECT' + $INPUT, ...)
|
|
51
|
+
# 模板字符串拼接
|
|
52
|
+
- pattern: $CONN.query(`SELECT ... ${$INPUT}`, ...)
|
|
53
|
+
- pattern: $CLIENT.query(`SELECT ... ${$INPUT}`, ...)
|
|
54
|
+
- pattern: $POOL.query(`SELECT ... ${$INPUT}`, ...)
|
|
55
|
+
- pattern: $DB.run(`SELECT ... ${$INPUT}`, ...)
|
|
56
|
+
- pattern: $DB.all(`SELECT ... ${$INPUT}`, ...)
|
|
57
|
+
metadata:
|
|
58
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
|
|
59
|
+
owasp: "A03:2021 - Injection"
|
|
60
|
+
category: sql-injection
|
|
61
|
+
precision: medium
|
|
62
|
+
references:
|
|
63
|
+
- "https://owasp.org/www-community/attacks/SQL_Injection"
|
|
64
|
+
- "https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html"
|
|
65
|
+
|
|
66
|
+
# ZM-JS-SQLI-002: Sequelize.query raw / knex.raw 拼接
|
|
67
|
+
- id: zm-js-sqli-002
|
|
68
|
+
severity: ERROR
|
|
69
|
+
message: |
|
|
70
|
+
检测到 Sequelize.query(raw: true) 或 knex.raw() 使用了字符串拼接构造SQL。
|
|
71
|
+
这些方法会直接将字符串作为原始SQL执行,绕过ORM的参数化保护。
|
|
72
|
+
|
|
73
|
+
修复:
|
|
74
|
+
1. Sequelize: sequelize.query('SELECT * FROM users WHERE id = ?', { replacements: [userId] })
|
|
75
|
+
2. Sequelize: sequelize.query('SELECT * FROM users WHERE id = :id', { replacements: { id: userId } })
|
|
76
|
+
3. Knex: knex.raw('SELECT * FROM users WHERE id = ?', [userId])
|
|
77
|
+
4. 尽量避免使用 raw query,优先使用 ORM 的链式API
|
|
78
|
+
languages:
|
|
79
|
+
- javascript
|
|
80
|
+
- typescript
|
|
81
|
+
pattern-either:
|
|
82
|
+
- pattern: $SEQ.query($QUERY + $INPUT, ...)
|
|
83
|
+
- pattern: $SEQ.query('SELECT' + $INPUT, ...)
|
|
84
|
+
- pattern: $SEQ.query('INSERT' + $INPUT, ...)
|
|
85
|
+
- pattern: $SEQ.query('UPDATE' + $INPUT, ...)
|
|
86
|
+
- pattern: $SEQ.query('DELETE' + $INPUT, ...)
|
|
87
|
+
- pattern: knex.raw($QUERY + $INPUT, ...)
|
|
88
|
+
- pattern: knex.raw('SELECT' + $INPUT, ...)
|
|
89
|
+
- pattern: knex.raw('INSERT' + $INPUT, ...)
|
|
90
|
+
- pattern: knex.raw('UPDATE' + $INPUT, ...)
|
|
91
|
+
- pattern: knex.raw('DELETE' + $INPUT, ...)
|
|
92
|
+
- pattern: $KNEX.raw('SELECT' + $INPUT, ...)
|
|
93
|
+
- pattern: $KNEX.raw('INSERT' + $INPUT, ...)
|
|
94
|
+
- pattern: $KNEX.raw('UPDATE' + $INPUT, ...)
|
|
95
|
+
- pattern: $KNEX.raw('DELETE' + $INPUT, ...)
|
|
96
|
+
- pattern: $SEQ.query(`SELECT ... ${$INPUT}`, ...)
|
|
97
|
+
- pattern: knex.raw(`SELECT ... ${$INPUT}`, ...)
|
|
98
|
+
metadata:
|
|
99
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
|
|
100
|
+
owasp: "A03:2021 - Injection"
|
|
101
|
+
category: sql-injection
|
|
102
|
+
precision: high
|
|
103
|
+
references:
|
|
104
|
+
- "https://sequelize.org/docs/v6/core-concepts/raw-queries/"
|
|
105
|
+
- "https://knexjs.org/guide/raw.html"
|
|
106
|
+
|
|
107
|
+
# ZM-JS-SQLI-003: SQL查询中使用 req.query/params/body 拼接
|
|
108
|
+
- id: zm-js-sqli-003
|
|
109
|
+
severity: ERROR
|
|
110
|
+
message: |
|
|
111
|
+
检测到SQL查询中直接拼接了 req.query / req.params / req.body 的用户输入。
|
|
112
|
+
这是SQL注入的最高风险模式。
|
|
113
|
+
|
|
114
|
+
修复:
|
|
115
|
+
1. 立即替换为参数化查询:
|
|
116
|
+
db.query('SELECT * FROM users WHERE name = ?', [req.query.name])
|
|
117
|
+
2. 使用查询构建器: knex.select().from('users').where('name', req.query.name)
|
|
118
|
+
3. 永远不要将用户输入拼接到SQL字符串中
|
|
119
|
+
languages:
|
|
120
|
+
- javascript
|
|
121
|
+
- typescript
|
|
122
|
+
pattern-either:
|
|
123
|
+
- pattern: $CONN.query($QUERY + $REQ.query.$FIELD, ...)
|
|
124
|
+
- pattern: $CONN.query($QUERY + $REQ.params.$FIELD, ...)
|
|
125
|
+
- pattern: $CONN.query($QUERY + $REQ.body.$FIELD, ...)
|
|
126
|
+
- pattern: $CLIENT.query($QUERY + $REQ.query.$FIELD, ...)
|
|
127
|
+
- pattern: $CLIENT.query($QUERY + $REQ.params.$FIELD, ...)
|
|
128
|
+
- pattern: $CLIENT.query($QUERY + $REQ.body.$FIELD, ...)
|
|
129
|
+
- pattern: $POOL.query($QUERY + $REQ.query.$FIELD, ...)
|
|
130
|
+
- pattern: $POOL.query($QUERY + $REQ.params.$FIELD, ...)
|
|
131
|
+
- pattern: $POOL.query($QUERY + $REQ.body.$FIELD, ...)
|
|
132
|
+
- pattern: $DB.run($QUERY + $REQ.query.$FIELD, ...)
|
|
133
|
+
- pattern: $DB.run($QUERY + $REQ.params.$FIELD, ...)
|
|
134
|
+
- pattern: $DB.run($QUERY + $REQ.body.$FIELD, ...)
|
|
135
|
+
- pattern: $DB.all($QUERY + $REQ.query.$FIELD, ...)
|
|
136
|
+
- pattern: $DB.all($QUERY + $REQ.params.$FIELD, ...)
|
|
137
|
+
- pattern: $DB.all($QUERY + $REQ.body.$FIELD, ...)
|
|
138
|
+
- pattern: $DB.get($QUERY + $REQ.query.$FIELD, ...)
|
|
139
|
+
- pattern: $DB.get($QUERY + $REQ.params.$FIELD, ...)
|
|
140
|
+
- pattern: $DB.get($QUERY + $REQ.body.$FIELD, ...)
|
|
141
|
+
- pattern: knex.raw($QUERY + $REQ.query.$FIELD, ...)
|
|
142
|
+
- pattern: knex.raw($QUERY + $REQ.params.$FIELD, ...)
|
|
143
|
+
- pattern: knex.raw($QUERY + $REQ.body.$FIELD, ...)
|
|
144
|
+
- pattern: $SEQ.query($QUERY + $REQ.query.$FIELD, ...)
|
|
145
|
+
- pattern: $SEQ.query($QUERY + $REQ.params.$FIELD, ...)
|
|
146
|
+
- pattern: $SEQ.query($QUERY + $REQ.body.$FIELD, ...)
|
|
147
|
+
metadata:
|
|
148
|
+
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
|
|
149
|
+
owasp: "A03:2021 - Injection"
|
|
150
|
+
category: sql-injection
|
|
151
|
+
precision: high
|
|
152
|
+
references:
|
|
153
|
+
- "https://owasp.org/www-community/attacks/SQL_Injection"
|