Уязвимость в приложениях на базе HTTP-библиотеки Hyper

В библиотеке Hyper, предлагающей реализацию протоколов HTTP/1 и HTTP/2 на языке Rust, выявлена особенность работы с памятью, которая может использоваться для инициирования отказа в обслуживании через исчерпание доступной процессу памяти. Для эксплуатации уязвимости достаточно отправить специально оформленный HTTP-запрос уязвимому обработчику, использующему Hyper. Библиотека достаточно популярна (67 млн загрузок) и используется в качестве зависимости у 2579 проектов, представленных в каталоге crates.io.

Причиной уязвимости является отсутствие ограничений на размер ресурсов, передаваемых в HTTP-запросах и -ответах. В библиотеке Hyper для копирования запроса или тела ответа предлагается функция body::to_bytes, копирующая данные запроса и ответа целиком в один буфер без проверки размера полученных данных. Соответственно, атака сводится к передаче очень большого запроса или ответа, обработка которого приведёт к выделению буфера, не вмещающегося в доступную память. Примечательно, что указанное поведение явно описано в документации, в которой рекомендуется выполнять отдельные проверки размера, но предупреждение игнорировалось в различных продуктах, использующих Hyper.

В реальных условиях для атаки нет необходимости отправлять большой объём данных – так как при обработке chunked-запросов буфер выделяется на основе информации в заголовке Content-Length, для выделения большого блока памяти или аварийного завершения процесса достаточно отправить начальный пакет с большим значением в Content-Length.

Release. Ссылка here.