При портировании инструментария cryptsetup-suspend за NixOS беше установен проблем в подсистемата за дискoво шифроване LUKS (Linux Unified Key Setup), поради който от ядрото на Linux 6.9 (проблемният комит), издадено през май 2024 година, спря да сe извършва почистването на криптографските ключове от оперативната памет, когато системата преминава в режим на заспиване.
Инструментарият cryptsetup-suspend се използва в Debian за автоматично блокиране на LUKS-раздели преди преминаване в режим на сън. Предполага се, че в случай на кражба на лаптоп, преминал в режим на сън, нападателят ще бъде лишен от достъп до данните, тъй като при излизане от сън ще е необходимо да се въведе парола за възстановяване на достъпа до зашифрените данни. Поради грешка в ядрото на Linux след блокирането на LUKS-раздела с командата „cryptsetup luksSuspend“ ключовете не бяха изчистени от оперативната памет и оставались видими чрез /proc/keys, което позволяваше на нападателя да ги извлече, например, чрез „студено рестартиране“ и да ги използва за достъп до данните.
Отсъствието на почистване на ключовете беше установено по време на отстраняване на състояние на гонка, което причиняваше проблеми при преминаването в режим на заспиване. Грешката възникна след рефакторирането в ядрото 6.9, при което ключовете бяха свързани с извикващия поток и трябваше да бъдат премахнати при неговото завършване, но всъщност оставаха в паметта. Предложен е еднореден патч за включване в ядрото на Linux, който отстранява допуснатата грешка.
Този патч не е приет в ядрото, тъй като в него е открит недостатък — патчът действа само за физически носители, но не работи за виртуални loop-устройства. Вместо да поправят проблема на страната на ядрото, разработчиците на инструментария cryptsetup предложиха обходен път за почистване на ключовете. Това изменение вече е прието и ще влезе в състава на издаването на cryptsetup 2.8.7.
Освен това, за NixOS беше създадено собствено изпълнение на скриптове за блокиране на шифровани дискове преди преминаване в режим на заспиване, при което е включен стар патч за ядрото, неприет през 2015 година, принудително почиствящ ключовете от паметта преди преминаването в режим на сън.
Източник: opennet.ru
