Aller au contenu

Command Injection

Injection de commandes

Description

L'injection de commandes est une faille de sécurité qui permet l'exécution non autorisée de commandes au sein du système d'exploitation d'un serveur. Elle se produit lorsqu'une application transfère par inadvertance des entrées utilisateur non vérifiées (provenant de formulaires, de cookies, d'en-têtes HTTP, etc.) directement au shell du système. Cela permet aux attaquants d'exécuter leurs propres commandes, généralement avec les mêmes autorisations que l'application vulnérable. Les attaques par injection de commandes sont possibles en grande partie en raison d'une validation insuffisante des entrées.

Exemples

Java

String userInput = request.getParameter("input");
Runtime.getRuntime().exec("ls " + userInput);

JavaScript

const userInput = req.body.input;
const exec = require('child_process').exec;
exec('ls ' + userInput, (error, stdout, stderr) => {
  console.log(stdout);
});

PHP

$userInput = $_GET['input'];
system('ls ' . $userInput);

Recommandation

Pour atténuer la vulnérabilité d'injection de commandes, voici quelques recommandations :

  • Éviter d'exécuter les entrées fournies par l'utilisateur : Abstenez-vous d'exécuter directement les données fournies par l'utilisateur dans les commandes ou les shells système. Validez et utilisez des listes blanches ou des options prédéfinies dans la mesure du possible.

  • Éviter la concaténation : Évitez de concaténer directement les entrées utilisateur dans les commandes système ; transmettez-les plutôt dans une liste d'arguments distincte.

  • Validation et assainissement des entrées : Validez et assainissez toujours les entrées utilisateur. Assurez-vous que toutes les données fournies par l'utilisateur et transmises aux fonctions du shell système ou d'exécution de commandes sont assainies et limitées aux caractères ou modèles attendus.

  • Principe de moindre privilège : Exécutez votre application ou vos services avec le moins de privilèges possibles nécessaires pour effectuer les actions requises. Évitez d'exécuter des services avec des privilèges de superutilisateur ou d'administrateur.

Exemples

Java

Scanner scanner = new Scanner(System.in);

System.out.print("Enter the file name: ");
String userInput = scanner.nextLine(); // Takes user input

// Sanitize user input to prevent command injection
String sanitizedInput = userInput.replaceAll("[^A-Za-z0-9]", ""); // Example sanitization

// Command execution
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l", sanitizedInput);

// Redirect error stream to output
processBuilder.redirectErrorStream(true);

Process process = processBuilder.start();

PHP

<?php
// User-supplied filename
$userInput = $_POST['filename']; // Example: 'file.txt'

// Validate and sanitize user input
if (preg_match('/^[a-zA-Z0-9_\.]+$/', $userInput)) { // Validate against alphanumeric and dot
    // Safely escape the user input to prevent command injection
    $escapedInput = escapeshellarg($userInput);

    // Command execution using the sanitized input
    $command = "ls -l " . $escapedInput;
    $output = shell_exec($command);

    echo "<pre>$output</pre>";
} else {
    echo "Invalid filename input!";
}
?>

Liens

Normes

  • CWE_TOP_25:
    • CWE_20
    • CWE_78
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255