Implantes invisibles en el código fuente

Los investigadores de Cambridge describen el método Trojan Source para insertar implantes ocultos en el código fuente.

Los expertos de la Universidad de Cambridge han descrito una vulnerabilidad que, según afirman, afecta a los compiladores más modernos. Este nuevo método de ataque utiliza una función legítima de las herramientas de desarrollo en el que el código fuente muestra una cosa, pero compila otra completamente distinta. Todo esto sucede mediante la magia de los caracteres de control Unicode. 

Los caracteres de formato de direccionalidad Unicode relevantes para reordenar los ataques.

Los caracteres de formato de direccionalidad Unicode relevantes para reordenar los ataques. Fuente

La mayoría de las veces, los caracteres de control no aparecen en la pantalla con el resto del código (aunque algunos editores los muestran), pero modifican el texto de alguna forma. En esta tabla se incluyen los códigos para el algoritmo bidireccional (bidi) Unicode, por ejemplo.  

Como probablemente ya sabrás, algunos idiomas humanos se escriben de izquierda a derecha (por ejemplo, el español), otros de derecha a izquierda (por ejemplo, el árabe). Cuando el código contiene solo un idioma, no hay problema, pero cuando es necesario (por ejemplo, en el caso de una línea contenga palabras en español y árabe) el código bidi especifica la dirección del texto. 

En la investigación, los autores utilizaron códigos para, por ejemplo, mover el terminador de comentarios en el código Python de la parte central de una línea al final. Aplicaron un código RLI para cambiar solo algunos caracteres, dejando el resto igual.  

Ejemplo de código Python vulnerable que utiliza códigos bidi.

Ejemplo de código Python vulnerable que utiliza códigos bidi. Fuente

A la derecha está la versión que los programadores ven al revisar el código fuente; a la izquierda se muestra cómo el código se ejecutará. La mayoría de los compiladores ignora los caracteres de control. Cualquiera que revise el código pensará que la quinta línea es un comentario inofensivo, aunque en realidad, una sentencia de retorno anticipado escondida en su interior hará que el programa se salte la operación que carga los fondos de la cuenta bancaria. Es decir, en este ejemplo el programa bancario simulado dispensará el dinero, pero no lo deducirá del saldo de la cuenta.  

¿Por qué resulta peligroso? 

A simple vista, la vulnerabilidad parece muy sencilla. ¿Quién insertaría caracteres invisibles con la esperanza de engañar a los auditores del código fuente? No obstante, el problema se ha considerado lo suficientemente grave como para justificar un código identificador de vulnerabilidades (CVE-2021-42574). Antes de publicar el artículo, los autores notificaron a los desarrolladores de los compiladores más comunes para darles tiempo para preparar los parches.  

El informe describe las capacidades de ataque básicas. Las dos estrategias de ejecución consisten en ocultar un comando dentro de los comentarios y algo en una línea que, por ejemplo, aparezca en la pantalla. En teoría, es posible lograr el efecto opuesto: crear un código que parezca un comando, pero que realmente forme parte de un comentario y acabe por no ejecutarse. Incluso es posible que existan métodos más creativos para explotar esta debilidad.  

Por ejemplo, alguien podría utilizar este truco para llevar a cabo un sofisticado ataque de cadena de suministro donde un contratista suministre a una empresa un código que parezca correcto, pero no funcione según lo planeado. Entonces, después de que se libere el producto final, un externo podría utilizar esa “funcionalidad alternativa” para atacar a los clientes.  

Pero ¿es realmente tan peligroso? 

Poco después de que se publicara el artículo, el programador Russ Cox criticó el ataque Trojan Source; por decirlo de alguna forma, no se mostró muy impresionado. Sus argumentos fueron los siguientes:  

  • Para nada es un ataque nuevo. 
  • Muchos editores de código utilizan resaltado de sintaxis para mostrar el código “invisible”. 
  • Los parches para los compiladores no son necesarios; basta con revisar cuidadosamente el código para detectar errores accidentales o maliciosos.  

Bien es cierto que el problema con los caracteres de control Unicode lleva surgiendo desde el 2017. Tampoco es nada nuevo un problema similar con los homoglifos (caracteres que parecen iguales pero tienen códigos distintos) y que también podría servir para introducir código desconocido más allá de los verificadores manuales.  

Sin embargo, el análisis crítico de Cox no niega la existencia del problema, sino que condena el informe como demasiado dramático, una descripción acertada de, por ejemplo, el artículo apocalíptico del periodista Brian Krebs sobre Trojan Source 

El problema es real, pero, por fortuna, la solución es muy sencilla. Los parches que ya están disponibles o que están a punto de salir bloquearán la compilación de código que contenga estos caracteres. (Como se indica, por ejemplo, en este aviso de seguridad de los desarrolladores del compilador Rust). Si utilizas tus propias herramientas de desarrollo de software, te recomendamos añadir una verificación similar para caracteres ocultos, los cuales, normalmente, no deberían aparecer en los códigos fuente.  

El peligro de los ataques a la cadena de suministro 

Muchas empresas subcontratan las labores de desarrollo a contratistas o utilizan módulos de código abierto ya hechos en sus proyectos. Esto siempre abre la puerta a ataques mediante la cadena de suministro. Los ciberdelincuentes pueden comprometer a un contratista o al código incrustado en un proyecto de código abierto e introducir código malicioso en la versión final del software. Las auditorias de código normalmente revelan estas puertas traseras, pero, si no, los usuarios finales podrían tener software de fuentes fiables y aun así perder sus datos.  

Trojan Source es un ejemplo de un ataque mucho más elegante. En lugar de tratar de contrabandear megabytes de código malicioso en un producto final, los atacantes pueden utilizar este enfoque para introducir un implante difícil de detectar en una parte crítica del software y explotarlo durante años.  

Cómo mantenerse a salvo 

Para protegerse contra los ataques del tipo Trojan Source: 

  • Actualiza todos los compiladores de lenguaje de programación que utilices (si se han liberado parches para estos). 
  • Escribe tus propios scripts que detecten un rango limitado de caracteres de control en el código fuente. 

En términos más generales, la lucha contra los ataques de cadena de suministro potenciales requiere tanto auditorias de código manuales como una gama de pruebas automatizadas. Nunca está de más ver tu código desde la perspectiva de los ciberdelincuentes para tratar de detectar ese sencillo error que pudiese quebrar todo el mecanismo de seguridad. Si no cuentas en interno con los recursos para este tipo de análisis, considera la opción de involucrar una serie de expertos externos. 

Consejos