11/11/2021Artículo original
Imagínate, por un momento, una puerta trasera insertada en un código de programación que se le pase por alto a cualquier revisor humano y que pocos IDEs ayuden a detectar: por muy exhaustivamente que lo comprueben, el código malicioso sigue perfectamente legítimo. Pues deja de imaginártelo…
…porque un grupo de investigadores ya han dejado claro que un ataque de este tipo existe: un ‘paper’ publicado hace unos días por la Universidad de Cambridge ha demostrado que es posible aplicarlo a algunos de los lenguajes de programación más populares hoy en día.
Este ataque, bautizado como ‘Trojan Source’ (código troyano) se aprovecha de dos características poco conocidas de los textos:
- Los homoglifos: Caracteres exactamente iguales pese a que representan códigos unicode distintos. Por ejemplo, una cadena como “aBeHKopcTxy” puede hacer referencia a letras muy diferentes dependiendo de si estamos usando el alfabeto latino o el cirílico. Y esto incluye también ciertos caracteres invisibles, que se ven como simples espacios sin serlo.
- El mecanismo bidireccional Unicode: una función que permite coexistir bloques de texto escritos en alfabetos que se escriben de derecha a izquierda con otros que lo hacen de izquierda a derecha.
Veamos un ejemplo
El investigador de seguridad Wolfgang Ettlinger, director de Certitude Consulting, presenta en su blog algunos fragmentos de código que sirven como prueba de concepto del citado tipo de ataque.
En XatakaPara evitar ser detectado este malware hasta te pide que completes un CAPTCHA
El primero sería algo tan simple como esto:
En teoría, le estamos diciendo a un programa que haga algo si el valor de ‘environment’ no coincide con el de ENV_PROD’, con ‘!=” actuando como operador de desigualdad…
…pero en realidad ese ‘!’ no es una exclamación, sino una consonante de algunos idiomas africanos que nosotros conocemos como clic alveolar, por lo que no forma parte del operador, sino del nombre de la variable.
Otro ejemplo de esto es el siguiente texto:
En teoría, ese script hace poco más que ejecutar dos comandos del sistema operativo (‘ping’ y ‘curl’) con una serie de parámetros referidos URLs. Hay también una variable, ‘timeout’, que limita el tiempo de ejecución del comando. Nada raro, todo —como decíamos antes— aparentemente legítimo.
Sin embargo, en dos líneas del texto anterior el espacio no es en realidad un espacio, sino un carácter denominado ‘relleno Hangul’, extraído del alfabeto coreano, que no separa palabras, sino que únicamente representa la ausencia de un glifo.
De tal manera, ese ‘espacio’ funciona en realidad como una palabra y, por tanto, puede actuar sin problemas como una variable en JavaScript. Así es como cabría leer dichas líneas:
Esto altera por completo la lógica de programación del script, al introducir variables adicionales que pueden usarse para colar parámetros que ejecutarían texto arbitrario si el script en cuestión estuviera disponible en un servidor web.
{“videoId”:”x7ziu8u”,”autoplay”:true,”title”:”Las matemáticas no se me dan mal, quiero aprender a programar”}
Viendo esto, los autores del paper proponen algunas soluciones para mitigar la el impacto de esta clase de ciberataques:
(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName(‘head’)[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement(‘script’); instagramScript.src = ‘https://platform.instagram.com/en_US/embeds.js’; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();