bk-security/auth-header-trust-rules

GitHub: bk-security/auth-header-trust-rules

一套针对 HTTP 头信任型身份验证绕过漏洞的 Semgrep 规则包,帮助开发者发现代码中不当依赖请求头进行鉴权决策的危险模式。

Stars: 0 | Forks: 0

# auth-header-trust-rules 一个小型的 Semgrep 规则包,用于标记基于攻击者可控制的 HTTP 请求头进行身份验证、授权或信任决策的代码。 此漏洞类的典型示例是 [CVE-2025-29927](https://github.com/advisories/GHSA-f82v-jwr5-mffw):Next.js 信任 `x-middleware-subrequest` 头来决定中间件是否运行, 导致任何提供伪造值的入站请求都可以完全跳过中间件。相同的模式在各种框架和生态系统中不断重演。 此规则包为两个语言家族和该缺陷的三个子类提供了规则。它旨在作为代码审查的辅助工具,而不是一个经过全面调优的 CI 门禁。这些规则优先考虑召回率而非精确率,最适合以交互方式运行,由人类对每个发现进行判断。 有关此漏洞类别及此规则包背后设计选择的更详细说明,请参阅 [bk-security.github.io](https://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`,将会绕过这些规则。 - 不在整理列表中的头名称。CVE-2025-29927 类的漏洞原则上可以使用任何头名称;我们通过包含 `x-internal-*`、`x-trust-*` 和 `x-bypass-*` 等模式来倾向于提高召回率,但全新的名称仍会成为漏网之鱼。 - 基于 cookie、查询参数或请求体字段的身份验证决策。这些属于相同的漏洞类别,但需要它们专属的规则。 - 基于头的*缺失*的身份验证决策。某些应用程序在某个头*不存在*时会跳过身份验证检查(这是一种配置错误的白名单模式)。当前的规则是基于“读取并使用”模式的,而非基于“缺失”模式。 在针对特定代码库扩展此规则包时,最有价值的补充通常是针对特定框架的辅助函数模式。如果某个代码库有一个 `isInternalRequest(req)` 辅助函数,那么能捕获它的规则只需一行 YAML。 ## 添加规则 1. 在 `rules//.yaml` 下创建规则。 2. 在 `tests//.` 下创建测试夹具,其中包含标注了 `# ruleid: ` 的正向示例和标注了 `# ok: ` 的反向示例。 3. 运行 `semgrep --test --config rules/ tests/`。新的规则和夹具将被自动识别;在提交更改之前,测试必须通过。 ## 许可证 MIT。 ## 作者 Bruce Kang。伴随此博客文章的源代码位于 [bk-security.github.io](https://github.com/bk-security/bk-security.github.io)。
标签:CISA项目, CVE-2025-29927, GNU通用公共许可证, HTTP请求头, IP伪造, Node.js, Python, SAST, Semgrep, WordPress安全扫描, X-Forwarded-For, XML 请求, 中间件安全, 代码安全审计, 安全专业人员, 安全开发, 安全规则库, 授权绕过, 提示注入防御, 数据可视化, 无后门, 源代码安全, 盲注攻击, 访问控制失效, 身份伪造, 身份验证绕过, 逆向工具, 错误基检测, 静态代码分析