Vulnerabilidade na biblioteca padrão Rust

Uma vulnerabilidade (CVE-2022-21658) foi identificada na biblioteca padrão Rust devido a uma condição de corrida na função std::fs::remove_dir_all(). Se esta função for usada para excluir arquivos temporários em um aplicativo privilegiado, um invasor poderá excluir arquivos e diretórios arbitrários do sistema que o invasor normalmente não teria acesso para excluir.

A vulnerabilidade é causada pela implementação incorreta da verificação de links simbólicos antes da exclusão recursiva de diretórios. Em vez de impedir que links simbólicos sejam seguidos, remove_dir_all() primeiro verifica se o arquivo é um link simbólico. Se um link for definido, ele será excluído como um arquivo e, se for um diretório, uma operação recursiva de remoção de conteúdo será chamada. O problema é que há um pequeno atraso entre a verificação e o início da operação de exclusão.

No momento em que a verificação já foi realizada, mas a operação de enumeração de diretórios para exclusão ainda não foi iniciada, o invasor pode substituir o diretório por arquivos temporários com um link simbólico. Se acertar 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 para o qual o link aponta. Apesar do fato de que o sucesso do ataque depende da precisão do momento escolhido para substituir o diretório e de acertar o momento certo na primeira vez ser improvável, durante os experimentos os pesquisadores conseguiram obter um ataque bem-sucedido repetível após executar a exploração dentro alguns segundos.

Todas as versões do Rust de 1.0.0 a 1.58.0 inclusive são afetadas. O problema foi resolvido em forma de patch por enquanto (a correção será incluída na versão 1.58.1, que é esperada dentro de algumas horas). Você pode monitorar a eliminação da vulnerabilidade nas distribuições nestas páginas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Todos os usuários de programas Rust executados com privilégios elevados e usando a função remove_dir_all são aconselhados a atualizar urgentemente o Rust para a versão 1.58.1. É interessante que o patch lançado não resolve o problema em todos os sistemas; por exemplo, no REDOX OS e versões do macOS anteriores a 10.10 (Yosemite), a vulnerabilidade não é bloqueada devido à ausência do sinalizador O_NOFOLLOW, que desativa os seguintes símbolos links.

Fonte: opennet.ru

Adicionar um comentário