Uma vulnerabilidade foi identificada na biblioteca padrão da linguagem Rust (CVE-2022-21658), relacionada a uma condição de corrida na função std::fs::remove_dir_all(). Ao utilizar essa função para remover arquivos temporários em um aplicativo privilegiado, um invasor pode conseguir deletar arquivos e diretórios do sistema aleatórios, aos quais normalmente ele não teria acesso.
A vulnerabilidade é causada pela implementação incorreta da verificação de links simbólicos antes da remoção recursiva de diretórios. Em vez de proibir o seguimento de links simbólicos, a função remove_dir_all() primeiramente verifica se o arquivo é um link simbólico. Se for um link, ele é removido como um arquivo, e se for um diretório, a operação de remoção recursiva do conteúdo é chamada. O problema é que há um pequeno atraso entre a verificação e o início da operação de remoção.
No momento em que a verificação já foi realizada, mas a operação de iteração nos diretórios para remoção ainda não começou, um invasor pode substituir o diretório com arquivos temporários por um link simbólico. Se isso ocorrer no momento certo, a função remove_dir_all() tratará o link simbólico como um diretório e começará a remover o conteúdo apontado por esse link. Embora o sucesso do ataque dependa da precisão do tempo escolhido para a substituição do diretório, e a chance de conseguir isso na primeira tentativa seja baixa, os pesquisadores conseguiram realizar com sucesso o ataque muitas vezes após a execução do exploit em poucos segundos.
Todas as versões do Rust da 1.0.0 até a 1.58.0 inclusivas estão vulneráveis. O problema já foi corrigido na forma de um patch (a correção será incluída na versão 1.58.1, que é esperada nas próximas horas). É possível acompanhar a correção nas distribuições nas seguintes páginas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. A todos os usuários de programas na linguagem Rust, executados com privilégios elevados e que utilizam a função remove_dir_all, recomenda-se que atualizem imediatamente para a versão 1.58.1. Curiosamente, o patch lançado não resolve o problema em todos os sistemas; por exemplo, no sistema operacional REDOX e nas versões do macOS anteriores à 10.10 (Yosemite), a vulnerabilidade não é bloqueada devido à ausência da flag O_NOFOLLOW, que desativa o seguimento de links simbólicos.
Fonte: opennet.ru
