Trojan Source, ataque que permite añadir cambios de código invisibles para el desarrollador

noviembre 05, 2021 , 0 Comments

Hace pocos dias investigadores de la Universidad de Cambridge dieron a conocer la publicación de una técnica para sustituir sutilmente códigos maliciosos en el código fuente de aplicaciones.

El método de ataque preparado que ya es catalogado bajo CVE-2021-42574 se presenta con el nombre Trojan Source y se basa en la formación de texto que se ve diferente al compilador/intérprete y la persona que ve el código.

Sobre Trojan Source

El método se basa en la aplicación de caracteres Unicode especiales en los comentarios del código, que cambian el orden de visualización del texto bidireccional. Con la ayuda de estos caracteres de control, algunas partes del texto se pueden mostrar de izquierda a derecha, mientras que otras, de derecha a izquierda.

En la práctica diaria, estos caracteres de control se pueden utilizar, por ejemplo, para insertar cadenas en hebreo o árabe en un archivo con código. Sin embargo, si usa estos caracteres para combinar líneas con diferentes direcciones de texto en la misma línea, los pasajes de texto que se muestran de derecha a izquierda pueden superponerse al texto normal existente que se muestra de izquierda a derecha.

Con este método, se puede agregar una construcción maliciosa al código, pero luego hacer que el texto con esta construcción sea invisible al ver el código, agregando los caracteres que se muestran de derecha a izquierda en el siguiente comentario o dentro del literal, lo que resultará en un resultado completamente diferentes caracteres superpuestos a la inserción maliciosa. Dicho código seguirá siendo semánticamente correcto, pero se interpretará y mostrará de manera diferente.

Hemos descubierto formas de manipular la codificación de archivos de código fuente para que los espectadores y compiladores humanos vean una lógica diferente. Un método particularmente pernicioso utiliza caracteres de anulación de direccionalidad Unicode para mostrar el código como un anagrama de su verdadera lógica. Hemos verificado que este ataque funciona contra C, C ++, C #, JavaScript, Java, Rust, Go y Python, y sospechamos que funcionará contra la mayoría de los otros lenguajes modernos.

Mientras revisa el código, el desarrollador se enfrentará al orden visual de los caracteres y verá un comentario sospechoso en un editor de texto, interfaz web o IDE, pero el compilador y el intérprete utilizarán el orden lógico de los caracteres y manejarán el código malicioso como está, independientemente del texto bidireccional en el comentario. Varios editores de código populares (VS Code, Emacs, Atom), así como interfaces para ver código en repositorios (GitHub, Gitlab, BitBucket y todos los productos de Atlassian) se ven afectados.

Hay varias formas de utilizar el método para implementar acciones maliciosas: agregar una expresión oculta «return», que conduce a la terminación de la ejecución de la función antes de tiempo; la conclusión en el comentario de expresiones que normalmente se consideran construcciones válidas (por ejemplo, para deshabilitar comprobaciones importantes); asignación de otros valores de cadena que conducen a fallas de validación de cadena.

Además, se propuso otra opción de ataque (CVE-2021-42694), que implica el uso de homoglyphs, símbolos que parecen similares en apariencia, pero difieren en significado y tienen diferentes códigos Unicode. Estos caracteres se pueden utilizar en algunos idiomas en los nombres de funciones y variables para engañar a los desarrolladores. Por ejemplo, se pueden definir dos funciones con nombres indistinguibles que realizan diferentes acciones. Sin un análisis detallado, no puede comprender de inmediato cuál de estas dos funciones se llama en un lugar en particular.

Como medida de protección, se recomienda implementar en compiladores, intérpretes y herramientas de ensamblaje que admitan caracteres Unicode, mostrando un error o advertencia si hay caracteres de control no apareados en comentarios, literales de cadena o identificadores que cambian la dirección de salida. Estos caracteres también deben prohibirse explícitamente en las especificaciones de los lenguajes de programación y deben tenerse en cuenta en los editores de código y las interfaces para trabajar con repositorios.

Ademas de que ya se han comenzado a solucionar las vulnerabilidades preparadas para GCC, LLVM/Clang, Rust, Go, Python y binutils. GitHub, Bitbucket y Jira y tambien ya están en preparación de una solución junto con GitLab.

Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.