Foram identificadas vulnerabilidades nas bibliotecas padrão das linguagens Rust e Go relacionadas ao processamento inadequado de endereços IP com dígitos octais nas funções de análise de endereço. As vulnerabilidades permitem contornar as verificações de endereços válidos em aplicativos, como, por exemplo, para facilitar o acesso a endereços da interface de loopback (127.x.x.x) ou sub-redes intranet durante ataques SSRF (Server-side request forgery). As vulnerabilidades continuam o ciclo de problemas anteriormente identificados 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, valores de string endereços IP, que começam com zero, devem ser interpretados como números octais, mas muitas bibliotecas não consideram essa particularidade e simplesmente descartam o zero, tratando o valor como um número decimal. Por exemplo, o número 0177 no sistema octal é equivalente a 127 no decimal. Um invasor pode solicitar um recurso especificando o valor "0177.0.0.1", que em representação decimal corresponde a "127.0.0.1". Se uma biblioteca problemática for utilizada, o aplicativo não reconhecerá a inclusão do endereço 0177.0.0.1 na sub-rede 127.0.0.1/8, mas, na verdade, ao enviar a solicitação, poderá acessar o endereço "0177.0.0.1", que as funções de rede tratarão como 127.0.0.1. De maneira semelhante, é possível enganar a verificação de endereços da intranet, especificando valores como "012.0.0.1" (equivalente a "10.0.0.1").
Em Rust, a biblioteca padrão afetada foi a "std::net" (CVE-2021-29922). O analisador de endereços IP dessa biblioteca descartava o zero antes dos valores no endereço, mas apenas se não fossem especificados mais de três dígitos, por exemplo, "0177.0.0.1" seria considerado um valor inválido, enquanto respostas a "010.8.8.8" e "127.0.026.1" retornariam resultados incorretos. Aplicativos que usam std::net::IpAddr para analisar endereços fornecidos pelo usuário estão potencialmente vulneráveis a ataques SSRF (Server-side request forgery), RFI (Remote File Inclusion) e LFI (Local File Inclusion). A vulnerabilidade foi corrigida no branch Rust 1.53.0.

Na linguagem Go, a biblioteca padrão "net" é suscetível a um problema (CVE-2021-29923). A função integrada net.ParseCIDR ignora zeros antes dos números octais, em vez de processá-los. Por exemplo, um atacante pode enviar o valor 00000177.0.0.1, que ao ser verificado na função net.ParseCIDR(00000177.0.0.1/24) será interpretado como 177.0.0.1/24, e não como 127.0.0.1/24. O problema também se manifesta na plataforma Kubernetes. A vulnerabilidade foi corrigida na versão Go 1.16.3 e na versão beta 1.17.


Fonte: opennet.ru
