
Анализируйте HTTP-запросы для минимизации рисков атак HTTP Desync (предшественник HTTP request smuggling/splitting).
Это означает, что существует множество серверов и клиентов, которые могут по-разному понимать границы запросов, создавая возможности для атак десинхронизации (также известных как 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, убедитесь, что исходящий запрос анализируется.См. документацию для получения дополнительной информации.
Эта библиотека предназначена в первую очередь для использования из HTTP-движков, написанных на C/C++.
cargo install --force cbindgencbindgen --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 - уже разобран 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, мы просим вас уведомить
AWS Security через страницу сообщения об уязвимостях. Пожалуйста, не создавайте публичный issue на GitHub.
См. CONTRIBUTING для получения дополнительной информации.
Этот проект лицензирован в соответствии с Apache-2.0 License.