Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Falha de segurança crítica: saturação de buffer baseado em pilha em glibc na getaddrinfo() (CVE-2015-7547)

O pacote glibc contém bibliotecas padrão que são usadas por múltiplos programas no sistema. Para salvar a memória e o espaço de disco, assim como, para facilitar o upgrade, o código de sistema comum é mantido em um local e compratilhado entre programas. Este pacote contém a biblioteca C padrão com os quais todos os programas Linux/GNU estão conectados. A biblioteca libresolv enviada junto com o glibc fornece funções que oferecem traduções entre os nomes de host e os endereços IP. nss_dns é o componente do glibc que fornece o módulo de serviço Name Service Switch (NSS) que usa libresolv para desempenhar consultas DNS.

Informações Gerais

Uma saturação de buffer baseada em pilha foi encontrada na libresolv no código que desempenha consultas duplas A/AAAA DNS. Um invasor remoto poderia criar respostas DNS especialmente elaboradas que gerariam uma falha na libresolv ou possivelmente executariam códigos com as permissões do usuário executando a biblioteca. A saturação de buffer ocorre na função send_dg (para consultas UDP) e send_vc (para consultas TCP) na libresolv. O problema fica exposto somente quando a libresolv é chamada a partir do módulo de serviço nss_dns NSS. Esta falha foi atribuída à CVE-2015-7547.

Os aplicativos que chamam o getaddrinfo com a família de endereço AF_UNSPEC são afetados, com exceção do Red Hat Enterprise Linux 6.4, onde os aplicativos são também afetados se a família de endereço AF_INET6 for usada. Os aplicativos que usam somente as funções gethostbyname antigas ou as funções libresolv, tais como res_search (e não getaddrinfo), não são afetadas.

Este problema não afetou a versão do glibc fornecida com Red Hat Enterprise Linux 5 ou anteriores. Este problema afetou as versões do glibc fornecidas com Red Hat Enterprise Linux 6 e 7.

Impacto

Este problema foi classificado como Crítico impacto por Red Hat Product Security.

Mitigação

Em uma configuração libresolv padrão, o vetor baseado em UDP é amenizado utilizando-se um resolvedor DNS compatível com um protocolo confiável em uma rede confiável. Um resolvedor compatível não irá produzir o tipo de respostas de grande porte que são necessárias para explorar esta vulnerabilidade pois por padrão, o resolvedor glibc não habilita EDNS0 e não requisita respostas de grande porte.

O vetor baseado em TCP pode ser amenizado por um resolvedor recursivo confiável em um rede confiável que limita o tamanho das respostas DNS individuais a 1023 bytes ou abaixo. Contudo, este recurso não é comum nas implementações do resolvedor DNS pois interrompe o protocolo DNS. (A opção de configuração do tamanho de buffer oferecida pela maioria dos resovedores aplica-se somente a UDP, não TCP.) A rejeição das respostas AAAA, sem limitar também o tamanho das respostas A, não ameniza a vulnerabilidade.

A desativação do suporte IPv6 em sistemas afetados não ameniza a vulnerabilidade pois as consultas duplas A/AAAA são desempenhadas mesmo que falte o suporte IPv6 no sistema.

Produtos Afetados e Resolução

Todas as versões da pacote glibc incluídas no Red Hat Enterprise Linux 6 e 7 foram afetadas por esta falha. Veja a tabela abaixo para obter links para respectivos avisos de segurança que corrigem este problema:

Resolução

Produto Supervisão
Red Hat Enterprise Linux 6 RHSA-2016:0175
Red Hat Enterprise Linux 7 RHSA-2016:0176
Red Hat Enterprise Linux 6.2 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.4 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.5 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.6 Extended Update Support RHSA-2016:0225
Red Hat Enterprise Linux 7.1 Extended Update Support RHSA-2016:0225


Depois que atualização é aplicada você precisa reinicializar o sistema ou todos os serviços afetados:

Já que esta vulnerabilidade afeta uma grande quantidade de aplicativos no sistema, o modo mais seguro e recomendável para garantir que todo aplicativo utilize os pacotes glibc é reiniciar o sistema.

Caso você não consiga reinicializar o sistema todo depois de aplicar a atualização, execute o seguinte comando para listar todos os processos em execução (não restrito a serviços) ainda utilizando a versão antiga [in-memory] do glibc no seu sistema.

lsof +c0 -d DEL | awk 'NR==1 || /libc-/ {print $2,$1,$4,$NF}' | column -t

Da lista de resultados, identifique os serviços voltados ao público e reinicie-os. Mesmo que este processo funcione como uma solução temporária, a Red Hat não oferece suporte caso surja um problema, será solicitado que você reinicie o sistema antes que a solução de problemas inicie.

Perguntas Frequentes

1. O SELinux bloqueia essa falha na segurança?
Uma política adequada de SELinux pode incluir alguns danos que um invasor pode causar e restringir o acesso dele ao sistema, porém DNS é utilizado por vários aplicativos e componentes de sistema, desta forma as políticas SELinux oferecem uma contenção limitada para esta questão.

2. Pode um resolvedor DNS confiável proteger esta questão?
Um resolvedor confiável, em uma configuração compatível com um protocolo padrão, não pode amenizar este problema pois prováveis explorações poderiam envolver respostas DNS sintaticamente bem formadas.

3. Os binários estaticamente vinculados são afetados por esta falha?
A Red Hat não oferece suporte à vinculação estática de glibc. Porém, se os clientes compilaram aplicativos estaticamente vinculados utilizando o pacote glibc-static, estes aplicativos ainda utilizarão as cópias de sistema de nss_dns e libresolv, e a instalação dos pacotes glibc atualizados irá resolver a vulnerabilidade.

Agradecimentos

A vulnerabilidade foi descoberta pela Google Security Team e a Red Hat.

Comments