Uma vulnerabilidade no núcleo Linux que permite corromper arquivos disponíveis apenas para leitura

Uma vulnerabilidade foi identificada no núcleo do Linux (CVE-2022-0847), permitindo a sobrescrição do conteúdo do cache de página para qualquer arquivo, incluindo aqueles em modo somente leitura, abertos com a flag O_RDONLY ou disponíveis em sistemas de arquivos montados em modo somente leitura. Praticamente, essa vulnerabilidade pode ser usada para injetar código em processos arbitrários ou corromper dados em arquivos abertos. Por exemplo, é possível modificar o conteúdo do arquivo authorized_keys para o processo sshd. Um protótipo do exploit está disponível para testes.

O problema recebeu o codinome Dirty Pipe, em analogia com a crítica vulnerabilidade Dirty COW identificada em 2016. Observa-se que, em termos de gravidade, Dirty Pipe é comparável ao Dirty COW, mas é significativamente mais fácil de explorar. A vulnerabilidade foi identificada após a análise de reclamações sobre a corrupção periódica de arquivos transferidos pela rede no sistema, que carrega arquivos compactados de um servidor de logs (37 corrupções em 3 meses em um sistema sobrecarregado), onde a operação splice() e pipes nomeados foram utilizados.

A vulnerabilidade se manifesta a partir do núcleo Linux 5.8, lançado em agosto de 2020, ou seja, está presente no Debian 11, mas não afeta o núcleo base do Ubuntu 20.04 LTS. Os núcleos RHEL 8.x e openSUSE/SUSE 15 são inicialmente baseados em versões antigas, mas não se pode descartar que a mudança problemática tenha sido retroportada para eles (não há dados precisos ainda). É possível acompanhar a publicação de atualizações de pacotes nas distribuições nessas páginas: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Uma correção para a vulnerabilidade foi proposta nas versões 5.16.11, 5.15.25 e 5.10.102. A correção também foi incluída no núcleo utilizado na plataforma Android.

A vulnerabilidade é causada pela falta de inicialização do valor "buf->flags" no código das funções copy_page_to_iter_pipe() e push_pipe(), sendo que a memória não é limpa ao alocar a estrutura e, em certas manipulações com pipes não nomeados, o "buf->flags" pode conter um valor de outra operação. Ao explorar essa particularidade, um usuário local não privilegiado pode fazer com que o flag contenha o valor PIPE_BUF_FLAG_CAN_MERGE, que permite a sobrescrita de dados no cache de página através da simples gravação de novos dados em um pipe nomeado especificamente preparado.

Para realizar um ataque, o arquivo alvo deve estar acessível para leitura, e como os direitos de acesso não são verificados ao gravar em um pipe, a substituição no cache de página pode ocorrer também para arquivos localizados em partições montadas apenas para leitura (por exemplo, arquivos de CD-ROM). Após a substituição das informações no cache de página, o processo ao ler dados do arquivo obterá não os dados reais, mas os dados substituídos.

A exploração se resume à criação de um pipe anônimo e ao preenchimento deste com dados arbitrários para garantir a definição da flag PIPE_BUF_FLAG_CAN_MERGE em todas as estruturas de anel associadas. Em seguida, os dados são lidos do pipe, mas a flag permanece definida em todas as instâncias da estrutura pipe_buffer nas estruturas de anel pipe_inode_info. Depois, é feita uma chamada à função splice() para ler dados do arquivo alvo para o pipe anônimo, começando do deslocamento necessário. Ao gravar dados neste pipe anônimo, devido à flag PIPE_BUF_FLAG_CAN_MERGE, os dados no cache de página serão sobrescritos, em vez de criar uma nova instância da estrutura pipe_buffer.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster