
HTTP 요청을 분석하여 HTTP Desync 공격의 위험을 최소화합니다 (HTTP 요청 스머글링/분할의 전조).
HTTP/1.1은 1991년부터 2014년까지 긴 진화 과정을 거쳤습니다:
이는 서버와 클라이언트의 다양성을 의미하며, 요청 경계에 대해 서로 다른 견해를 가질 수 있어 역동기화 공격(HTTP Desync)의 기회를 제공합니다.
최신 RFC 권장 사항을 따르는 것이 간단해 보일 수 있습니다. 그러나 오래된 대규모 시스템의 경우, 허용할 수 없는 가용성 영향을 초래할 수 있습니다.
http_desync_guardian 라이브러리는 HTTP Desync 공격을 방지하기 위해 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++로 작성된 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:
// mode == STRICTEST인 경우 거부
// 그렇지 않으면 허용
break;
case REQUEST_SAFETY_TIER_AMBIGUOUS:
// 요청이 모호합니다.
// mode == STRICTEST인 경우 거부
// 그렇지 않으면 전송하지만 FE/BE 연결을 재사용하지 마십시오.
break;
case REQUEST_SAFETY_TIER_SEVERE:
// 400을 보내고 FE 연결을 닫습니다.
break;
default:
// 도달할 수 없는 코드
abort();
}
}
Rust에서의 사용 예시는 benchmarks를 참조하십시오.
http_desync_guardian에서 잠재적인 보안 문제를 발견하신 경우,
AWS 보안팀에 취약점 신고 페이지를 통해 알려주시기 바랍니다. 공개 GitHub 이슈를 생성하지 마십시오.
자세한 내용은 CONTRIBUTING을 참조하십시오.
이 프로젝트는 Apache-2.0 라이선스에 따라 라이선스가 부여됩니다.