Os perigos das vulnerabilidades de 15 anos

Os desenvolvedores de um módulo Python comum descobriram recentemente por que antigas vulnerabilidades não corrigidas podem ser perigosas.

Em setembro de 2022, a Trellix publicou um relatório sobre uma vulnerabilidade no módulo tarfile, que faz parte de uma biblioteca padrão da linguagem de programação Python e pode ser usada por qualquer pessoa. A vulnerabilidade permite que um arquivo seja gravado em uma pasta arbitrária no disco rígido e, em alguns casos, também permite a execução de códigos maliciosos. O que torna este estudo notável é que o problema no tarfile foi descoberto em agosto de 2007 – há pouco mais de 15 anos! Mas naquela época não era considerado perigoso. Vamos descobrir por que não foi corrigido, o quanto pode ser perigoso e quais problemas os desenvolvedores Python e seus usuários podem enfrentar.

Tarfile em detalhes

Tarfile contém código para trabalhar com arquivos tar. Este formato é amplamente utilizado em sistemas operacionais semelhantes ao Unix, traçando sua história até 1979. Tar é uma maneira simples de embalar um grande número de arquivos e pastas. Inicialmente foi usado para escrever backups em fita magnética. Hoje em dia, os arquivos tar podem usar compactação de arquivos, embora isso seja opcional. O tarfile é responsável pela criação e desempacotamento desses arquivos, e os desenvolvedores python o usam como uma ferramenta para este tipo de tarefa.

A vulnerabilidade no tarfile é bastante simples. Foi descrito exaustivamente no relatório original do bug de agosto de 2007. Não é nem uma vulnerabilidade “clássica”, é que o tarfile recria a estrutura exata da pasta contida no arquivo quando está descompactada. Isso inclui casos em que o nome do arquivo é algo como “.. /.. /.. /.. /.. /etc/passwd”. Se você desempacotar tal arquivo como um administrador de sistema, o arquivo passwd não será escrito no diretório onde o arquivo em si está localizado. Ao passar pelo … / o programa responsável por restaurar os arquivos primeiro atinge o diretório root, em seguida, sobregrava o arquivo passwd no diretório /etc. No Linux, isso significa apagar o arquivo regular mantendo os dados de todos os usuários do sistema.

O perigo aqui é que o usuário de um programa que emprega o módulo tarfile não sabe como termina o desempacotamento normal de um arquivo regular. Pode não haver nada, ou alguns arquivos podem aparecer em um lugar inesperado. Ou alguns arquivos de usuário podem ser substituídos. O autor do relatório do bug menciona esse mesmo problema no próprio arquivador de piche, que foi corrigido em 2001 – há mais de 20 anos. Mas no tarfile a vulnerabilidade nunca foi fechada.

Uma espera de 15 anos

Após uma discussão sobre o potencial bug em 2007, foi decidido… que nada deveria ser feito, por duas razões. Primeiro, esse processamento de arquivos está em total conformidade com o padrão Unix POSIX (podemos confirmar isso). Segundo, “não há possibilidade de exploração na prática”. Um aviso no guia do usuário de que não é aconselhável descompactar arquivos de fontes não confiáveis usando tarfile foi considerado suficiente.

Essa avaliação foi comprovadamente falsa em 2022, quando Trellix mostrou que a exploração na prática é mais do que possível. E não apenas para escrever dados onde você quiser, mas também para executar código arbitrário. Lembre-se que esta é uma biblioteca para programadores;  ou seja, a possibilidade de um ataque depende do software específico no qual o módulo tarfile é usado. Trellix deu dois exemplos.

Trecho de código vulnerável no Universal Radio Hacker. <a href="https://www.trellix.com/en-us/about/newsroom/stories/research/tarfile-exploiting-the-world.html" target="_blank">Fonte</a>.

Trecho de código vulnerável no Universal Radio Hacker. Fonte.

O primeiro é o Universal Radio Hacker, um programa para analisar protocolos sem fio desconhecidos. O programa salva dados na forma de projetos, que consistem em vários arquivos tar. Os pesquisadores demonstraram como uma tentativa de abrir um arquivo pré-feito resulta em um arquivo executável sendo escrito no diretório execução do Windows. Então, da próxima vez que o sistema for reiniciado, este código será executado. Essa vulnerabilidade pode, entre outras coisas, ser explorada em diferentes plataformas.

O segundo exemplo mostrado no vídeo é um pouco mais complicado. O ambiente de desenvolvimento do  Spyder IDE armazena dados em arquivos tar. Ao importar esses dados, os pesquisadores primeiro repetiram o experimento com o plantio do arquivo no sistema, mas depois fizeram algo mais legal: eles programaram código arbitrário para ser executados na próxima inicialização do Spyder. O resultado deste experimento foi um pedido para executar código arbitrário agora com privilégios de administrador do sistema.

Consequências imprevisíveis

Esta história do bug de 15 anos ilustra mais uma vez que você nunca deve subestimar vulnerabilidades que permitem a inserção de dados em qualquer lugar – e se isso for feito os caminhos de exploração podem não ser tão óbvios.

Tarfile faz parte da biblioteca Python padrão e pode ser encontrado em quase qualquer sistema baseado em Linux (entre outros). No entanto, o perigo está no uso de uma função vulnerável específica. De um modo geral, qualquer projeto desenvolvido em Python que emprega um módulo de tarfile possui uma vulnerabilidade. Do ponto de vista do usuário final, é uma situação complicada: eles podem estar executando um programa potencialmente vulnerável e nem mesmo sabem que ele usa tar. Especialistas da Kaspersky recomendam:

  • limitar o processamento de arquivos de fontes não confiáveis;
  • executar programas de terceiros com privilégios mínimos para minimizar oportunidades de ataque;
  • software de auditoria usado nos sistemas mais críticos para identificar aqueles que usam a função vulnerável.

Para os desenvolvedores, esse problema é uma razão para auditar seu próprio código para encontrar chamadas para uma função vulnerável e alterar de acordo.

Dicas