ТехноСводка

Софт

В компиляторе Rust найдена 11-летняя ошибка в borrow checker, нарушающая безопасность памяти

В трекере Rust описана проблема, из-за которой компилятор принимает код с некорректным временем жизни ссылки, что приводит к использованию памяти после освобождения.

Ошибка связана с присваиванием через ковариантное поле структуры с реализацией Drop: код в drop получает не-'static ссылку, но предполагает, что она 'static. В примере из issue программа компилируется и печатает чужие данные, а с AddressSanitizer падает с stack-use-after-scope. Проблема воспроизводится на nightly и стабильных версиях минимум с 1.85.0.

Участники обсуждения привели варианты, в том числе без static; один из них, по их словам, сбоит или читает освобождённую память с версии 1.4, а другой компилируется с 1.18.0 (2017).

Представитель команды типов lcnr пояснил, что ошибка получила приоритет P-high, а не P-critical, потому что за 11 лет её никто не встретил. Он считает маловероятным, что она вызвала проблемы случайно: для эксплуатации нужна намеренно вредоносная реализация Drop. Команда называет устранение подобных дыр в системе типов приоритетом.

  • Приоритет P-high, не P-critical
  • Воспроизводится минимум с Rust 1.85.0

Источники

Текст подготовлен автоматически по материалам источников и может содержать неточности.