Falhas nas bibliotecas de rede do Rust e Go impedem validação de IP - SempreUpdate
09/08/2021 às 19:12
Falhas nas bibliotecas de rede do Rust e Go impedem validação de IP
Algumas falhas nas bibliotecas de rede do Rust e Go impedem validação de IP. Os problemas nessas linguagens de programação são relacionados ao manuseio incorreto de endereços IP com dígitos octais nas funções de análise de endereço.
É mencionado que essas vulnerabilidades permitem contornar verificações de endereço válidas em aplicativos, por exemplo, para organizar o acesso a endereços de interface de loopback ou sub-redes de intranet ao executar ataques de falsificação de solicitação do lado do servidor.
As vulnerabilidades nessas duas linguagens ocorrem na especificação de strings de endereço IP baseadas em zero, já que estas em teoria deveriam ser interpretadas como números octais, mas o problema que causa esses bugs é que muitas bibliotecas não levam isso em conta e simplesmente elas descartar zero, então eles acabam tratando o valor como um número decimal.
Por exemplo, para entender como os endereços IP são interpretados nesses bugs, o número 0177 em octal é 127 em decimal e com o qual um invasor pode solicitar um recurso especificando o valor "0177.0.0.1", que, uma vez que não é usado como octal, a notação decimal para isso é "127.0.0.1".
Por isso, no caso de utilizar uma das bibliotecas problemáticas, a aplicação não detectará a ocorrência do endereço 0177.0.0.1 na sub-rede 127.0.0.1, mas sim, ao enviar um pedido, o endereço 0177.0.0.1 que, devido à interpretação incorreta, as funções de rede irão processar isso como 127.0.0.1. Da mesma forma, o acesso a endereços de intranet pode ser enganado e verificado especificando vários valores, que o invasor avaliará para possível exploração.
Em relação ao Rust, foi detectado o problema de que ele estava sujeito à biblioteca padrão "std :: net" e que já está catalogado em "CVE-2021-29922". Ele descreve que o analisador de endereço IP desta biblioteca descarta um zero na frente dos valores de endereço , mas apenas se não mais do que três dígitos forem especificados, por exemplo, "0177.0.0.1" será interpretado como um valor inválido. Válido e um resultado incorreto será retornado em resposta.
A validação de entrada de string octal incorreta na biblioteca "net" padrão rust-lang permite que atacantes remotos não autenticados executem ataques SSRF, RFI e LFI indeterminados em muitos programas que dependem de rust-lang std :: net. Os octetos do endereço IP são deixados eliminados em vez de serem avaliados como endereços IP válidos.
Também é mencionado que os aplicativos que usam a biblioteca std :: net :: IpAddr ao analisar endereços especificados pelo usuário são potencialmente suscetíveis a ataques por SSRF (falsificação de solicitação do lado do servidor), RFI (inclusão de arquivo remoto) e LFI (inclusão de ficheiros locais). Da mesma forma, um invasor pode inserir 127.0.026.1, que na verdade é 127.0.22
Por exemplo, um invasor que envia um endereço IP para um aplicativo da web baseado em std :: net :: IpAddr pode causar SSRF inserindo dados de entrada octal; Um invasor pode enviar endereços IP exploráveis ??se o octeto tiver 3 dígitos, com o octeto explorável mínimo 08 que leva à negação de serviço e o octeto máximo explorável 099 que também leva à negação de serviço.
Se você quiser saber mais sobre essa vulnerabilidade no Rust, pode consultar os detalhes no link a seguir. Também é mencionado que a vulnerabilidade foi corrigida no branch Rust 1.53.0.
Em relação ao problema que afeta o Go, é mencionado que ele está sujeito à biblioteca padrão "net" e já está catalogado sob CVE-2021-29923. A descrição menciona que permite que atacantes remotos não autenticados executem ataques SSRF, RFI e LFI indeterminados em muitos programas que dependem da função net.ParseCIDR integrada de golang. Os octetos CIDR IP individuais são removidos em vez de avaliá-los como octetos IP válidos.
Por exemplo, um invasor pode passar o valor 00000177.0.0.1, que, quando verificado na função net.ParseCIDR, será analisado como 177.0.0.1/24, não 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.