Centro de Investigación Informática Lazarus

Trojan Source: cuando el ataque está dentro del mismo código fuente de tu aplicativo.

Trojan Source es un tipo de vulnerabilidad en la que se utilizan caracteres de control bidireccionales de Unicode para manipular la apariencia del código fuente, haciendo que lo que ve un revisor humano difiera de lo que interpreta un compilador, lo que permite insertar código malicioso de manera encubierta. Estas vulnerabilidades podrían ser introducidas en el código fuente de una aplicación durante el desarrollo, sobre todo si no se lleva a cabo una revisión exhaustiva del código fuente.

Desde la perspectiva de ciberseguridad y forense informática, los puntos más relevantes a tener en cuenta sobre este tipo de ataque, son:

  1. Trojan Source Attacks: Se trata de ataques en los que el código fuente está codificado de manera maliciosa para que su apariencia difiera entre lo que ve un compilador y lo que ve un revisor humano. Esto se logra usando caracteres de control bidireccionales de Unicode, que permiten que los caracteres de un programa se rendericen en un orden diferente al que se codificaron lógicamente.
  2. Afectación a Múltiples Lenguajes: Estos ataques afectan una amplia gama de lenguajes de programación como C, C++, JavaScript, Python, entre otros, debido a que la mayoría de los compiladores modernos aceptan entradas Unicode.
  3. Manipulación de la Visibilidad del Código: Las técnicas de ataque como «Stretched Strings» y «Commenting-Out» permiten a un adversario hacer que el código que se ve no sea el que realmente se ejecuta, engañando a los revisores humanos.
  4. Malware Visualmente Deceptivo: Las técnicas históricas que utilizan caracteres de control bidireccionales y de dirección han sido empleadas en malware para cambiar la apariencia de las extensiones de archivo, facilitando la distribución mediante correos electrónicos.
  5. Desafíos de Detección y Mitigación: Dado que estas vulnerabilidades pasan desapercibidas en el código fuente visual, representan un desafío significativo para los desarrolladores, especialmente en los escenarios de la cadena de suministro de software que implican múltiples organizaciones. La detección a nivel de compilador y editor se propone como una solución, aunque no todos han implementado estas defensas.
  6. Consenso de la Industria y Divulgación Coordinada: El documento también discute el proceso de divulgación coordinada emprendido para notificar a la industria sobre estas vulnerabilidades, destacando cómo diferentes actores respondieron a la divulgación de vulnerabilidades.

Estos aspectos resaltan la necesidad urgente de implementar defensas más sólidas en herramientas de desarrollo de software y aumentar la concienciación sobre estos vectores de ataque en el ámbito de la seguridad informática.

Entendiendo la metodología del ataque «Trojan Source»

La metodología del ataque «Trojan Source» se basa en el uso de caracteres de control bidireccionales de Unicode para alterar la apariencia visual del código fuente sin modificar su ejecución lógica. A continuación, se describe un ejemplo simplificado de cómo podría realizarse este ataque:

  1. Inserción de Caracteres Bidireccionales: El atacante inserta caracteres de control bidireccionales (por ejemplo, LTR (Left-To-Right) y RTL (Right-To-Left)) en el código fuente. Estos caracteres cambian la dirección de lectura del texto, lo que puede ocultar o reordenar partes del código cuando se visualiza.
  2. Desviación de la Lógica Visual: A través de estos caracteres, el atacante manipula el orden en que las líneas de código se presentan a los revisores, haciendo que el código malicioso no sea visible o aparezca diferente a lo que realmente se ejecutará.
  3. Ejemplo Práctico: Supongamos un caso donde un bloque de código condicional (como un «if») se utiliza para tomar decisiones críticas de seguridad. Usando la técnica «Trojan Source», un atacante podría insertar un comentario o una línea de código dentro de este bloque que, al ser revisado, aparece como benigna o incluso como parte de un comentario, pero que, al ser compilada o interpretada, se ejecuta realmente permitiendo un comportamiento malicioso.

Esta modalidad de ataque explota la disparidad entre cómo los humanos y las máquinas interpretan el texto, haciendo que el código malicioso pase desapercibido durante las auditorías visuales estándar por parte de desarrolladores y revisores de código.

¿Cómo se realiza el ataque y como detectar este tipo de código?

Técnicas de explotación:

  • Early Returns: Esta técnica permite al atacante ocultar una declaración de retorno genuina como un comentario o literal de cadena, permitiendo que una función regrese antes de lo visualmente aparente. De esta forma, se puede evitar que cierto código se ejecute.
  • Commenting-Out: En esta técnica, el texto que aparenta ser código legítimo está en realidad dentro de un comentario y, por lo tanto, nunca se ejecuta. Esto permite que el atacante muestre a un revisor de código algo que parece ser ejecutado pero que el compilador o intérprete ignora.
  • Stretched Strings: Aquí, el texto que parece estar fuera de un literal de cadena está realmente dentro de él. Esto permite que un adversario manipule comparaciones de cadenas, haciendo fallar comparaciones que parecen idénticas.

Estas técnicas utilizan caracteres de control bidireccionales de Unicode para modificar la apariencia visual del código fuente y engañar a los revisores humanos, ocultando el verdadero flujo lógico del programa.

Medidas, técnicas y procedimientos para detectar los ataques Trojan Source:

  1. Análisis de Código Estático: Implementar herramientas de análisis de código estático que puedan detectar caracteres de control bidireccionales en el código fuente. Estas herramientas pueden alertar sobre la presencia de tales caracteres, que son a menudo un indicador de manipulación malintencionada.
  2. Configuración de los Editores y Compiladores: Configurar editores de texto y compiladores para que generen advertencias o rechacen archivos de código fuente que contengan caracteres de control bidireccionales no esperados. Algunos compiladores modernos ya han comenzado a introducir tales características de seguridad.
  3. Visibilidad en el IDE: Asegurar que en los entornos de desarrollo integrado (IDE), se muestren claramente los caracteres de control. Esto puede lograrse destacando de manera visual o señalando de alguna otra manera estos caracteres para que los desarrolladores puedan verificar su presencia intencionadamente.
  4. Revisiones de Código Manuales y Mandatos de Políticas: Incluir como parte de las revisiones de código manuales, la inspección de posibles caracteres ocultos. También, instaurar políticas de codificación que especifiquen el conjunto de caracteres permitidos y desaconsejen el uso de caracteres de control Unicode a menos que sea absolutamente necesario y justificado.
  5. Integración de Plugins de Seguridad: Integrar plugins de seguridad en los editores de código que analicen de forma automática el código fuente en busca de patrones sospechosos o características inusuales, como las secuencias de caracteres bidireccionales.
  6. Auditorías de Seguridad en la Cadena de Suministro de Software: Realizar auditorías de seguridad regulares en los componentes de software de terceros para asegurar que el código fuente no contenga estos caracteres maliciosos, especialmente aquellos en repositorios públicos como GitHub.

Implementar estas medidas puede ayudar a mitigar el riesgo de que los ataques «Trojan Source» pasen desapercibidos durante el desarrollo y despliegue del software.

Ejemplo de Código Trojan Sources:

Supongamos que tenemos un fragmento de código en Python que determina si un usuario tiene acceso a un sistema:

if isAdmin(user):

    print(«Access granted»)

else:

    print(«Access denied»)

 

Aplicación de la Técnica Trojan Source

Utilizando la técnica Trojan Source, el código puede ser manipulado de la siguiente manera para que engañe a los revisores humanos:

if isAdmin(user):

    print(«Access denied»)

else:

    print(«Access granted»)

 

Explicación:

  1. Inserción de Caracteres Bidireccionales: Los caracteres especiales de control bidireccional de Unicode («») se han insertado en el código. Este carácter hace que lo que sigue se renderice visualmente de derecha a izquierda.
  2. Manipulación Visual del Código: Aunque el código parece decir print(«Access denied») cuando isAdmin(user) es verdadero, la ejecución real del código imprime «Access granted». Esto debido a que el carácter de control ha invertido la dirección del texto ocultando la verdadera lógica al ojo humano.
  3. Engaño en las Revisiones: Un revisor humano mira el código y ve la versión falsa, mientras que el compilador interpretará la lógica inversa debido a la posición de los caracteres especiales.

Este ejemplo manifiesta cómo el uso de caracteres bidireccionales puede suponer un riesgo significativo en la revisión manual de código y en el peor de los casos con aplicativos de desarrollo mal configurados para dar alerta de esta brecha de seguridad, al crear discrepancias entre lo que se ve y lo que realmente se ejecuta. Para contrarrestar este tipo de ataques, es crucial utilizar herramientas de análisis de código que detecten estos caracteres y realizar revisiones exhaustivas que incluyan la comprobación de caracteres ocultos en el código fuente.

¿Te has preguntado si los programas que usas (Software libre o privativo) están cumpliendo con esta condición en forma oculta?

Para más contenido como este, únete a nuestra comunidad de Informática Forense, Pentester, Osint y Jurídico. https://t.me/LAZARUS_VENEZUELA

Síguenos en Instagram como @lazarusciil https://instagram.com/lazarusciil    o contáctanos a través del Whatsapp https://wa.me/584264143205

Deja una respuesta

¿Conoces el Grupo Lazarus?

× ¿Cómo puedo ayudarte?