Uma nova exploração do kernel Linux chamada Dirty Cred foi revelada na conferência de segurança Black Hat da semana passada. Assim, um novo Exploit Linux ‘Dirty Cred’ acabou por ser revelado na Black Hat
Zhenpeng Lin, um estudante de doutorado, e uma equipe de pesquisadores trabalharam em uma abordagem alternativa para a perigosa vulnerabilidade do Dirty Pipe que afetou as versões 8 e posteriores do kernel Linux.
O Dity Pipe é uma grande falha que permite que os invasores elevem contas com menos privilégios ao nível máximo (raiz) explorando a maneira como o kernel usa pipes para passar dados. Os invasores podem usá-lo para modificar arquivos do sistema e injetar código arbitrário que é executado como root em máquinas vulneráveis.
Novo exploit Linux ‘Dirty Cred’ revelado na Black Hat
A equipe de Lin descobriu um caminho para trocar credenciais do Kernel Linux em sistemas vulneráveis a uma vulnerabilidade relatada anteriormente (CVE-2021-4154) e uma nova (CVE-2022-2588), e eles esperam adicionar mais CVEs compatíveis no futuro. Um POC público (prova de conceito) está disponível no GitHub oferecendo uma defesa eficaz contra o ataque.
Os pesquisadores descreveram sua abordagem como um método genérico que pode ser aplicado a contêineres (ao contrário do Dirty Pipe) e ao Android, e “permite que diferentes bugs sejam semelhantes ao Dirty-Pipe”. De fato, a exploração gerada “pode funcionar em diferentes kernels e ARCH sem alteração de código”.
Como funciona o Dirty Cred
Lin publicou uma demonstração no Twitter que demonstra como a abordagem pode ser usada para elevar um usuário com poucos privilégios em dois sistemas diferentes, como Centos 8 e Ubuntu, usando o mesmo código de exploração:
Nos bastidores, o ataque é uma corrupção de heap do kernel. Como as credenciais privilegiadas não são isoladas das não privilegiadas, um invasor pode tentar trocá-las.
Existem dois tipos principais de credenciais do kernel:
- credenciais de tarefa
- credenciais de arquivo aberto
Para simplificar isso, digamos que o kernel use dois tipos de objetos: “struct cred” e “struct file”. Esses objetos são armazenados em caches dedicados. O primeiro contém credenciais de tarefas, que são informações sobre privilégios, capacidades e permissões dos processos.
Qualquer ataque que consiga alterar esses dados pode resultar em uma escalada de privilégios. O que o Dirty cred faz é liberar uma credencial sem privilégios em uso para alocar uma privilegiada no slot de memória liberado e, finalmente, operar como um usuário privilegiado:
O ataque não é perfeito, porém, pois precisa esperar que um usuário privilegiado aloque credenciais de tarefa, mas deve ser possível acionar processos com SUIDs raiz, por exemplo.
A abordagem é praticamente a mesma com credenciais de arquivo aberto e objetos de arquivo struct. O ataque libera um arquivo após as verificações de permissão, mas antes da gravação do arquivo no disco, o que deve permitir que o invasor aloque um objeto de arquivo somente leitura no slot de memória e opere como usuário privilegiado:
A etapa final que visa estabilizar a exploração do arquivo não é a mais fácil de alcançar. A troca deve acontecer entre as verificações de permissão e a gravação no disco, o que representa uma janela de tempo muito estreita.
Os pesquisadores destacaram várias soluções que consistem em uma pausa na execução do kernel (por exemplo, FUSE, bloqueio de arquivo) para estender essa janela de tempo.
Como se proteger contra ataques Dirty Cred
Deve-se notar que o POC ainda está em andamento, mesmo que já esteja funcionando em condições específicas, como uma vulnerabilidade específica. O CVE-2021-4154 foi corrigido no kernel Linux, mas os pesquisadores indicam que “o exploit funciona na maioria dos kernels Centos 8 superiores a linux-4.18.0-305.el8 e na maioria dos kernels buntu 20 superiores a 5.4.0-87.98 e 5.11.0-37.41.”
Como os objetos são isolados de acordo com seu tipo e não com seus privilégios, os pesquisadores recomendam isolar credenciais privilegiadas de não privilegiadas usando memória virtual para evitar ataques de cache cruzado.
O patch está disponível no GitHub e consiste em isolar a tarefa cred usando vmalloc (memória virtualmente contígua).