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])
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.