Trojan Source es una vulnerabilidad de software que abusa de los caracteres bidireccionales de Unicode para mostrar el código fuente de forma diferente a como se ejecuta realmente. [ 1 ] El exploit utiliza la forma en que se muestran y codifican en los ordenadores los scripts de escritura con diferentes direcciones de lectura. Fue descubierto por Nicholas Boucher y Ross Anderson en la Universidad de Cambridge a finales de 2021. [ 2 ]
Fondo
Unicode es un estándar de codificación para representar texto, símbolos y glifos. Unicode es la codificación más utilizada en computadoras, presente en más del 98 % de los sitios web a septiembre de 2023.[ 3 ] Admite muchos idiomas y, por ello, debe admitir diferentes métodos de escritura de texto. Esto requiere compatibilidad tanto con idiomas de izquierda a derecha , como el inglés y el ruso, como con idiomas de derecha a izquierda , como el hebreo y el árabe . Dado que Unicode tiene como objetivo permitir el uso de más de un sistema de escritura, debe poder combinar escrituras con diferentes órdenes de visualización y resolver órdenes conflictivos. Como solución, Unicode contiene caracteres llamados caracteres bidireccionales ( Bidi ) que describen cómo se muestra y representa el texto. Estos caracteres pueden usarse indebidamente para cambiar la interpretación del texto sin alterarlo visualmente, ya que a menudo son invisibles. [ 4 ]
Metodología
En esta vulnerabilidad, se utilizan caracteres bidireccionales para reordenar visualmente el texto en el código fuente, de modo que la ejecución posterior se produzca en un orden diferente. Los caracteres bidireccionales pueden insertarse en áreas del código fuente donde se permiten literales de cadena. Esto suele ocurrir en la documentación, las variables o los comentarios.
En el ejemplo anterior, la marca RLI (aislamiento de derecha a izquierda) fuerza que el texto siguiente se interprete de forma diferente a como se muestra: primero aparece la comilla triple (que finaliza la cadena), seguida de un punto y coma (que inicia una nueva línea) y, finalmente, con el retorno prematuro (que devuelve None e ignora cualquier código que se encuentre debajo). La nueva línea finaliza la marca RLI, impidiendo que fluya hacia el código siguiente. Debido al carácter bidireccional, algunos editores de código fuente e IDE reorganizan el código para su visualización sin ninguna indicación visual de que se ha reorganizado, por lo que un revisor de código humano normalmente no lo detectaría. Sin embargo, cuando el código se inserta en un compilador, este puede ignorar el carácter bidireccional y procesar los caracteres en un orden diferente al que se muestra visualmente. Cuando el compilador termina, podría ejecutar código que visualmente parecía no ser ejecutable. [ 5 ] Las marcas de formato se pueden combinar varias veces para crear ataques complejos. [ 6 ]
Impacto y mitigación
Los lenguajes de programación que admiten cadenas Unicode y siguen el algoritmo Bidi de Unicode son vulnerables a la vulnerabilidad. Esto incluye lenguajes como Java , Go , C , C++ , C# , Python y JavaScript . [ 7 ]
Aunque el ataque no es estrictamente un error, muchos compiladores, intérpretes y sitios web añadieron advertencias o medidas de mitigación para la vulnerabilidad. Tanto GNU GCC como LLVM recibieron solicitudes para abordar la vulnerabilidad. [ 8 ] Marek Polacek envió un parche a GCC poco después de que se publicara la vulnerabilidad, que implementaba una advertencia para caracteres direccionales potencialmente inseguros; esta funcionalidad se integró en GCC 12 bajo la -Wbidi-charsbandera. [ 9 ] [ 10 ] LLVM también integró parches similares. Rust corrigió la vulnerabilidad en la versión 1.56.1, rechazando por defecto el código que incluye los caracteres. Los desarrolladores de Rust no encontraron paquetes vulnerables antes de la corrección. [ 11 ]
Muchos editores de código fuente e IDE ahora hacen más visibles estos caracteres potencialmente inseguros. Visual Studio Code ahora muestra los caracteres de control por defecto. [ 12 ] Notepad++ y vim ya hacían más visibles estos caracteres, como se señala en el artículo de investigación. [ 13 ]
Red Hat publicó un aviso en su sitio web, calificando la vulnerabilidad como "moderada". [ 14 ] GitHub publicó una advertencia en su blog, además de actualizar el sitio web para mostrar un cuadro de diálogo cuando se detectan caracteres bidireccionales en el código de un repositorio. [ 15 ]
Referencias
- ↑ "El error "Fuente troyana" amenaza la seguridad de todo el código – Krebs on Security . Noviembre de 2021. Archivado del original el 14 de enero de 2022. Consultado el 17 de enero de 2022 .
- ↑ "VU#999008 - Los compiladores permiten caracteres de control Unicode y caracteres homoglifos" . www.kb.cert.org . Archivado del original el 21/01/2022 . Consultado el 17/01/2022 .
- ↑ "Encuesta de uso de codificaciones de caracteres desglosada por clasificación" . w3techs.com . Archivado del original el 21/01/2022 . Consultado el 17/01/2022 .
- ↑ "UAX #9: Algoritmo bidireccional Unicode" . www.unicode.org . Archivado del original el 2 de mayo de 2019. Consultado el 17 de enero de 2022 .
- ↑ Edge, Jake (2021-11-03). "Fuente troyana: trucos (sin golosinas) con Unicode [ LWN.net ] " . lwn.net . Recuperado el 2022-03-12 .
- ↑ Stockley, Mark (2021-11-03). "Origen troyano: ocultando código malicioso a plena vista" . Malwarebytes Labs . Recuperado el 12 de marzo de 2022 .
- ↑ Tung, Liam. "Lenguajes de programación: este astuto truco podría permitir a los atacantes ocultar vulnerabilidades 'invisibles' en el código" . ZDNet . Archivado del original el 21 de diciembre de 2021. Consultado el 21 de enero de 2022 .
- ↑ "Parches pendientes para GCC y LLVM para contrarrestar ataques de troyanos" . www.phoronix.com . Archivado del original el 1 de diciembre de 2021. Consultado el 17 de enero de 2022 .
- ↑ Malcolm, David (12 de enero de 2022). "Prevenga ataques de origen troyano con GCC 12" . Red Hat Developer . Archivado del original el 17 de enero de 2022. Consultado el 17 de enero de 2022 .
- ↑ "Opciones de advertencia (Uso de la colección de compiladores GNU (GCC))" . gcc.gnu.org . Archivado del original el 5 de diciembre de 2018. Consultado el 17 de enero de 2022 .
- ↑ "Aviso de seguridad para rustc (CVE-2021-42574) | Blog de Rust" . blog.rust-lang.org . Archivado del original el 30/11/2021 . Consultado el 21/01/2022 .
- ↑ "Octubre de 2021 (versión 1.62) : caracteres de formato direccional Unicode" . Visual Studio Code . Octubre de 2021. Archivado del original el 1 de mayo de 2025. Consultado el 20 de mayo de 2025 .
- ↑ Boucher, Nicholas; Anderson, Ross (2021). "Fuente troyana: vulnerabilidades invisibles". arXiv : 2111.00169 [ cs.CR ].
- ↑ "RHSB-2021-007 Ataques de origen troyano (CVE-2021-42574, CVE-2021-42694)" . Portal de clientes de Red Hat . Archivado del original el 17 de enero de 2022. Consultado el 21 de enero de 2022 .
- ↑ "Advertencia sobre texto Unicode bidireccional | Registro de cambios de GitHub" . El blog de GitHub . 31 de octubre de 2021. Archivado del original el 15 de enero de 2022. Consultado el 21 de enero de 2022 .
Enlaces externos
- Sitio web https://trojansource.codes/ creado por sus descubridores, Nicholas Boucher y Ross Anderson.
- Código de prueba de concepto
- Documento de investigación completo sobre Trojan Source
- Base de datos nacional de vulnerabilidades del NIST y CVE (Vulnerabilidades y exposiciones comunes)
- CVE-2021-42574 - NIST y CVE (exploit BIDI)
- CVE-2021-42694 - NIST y CVE (ataque de homóglifos)
- UAX 9 del Consorcio Unicode sobre caracteres bidireccionales y formato.
- Unicode UTR 36 del Consorcio Unicode , que describe la vulnerabilidad en Unicode
- Informe de vulnerabilidades de CERT/CC
- 2021 en informática
- Explotación de inyecciones
- Errores de software