No processo em segundo plano slaacd, que é responsável pela autoconfiguração de endereços IPv6 (IPv6 Stateless Address Autoconfiguration, RFC 4862) no OpenBSD, foi identificada uma vulnerabilidade que causa um estouro de buffer ao receber um anúncio de roteador IPv6 (RA, Router Advertisement) especialmente formatado.
Inicialmente, a funcionalidade de autoconfiguração de endereços IPv6 foi implementada a nível de kernel, mas a partir do OpenBSD 6.2, foi movida para um processo separado e não privilegiado, o slaacd. Este processo é responsável pelo envio de mensagens RS (Router Solicitation) e pela análise das respostas RA (Router Advertisement) com informações sobre o roteador e parâmetros da conexão de rede.
Em fevereiro, uma falha foi corrigida no slaacd que causava encerramento inesperado ao especificar 7 servidores na lista RDNSS (Recursive DNS Servers). Tal descuido chamou a atenção de pesquisadores independentes, que tentaram estudar o código do slaacd em busca de outros erros que ocorriam ao analisar os campos nas mensagens RA. A análise revelou que havia outro problema no código, manifestando-se ao processar o campo DNSSL (DNS Search List), que inclui listas domínios e padrões de hosts para DNS.
Cada nome na lista DNSSL é codificado usando um delimitador com código nulo e rótulos intermediários de um byte, que definem o tamanho dos dados que seguem. A vulnerabilidade é causada pelo fato de que no código de análise da lista, o campo de tamanho é copiado para uma variável do tipo inteiro com sinal (‘len = data[pos]’). Consequentemente, se um valor com o bit mais significativo definido for fornecido no campo, esse valor será interpretado no operador condicional como um número negativo, e a verificação do tamanho máximo permitido (‘if (len > 63 || len + pos + 1 > datalen) {’) não funcionará, o que levará a uma chamada memcpy com um parâmetro em que o tamanho dos dados copiados excede o tamanho do buffer.


Fonte: opennet.ru
