Рекомендуем
VPS на Windows и Linux — от 49 ₽ за 7 дней Быстрый запуск сервера на NVMe для сайтов, ботов и других задач.
Выбрать VPS

В Rust-библиотеках раскрыли серию уязвимостей — от сбоев прокси до утечки секретов

26 октября 2026 года база RustSec опубликовала серию предупреждений об уязвимостях библиотек для Rust. Проблемы затронули HTTP-прокси Pingora, компоненты сжатия zstd, интерпретатор RustPython и библиотеку загрузки веб-страниц webpage: в зависимости от применения возможны отказ сервиса, раскрытие данных из памяти, обход проверок доступа или утечка ключей, попавших в готовую программу.

В Rust-библиотеках раскрыли серию уязвимостей
В Rust-библиотеках раскрыли серию уязвимостей

Уязвимости Pingora позволяют перегрузить HTTP/2-сервер и обойти проверки запросов

В библиотеке Pingora, на которой можно строить прокси-серверы и сетевые шлюзы, зафиксировали три проблемы. Самая серьёзная из них, RUSTSEC-2026-0389 (CVE-2026-105297), получила оценку 8,7 из 10 по CVSS 4.0. Она позволяет удалённому клиенту исчерпать память сервера, принимающего соединения HTTP/2.

Причина — прежние ограничения по умолчанию: до версии pingora-core 0.8.1 сервер разрешал слишком большие списки HTTP-заголовков и не ограничивал количество одновременных потоков в одном соединении, если приложение не устанавливало собственные пределы. Исследователь продемонстрировал, что одного подключения достаточно, чтобы процесс с лимитом памяти 2 ГиБ завершился из-за её нехватки. В исправленном варианте при использовании стандартных настроек действует лимит 64 КиБ на распакованный список заголовков и 100 потоков на соединение.

Два других бюллетеня касаются маршрутизации и контроля доступа:

  • RUSTSEC-2026-0388 (CVE-2026-105298, 6,3 балла): Pingora могла по-разному обрабатывать адрес сайта из HTTP/2-поля :authority и заголовка Host. При определённой настройке кеша и серверов это позволяло подменять кешируемый ответ или обходить ограничения, основанные на имени хоста.
  • RUSTSEC-2026-0390 (CVE-2026-105299, 7,0 балла): pingora-proxy передавала некоторые клиентские заголовки Connection в промежуточный HTTP/1-прокси. В цепочке нескольких прокси это могло приводить к удалению заголовков, необходимых для проверки доступа, например X-Forwarded-For.

Все три проблемы исправлены в Pingora 0.9.0. При этом для первой уязвимости отдельное исправление появилось уже в 0.8.1. Есть важная оговорка: приложения, задающие собственные H2Options, должны явно устанавливать ограничения HTTP/2 — новые безопасные значения по умолчанию на такие настройки не распространяются. Согласно бюллетеням, клиенты CDN Cloudflare не были затронуты из-за особенностей внутренней инфраструктуры компании.

zstd и zstd-safe могли раскрывать память при обработке сжатых данных

Целая группа сообщений RustSec относится к zstd, zstd-safe и zstd-sys — компонентам, через которые программы на Rust сжимают и распаковывают данные. Некоторые дефекты находились на границе безопасного Rust-кода и низкоуровневой библиотеки сжатия, написанной на C.

Один из показательных случаев — RUSTSEC-2026-0403. Когда потоковая распаковка повреждённого файла старого формата zstd завершалась ошибкой, zstd-safe могла ошибочно считать часть буфера заполненной. Через zstd::stream::write::Decoder в выходной поток попадали ранее находившиеся в памяти байты — до 32 КиБ при стандартном размере буфера. Риск раскрытия зависит от того, кому программа передаёт результат распаковки. Обычный zstd::decode_all и декодер для чтения в этом бюллетене указаны как незатронутые.

В RUSTSEC-2026-0398 описана другая проблема: при обращении за пределы данных в режиме seekable библиотека могла установить длину массива Vec больше выделенной памяти. Последующее чтение способно раскрыть соседние участки памяти, а запись — повредить их. Отдельные предупреждения описывают двойное освобождение памяти и ошибки при работе с многопоточным контекстом.

Есть и риск смешивания данных разных операций. По RUSTSEC-2026-0391, если сжатие или распаковка прерывались, повторно использованный контекст мог перенести остатки предыдущего потока в следующий. Для сервиса, обрабатывающего запросы нескольких клиентов с общим контекстом, это создаёт сценарий утечки данных между запросами.

Разработчик проекта объединил исправления в выпусках zstd 0.14.3, zstd-safe 8.2.0 и zstd-sys 2.1.2. Изменения были объединены 16 октября после автоматизированного анализа безопасности и дополнительной проверки кода; бюллетени RustSec по этим проблемам опубликованы 26 октября. Не каждая ошибка затрагивает все приложения: для одних нужны повреждённые сжатые данные, для других — конкретные API, экспериментальные возможности или WebAssembly.

rustpython-vm сохраняла переменные сборки вместе с секретами в программе

Уязвимость RUSTSEC-2026-0394 затрагивает rustpython-vm версий от 0.3.0 до 0.5.0. Во время компиляции библиотека записывала все переменные окружения сборочной системы в файл, а затем включала его содержимое в программу.

Чем опасен такой механизм? Системы автоматической сборки CI могут хранить в переменных окружения токены реестров, ключи API и облачные учётные данные. Если секреты присутствовали во время сборки, они могли попасть в распространяемый исполняемый файл в открытом виде. Их можно извлечь стандартной утилитой strings либо через интерфейс самого RustPython.

В RustSec говорится, что наличие подобных данных подтвердили в выпущенных бинарных файлах как минимум четырёх зависимых проектов. В rustpython-vm 0.6.0 механизм встраивания всех переменных окружения удалён. При этом ранее собранный файл сохраняет включённые в него данные даже после обновления исходной зависимости; последствия зависят от того, какие переменные были доступны на момент его сборки и кому достался файл.

webpage открывала путь к внутренним адресам и локальным файлам

Библиотека webpage применяется для получения содержимого веб-страниц. До версии 2.1.0 методы HTTP::fetch и Webpage::from_url передавали адрес библиотеке libcurl без достаточной проверки схемы URL и конечного сетевого адреса.

Если приложение позволяло посетителю самостоятельно задать адрес для загрузки, злоумышленник мог использовать ссылку file:// для чтения доступных процессу локальных файлов. Другой вариант — направить серверный запрос во внутреннюю сеть или к служебному адресу облачной инфраструктуры, в том числе через перенаправление HTTP. Такой класс ошибок называют SSRF — подделкой запросов от имени сервера.

Бюллетень RUSTSEC-2026-0407 оценивает проблему в 7,5 балла. В webpage 2.1.0 обычные методы разрешают только HTTP(S) и проверяют, что конечный IP-адрес публичный, включая переходы по перенаправлениям. Для приложений, которым специально требуется обращаться к доверенным внутренним ресурсам, предусмотрены отдельные методы с суффиксом _unrestricted.

Исправленные версии и проверка зависимостей Rust

Опубликованные бюллетени указывают следующие версии, содержащие исправления описанных выше проблем:

БиблиотекаИсправленная версияОсновной затронутый сценарий
pingora-core, pingora-proxy0.9.0 и новееHTTP/2, кеширование и цепочки прокси; для DoS в pingora-core достаточно 0.8.1
zstd0.14.3 и новееПовторное использование контекстов и потоковая распаковка; у старых веток диапазоны уязвимых версий различаются
zstd-safe8.2.0 и новееРабота с буферами, распаковка и контексты
zstd-sys2.1.2 и новееПовреждение памяти при нехватке памяти в wasm32
rustpython-vm0.6.0 и новееПопадание переменных окружения сборки в исполняемый файл
webpage2.1.0 и новееSSRF и чтение локальных файлов через недоверенные URL

Для проверки зависимостей у Rust есть инструмент cargo audit. Он сопоставляет библиотеки и их версии из Cargo.lock с базой предупреждений RustSec, включая транзитивные зависимости — те, которые приложение получает через другие пакеты. Это помогает обнаружить уязвимую библиотеку даже тогда, когда она напрямую не указана в Cargo.toml.

Само наличие пакета в дереве зависимостей ещё не доказывает возможность атаки. Например, проблема webpage требует передачи контролируемого извне URL, а часть уязвимостей zstd-safe связана с определёнными функциями или включёнными возможностями. Для Pingora значение имеют поддержка HTTP/2, настройки ограничений и расположение прокси в сети.

Уязвимости затрагивают разные уровни программ на Rust

Серия бюллетеней от 26 октября охватывает сетевые запросы, сжатие данных и процесс сборки программ. Для Pingora последствия определяются конфигурацией прокси, для zstd — способом обработки потоков, а для RustPython — содержимым среды сборки. Поэтому одинаковое предупреждение RustSec может иметь совершенно разный практический эффект в двух программах, использующих одну и ту же библиотеку.

Источники

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться