
Prova de conceito para CVE-2022-0847
CSE 5380: Trabalho de Segurança da Informação CVE-2022-0847 (Dirty Pipe)
Por
Karan Vasudevamurthy (UTA ID: 1002164438)
O que é CVE?
Common Vulnerabilities and Exposures (CVE) é uma lista de vulnerabilidades e exposições de segurança da informação publicamente divulgadas. A corporação MITRE introduziu o CVE em 1999 para identificar e classificar as vulnerabilidades em software e firmware. A MITRE é uma organização sem fins lucrativos que opera centros de pesquisa e desenvolvimento financiados pelo governo federal dos Estados Unidos. O CVE visa facilitar o compartilhamento de informações sobre vulnerabilidades conhecidas, para que os planos de segurança cibernética possam ser atualizados para refletir os problemas e fraquezas de segurança mais recentes. Para isso, o CVE atribui um identificador único a cada vulnerabilidade ou exposição. Através dos identificadores CVE, que também são conhecidos como nomes CVE ou números CVE. O Common Vulnerability Scoring System (CVSS) é um conjunto de padrões abertos para atribuir um número a uma vulnerabilidade a fim de avaliar sua gravidade. A faixa de uma pontuação CVSS é de 0,0 a 10,0. O grau de gravidade de segurança aumenta com o aumento do número. Cada ID CVE é formatado como CVE-AAAA-NNNNN. A parte AAAA é o ano em que o ID CVE foi atribuído ou o ano em que a vulnerabilidade foi tornada pública.
O que são pipes?
No contexto do CVE-2022-0847, é crucial entender o funcionamento interno dos pipes, particularmente os atributos associados ao buffer do pipe. Pipes no Linux ajudam na transferência de dados entre processos, com a saída de um processo se tornando a entrada para outro. Esse mecanismo facilita a comunicação e coordenação entre diferentes processos em execução no sistema. Pipes são unidirecionais no Linux, o que significa que os dados fluem em apenas uma direção. Um buffer de pipe normalmente consiste em uma estrutura de dados FIFO (first-in, first-out) de tamanho fixo que armazena temporariamente os dados sendo transferidos entre processos. Quando um processo escreve dados em um pipe, eles são armazenados no buffer até que outro processo os leia. Assim que os dados são lidos, eles são removidos do buffer, permitindo que novos dados sejam escritos.
A vulnerabilidade
Para o CVE-2022-0847, é importante entender duas funções dentro do buffer do pipe-
Página | 1
Max Kellermann descobriu que o kernel Linux lidava incorretamente com pipes Unix. A vulnerabilidade surge devido à inicialização inadequada de certos atributos, especificamente o parâmetro "flags", dentro das funções "copy_page_to_iter_pipe" e "push_pipe". Essa omissão leva à possibilidade de valores obsoletos ou incorretos serem atribuídos às flags, comprometendo potencialmente a segurança e a integridade do sistema. Um usuário local não privilegiado poderia usar essa falha para escrever em páginas no cache de página apoiadas por arquivos somente leitura e, assim, escalar seus privilégios no sistema.
Metodologia de Ataque
É semelhante ao CVE-2016-5195 “Dirty Cow”, mas é mais fácil de explorar. A exploração do CVE-2022-0847 requer acesso local ao sistema alvo e afeta versões do kernel Linux mais recentes que a 5.8. Podemos criar novos buffers de pipe com a flag PIPE_BUF_FLAG_CAN_MERGE incorretamente definida devido à falta de inicialização adequada. Essa flag controla a coalescência de escritas em um buffer de pipe e, portanto, permite escrever em uma página existente emendada no pipe. Se um arquivo permitir essa página emendada, a modificação será vista na visão compartilhada em todo o sistema do arquivo na memória. Qualquer liberação de cache posterior ignorará as configurações atuais de permissões do Linux e copiará os dados alterados para o disco. Isso permitiria que um usuário sem privilégios alterasse conteúdos específicos de um arquivo (seja em disco ou na memória), mesmo que o arquivo esteja protegido contra modificação por controles de acesso somente leitura como SELinux, permissões padrão do Linux, controle de acesso avançado e arquivos imutáveis. Portanto, podemos assumir que o atacante seria qualquer usuário local sem privilégios com conhecimento básico de sistemas Linux e capacidade de executar código malicioso. Tal indivíduo poderia escalar seus privilégios e potencialmente comprometer todo o sistema, representando um risco significativo de segurança.
Prova de conceito
Abaixo estão as etapas que segui para explorar o CVE-2022-0847 em uma máquina virtual rodando Linux.
Verificando se sua Distribuição Linux pode ser explorada-
Qualquer kernel Linux mais recente que 5.8 é afetado. No entanto, as versões 5.16.11, 5.15.25 e 5.10.102 não podem ser exploradas para o CVE-2022-0847. Para descobrir sua versão do kernel, podemos simplesmente executar *uname -r*. Você também pode executar este script bash se não tiver certeza se um sistema alvo é vulnerável ou não.
Baixando o kernel Linux correto-
Para a demonstração, decidi usar Ubuntu 20.04.1 LTS. Mas esta versão do Ubuntu atualmente roda no kernel Linux 5.15 e o CVE-2022-0847 não pode ser explorado nesta versão do kernel. Para baixar o kernel Linux 5.8, podemos simplesmente executar *sudo apt install linux-image-5.8.0-63-generic linux-headers-5.8.0-63-generic*
Baixando o exploit-
O exploit pode ser encontrado no GitHub. Ele demonstra como sobrescrever qualquer conteúdo de arquivo no cache de página, mesmo que o arquivo não tenha permissão para ser escrito, seja imutável ou esteja em um ponto de montagem somente leitura. Você também pode executar *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)*no terminal.
Copiando o arquivo passwd original-
Podemos executar *cp /etc/passwd /tmp/passwd.bak*. Isso nos ajudará a identificar a diferença no arquivo passwd antes e depois de executar o exploit.
Compilando o exploit-
Para compilar o exploit com sucesso, você precisará ter o GCC instalado. Você pode instalar o GCC com *sudo apt-get install gcc*. Para compilar o exploit, você pode executar
Limitações
Existem duas limitações principais deste exploit:
Status Atual e Remediação
Em 12/01/2024, a probabilidade de atividade de exploração nos próximos 30 dias é de 7,58% (Exploit prediction scoring system (EPSS)). Abaixo está o CVSS (Common Vulnerability Scoring System) para o CVE-2022-0487:
Esta vulnerabilidade pode ser explorada em qualquer kernel Linux mais recente que 5.8. No entanto, a vulnerabilidade foi corrigida no Linux 5.16.11, 5.15.25 e 5.10.102. Portanto, podemos simplesmente aplicar os patches ou atualizações fornecidos pelos mantenedores da distribuição Linux para corrigir a vulnerabilidade. Para fazer isso, podemos apenas executar os seguintes comandos *sudo apt update* e *sudo apt upgrade*.
Referências
*gcc exp.c -o exp*Executando o exploit-
Para executar o exploit, os parâmetros que precisam ser fornecidos são o arquivo somente leitura, o deslocamento e alguns caracteres que serão inseridos. Neste caso, executaremos *./exp /etc/passwd 1 ootz:* . Se você obtiver uma saída que diz “It worked !”, significa que exploramos com sucesso a vulnerabilidade Dirty Pipe e agora podemos obter acesso root sem a senha.
Alternando para acesso root-
Agora podemos simplesmente executar *su rootz* e devemos ter acesso root. Para confirmar, podemos executar o comando id.