#http-request #http-1 #attacks #security #request-headers #requests #desync

http_desync_guardian

HTTP/1.1 请求分析以防止HTTP Desync攻击

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日

#1054HTTP服务器

Apache-2.0

435KB
5K SLoC

Rust 4.5K SLoC // 0.0% comments C 651 SLoC // 0.1% comments

Apache 2 License Crate Clippy/Fmt Tests Coverage Status

概述

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引擎中使用。

  1. 安装cbindgencargo install --force cbindgen
  2. 生成头文件
    • 运行cbindgen --output http_desync_guardian.h --lang c以生成C语言的头文件。
    • 运行cbindgen --output http_desync_guardian.h --lang c++以生成C++语言的头文件。
  3. 运行cargo build --release。二进制文件位于./target/release/libhttp_desync_guardian.*文件中。

了解更多:请参阅通用Nginx示例。

#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