Vulnerabilidade nas bibliotecas de rede das linguagens Rust and Go que permite ignorar a verificação de endereço IP

Vulnerabilidades relacionadas ao processamento incorreto de endereços IP com dígitos octais em funções de análise de endereços foram identificadas nas bibliotecas padrão das linguagens Rust and Go. As vulnerabilidades tornam possível contornar verificações de endereços válidos em aplicações, por exemplo, para organizar o acesso a endereços de interface de loopback (127.xxx) ou sub-redes de intranet ao realizar ataques SSRF (Server-side request forgery). As vulnerabilidades continuam o ciclo de problemas identificados anteriormente nas bibliotecas node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) e Net::Netmask (Perl, CVE-2021-29424).

De acordo com a especificação, os valores da string de endereço IP começando com zero devem ser interpretados como números octais, mas muitas bibliotecas não levam isso em consideração e simplesmente descartam o zero, tratando o valor como um número decimal. Por exemplo, o número 0177 em octal é igual a 127 em decimal. Um invasor pode solicitar um recurso especificando o valor “0177.0.0.1”, que em notação decimal corresponde a “127.0.0.1”. Caso seja utilizada a biblioteca problemática, a aplicação não detectará que o endereço 0177.0.0.1 está na sub-rede 127.0.0.1/8, mas na verdade, ao enviar uma solicitação, poderá acessar o endereço “0177.0.0.1”, que o funções de rede serão processadas como 127.0.0.1. De forma semelhante, você pode enganar a verificação de acesso a endereços de intranet especificando valores como “012.0.0.1” (equivalente a “10.0.0.1”).

No Rust, a biblioteca padrão “std::net” foi afetada por um problema (CVE-2021-29922). O analisador de endereço IP desta biblioteca descartou um zero antes dos valores no endereço, mas somente se não mais do que três dígitos fossem especificados, por exemplo, “0177.0.0.1” seria percebido como um valor inválido e um resultado incorreto seria retornado em resposta a 010.8.8.8 e 127.0.026.1 . Os aplicativos que usam std::net::IpAddr ao analisar endereços especificados pelo usuário são potencialmente suscetíveis a ataques SSRF (falsificação de solicitação do lado do servidor), RFI (Inclusão de Arquivo Remoto) e LFI (Inclusão de Arquivo Local). A vulnerabilidade foi corrigida no branch Rust 1.53.0.

Vulnerabilidade nas bibliotecas de rede das linguagens Rust and Go que permite ignorar a verificação de endereço IP

No Go, a biblioteca padrão “net” é afetada (CVE-2021-29923). A função interna net.ParseCIDR ignora os zeros iniciais antes dos números octais em vez de processá-los. Por exemplo, um invasor pode passar o valor 00000177.0.0.1, que, quando verificado na função net.ParseCIDR(00000177.0.0.1/24), será analisado como 177.0.0.1/24 e não 127.0.0.1/24. O problema também se manifesta na plataforma Kubernetes. A vulnerabilidade foi corrigida no Go versão 1.16.3 e beta 1.17.

Vulnerabilidade nas bibliotecas de rede das linguagens Rust and Go que permite ignorar a verificação de endereço IP


Fonte: opennet.ru

Adicionar um comentário