Foi revelada a informação sobre a sexta vulnerabilidade (1, 2-3, 4, 5), permitindo que um usuário local não privilegiado obtenha direitos de root, sobrescrevendo dados no cache de páginas. A vulnerabilidade recebeu o nome de código PinTheft. Um protótipo de exploit está disponível. O identificador CVE ainda não foi atribuído. A correção está disponível apenas na forma de um patch, publicado em 5 de maio e aceito na branch netdev em 11 de maio, mas não incluído em lançamentos corretivos do núcleo.
A vulnerabilidade está presente na implementação do protocolo de rede RDS (Reliable Datagram Sockets), destinado à troca de mensagens de alta velocidade entre nós em um cluster, com latência mínima e entrega garantida. O ataque é possível em sistemas com a subsistema io_uring ativado (io_uring_disabled=0) e um núcleo compilado com as opções CONFIG_RDS, CONFIG_RDS_TCP e CONFIG_IO_URING. Para que o exploit funcione, deve haver um arquivo executável disponível para leitura com a flag SUID-root no sistema.
Para carregar automaticamente o módulo do núcleo rds_tcp, o exploit solicita o envio de dados via RDS utilizando o transporte SO_RDS_TRANSPORT=2. Observa-se que, entre as distribuições Linux testadas, na configuração padrão, o módulo do núcleo rds é fornecido apenas no Arch Linux. Para bloquear a vulnerabilidade, pode-se impedir o carregamento automático dos módulos do núcleo rds e rds_tcp: rmmod rds_tcp rds printf ‘install rds /bin/false\ninstall rds_tcp /bin/false\n’ > /etc/modprobe.d/pintheft.conf
A vulnerabilidade é causada por um erro na implementação do mecanismo zerocopy na função rds_message_zcopy_from_user(), que realiza a modificação direta de dados no cache de páginas para evitar bufferização excessiva. Em caso de falha, não houve limpeza do campo rm->data.op_nents, o que causou a dupla liberação do buffer (double-free). A aparição de um valor incorreto no contador de referências foi explorada para sobrescrever dados no cache de páginas, devido à manipulação do ponteiro para um buffer fixo io_uring.
O mecanismo de exploração é típico de todas as vulnerabilidades dessa classe — o atacante consegue a persistência de um arquivo de programa com a flag suid root no cache de páginas, e então insere um código no cabeçalho ELF para executar /usr/bin/sh. Após essa manipulação, a execução do programa leva ao carregamento na memória não do arquivo executável original do armazenamento, mas de uma cópia modificada do cache de páginas. Ao contrário dos exploits anteriores, esta nova variante é adaptada apenas para atacar a utilidade "su", mas também pode ser aplicada quando há programas suid no sistema, como mount, passwd, chsh, newgrp, umount e pkexec.
Fonte: opennet.ru
