Durante a portabilidade do utilitário cryptsetup-suspend para NixOS, foi identificada uma falha no subsistema de criptografia de disco LUKS (Linux Unified Key Setup), que impediu a limpeza das chaves de criptografia da memória RAM quando o sistema entra em modo de espera, a partir do kernel Linux 6.9 (commit problemático) lançado em maio de 2024.
O utilitário cryptsetup-suspend é utilizado no Debian para bloquear automaticamente as partições LUKS antes de entrar em modo de espera. Acredita-se que, em caso de roubo de um laptop colocado em modo de espera, o criminoso não terá acesso aos dados, pois será necessário inserir uma senha para restaurar o acesso aos dados criptografados ao sair do modo de espera. Devido a uma falha no kernel Linux, após bloquear a partição LUKS com o comando 'cryptsetup luksSuspend', as chaves não eram limpas da memória RAM e permaneciam visíveis através de /proc/keys, possibilitando que um atacante as extraísse, por exemplo, por meio do método de 'reinicialização fria', e as utilizasse para acessar os dados.
A falta de limpeza das chaves foi descoberta durante a depuração de uma condição de corrida que causava problemas ao entrar em modo de espera. A falha surgiu após uma refatoração no kernel 6.9, onde as chaves eram vinculadas ao thread chamador e deveriam ser removidas ao seu término, mas na prática permaneciam na memória. Um patch de uma linha foi proposto para ser incluído no kernel Linux, corrigindo a falha cometida.
Este patch não foi aceito no kernel, pois foi identificada uma falha — o patch só funciona para dispositivos físicos, mas não para dispositivos virtuais de loop. Em vez de corrigir o problema no lado do kernel, os desenvolvedores do utilitário cryptsetup propuseram uma solução alternativa para a limpeza das chaves. Esta modificação já foi aceita e fará parte da versão 2.8.7 do cryptsetup.
Além disso, para NixOS, foi criada uma implementação própria de scripts para bloquear discos criptografados antes de entrar em modo de espera, utilizando um patch antigo do kernel, não aceito em 2015, que força a limpeza das chaves da memória antes de entrar no modo de espera.
Fonte: opennet.ru
