Vulnerabilidade no kernel do Linux que pode adulterar arquivos somente leitura

Foi identificada uma vulnerabilidade no kernel Linux (CVE-2022-0847) que permite que o conteúdo do cache da página seja substituído por quaisquer arquivos, incluindo aqueles em modo somente leitura, abertos com o sinalizador O_RDONLY ou localizados em sistemas de arquivos montado em modo somente leitura. Em termos práticos, a vulnerabilidade poderia ser usada para injetar código em processos arbitrários ou corromper dados em arquivos abertos. Por exemplo, você pode alterar o conteúdo do arquivoauthorized_keys para o processo sshd. Um protótipo de exploração está disponível para teste.

O problema recebeu o codinome Dirty Pipe, semelhante à vulnerabilidade crítica Dirty COW identificada em 2016. Nota-se que em termos de nível de perigo, Dirty Pipe está no mesmo nível que Dirty COW, mas é muito mais fácil de operar. A vulnerabilidade foi identificada durante a análise de reclamações sobre corrupção periódica de arquivos baixados pela rede em um sistema que baixa arquivos compactados de um servidor de log (37 corrupções em 3 meses em um sistema carregado), cuja preparação utilizou a operação splice() e tubos sem nome.

A vulnerabilidade aparece a partir do kernel Linux 5.8, lançado em agosto de 2020, ou seja. presente no Debian 11, mas não afeta o kernel base no Ubuntu 20.04 LTS. Os kernels RHEL 8.x e openSUSE/SUSE 15 são inicialmente baseados em ramificações antigas, mas é possível que a mudança que causou o problema tenha sido portada para eles (ainda não há dados exatos). Você pode acompanhar a publicação de atualizações de pacotes em distribuições nestas páginas: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Uma correção para a vulnerabilidade foi fornecida nas versões 5.16.11, 5.15.25 e 5.10.102. A correção também está incluída no kernel usado 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(), apesar de a memória não ser limpa ao alocar uma estrutura e durante certas manipulações com pipes sem nome, um valor de outra operação. Usando esse recurso, um usuário local sem privilégios pode obter a aparência do valor PIPE_BUF_FLAG_CAN_MERGE no sinalizador, o que permite organizar a substituição de dados no cache da página simplesmente gravando novos dados em um canal sem nome especialmente preparado.

Para um ataque, o arquivo alvo deve ser legível e, como os direitos de acesso não são verificados ao gravar no pipe, a substituição no cache da página também pode ser feita para arquivos localizados em partições montadas somente leitura (por exemplo, para arquivos c CD- ROM). Após substituir as informações no cache da página, ao ler os dados de um arquivo, o processo receberá não os dados reais, mas os dados substituídos.

A operação se resume a criar um canal sem nome e preenchê-lo com dados arbitrários para garantir que o sinalizador PIPE_BUF_FLAG_CAN_MERGE esteja definido em todas as estruturas em anel associadas a ele. Em seguida, os dados são lidos do canal, mas o sinalizador permanece definido em todas as instâncias da estrutura pipe_buffer nas estruturas em anel pipe_inode_info. Uma chamada para splice() é então feita para ler os dados do arquivo de destino em um canal sem nome, começando no deslocamento desejado. Ao gravar dados neste canal sem nome, devido à configuração do sinalizador PIPE_BUF_FLAG_CAN_MERGE, os dados no cache da página serão substituídos em vez de criar uma nova instância da estrutura pipe_buffer.

Fonte: opennet.ru

Adicionar um comentário