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.
Imagine pedir a um assistente de escritório para imprimir um documento chamado 'relatorio.pdf'. A injeção de comando ocorre quando alguém fornece o nome 'relatorio.pdf; whoami', e o assistente entrega o bilhete inteiro ao terminal, fazendo-o imprimir o relatório e ler o crachá de administrador.
Web Application SecurityCWE-918.CWE-918Defense-in-DepthO aplicativo aceita nomes de host diagnósticos, nomes de arquivo ou flags diretamente de uma requisição HTTP ou formulário de usuário.
O backend constrói uma string de comando shell usando concatenação direta ou formatação em vez de um vetor de argumentos separado.
O invasor injeta metacaracteres shell como ';', '&&', '|' ou crases (ex: '127.0.0.1; id') para quebrar o contexto pretendido do comando.
O shell do sistema operacional executa o comando anexado com todos os privilégios do processo web em execução.
// 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.