No processo em segundo plano slaacd, responsável pela configuração automática de endereços IPv6 (IPv6 Stateless Address Autoconfiguration, RFC 4862) no OpenBSD, foi identificada uma vulnerabilidade que leva a um buffer overflow ao receber um anúncio de roteador IPv6 especialmente projetado (RA, Router Advertisement) .
Inicialmente, a funcionalidade de configuração automática de endereços IPv6 foi implementada no nível do kernel, mas a partir do OpenBSD 6.2 ela foi movida para um processo slaacd separado e sem privilégios. Este processo é responsável por enviar mensagens RS (Router Solicitation) e analisar respostas RA (Router Advertisement) com informações sobre o roteador e os parâmetros de conexão da rede.
Em fevereiro, o slaacd corrigiu um bug que causava seu travamento se 7 servidores fossem especificados na lista RDNSS (servidores DNS recursivos). Esse descuido atraiu a atenção de pesquisadores independentes que tentaram examinar o código slaacd em busca de outros erros que ocorrem ao analisar campos em mensagens RA. A análise mostrou que há outro problema no código, que se manifesta ao processar o campo DNSSL (DNS Search List), que inclui listas de nomes de domínio e modelos de host para DNS.
Cada nome na lista DNSSL é codificado usando um delimitador nulo e tags de um byte intermediárias que determinam o tamanho dos dados a seguir. A vulnerabilidade é causada pelo fato de que no código de análise de lista, um campo com um tamanho é copiado para uma variável com tipo inteiro assinado (“len = data[pos]”). Assim, se um valor for especificado no campo com o bit mais significativo definido, esse valor será percebido 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 para memcpy com um parâmetro cujo tamanho dos dados copiados excede o tamanho do buffer.
Fonte: opennet.ru