A empresa Qualys identificou três vulnerabilidades na ferramenta needrestart, que é projetada para reiniciar processos em segundo plano após a atualização das bibliotecas utilizadas por esses processos. A partir do Ubuntu 21.04, a ferramenta needrestart está incluída no ambiente base do Ubuntu Server, sendo executada com privilégios de root ao final de cada transação do gerenciador de pacotes APT, escaneando processos em execução e reiniciando aqueles que estão relacionados a arquivos que foram alterados após a atualização dos pacotes. As vulnerabilidades descobertas permitem que um usuário local não privilegiado obtenha direitos de root em uma configuração padrão do Ubuntu Server.
As vulnerabilidades estão presentes no needrestart a partir da versão 0.8 (2014) e foram corrigidas na versão 3.8 do needrestart. Os problemas também já foram resolvidos nas distribuições Debian e Ubuntu. Como uma solução alternativa para bloquear a exploração da vulnerabilidade, você pode desativar a varredura de interpretadores, especificando o parâmetro "$nrconf{interpscan} = 0" no arquivo de configuração /etc/needrestart/needrestart.conf.
As vulnerabilidades estão presentes no código que implementa o modo de identificação de atualização de scripts executados usando interpretadores. Os problemas identificados são:
- CVE-2024-48990 — um usuário local pode conseguir executar código com privilégios de root ao criar condições para iniciar o interpretador Python com a variável de ambiente PYTHONPATH definida pelo atacante. Além do uso do Python, um ataque também pode ser realizado (CVE-2024-48992) iniciando o interpretador Ruby com a variável de ambiente RUBYLIB.
As vulnerabilidades são causadas pelo fato de que, durante o reinício de um script modificado, a ferramenta needrestart define a variável de ambiente PYTHONPATH com base no conteúdo do arquivo /proc/pid/environ, que é então utilizado também para executar seu próprio código Python. Assim, o atacante pode aguardar a atividade relacionada ao funcionamento do gerenciador de pacotes APT, simular a alteração de seu script e definir a variável de ambiente PYTHONPATH, que também será aplicada ao iniciar o código Python embutido no needrestart ("import sys\n print(sys.path)") que é executado com privilégios de root.
Por exemplo, para explorar a vulnerabilidade, pode-se iniciar um processo Python que permanece em memória continuamente, configurando a variável de ambiente "PYTHONPATH=/home/test" e colocando a biblioteca compartilhada "/home/test/importlib/__init__.so", que será executada ao rodar código Python privilegiado no needrestart.
- CVE-2024-48991 - um usuário local pode conseguir a execução de código com privilégios de root ao iniciar uma condição de corrida, resultando na execução de um interpretador Python fictício fornecido pelo atacante, em vez do interpretador Python do sistema. O cerne da vulnerabilidade é semelhante ao problema mencionado anteriormente, a única diferença é que o needrestart determina o nome do processo Python (por exemplo, /usr/bin/python3) através da leitura de "/proc/pid/exe".
Para explorar a vulnerabilidade, pode-se criar um processo /home/test/race, que, através do mecanismo inotify, aguardará o momento em que o needrestart começar a ler o conteúdo de /proc/pid/exe, e imediatamente iniciará o interpretador Python do sistema através da função execve. Como o needrestart não verifica se este é realmente o Python, ele considerará que /home/test/race é o interpretador Python e o executará para seu código.
- CVE-2024-11003 - um usuário local pode executar comandos shell arbitrários com privilégios de root criando condições para que o needrestart processe nomes de arquivos no formato "comando|", cuja passagem para a função open() do Perl resultará na execução do comando. De fato, a vulnerabilidade se manifesta no módulo Perl ScanDeps (CVE-2024-10224), mas é causada pela passagem de parâmetros externos para esse módulo sem a devida verificação.
O ataque pode ser realizado através da execução de um script Perl com o caractere "|" no nome, por exemplo, "/home/test/perl|". Durante a execução da função scan_deps() no needrestart, este arquivo será aberto através da função open(), que tratará o caractere "|" como um sinal para iniciar o programa "/home/test/perl" e utilizará o fluxo de saída recebido desse programa.
Fonte: opennet.ru
