Utiliser des caractères Unicode invisibles pour masquer les actions dans le code JavaScript

Suite à la méthode d'attaque Trojan Source, basée sur l'utilisation de caractères Unicode qui modifient l'ordre d'affichage du texte bidirectionnel, une autre technique d'introduction d'actions cachées a été publiée, applicable au code JavaScript. La nouvelle méthode est basée sur l'utilisation du caractère Unicode « ㅤ » (code 0x3164, « HANGUL FILLER »), qui appartient à la catégorie des lettres, mais n'a pas de contenu visible. La catégorie Unicode à laquelle appartient ce caractère est autorisée depuis la spécification ECMAScript 2015 pour une utilisation dans les noms de variables JavaScript, permettant de créer des variables invisibles ou de nouvelles variables impossibles à distinguer des autres variables dans les éditeurs de code populaires tels que Notepad++ et VS Code.

A titre d'exemple, on donne le code de la plateforme Node.js, dans lequel, à l'aide d'une variable composée d'un seul caractère « ㅤ », une porte dérobée est cachée qui permet d'exécuter le code spécifié par l'attaquant : app.get('/ network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // en fait, il est écrit "const { timeout,ㅤ \u3164}" const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // la virgule est suivie du caractère \u3164 ];

À première vue, seule la valeur du timeout est transmise via le paramètre externe, et le tableau contenant les commandes à exécuter contient une liste fixe inoffensive. Mais en fait, après la variable timeout, la valeur d'une autre variable invisible avec le code de caractère \u3164 est attribuée, qui est également substituée dans le tableau des commandes exécutables. Ainsi, si une telle conception est disponible, un attaquant peut envoyer une requête du type « https://host:8080/network_health?%E3%85%A4=command » pour activer la porte dérobée et exécuter son code.

Un autre exemple est le caractère « ǃ » (ALVEOLAR CLICK), qui peut être utilisé pour donner l’impression d’indiquer un point d’exclamation. Par exemple, l'expression « if(environmentǃ=ENV_PROD){ » lorsqu'elle est exécutée dans Node.js 14 sera toujours vraie, car elle ne vérifie pas la différence, mais attribue la valeur de ENV_PROD à la variable « environnementǃ ». D'autres caractères Unicode trompeurs incluent "/", "−", "+", "⩵", "❨", "⫽", "꓿" et "∗".

Source: opennet.ru

Ajouter un commentaire