
Prova de conceito demonstrando a contornação da criptografia de disco LUKS vinculada a TPM em sistemas Linux, extraindo chaves de volume por meio de ataque personalizado ao sistema de arquivos raiz.
Este repositório contém um código simples de prova de conceito que explora uma fraqueza comum descrita inicialmente há mais de um ano em https://oddlama.org/blog/bypassing-disk-encryption-with-tpm2-unlock/. Embora tenha como alvo específico o IncusOS, o ataque é bastante genérico contra a maioria dos sistemas Linux modernos.
Se você está vinculando sua criptografia LUKS a um TPM, certifique-se de também definir um PIN para o TPM.
Esta é uma PoC rápida e improvisada. Não está totalmente polida e há algumas arestas. Não há suporte e não pretendo fazer qualquer desenvolvimento adicional.
Eu, como a maioria das pessoas, presumi que configurar a criptografia de disco LUKS vinculada ao chip TPM do meu laptop seria seguro e impediria um atacante de extrair a chave de volume LUKS (também conhecida como chave mestra). Acontece que é quase deprimentemente fácil de fazer e não deixa nenhum vestígio do ataque.
Sim, o problema é que um atacante pode fornecer um sistema de arquivos raiz personalizado, e após o seu sistema inicializar, o TPM estará em um estado "bom" conhecido, no qual ele desbloqueará seu volume LUKS de bom grado. O atacante pode então fazer o que quiser e facilmente encobrir qualquer evidência do ataque.
Mas um atacante preparado literalmente só precisa ter seu computador em sua posse por alguns minutos e você está comprometido. Deixou seu laptop no quarto de hotel enquanto saía para jantar? E quanto a um posto de controle de segurança onde você é separado para interrogatório? Sim, isso não é bom.
O script ./prepare.sh executa as etapas necessárias para comprometer a VM alvo. As mesmas etapas podem ser facilmente executadas contra um disco rígido real que foi temporariamente removido de seu alojamento normal.
O "exploit" real extrairá a chave de volume LUKS original, que pode ser vista observando o log do journal para attack.service. Muitas variações deste ataque são possíveis.
Execute ./restore.sh para apagar toda evidência de suas ações enquanto você sai com a chave de volume LUKS da sua vítima.