Desde Linux Darkcrizt  

Encontraron vulnerabilidades en las biblioteca de red de Rust y Go evita la validación IP

Hace poco se dio a conocer información sobre vulnerabilidades que fueron encontradas en las bibliotecas estándar de los lenguajes Rust y Go, las cuales están relacionadas con el manejo incorrecto de direcciones IP con dígitos octales en las funciones de análisis de direcciones.

Se menciona que estas vulnerabilidades permiten evitar verificaciones de direcciones válidas en aplicaciones, por ejemplo, para organizar el acceso a direcciones de interfaz de bucle invertid o subredes de intranet cuando se realizan ataques de falsificación de solicitudes del lado del servidor.

Las vulnerabilidades en estos dos lenguajes tienen realización en la especificación las cadenas de direcciones IP basadas en cero, ya que estas en teoría deberían de interpretarse como números octales, pero el problema que causa estos fallos es que muchas bibliotecas no tienen esto en cuenta y simplemente descartan el cero, por lo cual terminan tratando el valor como un número decimal.

Por ejemplo, para poder entender el como es interpretadas las direcciones IP en estos fallos, el número 0177 en octal es 127 en decimal y con lo cual un atacante puede solicitar un recurso especificando el valor «0177.0.0.1», el cual al no ser tomado como octal la notación decimal de este es «127.0.0.1».

Es por ello que en el caso de utilizar una de las bibliotecas problemáticas, la aplicación no detectará la ocurrencia de la dirección 0177.0.0.1 en la subred 127.0.0.1, pero de hecho, al enviar una solicitud, se puede llamar a la dirección «0177.0.0.1» la cual por la mala interpretación, las funciones de red procesarán esta como 127.0.0.1. De manera similar, se puede engañar y verificar el acceso a las direcciones de la intranet especificando valores diversos valores, los cuales el atacante evaluara para su posible explotación.

Por el lado de Rust, el problema se detectó que estaba sujeto a la biblioteca estándar «std::net» y la cual ya está catalogada bajo «CVE-2021-29922». En ella se describe que el analizador de las direcciones IP de esta biblioteca descarta un cero delante de los valores de la dirección, pero solo si no se especificaron más de tres dígitos, por ejemplo, «0177.0.0.1» se interpretará como un valor no válido y se devolverá un resultado incorrecto en respuesta.

La validación de entrada incorrecta de cadenas octales en la biblioteca estándar «net» de rust-lang permite a atacantes remotos no autenticados realizar ataques SSRF, RFI y LFI indeterminados en muchos programas que dependen de rust-lang std :: net. Los octectos de la dirección IP se dejan despojados en lugar de evaluarse como direcciones IP válidas.

Además se menciona que las aplicaciones que utilizan la biblioteca 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). Del mismo modo, un atacante puede ingresar 127.0.026.1, que en realidad es 127.0.22

Por ejemplo, un atacante que envía una dirección IP a una aplicación web que se basa en std::net::IpAddr, podría causar SSRF al ingresar datos de entrada octal; Un atacante puede enviar direcciones IP explotables si el octeto tiene 3 dígitos, siendo el octecto explotable mínimo 08 que condice a denegación de servicio y el octeto explotable máximo 099 el cual tambien conduce a denegación de servicio. 

Si quieres conocer más al respecto sobre esta vulnerabilidad en Rust, puedes consultar los detalles en el siguiente enlace. Tambien se menciona que la vulnerabilidad se corrigió en la rama Rust 1.53.0.

En cuanto al problema que afecta a Go, se menciona que este está sujeto a la biblioteca estándar «net» y ya está catalogado bajo CVE-2021-29923. En la descripción se menciona que permite a atacantes remotos no autenticados realizar ataques SSRF, RFI y LFI indeterminados en muchos programas que dependen de la función net.ParseCIDR incorporada de golang. Los octetos individuales de IP de CIDR se eliminan en lugar de evaluarlos como octetos de IP válidos.

Por ejemplo, un atacante puede pasar el valor 00000177.0.0.1, que, cuando se marca en la función net.ParseCIDR, se analizará como 177.0.0.1/24, no 127.0.0.1/24. El problema también se manifiesta en la plataforma Kubernetes. La vulnerabilidad se solucionó en la versión Go 1.16.3 y la versión beta 1.17.

Puedes conocer más al respecto sobre esta vulnerabilidad en el siguiente enlace.

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.