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

Уязвимости 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-proxy | 0.9.0 и новее | HTTP/2, кеширование и цепочки прокси; для DoS в pingora-core достаточно 0.8.1 |
zstd | 0.14.3 и новее | Повторное использование контекстов и потоковая распаковка; у старых веток диапазоны уязвимых версий различаются |
zstd-safe | 8.2.0 и новее | Работа с буферами, распаковка и контексты |
zstd-sys | 2.1.2 и новее | Повреждение памяти при нехватке памяти в wasm32 |
rustpython-vm | 0.6.0 и новее | Попадание переменных окружения сборки в исполняемый файл |
webpage | 2.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 может иметь совершенно разный практический эффект в двух программах, использующих одну и ту же библиотеку.
Источники
- RustSec — RUSTSEC-2026-0389, переполнение памяти HTTP/2 в pingora-core
- RustSec — RUSTSEC-2026-0388, несоответствие Host и :authority
- RustSec — RUSTSEC-2026-0390, обход проверок заголовков в pingora-proxy
- RustSec — RUSTSEC-2026-0403, раскрытие памяти при распаковке zstd-safe
- RustSec — RUSTSEC-2026-0398, ошибка границ памяти в zstd-safe
- RustSec — RUSTSEC-2026-0391, утечка между потоками zstd
- zstd-rs — официальный pull request с исправлениями и версиями
- RustSec — RUSTSEC-2026-0394, секреты в rustpython-vm
- RustPython — первоначальный отчёт о переменных сборки
- RustSec — RUSTSEC-2026-0407, SSRF в webpage
- RustSec — документация cargo-audit