Directives

Injection de commandes

Intéressons-nous pour l'instant à l'injection de commandes seule. Nous allons principalement nous concentrer sur quelques exemples différents afin de mieux visualiser le phénomène. Pour rappel, les vulnérabilités par injection de commandes surviennent lorsqu'une entrée utilisateur est utilisée dans une commande système, comme dans la fonction suivante :

let ip = request.params.ipAddress;

system("ping " + ip);

Si un utilisateur fournit une adresse IP, prenons `8.8.8.8` comme exemple, la commande exécutée sera `ping 8.8.8.8`, ce qui correspond au comportement attendu. Cependant, si l'utilisateur saisit `8.8.8.8 && ls /etc/`, cette commande ne se contentera pas de pinguer l'adresse 8.8.8.8, mais elle exécutera également `ls` sur le dossier `/etc/`.

Atténuation

Compte tenu de la gravité d'une attaque par injection de commandes, voici quelques questions essentielles à se poser lors de l'utilisation de commandes système :

  • Avez-vous réellement besoin d'invoquer cette commande ? La meilleure défense consiste à ne jamais invoquer de commandes système.
  • Existe-t-il des bibliothèques ou des liaisons permettant d'obtenir le même résultat sans utiliser de commande système ?
  • Pouvez-vous transmettre des données au processus via l'entrée standard (Standard In) plutôt que par la commande elle-même ?

Si ces options ne sont pas possibles, la paramétrisation est indispensable.

Exemples

Voici quelques exemples dans différents langages pour illustrer cela en pratique.

Sans paramétrisation, ce code est vulnérable à l'injection de commandes.

string folder = "/tmp/ && ifconfig";
string cmd = "\"ls " + folder +"\"";

// NON SÉCURISÉ : Exécute à la fois la commande `ls` et `ifconfig`
System.Diagnostics.Process.Start("bash", "-c " + cmd);

C# - sécurisé

En fournissant la commande sous forme de liste de paramètres, celle-ci est paramétrée et protégée contre l'injection de commandes.

string folder = "/tmp/ && ifconfig";
List<string> arguments = new List<string>() {"-c", "ls", folder};

// SÉCURISÉ : N'exécute pas la commande ifconfig
System.Diagnostics.Process.Start("bash", arguments);

Java - Non sécurisé

Sans paramétrisation, ce code est vulnérable à l'injection de commandes.

String folder = "/tmp/ && ifconfig";

// NON SÉCURISÉ : Exécute à la fois la commande `ls` et `ifconfig`
ProcessBuilder b = new ProcessBuilder("bash -c ls " + folder);

Process p = pb.start();

Java - Sécurisé

En fournissant la commande sous forme de liste de paramètres, celle-ci est paramétrée et protégée contre l'injection de commandes.

String folder = "/tmp/ && ifconfig";

// SÉCURISÉ : N'exécute pas la commande ifconfig
ProcessBuilder b = new ProcessBuilder("bash", "-c", "ls", folder);

Process p = pb.start();

Javascript - Non sécurisé

Sans paramétrisation, ce code est vulnérable à l'injection de commandes.

const { exec } = require("child_process");

const folder = "/tmp/ && ifconfig";

// NON SÉCURISÉ : exécute les commandes `ls` et `ifconfig`
const ls = exec("bash -c ls " + folder, (error, stdout, stderr) => {
     console.log(`stdout: ${stdout}`);
});

Javascript - Sécurisé

const { spawn } = require("child_process");

const folder = "/tmp/ && ifconfig";

// SÉCURISÉ : n'exécute pas la commande ifconfig
const ls = spawn("bash", ["-c", "ls", folder]);

ls.stdout.on("data", data => {
    console.log(`stdout: ${data}`);
});

Python - Non sécurisé

Sans paramétrage, ce code est vulnérable aux injections de commandes.‍

import subprocess

folder = "/tmp/ && ifconfig"

# NON SÉCURISÉ : exécute les commandes `ls` et `ifconfig`
subprocess.run("bash -c ls " + folder, shell=True)

Python - Sécurisé

En fournissant la commande sous forme de liste de paramètres, celle-ci est paramétrée et protégée contre les injections de commandes.
‍

import subprocess

folder = "/tmp/ && ifconfig"

# SÉCURISÉ : n'exécute pas la commande ifconfig
subprocess.run(["bash", "-c", "ls", folder])

‍

Slogan

Le codage sécurisé en pratique

Explorez nos directives de développement sécurisé pour comprendre et atténuer les vulnérabilités logicielles telles que l'OWASP Top 10, et plongez dans des missions de formation guidées pour vous exercer sur des simulations d'applications réelles.

Autres directives
Réserver une démo