Rust 1.96.0: что проверить перед обновлением

Rust 1.96.0 привносит новые range API, макросы assert, изменения в WebAssembly и исправления двух уязвимостей сторонних регистров.

2026-06-02 GIGATAP Team #security
#Rust#Developer Tools#Open Source Security

Rust 1.96.0 — это не просто обновление компилятора. Команда Rust Release Team добавила новые range API, макросы assert, изменила поведение линкера для WebAssembly и исправила две уязвимости, затрагивающие пользователей сторонних регистров.

Практический вопрос для большинства команд: можно ли обновиться без проблем и зависят ли ваши WebAssembly или регистровые workflows от поведения, которое Rust теперь считает небезопасным или некорректным.

Что изменилось в Rust 1.96.0#

Релиз Rust 1.96.0 объявлен 28 мая 2026. Обновление доступно через rustup. Для тестеров доступны beta и nightly каналы для раннего обнаружения багов.

Главное изменение в стандартной библиотеке — стабилизация новых типов диапазонов под core::range, включая RangeInclusive. Новые типы отделяют хранение диапазона от состояния итератора, решая тонкую проблему: старый синтаксис создавал типы, которые одновременно работают как диапазон и итератор, что могло приводить к ошибкам.

core::range::RangeInclusive теперь может открыто показывать поля без риска конфликтов с exhausted-iterator состоянием. Старые диапазоны пока остаются, будущие версии Rust пересмотрят их использование.

Для разработчиков библиотек важно принимать диапазоны через трейты для совместимости старого и нового поведения. Если нужен конкретный тип, предпочтение — новым range.

Rust 1.96.0 также добавляет макросы pattern-checking assert, аналогичные debug_assert!(matches!(..)), но с выводом значения при ошибке. Макросы не включены в стандартный prelude из-за конфликтов с популярными внешними crates, импорт должен быть явным.

Значение для безопасности#

Ключевое изменение для операций — WebAssembly. Rust теперь не пропускает старое поведение линкера, позволяющее неопределенные символы превращать в импорты Wasm. Неопределенные символы вызывают linker errors.

Это безопаснее: ошибки линковки обычно указывают на баги сборки, неправильную конфигурацию или случайные совпадения имен символов. Rust 1.96.0 переносит проверку на этап сборки, где CI её фиксирует.

Стоимость совместимости: проекты, полагающиеся на старое поведение, могут сломаться. Есть два выхода: включить старое поведение через RUSTFLAGS=-Clink-arg=--allow-undefined или явно указать импорт #[link(wasm_import_module = "env")].

Зависит от намерения. Случайный символ — исправьте сборку. Намеренный импорт хоста — лучше явный import, чем глобальный флаг.

Релиз исправляет две уязвимости сторонних регистров: одна связана с извлечением crate tarballs с symlinks, другая — с аутентификацией через нормализованные URL. Полные CVE, уровень критичности и диапазоны версий не указаны, придумывать их нельзя.

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

Что проверить#

Для WebAssembly:

  • Соберите все Wasm цели новым stable toolchain.
  • Отслеживайте новые ошибки undefined symbols.
  • Определите, символ случайный или намеренный.
  • Явно указывайте #[link(wasm_import_module = "env")], когда это соответствует дизайну.
  • Не используйте --allow-undefined без понимания рисков.

Для библиотек:

  • Проверьте публичные API, работающие с конкретными range.
  • Предпочитайте новые range для будущей совместимости.

Для security operations:

  • Подтвердите использование сторонних или приватных регистров.
  • Проверьте аутентификацию при нормализованных URL.
  • Убедитесь, что извлечение tarballs происходит только через стандартные пути Cargo.
  • Читайте полный релиз перед заявлением о рисках.
  • Обновляйте образы сборки и toolchains после CI.

Ссылка GigaTap по теме: OpenSSF: сделать security artifacts операционными, Open Source Security требует больше, чем код.

Чего не преувеличивать#

Rust 1.96.0 не кризисный релиз. Исправлены две уязвимости для сторонних регистров, активной эксплуатации или универсальной угрозы нет.

Сбой линкера WebAssembly не всегда плохо — это сигнал о скрытых ошибках сборки.

Изменения range — сигнал для проектирования API, не повод переписывать рабочий код сразу.

Вывод: обновляйте, тестируйте и внимательно проверяйте Wasm и пути сторонних регистров. Rust 1.96.0 — обычный релиз с зонами, где дисциплина инженера важна.