Vulnerabilidade nas bibliotecas de rede dos idiomas Rust e Go que che permite evitar a verificación do enderezo IP

Identificáronse vulnerabilidades relacionadas co procesamento incorrecto de enderezos IP con díxitos octais nas funcións de análise de enderezos nas bibliotecas estándar das linguaxes Rust e Go. As vulnerabilidades permiten ignorar as comprobacións de enderezos válidos nas aplicacións, por exemplo, para organizar o acceso a enderezos de interface de loopback (127.xxx) ou subredes de intranet cando se realizan ataques SSRF (falsificación de solicitudes no lado do servidor). As vulnerabilidades continúan o ciclo de problemas previamente 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).

Segundo a especificación, os valores das cadeas de enderezos IP que comezan cun cero deben interpretarse como números octais, pero moitas bibliotecas non o teñen en conta e simplemente descartan o cero, tratando o valor como un número decimal. Por exemplo, o número 0177 en octal é igual a 127 en decimal. Un atacante pode solicitar un recurso especificando o valor "0177.0.0.1", que en notación decimal corresponde a "127.0.0.1". Se se utiliza a biblioteca problemática, a aplicación non detectará que o enderezo 0177.0.0.1 estea na subrede 127.0.0.1/8, pero de feito, ao enviar unha solicitude, pode acceder ao enderezo “0177.0.0.1”, que o as funcións de rede procesaranse como 127.0.0.1. Do mesmo xeito, pode enganar a verificación do acceso aos enderezos da intranet especificando valores como "012.0.0.1" (equivalente a "10.0.0.1").

En Rust, a biblioteca estándar "std::net" viuse afectada por un problema (CVE-2021-29922). O analizador de enderezos IP desta biblioteca descartou un cero antes dos valores do enderezo, pero só se non se especificaron máis de tres díxitos, por exemplo, "0177.0.0.1" percibiríase como un valor non válido e un resultado incorrecto sería devolto en resposta a 010.8.8.8 e 127.0.026.1 . As aplicacións que usan std::net::IpAddr ao analizar enderezos especificados polo usuario son potencialmente susceptibles aos ataques SSRF (falsificación de solicitudes no lado do servidor), RFI (inclusión de ficheiros remotos) e LFI (inclusión de ficheiros locais). A vulnerabilidade foi corrixida na rama Rust 1.53.0.

Vulnerabilidade nas bibliotecas de rede dos idiomas Rust e Go que che permite evitar a verificación do enderezo IP

En Go, a biblioteca estándar "net" está afectada (CVE-2021-29923). A función integrada net.ParseCIDR omite os ceros iniciales antes dos números octais en lugar de procesalos. Por exemplo, un atacante pode pasar o valor 00000177.0.0.1 que, cando se comprobe na función net.ParseCIDR(00000177.0.0.1/24), analizarase como 177.0.0.1/24 e non como 127.0.0.1/24. O problema tamén se manifesta na plataforma Kubernetes. A vulnerabilidade está corrixida na versión 1.16.3 de Go e na versión beta 1.17.

Vulnerabilidade nas bibliotecas de rede dos idiomas Rust e Go que che permite evitar a verificación do enderezo IP


Fonte: opennet.ru

Engadir un comentario