Vulnerabilidad en bibliotecas de red de los lenguajes Rust y Go que permite eludir la verificación de direcciones IP.

Se han detectado vulnerabilidades en las bibliotecas estándar de los lenguajes Rust y Go, relacionadas con el manejo incorrecto de direcciones IP que contienen cifras octales en las funciones de análisis de direcciones. Estas vulnerabilidades permiten eludir las comprobaciones de direcciones válidas en aplicaciones, por ejemplo, para acceder a direcciones de bucle invertido (127.x.x.x) o subredes intranet en ataques SSRF (Server-side request forgery). Las vulnerabilidades continúan un ciclo de problemas previamente identificados en las 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) y Net::Netmask (Perl, CVE-2021-29424).

De acuerdo con la especificación, los valores de cadena direcciones IP, que comienzan con cero, deben interpretarse como números octales, pero muchas bibliotecas no consideran esta particularidad y simplemente descartan el cero, procesando el valor como un número decimal. Por ejemplo, el número 0177 en el sistema octal es equivalente a 127 en decimal. Un atacante puede solicitar un recurso utilizando el valor ‘0177.0.0.1’, que en notación decimal corresponde a ‘127.0.0.1’. Al usar una biblioteca problemática, la aplicación no identificará la entrada de la dirección 0177.0.0.1 en la subred 127.0.0.1/8, pero al enviar la solicitud puede realizar una llamada a la dirección ‘0177.0.0.1’, que las funciones de red tratarán como 127.0.0.1. De manera similar, se puede engañar a la verificación del acceso a direcciones intranet, proporcionando valores como ‘012.0.0.1’ (equivalente a ‘10.0.0.1’).

En Rust, el problema estaba presente en la biblioteca estándar ‘std::net’ (CVE-2021-29922). El analizador de direcciones IP de esta biblioteca descartaba el cero antes de los valores en la dirección, pero solo si no se especificaban más de tres cifras, por ejemplo, ‘0177.0.0.1’ sería considerado un valor no válido, mientras que para 010.8.8.8 y 127.0.026.1 se devolvería un resultado incorrecto. Las aplicaciones que utilizan std::net::IpAddr al analizar direcciones proporcionadas por el usuario son potencialmente vulnerables a ataques SSRF (Server-side request forgery), RFI (Remote File Inclusion) y LFI (Local File Inclusion). La vulnerabilidad ha sido corregida en la rama Rust 1.53.0.

Vulnerabilidad en bibliotecas de red de los lenguajes Rust y Go que permite eludir la verificación de direcciones IP.

En el lenguaje Go, la biblioteca estándar "net" está sujeta a un problema (CVE-2021-29923). La función integrada net.ParseCIDR omite ceros antes de números octales en lugar de procesarlos. Por ejemplo, un atacante puede enviar el valor 00000177.0.0.1, que al ser verificado en la función net.ParseCIDR(00000177.0.0.1/24) será analizado como 177.0.0.1/24, y no como 127.0.0.1/24. El problema también se presenta en la plataforma Kubernetes. La vulnerabilidad se ha solucionado en la versión Go 1.16.3 y en la beta 1.17.

Vulnerabilidad en bibliotecas de red de los lenguajes Rust y Go que permite eludir la verificación de direcciones IP.
Reproducir video


Fuente: opennet.ru
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster