Найти тему
Проект OpenNet

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

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

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

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