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

En las bibliotecas estándar de los lenguajes Rust y Go se han identificado vulnerabilidades relacionadas con el procesamiento incorrecto de direcciones IP con dígitos octales en funciones de análisis de direcciones. Las vulnerabilidades permiten eludir las comprobaciones de direcciones válidas en las aplicaciones, por ejemplo, para organizar el acceso a las direcciones de la interfaz loopback (127.xxx) o a las subredes de la intranet al realizar ataques SSRF (falsificación de solicitudes del lado del servidor). Las vulnerabilidades continúan el 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), Datos::Validar::IP (Perl, CVE-2021-29662) y Red::Máscara de red (Perl, CVE-2021-29424).

Según la especificación, los valores de las cadenas de direcciones IP que comienzan con cero deben interpretarse como números octales, pero muchas bibliotecas no tienen esto en cuenta y simplemente descartan el cero, tratando el valor como un número decimal. Por ejemplo, el número 0177 en octal es igual a 127 en decimal. Un atacante puede solicitar un recurso especificando el valor "0177.0.0.1", que en notación decimal corresponde a "127.0.0.1". Si se utiliza la biblioteca problemática, la aplicación no detectará que la dirección 0177.0.0.1 está en la subred 127.0.0.1/8, pero de hecho, al enviar una solicitud, puede acceder a la dirección “0177.0.0.1”, que el Las funciones de red se procesarán como 127.0.0.1. De manera similar, puedes burlar la verificación de acceso a direcciones de intranet especificando valores como “012.0.0.1” (equivalente a “10.0.0.1”).

En Rust, la biblioteca estándar "std::net" se vio afectada por un problema (CVE-2021-29922). El analizador de direcciones IP de esta biblioteca descartó un cero antes de los valores en la dirección, pero solo si no se especificaron más de tres dígitos; por ejemplo, "0177.0.0.1" se percibiría como un valor no válido y un resultado incorrecto. se devolvería en respuesta a 010.8.8.8 y 127.0.026.1. Las aplicaciones que utilizan std::net::IpAddr al analizar direcciones especificadas por el usuario son potencialmente susceptibles a ataques SSRF (falsificación de solicitudes del lado del servidor), RFI (inclusión remota de archivos) y LFI (inclusión de archivos locales). La vulnerabilidad se solucionó en la rama Rust 1.53.0.

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

En Go, la biblioteca estándar "net" se ve afectada (CVE-2021-29923). La función incorporada net.ParseCIDR omite los ceros iniciales antes de los números octales en lugar de procesarlos. Por ejemplo, un atacante puede pasar el valor 00000177.0.0.1, que, cuando se marca en la función net.ParseCIDR(00000177.0.0.1/24), se analizará como 177.0.0.1/24 y no como 127.0.0.1/24. El problema también se manifiesta en la plataforma Kubernetes. La vulnerabilidad se solucionó en Go versión 1.16.3 y beta 1.17.

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


Fuente: opennet.ru

Añadir un comentario