Búsqueda de Ciberamenazas

¿Usas WinRAR? Asegúrate de parchear contra estos fallos de ejecución de código

El venerable programa RAR, abreviatura de Roshal’s Archiver en honor a su creador original, ha sido popular en los círculos de intercambio de archivos y distribución de software durante décadas, entre otras cosas por sus funciones integradas de recuperación de errores y reconstrucción de archivos.

Los primeros usuarios de Internet recordarán, con poco cariño, los días en que las transferencias de archivos grandes se enviaban como archivos comprimidos divididos en varios disquetes, o se subían a foros en línea preocupados por el tamaño como una serie de trozos de tamaño modesto que primero se comprimían para ahorrar espacio y luego se ampliaban a una forma codificada en texto sólo ASCII.

Si un disquete se perdía o no se leía correctamente, o si un trozo de un archivo de 12 partes se borraba del servidor por error, no tenías suerte.

RAR, o WinRAR en su forma contemporánea para Windows, ayudó a solucionar este problema ofreciendo los llamados volúmenes de recuperación.

Éstos almacenaban datos de corrección de errores, de modo que los archivos de varias partes podían recuperarse automática y completamente, incluso si un fragmento entero (o más, dependiendo de cuánta información de recuperación se guardara) se perdía o era irrecuperable.

Guardar una rueda de repuesto en el maletero

Aparentemente, los archivos RAR hasta la versión 4 inclusive utilizaban la llamada corrección por paridad; las versiones más recientes utilizan un sistema de corrección de errores computacionalmente más complejo pero más potente, conocido como códigos Reed-Solomon.

La corrección basada en la paridad se basa en la operación XOR, que denotaremos aquí con el símbolo ⊕ (un signo más dentro de un círculo).

XOR es la abreviatura de OR exclusivo, que denota “o X es verdadero o Y es verdadero, pero no ambos a la vez”, siguiendo así esta tabla de verdad, que construimos suponiendo que X e Y solo pueden tener los valores 0 (falso) o 1 (verdadero):

Si X=0 e Y=0 entonces X Y = 0 (dos falsos hacen un falso)

Si X=1 e Y=0 entonces X Y = 1 (uno puede ser verdadero, pero no los dos)

Si X=0 e Y=1 entonces X Y = 1 (una puede ser verdadera, pero no las dos)

Si X=1 e Y=1 entonces X Y = 0 (tiene que ser una u otra)

La función XOR funciona un poco como la pregunta: “¿quieres café o té?”.

Si dices “sí”, entonces tienes que elegir solo café, o elegir solo té, porque no puedes tomar una taza de cada.

Como puedes deducir de la tabla  anterior, XOR tiene las convenientes características de que X ⊕ 0 = X, y X ⊕ X = 0.

Imagina ahora que tienes tres bloques de datos etiquetados como A, B y C, y que calculas un cuarto bloque P XORando A, B y C, de modo que P = (A ⊕ B ⊕ C).

Dada la tabla de verdad anterior, y dado que XOR es lo que se conoce como conmutativo, lo que significa que el orden de los valores en un cálculo puede intercambiarse si quieres, de modo que X ⊕ Y = Y ⊕ Z, o A ⊕ B ⊕ C = C ⊕ B ⊕ A = B ⊕ C ⊕ A y así sucesivamente, podemos ver que:

A B C P = A B C (A B C)

              = (AA) (BB) (CC)

              = 0 0 0

              = 0

Mira ahora qué ocurre si se pierde cualquiera de A, B o C:

A B P = A B (A B C)

              = (AA) (BB) C

              = 0 0 C

              = C <–¡vuelve el trozo que falta!

 

A C P = A C (A B C)

              = (AA) (CC) B

              = 0 0 B

              = B <–¡vuelve el trozo que falta!

 

    B C P = B C (A B C)

              = (BB) (CC) A

              = 0 0 A

              = A <–¡vuelve el trozo perdido!

Además, si se pierde P, podemos ignorarlo porque podemos calcular A ⊕ B ⊕ C de todos modos.

En pocas palabras, tener el trozo de datos de paridad P significa que siempre podemos reconstruir cualquier trozo perdido, independientemente de cuál sea.

El error de recuperación

Pues bien, después de lo que suponemos que han sido muchos años pasando desapercibido, ha aparecido un error ahora denominado CVE-2023-40477 en WinRAR.

Este fallo puede activarse (irónicamente, quizás) cuando el producto hace uso de este sistema de recuperación de datos.

Por lo que podemos ver, un trozo de datos de paridad con trampa insertado en un archivo puede engañar al código de WinRAR para que escriba datos fuera de la zona de memoria que tiene asignada.

Esto da lugar a una vulnerabilidad de desbordamiento de búfer explotable.

Los datos escritos donde no deben terminan siendo tratados como código de programa que se ejecuta, en lugar de como simples datos que se utilizan en el proceso de desarchivado.

Este fallo no obtuvo una puntuación de gravedad de 10/10 en la “escala de peligrosidad” del CVSS, sino de 7,8/10, ya que la vulnerabilidad no puede explotarse sin algún tipo de ayuda por parte del usuario al que va dirigida.

Segundo fallo

Curiosamente, se ha parcheado un segundo fallo de seguridad en la última versión de WinRAR, y aunque este parece menos problemático que el fallo CVE-2023-40477 mencionado anteriormente, TechCrunch sugiere que se ha explotado en la vida real a través de archivos trampa “publicados en al menos ocho foros públicos [que cubren] una amplia gama de temas relacionados con el comercio, la inversión y las criptomonedas”.

No podemos encontrar un número CVE para este, pero WinRAR lo describe simplemente como:

WinRAR podía iniciar un archivo erróneo después de que un usuario hiciera doble clic en un elemento de un archivo especialmente diseñado.

En otras palabras, un usuario que abriera un archivo y decidiera mirar un archivo aparentemente inocente en su interior (un archivo de texto README, por ejemplo, o una imagen de aspecto inofensivo) podría iniciar inesperadamente algún otro archivo del archivo, como un script o un programa ejecutable.

Es un poco como recibir un correo electrónico que contiene un archivo adjunto de aspecto seguro junto con otro de aspecto arriesgado, decidir empezar investigando solo el de aspecto seguro, pero lanzar sin saberlo el archivo arriesgado en su lugar.

Por lo que sabemos, este fallo existía en el código de WinRAR para desempaquetar archivos ZIP, no en el código para procesar su propio formato de archivo RAR.

Los archivos ZIP de dos caras han sido un problema de ciberseguridad durante años, porque el índice de archivos y directorios de cualquier archivo ZIP aparece dos veces, una en una serie de bloques de datos intercalados a lo largo del archivo, y otra en un único trozo de datos al final. El código que verifica los archivos basándose en un índice pero los extrae y utiliza basándose en el otro, sin comprobar que los dos índices son coherentes, ha dado lugar a numerosas vulnerabilidades explotables a lo largo de los años. No sabemos si este problema de doble índice es la causa principal del reciente fallo de WinRAR, pero nos recuerda que descomprimir archivos comprimidos puede ser un proceso complejo y propenso a errores que requiere una cuidadosa atención a la seguridad, incluso a costa de un procesamiento adicional y una reducción del rendimiento.

¿Qué hacer?

Si eres usuario de WinRAR, asegúrate de que tienes la última versión, que es la 6.23 en el momento de escribir esto [2023-08-23T16:30Z].

Al parecer, no existe un sistema de actualización automática en el software WinRAR, por lo que tienes que descargar el nuevo instalador y ejecutarlo tú mismo para sustituir una versión antigua.

Si eres programador, recuerda revisar el código heredado que sigue en tu software pero que se considera “retirado” o “ya no recomendado para nuevos usuarios”.

Por lo que podemos ver, WinRAR ya no genera datos de recuperación del estilo antiguo, y utiliza algoritmos de corrección de errores más inteligentes desde la versión 5, pero por razones de compatibilidad con versiones anteriores sigue procesando archivos del estilo antiguo si se presentan.

Recuerda que cuando los atacantes crean archivos trampa con la esperanza de engañar a tu software, generalmente no están utilizando tu software para crear esos, por lo que probar tus propias rutinas de entrada solo contra archivos que tus propias rutinas de salida crearon originalmente nunca es suficiente.

Si no has pensado en el fuzzing, un término que se refiere a una técnica de prueba en la que se presentan a tu software millones de entradas permutadas, malformadas y deliberadamente incorrectas, mientras se supervisa su mal comportamiento, puede que sea el momento de pensárselo.

Los buenos fuzzers no solo ejecutan tu código una y otra vez, sino que también intentan adaptar los ajustes, trucos y modificaciones que hacen a sus datos de entrada falsos para que se pruebe la mayor parte posible de tu código.

Esto te ayuda a obtener lo que se conoce como una buena cobertura del código durante las pruebas, lo que incluye forzar tu programa por rutas de código raras e inusuales que casi nunca se activan en el uso habitual, y donde vulnerabilidades inexploradas pueden haber pasado desapercibidas durante años.

Dejar un comentario

Your email address will not be published. Required fields are marked *