По време на портването на инструмента 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 г., който принудително изтрива ключовете от паметта преди преминаването в режим на сън.
Източник: opennet.ru
