A Qualys descobriu duas vulnerabilidades (CVE-2021-44731, CVE-2021-44730) na ferramenta snap-confine, fornecida com a flag SUID root e chamada pelo processo snapd para criar o ambiente de execução para aplicativos distribuídos em pacotes autossuficientes no formato snap. As vulnerabilidades permitem que um usuário local não privilegiado consiga executar código com privilégios de root no sistema. Os problemas foram corrigidos na atualização de hoje dos pacotes snapd para Ubuntu 21.10, 20.04 e 18.04.
A primeira vulnerabilidade (CVE-2021-44730) permite um ataque por meio da manipulação de links duros, mas requer a desativação da proteção do sistema contra links duros (configurando sysctl fs.protected_hardlinks para 0). O problema é causado pela verificação incorreta do local dos arquivos executáveis das ferramentas snap-update-ns e snap-discard-ns, executadas com privilégios de root. O caminho para esses arquivos era calculado na função sc_open_snapd_tool() com base no seu próprio caminho de /proc/self/exe, o que permite criar um link duro para snap-confine em seu próprio diretório e colocar nele suas versões das ferramentas snap-update-ns e snap-discard-ns. Após a execução via link duro, snap-confine com privilégios de root iniciará os arquivos snap-update-ns e snap-discard-ns fornecidos pelo atacante a partir do diretório atual.
A segunda vulnerabilidade é causada por uma condição de corrida e pode ser explorada na configuração padrão do Ubuntu Desktop. Para que o exploit funcione com sucesso no Ubuntu Server, é necessário escolher um dos pacotes da seção 'Featured Server Snaps' durante a instalação. A condição de corrida ocorre na função setup_private_mount(), chamada durante a preparação do espaço de nomes para os pontos de montagem do pacote snap. Esta função cria um diretório temporário '/tmp/snap.$SNAP_NAME/tmp' ou usa um já existente para a montagem bind dos diretórios do pacote no formato snap.
Como o nome do diretório temporário é previsível, um atacante pode substituir seu conteúdo por um link simbólico no momento após a verificação do proprietário, mas antes da chamada do sistema mount. Por exemplo, é possível criar um link simbólico "\/tmp\/snap.lxd\/tmp" no diretório \/tmp\/snap.lxd, apontando para um diretório arbitrário, e a chamada mount() seguirá o link simbólico e montará o diretório no namespace snap. Da mesma forma, é possível montar seu próprio conteúdo em \/var\/lib e, através da substituição de \/var\/lib\/snapd\/mount\/snap.snap-store.user-fstab, organizar o montamento de seu diretório \/etc no namespace do pacote snap para carregar sua biblioteca com privilégios de root substituindo \/etc\/ld.so.preload.
Observa-se que a criação de um exploit se revelou uma tarefa não trivial, uma vez que a utilidade snap-confine é escrita em Go utilizando práticas de programação segura, possui proteção baseada em perfis AppArmor, filtra chamadas de sistema através do mecanismo seccomp e aplica namespaces para isolamento durante a montagem. No entanto, os pesquisadores conseguiram preparar um exploit funcional para obter privilégios de root no sistema. O código do exploit será publicado em algumas semanas, após os usuários instalarem as atualizações fornecidas.
Fonte: opennet.ru
