При переносе инструментария cryptsetup-suspend для NixOS была обнаружена ошибка в подсистеме дискового шифрования LUKS (Linux Unified Key Setup), из-за которой начиная с ядра Linux 6.9 (проблемный коммит), выпущенного в мае 2024 года, очистка ключей шифрования из оперативной памяти при переходе системы в ждущий режим перестала работать.
Инструментарий cryptsetup-suspend используется в Debian для автоматической блокировки LUKS-разделов перед переходом в режим сна. Предполагается, что в случае кражи ноутбука, переведённого в режим сна, злоумышленник не сможет получить доступ к данным, так как при выходе из сна потребуется ввести пароль для восстановления доступа к зашифрованным данным. Из-за ошибки в ядре Linux после блокировки LUKS-раздела командой «cryptsetup luksSuspend» ключи не очищались из оперативной памяти и оставались видны через /proc/keys, что позволяло атакующему извлечь их, например, с помощью метода «холодной перезагрузки», и использовать для доступа к данным.
Отсутствие очистки ключей было выявлено в ходе отладки состояния гонки, из-за чего возникли проблемы с переходом в ждущий режим. Ошибка возникла после рефакторинга в ядре 6.9, в результате которого ключи привязывались к вызывающему потоку и должны были удаляться при его завершении, но на практике оставались в памяти. Для исправления данной ошибки в ядре Linux предложен однострочный патч.
Данный патч не принят в ядро, так как в нём была обнаружена недоработка: он работает только для физических накопителей, но не для виртуальных loop-устройств. Вместо исправления проблемы на уровне ядра разработчиками инструментария cryptsetup был предложен обходной путь очистки ключей. Это изменение уже было принято и войдёт в состав релиза cryptsetup 2.8.7.
Кроме того, для NixOS была создана собственная реализация скриптов для блокировки шифрованных дисков перед переходом в ждущий режим, использующая старый патч к ядру, не принятый в 2015 году, который принудительно очищает ключи из памяти перед переходом в режим сна.
Izvor: opennet.ru
