4个版本
0.1.3 | 2020年8月17日 |
---|---|
0.1.2 | 2020年8月17日 |
0.1.1 | 2020年8月17日 |
0.1.0 | 2020年8月17日 |
#1054 在 HTTP服务器
435KB
5K SLoC
概述
HTTP/1.1
自1991年至2014年经历了漫长的发展
这意味着存在各种服务器和客户端,它们可能对请求边界有不同的看法,从而为解同步攻击(又称HTTP Desync)创造了机会。
遵循最新的RFC建议似乎很简单。然而,对于存在已久的大型系统,这可能会带来不可接受的可用性影响。
http_desync_guardian
库旨在分析HTTP请求以防止HTTP Desync攻击,平衡安全和可用性。它将请求分类到不同的类别,并提供如何处理每一层的建议。
它可以用于原始HTTP请求头或由HTTP引擎解析。消费者可以配置日志和指标收集。日志是速率限制的,并且所有用户数据都是加密的。
如果您认为您可能发现了一个影响安全的漏洞,请按照我们的安全通知流程操作。
优先级
- 服务之间的统一至关重要。 这意味着请求分类、日志记录和指标必须在幕后进行,并且具有最小可用设置(例如,日志文件目标)。
- 注重可审查性。 测试套件必须不需要了解库/编程语言,只需了解HTTP协议即可。因此,它易于审查、贡献和重用。
- 当用户容易使用时,安全是高效的。 我们的目标是将库的集成尽可能简单。
- 超轻量。 负载必须最小,不对请求处理造成实质性负担(参见基准测试)。
支持的HTTP版本
该库的主要关注点是 HTTP/1.1
。请参阅测试以获取所有涵盖的案例。HTTP/1.1的前驱者不支持连接重用,这限制了HTTP Desync的机会,但是一些代理可能将此类请求升级到HTTP/1.1
并重用后端连接,这可能允许构建恶意的HTTP/1.0
请求。这就是为什么它们使用与HTTP/1.1
相同的标准进行分析。对于其他协议版本有以下例外
HTTP/0.9
请求从不被认为是Compliant
,而是被归类为Acceptable
。如果任何Content-Length
/Transfer-Encoding
存在,则它是Ambiguous
。HTTP/1.0
- 存在Transfer-Encoding
会使请求Ambiguous
。HTTP/2+
不在范围内。但如果您的代理将HTTP/2
降级为HTTP/1.1
,请确保分析输出请求。
请参阅文档了解更多信息。
C语言使用
该库设计为主要用于从用C/C++/C+++编写的HTTP引擎中使用。
- 安装cbindgen:
cargo install --force cbindgen
- 生成头文件
- 运行
cbindgen --output http_desync_guardian.h --lang c
以生成C语言的头文件。 - 运行
cbindgen --output http_desync_guardian.h --lang c++
以生成C++语言的头文件。
- 运行
- 运行
cargo build --release
。二进制文件位于./target/release/libhttp_desync_guardian.*
文件中。
#include "http_desync_guardian.h"
/*
* http_engine_request_t - already parsed by the HTTP engine
*/
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:
// The request is good. green light
break;
case REQUEST_SAFETY_TIER_ACCEPTABLE:
// Reject, if mode == STRICTEST
// Otherwise, OK
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// The request is ambiguous.
// Reject, if mode == STRICTEST
// Otherwise send it, but don't reuse both FE/BE connections.
break;
case REQUEST_SAFETY_TIER_SEVERE:
// Send 400 and close the FE connection.
break;
default:
// unreachable code
abort();
}
}
Rust语言使用
请参考基准测试,了解Rust的使用示例。
安全漏洞通知
如果您在http_desync_guardian
中发现潜在的安全问题,我们要求您通过我们的漏洞报告页面向AWS安全团队报告。请不要创建公开的github问题。
安全
有关更多信息,请参阅CONTRIBUTING。
许可证
本项目采用Apache-2.0许可证。
依赖关系
约2MB
约45K SLoC