一个小的 Semgrep 规则包,用于标记基于攻击者控制的 HTTP 请求头做出认证、授权或信任决策的代码。
该漏洞类的典型示例是 CVE-2025-29927:Next.js 信任 x-middleware-subrequest 头来决定中间件是否运行,任何提供了精心构造值的入站请求都可以完全跳过中间件。同样的模式在各个框架和生态系统中反复出现。
此规则包涵盖了两种语言系列和该漏洞的三个子类。它旨在作为代码审查辅助工具,而非完全调优的 CI 门禁。规则偏向于召回率而非精确度,最好以交互方式运行,由人工对每个发现做出判断。
如需更详细地了解该漏洞类以及此包背后的设计选择,请参阅 bk-security.github.io。
| 规则 | 语言 | 严重性 | 捕获内容 |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Warning | 读取名称暗示内部协议或认证绕过的头(x-internal、x-bypass-auth、x-middleware-subrequest、x-admin-override、x-impersonate 等) |
nodejs-header-as-identity | JS / TS | Warning | 读取通常用于携带用户身份的头(x-forwarded-user、x-authenticated-user、x-remote-user 等) |
nodejs-forwarded-for-trust | JS / TS | Info | 读取常用于安全决策的 x-forwarded-for、x-real-ip 及类似源 IP 头 |
python-header-flag-auth-bypass | Python | Warning | 与 Node.js 变体相同,包括 Django 风格的 request.META["HTTP_X_*"] 访问 |
python-header-as-identity | Python | Warning | 与 Node.js 变体相同,Python 风格 |
python-forwarded-for-trust | Python | Info | 与 Node.js 变体相同,Python 风格 |
安装 Semgrep:
pip install semgrep
针对目标运行规则包:
semgrep --config /path/to/auth-header-trust-rules/rules /path/to/target
或者运行单条规则:
semgrep --config /path/to/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /path/to/target
针对捆绑的测试夹具验证规则:
semgrep --test --config rules/ tests/
预期输出:
6/6: ✓ All tests passed
规则匹配于一个已知在受信任时危险的头部名称精选列表。它们能捕获常见情况。它们不会捕获:
getInternalFlag(req) 的自定义辅助函数若读取 x-some-novel-name 将逃过规则。x-internal-*、x-trust-* 和 x-bypass-* 等模式来偏向召回率,但新名称仍会漏过。在为特定代码库扩展此包时,最高价值的添加通常是特定框架的辅助函数模式。如果代码库有一个 isInternalRequest(req) 辅助函数,捕获它的规则只需一行 YAML。
rules/<lang>/<name>.yaml 下创建规则。tests/<lang>/<name>.<ext> 下创建测试夹具,其中包含标注为 # ruleid: <rule-id> 的正例和标注为 # ok: <rule-id> 的反例。semgrep --test --config rules/ tests/。新规则和夹具将被自动识别;在提交更改前测试必须通过。MIT。
Bruce Kang。配套博文的源代码位于 bk-security.github.io。