Condición de carreira no colector de lixo do núcleo de Linux que pode levar a unha escalada de privilexios

Jann Horn, do equipo de Google Project Zero, que unha vez identificou as vulnerabilidades Spectre e Meltdown, publicou unha técnica para explotar unha vulnerabilidade (CVE-2021-4083) no colector de lixo do núcleo de Linux. A vulnerabilidade débese a unha condición de carreira ao limpar os descritores de ficheiros en sockets Unix e potencialmente permite que un usuario local sen privilexios execute o seu código a nivel do núcleo.

O problema é interesante porque estimouse que a xanela de tempo durante a que se produce a condición de carreira era demasiado pequena para crear exploits reais, pero o autor do estudo demostrou que incluso esas vulnerabilidades inicialmente escépticas poden converterse na fonte de ataques reais se o creador do exploit ten as habilidades e o tempo necesarios. Yann Horn mostrou como, coa axuda de manipulacións de filigrana, pode reducir a condición de carreira que se produce ao chamar simultaneamente ás funcións close() e fget() nunha vulnerabilidade de uso despois de libre totalmente explotable e lograr o acceso a datos xa liberados. estrutura dentro do núcleo.

Prodúcese unha condición de carreira durante o proceso de pechar un descritor de ficheiro mentres se chama a close() e fget() ao mesmo tempo. A chamada a pechar() pode executarse antes de fget(), o que confundirá ao colector de lixo porque, segundo o refcount, a estrutura do ficheiro non terá referencias externas, pero permanecerá adxunta ao descritor do ficheiro, é dicir. O colector de lixo pensará que ten acceso exclusivo á estrutura, pero de feito, durante un curto período de tempo, a entrada restante na táboa descritor de ficheiros seguirá apuntando á estrutura que se está liberando.

Para aumentar a probabilidade de entrar nunha condición de carreira, utilizáronse varios trucos, que fixeron posible aumentar a probabilidade de éxito da explotación ata o 30% ao introducir optimizacións específicas do sistema. Por exemplo, para aumentar o tempo de acceso a unha estrutura con descritores de ficheiros en varios centos de nanosegundos, os datos foron eliminados da caché do procesador ao ensuciar a caché con actividade noutro núcleo da CPU, o que permitiu recuperar a estrutura da memoria en lugar de a rápida caché da CPU.

A segunda característica importante foi o uso de interrupcións xeradas por un temporizador de hardware para aumentar o tempo de condición de carreira. Seleccionouse o momento para que o controlador de interrupcións disparase cando se producise unha condición de carreira e interrompese a execución do código durante algún tempo. Para atrasar aínda máis a devolución do control, xeráronse preto de 50 mil entradas na cola de espera mediante epoll, o que requiriu buscar a través do controlador de interrupcións.

A técnica para explotar a vulnerabilidade foi revelada despois dun período de non divulgación de 90 días. O problema aparece dende o núcleo 2.6.32 e solucionouse a principios de decembro. A corrección incluíuse no núcleo 5.16 e tamén foi transferida ás ramas LTS do núcleo e dos paquetes do núcleo que se fornecen nas distribucións. Cabe destacar que a vulnerabilidade foi identificada durante a análise dun problema similar CVE-2021-0920, que se manifesta no colector de lixo ao procesar a bandeira MSG_PEEK.

Fonte: opennet.ru

Engadir un comentario