Понижение версии HTTP-2

Поскольку HTTP/2 всё ещё относительно новый, веб-серверам, поддерживающим его, часто приходится взаимодействовать с устаревшей бэкэнд-инфраструктурой, которая работает только на HTTP/1. В результате распространённой практикой стало то, что фронтенд-серверы переписывают каждый входящий запрос HTTP/2 в синтаксис HTTP/1, фактически формируя его эквивалент на HTTP/1. Затем этот «пониженный» запрос пересылается соответствующему бэкэнд-серверу.

http2-downgrading.jpg

Когда бэкэнд, говорящий на HTTP/1, формирует ответ, фронтенд-сервер выполняет обратное преобразование, генерируя ответ HTTP/2, который возвращается клиенту. Это работает потому, что каждая версия протокола по сути представляет собой иной способ представления одной и той же информации. У каждого элемента сообщения HTTP/1 есть приблизительный эквивалент в HTTP/2.

http2-http1-mapping.jpg

В результате серверам относительно просто конвертировать эти запросы и ответы между двумя протоколами. Собственно, именно так Burp может отображать сообщения HTTP/2 в редакторе сообщений с использованием синтаксиса HTTP/1.

Понижение версии HTTP/2 чрезвычайно распространено и даже является поведением по умолчанию для ряда популярных сервисов обратного проксирования. В некоторых случаях опции отключить его просто нет.

Какие риски связаны с понижением версии HTTP/2?

Понижение версии HTTP/2 может подвергать сайты атакам контрабанды запросов, даже несмотря на то, что сам HTTP/2 при сквозном использовании обычно считается невосприимчивым к ним.

Из-за встроенного механизма определения длины в HTTP/2 при использовании понижения версии потенциально возникают три разных способа указать длину одного и того же запроса, и именно на этом и основаны все атаки контрабанды запросов.

Last updated