HTTP/1.1 从 1991 年到 2014 年经历了漫长的演进:
这意味着存在多种服务器和客户端,它们对请求边界的理解可能不同,从而产生反同步攻击(即 HTTP Desync)的机会。
遵循最新的 RFC 建议看似简单。然而,对于已运行多年的大型系统,这可能会带来不可接受的可用性影响。
http_desync_guardian 库旨在分析 HTTP 请求以防范 HTTP Desync 攻击,在安全性与可用性之间取得平衡。
它将请求分类为不同的类别,并提供各层级应如何处理建议。
该库可用于原始 HTTP 请求头,也可用于已由 HTTP 引擎解析的请求。 使用者可以配置日志记录和指标收集。 日志记录有速率限制,所有用户数据均经过脱敏处理。
如果您认为自己发现了可能影响安全的问题,请遵循我们的安全通知流程。
本库主要关注 HTTP/1.1。所有涵盖的案例参见测试。HTTP/1.1 的前身不支持连接复用,这限制了 HTTP Desync 的机会,
但某些代理可能会将此类请求升级为 HTTP/1.1 并复用后端连接,从而可能构造恶意的 HTTP/1.0 请求。
因此它们使用与 HTTP/1.1 相同的标准进行分析。其他协议版本有以下例外:
HTTP/0.9 请求从不被视为 合规,而是归类为 可接受。如果存在 Content-Length/Transfer-Encoding 中的任意一个,则归类为 歧义。HTTP/1.0 - 存在 Transfer-Encoding 会使请求成为 歧义。HTTP/2+ 不在范围内。但如果您的代理将 HTTP/2 降级为 HTTP/1.1,请确保出站请求被分析。更多内容请参阅文档。
本库设计为主要用于 C/C++ 编写的 HTTP 引擎。
cargo install --force cbindgencbindgen --output http_desync_guardian.h --lang ccbindgen --output http_desync_guardian.h --lang c++cargo build --release。生成的二进制文件位于 ./target/release/libhttp_desync_guardian.* 文件中。#include "http_desync_guardian.h"
/*
* http_engine_request_t - 由 HTTP 引擎解析后的请求
*/
static int check_request(http_engine_request_t *req) {
http_desync_guardian_request_t guardian_request = construct_http_desync_guardian_from(req);
http_desync_guardian_verdict_t verdict = {0};
http_desync_guardian_analyze_request(&guardian_request, &verdict);
switch (verdict.tier) {
case REQUEST_SAFETY_TIER_COMPLIANT:
// 请求正常,绿灯
break;
case REQUEST_SAFETY_TIER_ACCEPTABLE:
// 如果 mode == STRICTEST 则拒绝
// 否则允许
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// 请求存在歧义。
// 如果 mode == STRICTEST 则拒绝
// 否则发送,但不复用前端/后端连接。
break;
case REQUEST_SAFETY_TIER_SEVERE:
// 返回 400 并关闭前端连接。
break;
default:
// 不可达代码
abort();
}
}
参见基准测试 作为从 Rust 使用的示例。
如果您在 http_desync_guardian 中发现潜在的安全问题,请通过我们的漏洞报告页面通知 AWS Security。请不要公开创建 GitHub Issue。
更多信息请参见 CONTRIBUTING。
本项目采用 Apache-2.0 许可证。