Alguns dias atrás Jann Horn da equipe do Google Project Zero, que anteriormente identificaram as vulnerabilidades Spectre e Meltdown, revelou uma técnica para explorar uma vulnerabilidade encontrado no coletor de lixo do kernel Linux (CVE-2021-4083).
Vulnerabilidade é causado por uma condição de corrida quando os descritores de arquivo de soquete unix são limpos e potencialmente permite que um usuário local sem privilégios execute seu código no nível do kernel.
O problema é interessante porque a janela de tempo durante o qual a condição de corrida ocorre foi avaliado como muito pequeno para criar vulnerabilidades reais, mas o autor do estudo mostrou que mesmo vulnerabilidades inicialmente céticas podem se tornar uma fonte de ataques reais se o criador da vulnerabilidade tiver as habilidades e o tempo necessários.
Yann Horn mostrou como, com a ajuda de manipulações de filigrana, é possível reduzir a condição Um evento de corrida que ocorre ao chamar as funções close() e fget() ao mesmo tempo para uma vulnerabilidade use-after-free totalmente explorada e ao obter acesso a uma estrutura de dados já liberada dentro do kernel.
Ocorre uma condição de corrida durante o processo de fechamento de um descritor de arquivo enquanto chama as funções close() e fget() ao mesmo tempo. A chamada para close() pode ser executada antes de fget() ser executado, o que confundirá o coletor de itens não utilizado porque, de acordo com refcount, a estrutura do arquivo não terá referências externas, mas permanecerá anexada ao descritor de arquivo, ou seja, o coletor de lixo assumirá que tem acesso exclusivo à estrutura, mas na verdade por um curto período de tempo, a entrada restante na tabela do descritor de arquivo continuará a indicar que a estrutura está sendo liberada.
Para aumentar a probabilidade entrando em uma condição de corrida, foram usados vários truques que permitiram aumentar a probabilidade de sucesso da participação em 30% ao realizar otimizações específicas do sistema. Por exemplo, para aumentar o tempo de acesso a uma estrutura com descritores de arquivo em várias centenas de nanossegundos, os dados foram liberados do cache do processador poluindo o cache com atividade em outro núcleo da CPU, o que possibilitou retornar a estrutura da memória e não o cache rápido da CPU.
A segunda característica importante era o uso de interrupções geradas por um temporizador de hardware para aumentar o tempo de corrida. O tempo foi escolhido para que o manipulador de interrupção fosse acionado durante a ocorrência da condição de corrida e interrompesse a execução do código por um tempo. Para atrasar ainda mais o retorno do controle, o epoll gerou cerca de 50 mil entradas na fila, o que exigiu uma iteração no manipulador de interrupções.
A técnica exploração de vulnerabilidade foi divulgado após um período de não divulgação de 90 dias. O problema
e foi corrigido no início de dezembro. A correção foi incluída no kernel 5.16 e também movida para as ramificações LTS do kernel e os pacotes com o kernel fornecidos nas distribuições. Deve-se notar que a vulnerabilidade foi identificada durante a análise de um problema semelhante CVE-2021-0920, que se manifesta no coletor de lixo ao processar o sinalizador MSG_PEEK.
Outra vulnerabilidade encontrada recentemente no kernel Linux, foi o CVE-2022-0742 que pode esgotar a memória disponível e causar remotamente uma negação de serviço enviando pacotes icmp6 especialmente criados. O problema está relacionado a um vazamento de memória que ocorre ao processar mensagens ICMPv6 com tipos 130 ou 131.
O problema está presente desde o kernel 5.13 e foi corrigido nas versões 5.16.13 e 5.15.27. O problema não afetou Debian, SUSE, Ubuntu LTS (18.04, 20.04) e ramificações estáveis do RHEL, foi corrigido no Arch Linux.
Finalmente se você estiver interessado em saber mais sobre isso da nota, você pode conferir os detalhes em o seguinte link.