No utilitário , utilizado para executar comandos em nome de outros usuários, vulnerabilidade (), permitindo elevar suas permissões no sistema para o usuário root. O problema se manifesta a partir do lançamento do sudo 1.7.1, somente quando a opção «pwfeedback» está habilitada no arquivo /etc/sudoers, a qual está desativada por padrão, mas ativada em algumas distribuições, como Linux Mint e Elementary OS. O problema foi resolvido na versão , publicada há algumas horas. Nas distribuições, a vulnerabilidade ainda permanece não corrigida.
A opção «pwfeedback» inclui a exibição do caractere «*» após cada caractere digitado ao inserir a senha. Devido a uma falha na implementação da função getln(), definida no arquivo tgetpass.c, uma string com senha muito longa passada pelo fluxo de entrada padrão (stdin) pode não caber no buffer alocado e sobrescrever outros dados na pilha em determinadas condições. O estouro ocorre durante a execução do código sudo com privilégios de root.
A essência do problema é que, ao usar o caractere especial ^U (limpar linha) durante a entrada e em caso de falha na operação de gravação, o código responsável por limpar os caracteres exibidos «*» redefine os dados sobre o tamanho disponível do buffer, mas não retorna o ponteiro para a posição atual no buffer ao seu valor original. Outro fator que contribui para a exploração é a falta de desativação automática do modo «pwfeedback» ao receber dados que não são do terminal, mas através do fluxo de entrada (essa falha permite a criação de condições para um erro de gravação ocorrer, por exemplo, em sistemas com canais unidirecionais o erro ocorre ao tentar escrever além do final do canal para leitura).
Como o atacante pode controlar completamente a sobrescrita de dados na pilha, não é difícil criar um exploit que permite elevar suas permissões para o usuário root. O problema pode ser explorado por qualquer usuário, independentemente dos direitos de uso do sudo e da presença de configurações específicas do usuário no sudoers. Para bloquear o problema, deve-se garantir a ausência da configuração «pwfeedback» em /etc/sudoers e, se necessário, desativá-la («Defaults !pwfeedback»). Para verificar a existência do problema, pode-se executar o código:
$ perl -e 'print(('A' x 100 . '\x{00}') x 50)' | sudo -S id
Senha: Falha de segmentação
Fonte: opennet.ru
