
HTTPリクエストを分析して、HTTP Desync攻撃(HTTPリクエストスマグリング/スプリッティングの前兆)のリスクを最小限に抑えます。
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リクエストはCompliantと見なされることはなく、Acceptableに分類されます。Content-Length/Transfer-Encodingのいずれかが存在する場合、Ambiguousになります。HTTP/1.0 – Transfer-Encodingが存在する場合、リクエストはAmbiguousになります。HTTP/2+は対象外です。ただし、プロキシがHTTP/2をHTTP/1.1にダウングレードする場合は、送信リクエストが分析されることを確認してください。詳細についてはドキュメントを参照してください。
このライブラリは、主にC/C++で書かれたHTTPエンジンから使用されるように設計されています。
cargo install --force cbindgencbindgen --output http_desync_guardian.h --lang c を実行cbindgen --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:
// モードがSTRICTESTの場合は拒否
// それ以外はOK
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// リクエストは曖昧。
// モードがSTRICTESTの場合は拒否
// それ以外は送信するが、FE/BE接続を再利用しない。
break;
case REQUEST_SAFETY_TIER_SEVERE:
// 400を送信し、FE接続を閉じる。
break;
default:
// 到達不能コード
abort();
}
}
Rustからの使用例としてベンチマークを参照してください。
http_desync_guardianで潜在的なセキュリティ問題を発見された場合は、
vulnerability reporting pageを通じてAWS Securityに通知してください。公開のgithub issueを作成しないでください。
詳細についてはCONTRIBUTINGを参照してください。
このプロジェクトはApache-2.0 Licenseの下でライセンスされています。