Qué es un troyano y cómo se cuela en tu código fuente

Publicado el 23 de febrero de 2022
por Laura Verheyde
ESTUDIO DE CASO

Qué es un troyano y cómo se cuela en tu código fuente

Publicado el 23 de febrero de 2022
por Laura Verheyde
Ver recurso
Ver recurso
Fuente troyana
Fuente troyana

A principios de noviembre, la Universidad de Cambridge publicó su investigación llamada Trojan-Source. Esta investigación se centraba en cómo se pueden ocultar puertas traseras en el código fuente y en los comentarios, utilizando caracteres de formato direccional. Éstos pueden utilizarse para elaborar código cuya lógica es interpretada por el compilador de forma diferente a la de un revisor de código humano.

Esta vulnerabilidad es nueva, aunque Unicode se ha utilizado de forma nefasta en el pasado, como por ejemplo ocultando la verdadera extensión de un archivo invirtiendo la dirección de la última parte de un nombre de archivo. La reciente investigación reveló que muchos compiladores ignoran los caracteres Unicode en el código fuente sin avisar, mientras que los editores de texto, incluidos los editores de código, pueden reflotar las líneas que contienen comentarios y código basados en ellos. Por lo tanto, el editor puede mostrar el código y los comentarios de forma diferente, y en un orden distinto, de cómo lo analizará el compilador, incluso intercambiando el código y los comentarios.

Sigue leyendo para saber más. O si quieres arremangarte y probar el hackeo simulado de Trojan Source, entra en nuestra misión pública y gratuita para experimentarlo por ti mismo.

Texto bidireccional

Uno de estos ataques de origen troyano hace uso del algoritmo Unicode Bidi (bidireccional), que maneja la forma de agrupar texto con un orden de visualización diferente, como el inglés (de izquierda a derecha) y el árabe (de derecha a izquierda). Los caracteres de formato direccional pueden utilizarse para reorganizar la agrupación y mostrar el orden de los caracteres.

La tabla anterior contiene algunos de los caracteres de anulación de Bidi relevantes para el ataque. Por ejemplo,

RLI e d o c PDI

La abreviatura RLI significa Right-to-Left Isolate. Aislará el texto de su contexto (delimitado por PDI, Pop-Directional-Isolate), y lo leerá de derecha a izquierda. El resultado es:

c o d e

Sin embargo, los compiladores e intérpretes no suelen procesar los caracteres de control de formato, incluidos los Bidi, antes de analizar el código fuente. Si simplemente ignoran los caracteres de formato direccional, los analizarán:

e d o c

¿Vino viejo en botellas nuevas?

Por supuesto, esto no es nada nuevo bajo el sol. En el pasado, se han insertado caracteres de formato direccional en los nombres de archivos para disfrazar su naturaleza maliciosa. Un archivo adjunto de correo electrónico mostrado como "myspecialexe.doc" podría parecer bastante inocente, si no fuera por el carácter RLO(Right-to-Left override) presente que revela que el nombre real es "myspecialcod.exe".

El ataque Trojan Source inserta caracteres de formato direccional en los comentarios y cadenas presentes en el código fuente, ya que estos no generan ningún error de sintaxis o de compilación. Estos caracteres de control cambian el orden de visualización de la lógica del código haciendo que el compilador lea algo totalmente diferente a lo que haría un humano.

Por ejemplo, un archivo que contenga los siguientes bytes en este orden:

Texto Unicode bidireccional

se reordenará de la siguiente manera por los caracteres de formato direccional

Caracteres de formato direccional

lo que hace que el código se muestre así si los caracteres de formato direccional no se llaman explícitamente:

Caracteres Unicode bidireccionales

La RLO cambia la llave de cierre por una llave de apertura, y viceversa en la última línea. El resultado de ejecutar este código sería: "Usted es un administrador". La comprobación de admin fue comentada, sin embargo los caracteres de control dan la impresión de que todavía está presente. 

(Fuente: https://github.com/nickboucher/trojan-source/blob/main/C%23/commenting-out.csx)

¿Cómo puede afectarle esto?

Muchos lenguajes son vulnerables al ataque: C, C++, C#, JavaScript, Java, Rust, Go y Python, y se supone que hay más. Ahora bien, el desarrollador medio podría fruncir el ceño al ver caracteres de formato direccional en el código fuente, pero un novato podría encogerse de hombros y no pensar en ello. Además, la visualización de estos caracteres depende en gran medida del IDE, por lo que nunca es una garantía de que sean detectados.

Pero, ¿cómo pudo colarse esta vulnerabilidad en el código fuente en primer lugar? En primer lugar, esto puede ocurrir cuando se utiliza el código fuente de fuentes poco fiables, donde las contribuciones de código malicioso han pasado desapercibidas. En segundo lugar, podría ocurrir por un simple copiar y pegar del código encontrado en Internet, algo que la mayoría de los desarrolladores hemos hecho antes. La mayoría de las organizaciones dependen de componentes de software de múltiples proveedores. Esto plantea la cuestión de hasta qué punto podemos confiar plenamente en este código. ¿Cómo podemos detectar el código fuente que contiene puertas traseras ocultas?

¿De quién es el problema?

Por un lado, los compiladores y los pipelines de compilación deberían no permitir líneas de código fuente con más de una dirección, a menos que una dirección esté estrictamente limitada a cadenas y comentarios. Tenga en cuenta que un carácter de formato direccional en una cadena o comentario puede, si no se salta, extender un cambio de dirección hasta el final de la línea. En general, los editores de código deberían representar y resaltar explícitamente los caracteres Unicode sospechosos, como los homoglifos y los caracteres de formato direccional. Desde noviembre, GitHub añade una señal y un mensaje de advertencia a cada línea de código que contenga texto unicode bidireccional, aunque no resalta en qué parte de la línea se encuentran estos caracteres. Esto todavía puede permitir que se cuelen cambios de dirección maliciosos junto con cambios de dirección benignos.

La concienciación de los desarrolladores y revisores de código es esencial, por lo que hemos creado un recorrido que ilustra la vulnerabilidad. Actualmente esta guía está disponible para Java, C#, Python, GO y PHP.

Así que si quieres saber más, prueba nuestra simulación (pública missions) de Trojan Source, y lee la investigación de Trojan Source.

Simulación en Java

Simulación en C#

Simulación en PHP

Simulación en GO

Simulación en Python

Ver recurso
Ver recurso

Autor

Laura Verheyde

Laura Verheyde es una desarrolladora de software en Secure Code Warrior centrada en la investigación de vulnerabilidades y la creación de contenidos para Missions y Coding labs.

¿Quieres más?

Sumérjase en nuestras últimas ideas sobre codificación segura en el blog.

Nuestra amplia biblioteca de recursos tiene como objetivo potenciar el enfoque humano de la mejora de la codificación segura.

Ver blog
¿Quieres más?

Obtenga las últimas investigaciones sobre la seguridad impulsada por los desarrolladores

Nuestra amplia biblioteca de recursos está repleta de recursos útiles, desde libros blancos hasta seminarios web, que le ayudarán a iniciarse en la codificación segura orientada a los desarrolladores. Explórela ahora.

Centro de recursos

Qué es un troyano y cómo se cuela en tu código fuente

Publicado el 23 de febrero de 2022
Por Laura Verheyde

A principios de noviembre, la Universidad de Cambridge publicó su investigación llamada Trojan-Source. Esta investigación se centraba en cómo se pueden ocultar puertas traseras en el código fuente y en los comentarios, utilizando caracteres de formato direccional. Éstos pueden utilizarse para elaborar código cuya lógica es interpretada por el compilador de forma diferente a la de un revisor de código humano.

Esta vulnerabilidad es nueva, aunque Unicode se ha utilizado de forma nefasta en el pasado, como por ejemplo ocultando la verdadera extensión de un archivo invirtiendo la dirección de la última parte de un nombre de archivo. La reciente investigación reveló que muchos compiladores ignoran los caracteres Unicode en el código fuente sin avisar, mientras que los editores de texto, incluidos los editores de código, pueden reflotar las líneas que contienen comentarios y código basados en ellos. Por lo tanto, el editor puede mostrar el código y los comentarios de forma diferente, y en un orden distinto, de cómo lo analizará el compilador, incluso intercambiando el código y los comentarios.

Sigue leyendo para saber más. O si quieres arremangarte y probar el hackeo simulado de Trojan Source, entra en nuestra misión pública y gratuita para experimentarlo por ti mismo.

Texto bidireccional

Uno de estos ataques de origen troyano hace uso del algoritmo Unicode Bidi (bidireccional), que maneja la forma de agrupar texto con un orden de visualización diferente, como el inglés (de izquierda a derecha) y el árabe (de derecha a izquierda). Los caracteres de formato direccional pueden utilizarse para reorganizar la agrupación y mostrar el orden de los caracteres.

La tabla anterior contiene algunos de los caracteres de anulación de Bidi relevantes para el ataque. Por ejemplo,

RLI e d o c PDI

La abreviatura RLI significa Right-to-Left Isolate. Aislará el texto de su contexto (delimitado por PDI, Pop-Directional-Isolate), y lo leerá de derecha a izquierda. El resultado es:

c o d e

Sin embargo, los compiladores e intérpretes no suelen procesar los caracteres de control de formato, incluidos los Bidi, antes de analizar el código fuente. Si simplemente ignoran los caracteres de formato direccional, los analizarán:

e d o c

¿Vino viejo en botellas nuevas?

Por supuesto, esto no es nada nuevo bajo el sol. En el pasado, se han insertado caracteres de formato direccional en los nombres de archivos para disfrazar su naturaleza maliciosa. Un archivo adjunto de correo electrónico mostrado como "myspecialexe.doc" podría parecer bastante inocente, si no fuera por el carácter RLO(Right-to-Left override) presente que revela que el nombre real es "myspecialcod.exe".

El ataque Trojan Source inserta caracteres de formato direccional en los comentarios y cadenas presentes en el código fuente, ya que estos no generan ningún error de sintaxis o de compilación. Estos caracteres de control cambian el orden de visualización de la lógica del código haciendo que el compilador lea algo totalmente diferente a lo que haría un humano.

Por ejemplo, un archivo que contenga los siguientes bytes en este orden:

Texto Unicode bidireccional

se reordenará de la siguiente manera por los caracteres de formato direccional

Caracteres de formato direccional

lo que hace que el código se muestre así si los caracteres de formato direccional no se llaman explícitamente:

Caracteres Unicode bidireccionales

La RLO cambia la llave de cierre por una llave de apertura, y viceversa en la última línea. El resultado de ejecutar este código sería: "Usted es un administrador". La comprobación de admin fue comentada, sin embargo los caracteres de control dan la impresión de que todavía está presente. 

(Fuente: https://github.com/nickboucher/trojan-source/blob/main/C%23/commenting-out.csx)

¿Cómo puede afectarle esto?

Muchos lenguajes son vulnerables al ataque: C, C++, C#, JavaScript, Java, Rust, Go y Python, y se supone que hay más. Ahora bien, el desarrollador medio podría fruncir el ceño al ver caracteres de formato direccional en el código fuente, pero un novato podría encogerse de hombros y no pensar en ello. Además, la visualización de estos caracteres depende en gran medida del IDE, por lo que nunca es una garantía de que sean detectados.

Pero, ¿cómo pudo colarse esta vulnerabilidad en el código fuente en primer lugar? En primer lugar, esto puede ocurrir cuando se utiliza el código fuente de fuentes poco fiables, donde las contribuciones de código malicioso han pasado desapercibidas. En segundo lugar, podría ocurrir por un simple copiar y pegar del código encontrado en Internet, algo que la mayoría de los desarrolladores hemos hecho antes. La mayoría de las organizaciones dependen de componentes de software de múltiples proveedores. Esto plantea la cuestión de hasta qué punto podemos confiar plenamente en este código. ¿Cómo podemos detectar el código fuente que contiene puertas traseras ocultas?

¿De quién es el problema?

Por un lado, los compiladores y los pipelines de compilación deberían no permitir líneas de código fuente con más de una dirección, a menos que una dirección esté estrictamente limitada a cadenas y comentarios. Tenga en cuenta que un carácter de formato direccional en una cadena o comentario puede, si no se salta, extender un cambio de dirección hasta el final de la línea. En general, los editores de código deberían representar y resaltar explícitamente los caracteres Unicode sospechosos, como los homoglifos y los caracteres de formato direccional. Desde noviembre, GitHub añade una señal y un mensaje de advertencia a cada línea de código que contenga texto unicode bidireccional, aunque no resalta en qué parte de la línea se encuentran estos caracteres. Esto todavía puede permitir que se cuelen cambios de dirección maliciosos junto con cambios de dirección benignos.

La concienciación de los desarrolladores y revisores de código es esencial, por lo que hemos creado un recorrido que ilustra la vulnerabilidad. Actualmente esta guía está disponible para Java, C#, Python, GO y PHP.

Así que si quieres saber más, prueba nuestra simulación (pública missions) de Trojan Source, y lee la investigación de Trojan Source.

Simulación en Java

Simulación en C#

Simulación en PHP

Simulación en GO

Simulación en Python

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.