This article is an automated machine-translation of an article in English. We know the translation isn't perfect, but we hope it's useful for people who don't read English.

Anatomía de una vulnerabilidad - La Web Toolkit Descargar cURL agujereada por error de autenticación

Filed Under: Featured, Vulnerability

Puede que no hayas oído hablar de cURL, pero de lo que has utilizado el software que utiliza.

Es un conjunto de herramientas de programación de código abierto que ayuda a lidiar con la escritura de código de cliente que se ocupa de las direcciones URL.

En palabras del propio proyecto, "cURL groks los URLs."

Es popular porque es un cuchillo del ejército suizo URL, por lo que es fácil de manejar protocolos populares como HTTP, SMTP, POP3 y muchos más. También soporta cargas, descargas, autenticación, servidores proxy, cookies y SSL / TLS.

Incluso soporta Gopher , si usted recuerda que hacia atrás.

Uno de los riesgos con una biblioteca totalmente canto y el baile, por supuesto, es que hay más código a ir mal.

Y a veces, incluso los pedazos oscuros del código que pensó que nunca haría uso podría disparará. Peor aún, podrían ser activable por circunstancias externas que nunca predijo.

Ese es el problema rizado aquí.

El código vulnerable se introdujo en la versión 7.26.0, cuando el apoyo a DIGEST_MD5 autenticación se añadió al software cURL.

DIGEST_MD5 es una forma rudimentaria de lo que le permite iniciar sesión a través de una conexión sin cifrar, por ejemplo a un servidor HTTP o POP3, sin necesidad de enviar la contraseña actual.

El servidor envía una cadena de desafío al azar, o nonce, junto con un montón de otros datos relacionados con la autenticación , se responde con un hash criptográfico de la contraseña mezclado con los datos suministrados por el servidor:

Así que un cracker que olfatea su respuesta directamente no se puede recuperar la contraseña de la misma, y ​​dado que el reto es aleatoria y varía cada vez que se conecte, el cracker no puede volver a utilizar su respuesta más adelante.

Como acotación al margen: evitar el uso de DIGEST_MD5 autenticación. Cifrar toda la sesión utilizando TLS lugar.

Un cracker que huele una respuesta DIGEST_MD5 no puede volver a utilizar directamente, pero se puede utilizar para tratar de recuperar su contraseña en línea utilizando un ataque de diccionario.

TLS no no lo impide, sino que también mantiene el secreto transacción completa, incluyendo el contenido de su sesión de Internet o correo electrónico. Eso es un resultado de seguridad mucho mejor.

Aquí está el código con errores de una versión vulnerable de cURL:

No se preocupe si usted no está familiarizado con C. Voy a explicar.

En C, el manejo y el uso de la memoria se deja en manos del programador. Usted puede utilizar el código de biblioteca para ayudarle a lidiar con seguridad con datos de longitud variable, tales como cadenas de texto proporcionados por el usuario, o se puede tratar directamente con la memoria de sí mismo.

Por encima, el programador ha hecho el último.

En primer lugar, se asigna una serie de bloques de memoria de longitud fija en la pila.

Entonces copia las cadenas de texto suministrados por el llamador de la función en los bloques, pero se utiliza el sistema de funciones strcpy () y strcat (), que significan "cadena copiar" y "cadena concatentate" (tack una cadena en el extremo de otro), respectivamente.

En el código moderno, nunca se debe utilizar esas funciones, porque no se puede limitar la cantidad de datos que se copian.

Ellos simplemente duplicar cada byte de la cadena de entrada en la cadena de salida, hasta que un NUL (cero) byte que ha encontrado. Un NUL es como el final de una cadena de texto se indica en C.

Así, si el servidor envía demasiados datos en su desafío de autenticación, por ejemplo una cadena reino excesivamente largo (el contenido de lo que puede ser cualquiera que sea el servidor elige), esta función rellenar demasiados datos en la memoria intermedia se utiliza para calcular la autenticación de respuesta.

Un desbordamiento de búfer resultará, y en este caso, ya que los bloques de datos de destino se asignan automáticamente en la pila, la función se bloqueará cuando termina.

Eso es porque la pila también almacena la dirección de memoria en la que la función fue llamada, por lo que el software cURL pueda volver allí cuando esté terminado. La dirección de retorno se sobrescribe en el código anterior, si la respuesta de la cadena obtener el exceso de llenado.

La solución era simple.

La incontrolable strcpy () y funciones strcat () se han sustituido por la función snprintf (), que significa "letra con formato de cadena en bytes en la mayoría de n":

Usted todavía puede cometer errores con snprintf, ya que depende de usted para especificar n, y si usted no tiene cuidado, puede hacerlo mal.

Pero el punto es que al menos es posible restringir la salida de snprintf a un tamaño de búfer conocido, que simplemente no se puede hacer con el strcpy pasado de moda () y strcat ().

→ El código cURL actualizado anteriormente aún no es perfecto. El programador realmente debe comprobar el valor de retorno de snprintf (), que informa de la cantidad de bytes que quería escribir. Si el buffer no era lo suficientemente grande, entonces la salida será incompleta e incorrecta por lo tanto. Usted no debe usar: aumentar el tamaño del búfer y vuelva a intentarlo, o informar de un error en su lugar.

Probablemente esté pensando, en este punto, que la explotación de esta vulnerabilidad sería difícil porque la mayoría de los programas que utilizan cURL hacerlo en el fondo. Ellos no son interactivos.

Autoupdating software, que puede usar la biblioteca CURL (conocido como libcurl) por lo general viene pre-configurado con una lista de direcciones URL en buen estado, o le pide que introduzca una URL en tiempo de instalación, y eso es todo.

Un atacante que pudiera hablar a cambio de su buena conocida URL actualización automática para una chunga, o que podría persuadir a cambiar desde el servidor de correo electrónico POP3 que siempre ha utilizado a una que nunca has oído hablar, seguramente sería más fácil para infectar simplemente por conseguir que se ejecute su software malicioso directamente.

Eso es cierto, pero todavía hay un riesgo.

Si un atacante puede redirigir las peticiones de tu AutoUpdater o su cliente POP3, por ejemplo, jugando con la configuración de DNS, o por el pirateo de un servidor en el borde de la red de su proveedor de servicios, que podría enviar a un sitio impostor y tratar de explotar desde allí.

Debido al desbordamiento de búfer, esto podría conducir a un drive-by download, donde cURL en sí es engañado para portarse mal, cortar el consentimiento informado fuera del circuito completo.

Las lecciones?

  • No usar strcpy () o strcat ().
  • Ever.
  • Use snprintf (o strlcpy () y strlcat () , o similar) en su lugar.
  • Compruebe siempre el valor de retorno de las funciones de manejo de cadenas para que no terminen con resultados incorrectos.

El siguiente problema es saber si, o que, de software que está utilizando que incluye código cURL con estos errores. (Las versiones de cURL 7.26.0 a 7.28.1 de inclusive se ven afectados.)

Mejor empezar a preguntar a su alrededor ...

NB. Aunque los productos de Sophos utiliza varios libcurl, ninguno de ellos utilizan el código de las versiones vulnerables.

You might like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

About the author

Paul Ducklin is a passionate security proselytiser. (That's like an evangelist, but more so!) He lives and breathes computer security, and would be happy for you to do so, too. Paul won the inaugural AusCERT Director's Award for Individual Excellence in Computer Security in 2009. Follow him on Twitter: @duckblog