分析HTTP請求以降低HTTP走私攻擊HTTP數據接收不同步攻擊的風險

寫在前面的話

HTTP/1.1自1991年至2014年,已經走過了一段很長的發展歷程:

  • HTTP/0.9– 1991
  • HTTP/1.0– 1996
  • HTTP/1.1
  • RFC 2068– 1997
  • RFC 2616- 1999
  • RFC 7230- 2014

這也就意味著,互聯網中各種各樣的伺服器和客戶端,可能會存在很多安全問題,這也會給HTTP走私攻擊(HTTP數據接收不同步攻擊)創造了機會。

分析HTTP请求以降低HTTP走私攻击HTTP数据接收不同步攻击的风险

 

\

遵循最新的RFC建議似乎很簡單。然而,對於已經存在一段時間的大型系統,它可能會帶來很多在系統可用性方面令人無法接受的影響。

http_desync_guardian這個工具庫便應運而生,該工具可以幫助廣大研究人員分析HTTP請求,以防止HTTP走私攻擊(HTTP數據接收不同步攻擊)的發生,同時還能夠兼顧安全性和可用性。該工具可以將請求進行分類,並並提供針對每一層的處理建議。

該工具既可以分析原始的HTTP請求Header,也可以對那些已經被HTTP引擎分析過的請求數據進行二次分析。

工具特性

1、服務的統一性是關鍵。這意味著請求分類、日誌記錄和度量必須在後台進行,並使用最少的可用設置(例如,日誌文件目的地址)。

2、關注可審查性。測試套件不需要關於庫/程式語言的知識,而只需要關於HTTP協議的知識即可。因此,它很容易審查、貢獻程式碼和重複使用。

3、安全性對於用戶來說是最重要的。

4、輕量級,開銷非常小,並且處理請求不需要額外開銷。

支援的HTTP版本

該工具主要針對的是HTTP/1.1,具體可以參考提供的覆蓋測試用例。

HTTP/1.1的前身不支援連接重用,這限制了HTTP去同步的機會,但是一些代理可能會將此類請求升級到HTTP/1.1,並重新使用後端連接,這可能會導致惡意HTTP/1.0請求。這也就是為什麼我們選擇使用與HTTP/1.1相同的標準來分析它們。對於其他協議版本,可以參考這篇【文檔】。

工具下載

廣大研究人員可以使用下列命令將該項目源碼克隆至本地:

git clone //github.com/aws/http-desync-guardian.git
複製程式碼

C程式碼使用

這個工具庫主要使用的是C/C++開發的HTTP引擎,工具安裝配置方法如下:

1、安裝cbindgen:

cargo install --force cbindgen
複製程式碼

2、生成Header文件:

C:

cbindgen --output http_desync_guardian.h --lang c
複製程式碼

C++:

cbindgen --output http_desync_guardian.h --lang c++
複製程式碼

3、運行下列命令,其中相關程式碼位於「
./target/release/libhttp_desync_guardian.*」文件:

cargo build --release
複製程式碼
#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();

    }

}
複製程式碼

許可證協議

本項目的開發與發布遵循Apache-2.0開源許可證協議。