Un ciberataque basado en caracteres invisibles o ambiguos permite introducir puertas traseras en código JavaScript

11/11/2021Artículo original

Un ciberataque basado en caracteres invisibles o ambiguos permite introducir puertas traseras en código JavaScript

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.
  Cuando eres el informático de la familia y todos te piden ayuda para cualquier tontería

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.

Para evitar ser detectado este malware hasta te pide que completes un CAPTCHAEn 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:

  Forzar la descarga de un archivo desde Azure Blob Storage

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”}

  AWS intenta captar desarrolladores con esta nueva herramienta capaz de migrar aplicaciones .NET a Linux

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); } })();

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad