flawopen.com/command-injection/Rust
Learn how to fix Command Injection (CWE-78) in Rust. Side-by-side vulnerable vs secure code examples for std::process::Command with isolated argument slices.
Imaginez demander à un assistant de bureau d'imprimer un document nommé 'rapport.pdf'. L'injection de commande se produit lorsque quelqu'un fournit le nom 'rapport.pdf; whoami', et l'assistant transmet aveuglément le billet au terminal, imprimant le rapport et lisant le badge d'administrateur.
Web Application SecurityCWE-918.CWE-918Defense-in-DepthL'application reçoit des noms d'hôte de diagnostic ou des noms de fichiers directement à partir d'une requête HTTP.
Le backend assemble une commande shell par simple concaténation de chaînes au lieu d'utiliser un tableau d'arguments isolé.
L'attaquant injecte des métacaractères shell comme ';', '&&', '|' ou des accents graves (ex. '127.0.0.1; id') pour échapper au contexte initial.
Le shell du système d'exploitation exécute la commande injectée avec tous les privilèges du processus du serveur web.
// Spawning shell explicitly with format! string
use std::process::Command;
fn run_backup(folder: &str) {
// Attacker input: "data; whoami"
let cmd = format!("tar -czf backup.tar.gz {}", folder);
Command::new("sh")
.arg("-c")
.arg(&cmd)
.status()
.expect("failed");
}
// Calling binary directly with discrete .arg() calls
use std::process::Command;
fn run_backup(folder: &str) {
// folder is passed as a literal argument to tar, not shell
Command::new("tar")
.arg("-czf")
.arg("backup.tar.gz")
.arg(folder)
.status()
.expect("failed");
}
arg() or .args() slices.