Qu’est-ce que l’injection de commande du système d’exploitation ?

L’injection de commandes du système d’exploitation est une vulnérabilité qui permet à un pirate malveillant de tromper une application pour qu’elle exécute des commandes du système d’exploitation (OS). L’injection de commande du système d’exploitation est également connue sous le nom d’ injection de commande ou d’injection de shell .


Gravité: grave
Prévalence:découvert rarement
Portée: peut apparaître dans tous les logiciels informatiques
Impact technique : accès au shell de commande
Conséquences dans le pire des cas : compromis complet du système
Solution rapide: ne pas appeler les fonctions du système d’exploitation en fonction de l’entrée de l’utilisateur

Comment fonctionne l’injection de commande du système d’exploitation ?

La plupart des langages de programmation incluent des fonctions qui permettent au développeur d’appeler des commandes du système d’exploitation. Les raisons d’appeler des commandes du système d’exploitation sont variées, par exemple, pour inclure des fonctionnalités qui ne sont pas disponibles dans ce langage de programmation par défaut, pour appeler des scripts écrits dans d’autres langages, etc.

Les vulnérabilités d’injection de commande du système d’exploitation résultent de l’utilisation de telles fonctions d’appel du système d’exploitation avec une validation d’entrée insuffisante. Un manque de validation permet à l’attaquant d’injecter des commandes malveillantes dans l’entrée de l’utilisateur, puis de les exécuter sur le système d’exploitation hôte.

Les vulnérabilités d’injection de commandes sont un problème d’appsec qui peut apparaître dans n’importe quel type de logiciel informatique, dans presque tous les langages de programmation et sur n’importe quelle plate-forme. Par exemple, vous pouvez obtenir des vulnérabilités d’injection de commande dans les logiciels embarqués dans les routeurs, les applications Web et les API écrites en PHP, les scripts côté serveur écrits en Python, les applications mobiles écrites en Java et même dans le logiciel du système d’exploitation principal.

Le terme injection de commande OS est défini dans CWE-78 comme une neutralisation incorrecte d’éléments spéciaux utilisés dans une commande OS. L’ OWASP préfère le terme plus simple injection de commande . Le terme injection de coque est très rarement utilisé. Certaines vulnérabilités d’injection de commande du système d’exploitation sont classées comme aveugles ou hors bande . Cela signifie que l’attaque par injection de commande du système d’exploitation ne se traduit pas par un renvoi ou un affichage immédiat de quoi que ce soit, et le résultat de l’attaque est, par exemple, envoyé à un serveur contrôlé par l’attaquant.

Notez que l’injection de commande du système d’exploitation est souvent confondue avec l’exécution de code à distance (RCE), également appelée injection de code . Dans le cas de RCE, l’attaquant exécute un code malveillant dans le langage de l’application et dans le contexte de l’application. Dans le cas de l’injection de commande du système d’exploitation, l’attaquant exécute une commande malveillante dans un shell système. Cependant, certaines sources considèrent l’injection de commande du système d’exploitation comme un type d’injection de code.

Exemple d’attaque par injection de commande

Vous trouverez ci-dessous un exemple simple de code source PHP avec une vulnérabilité d’injection de commande du système d’exploitation et un vecteur d’attaque par injection de commande sur les applications qui incluent ce code.

Code vulnérable

Le développeur d’une application PHP souhaite que l’utilisateur puisse voir la sortie de la commande ping Windows dans l’application Web. L’utilisateur doit entrer l’adresse IP et l’application envoie des pings ICMP à cette adresse. Le développeur transmet l’adresse IP à l’aide d’un paramètre HTTP GET, puis l’utilise dans la ligne de commande. Malheureusement, le développeur fait trop confiance à l’utilisateur et n’effectue pas la validation des entrées.

 
  $address = $_GET["address"];
  $output = shell_exec("ping -n 3 $address");
  echo "
$output
"
; ?>
 

Le vecteur d’attaque

L’attaquant abuse de ce script en manipulant la requête GET avec la charge utile suivante :

http://example.com/ping.php?address=8.8.8.8%26dir

La fonction shell_exec exécute la commande de système d’exploitation suivante : ping -n 3 8.8.8.8&dir. Le symbole & dans Windows sépare les commandes du système d’exploitation. Par conséquent, l’application vulnérable exécute une commande supplémentaire ( dir ) et affiche la sortie de la commande (liste des répertoires) :

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=30ms TTL=56
Reply from 8.8.8.8: bytes=32 time=35ms TTL=56
Reply from 8.8.8.8: bytes=32 time=35ms TTL=56
Ping statistics for 8.8.8.8:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 30ms, Maximum = 35ms, Average = 33ms
Volume in drive C is OS
Volume Serial Number is 1337-8055
Directory of C:\Users\Noob\www
(...)
 

Conséquences potentielles d’une attaque par injection de commande du système d’exploitation

Dans le cas des vulnérabilités d’injection de commandes du système d’exploitation, l’attaquant est capable d’exécuter des commandes du système d’exploitation avec les privilèges de l’application vulnérable. Cela permet à l’attaquant, par exemple, d’installer un shell inversé et d’obtenir un accès cmd avec de tels privilèges. Ils peuvent alors être en mesure d’intensifier l’attaque en utilisant d’autres exploits, ce qui peut finalement conduire à l’obtention d’un accès root et, par conséquent, au contrôle complet du système d’exploitation du serveur Web.

En cas de succès, l’attaquant peut enchaîner avec l’un des types d’attaques courants suivants :

  • Ransomware ou autre malware : l’attaquant peut installer un agent ransomware sur la machine, qui utilisera ensuite d’autres méthodes pour se propager à d’autres actifs appartenant à la victime.
  • Extraction de crypto-monnaie : les attaquants installent souvent des mineurs de crypto-monnaie sur des machines compromises, qui consomment vos ressources d’exécution et fournissent des fonds pour des activités plus malveillantes.
  • Vol de données sensibles : l’attaquant peut utiliser l’élévation de privilèges pour accéder aux serveurs de base de données SQL contenant des données utilisateur sensibles telles que les numéros de carte de crédit ou obtenir des informations d’identification à partir des fichiers de configuration et d’application locaux.

Exemples de vulnérabilités connues d’injection de commandes de système d’exploitation

  • CVE-2021-21315 dans la bibliothèque d’informations système pour Node.js ( package npm systeminformation , versions antérieures à 5.3.1). Si vous utilisiez certaines fonctions de cette bibliothèque sans nettoyage des entrées, un attaquant pourrait exécuter des commandes du système d’exploitation à l’aide de votre application Web.
  • CVE-2016-3714 ( ImageTragick ) dans ImageMagick (versions antérieures à 7.0.1-1), qui est un package de manipulation d’image populaire utilisé par de nombreux plugins de traitement d’image, tels que imagick en PHP, rmagick et trombone en Ruby, et imagemagick en Node .js. La vulnérabilité permettait à des attaquants distants d’exécuter du code arbitraire via des métacaractères du shell dans une image spécialement conçue.
  • CVE-2014-6271 (Shellshock) dans la commande bash du système d’exploitation Linux (GNU Bash version 4.3 ou antérieure). Si un script bash utilisait une entrée utilisateur non filtrée dans les variables du système d’exploitation, un attaquant pourrait injecter des commandes du système d’exploitation qui seraient exécutées pendant que le script attribuait la variable du système d’exploitation.

Comment détecter les vulnérabilités d’injection de commande du système d’exploitation ?

La meilleure façon de détecter les vulnérabilités d’injection de commande du système d’exploitation dépend de si elles sont déjà connues ou inconnues.

  • Si vous n’utilisez que des logiciels commerciaux ou open source et que vous ne développez pas de logiciels vous-même, vous trouverez peut-être qu’il suffit d’identifier la version exacte du système ou de l’application que vous utilisez. Si la version identifiée est vulnérable à l’injection de commande du système d’exploitation, vous pouvez supposer que vous êtes sensible à cette vulnérabilité d’injection de commande du système d’exploitation. Vous pouvez identifier la version manuellement ou utiliser un outil de sécurité approprié, tel qu’un logiciel d’analyse de la composition logicielle (SCA) dans le cas d’applications Web ou un analyseur de réseau dans le cas de systèmes et d’applications en réseau.
  • Si vous développez votre propre logiciel ou si vous souhaitez potentiellement trouver des vulnérabilités d’injection de commande de système d’exploitation inconnues (jours zéro) dans des applications connues, vous devez être en mesure d’exploiter avec succès la vulnérabilité d’injection de commande de système d’exploitation pour être certain qu’elle existe. Dans de tels cas, vous devez soit effectuer des tests d’intrusion manuels avec l’aide de chercheurs en sécurité ou de testeurs d’intrusion, soit utiliser un outil de test de sécurité capable d’exploiter automatiquement les vulnérabilités (ce qui n’est possible que pour les tests de sécurité Web).

Comment prévenir les vulnérabilités d’injection de commandes du système d’exploitation dans les applications Web ?

Il existe plusieurs méthodes pour améliorer la sécurité des applications en empêchant les attaques par injection de commande du système d’exploitation. Le plus simple et le plus sûr est de ne jamais utiliser d’appels tels que shell_exec en PHP pour exécuter les commandes du système d’exploitation hôte. Au lieu de cela, vous devez utiliser les commandes équivalentes du langage de programmation. Par exemple, si un développeur veut envoyer du courrier en utilisant PHP sous Linux/UNIX, il peut être tenté d’utiliser la commande mail disponible dans le système d’exploitation. Au lieu de cela, ils devraient utiliser la fonction mail() en PHP.

L’administrateur du serveur Web peut appliquer cela en désactivant des fonctions potentiellement dangereuses, telles que celles qui provoquent des appels au système d’exploitation. Par exemple, dans le cas de PHP, vous pouvez configurer le fichier php.ini pour bloquer les commandes dangereuses en ajoutant la ligne suivante :

disable_functions=exec,passthru,shell_exec,system
 

Utilisation du nettoyage des entrées pour empêcher l’injection de commandes

L’approche ci-dessus peut être difficile s’il n’y a pas de commande équivalente dans le langage de programmation. Par exemple, il n’existe aucun moyen direct d’envoyer des paquets ping ICMP depuis PHP. Dans de tels cas, vous devez appliquer le nettoyage des entrées avant de transmettre la valeur à une commande shell et le moyen le plus sûr consiste à utiliser une liste blanche. Par exemple, dans le code vulnérable présenté ci-dessus, vous pouvez vérifier si la variable d’ adresse est une adresse IP. Le résultat serait le code corrigé suivant :

 
  $address = filter_var($_GET["address"], FILTER_VALIDATE_IP);
  $output = shell_exec("ping -n 3 $address");
  echo "
$output
"
; ?>
 

Lors de la désinfection, rappelez-vous qu’une entrée utilisateur dangereuse peut provenir de nombreux endroits, pas seulement des paramètres GET et POST. Il peut également apparaître dans les en-têtes HTTP, les données JSON ou XML et toute autre partie d’une requête HTTP.

Utiliser l’échappement de caractères pour empêcher l’injection de commande

Dans certaines langues, vous pouvez utiliser l’échappement de caractères pour empêcher les attaques par injection de commande. Cela signifie qu’avant d’envoyer une entrée utilisateur à la commande du système d’exploitation, la fonction de langage de programmation intégrée s’assure que tous les caractères potentiellement dangereux sont échappés.

Par exemple, en PHP, vous pouvez utiliser les fonctions escapeshellarg et escapeshellcmd . Le résultat serait le code sécurisé suivant :

 
  $address = $_GET["address"];
  $output = shell_exec(escapeshellcmd("ping -n 3 $address"));
  echo "
$output
"
; ?>
 

Utiliser des listes noires pour empêcher l’injection de commandes

Nous ne recommandons pas d’utiliser des listes noires car les attaquants ont de nombreuses façons de les contourner. Cependant, si vous décidez d’utiliser une liste noire, vous devez être conscient que l’attaquant peut utiliser une variété de caractères spéciaux pour injecter une commande arbitraire. Les plus simples et les plus courants sont le point-virgule ( ; ) pour Linux et l’esperluette ( & ) pour Windows. Cependant, les charges utiles suivantes pour le code vulnérable présenté ci-dessus fonctionneront toutes et afficheront le résultat de la commande whoami :

  • address=8.8.8.8%3Bwhoami( ; caractère, Linux uniquement)
  • address=8.8.8.8&26whoami( & caractère, Windows uniquement)
  • address=8.8.8.8%7Cwhoami( | caractère)
  • address=invalid%7C%7Cwhoami( caractères || , la deuxième commande n’est exécutée que si la première commande échoue)
  • address=8.8.8.8&26&26whoami( && caractères)
  • %3E(whoami)( > caractère, Linux uniquement)
  • %60whoami%60( ` caractère, Linux uniquement, le résultat sera signalé par la commande ping comme une erreur)

Par conséquent, si vous devez absolument utiliser la liste noire, vous devez filtrer ou échapper les caractères spéciaux suivants :

  • Les fenêtres:( ) < > & * ‘ | = ? ; [ ] ^ ~ ! . ” % @ / \ : + , `
  • Linux :{ } ( ) < > & * ‘ | = ? ; [ ] $ – # ~ ! . ” % / \ : + , `

Comment atténuer les attaques par injection de commande du système d’exploitation ?

Les méthodes pour atténuer les attaques par injection de commande du système d’exploitation diffèrent selon le type de logiciel :

  • Dans le cas de logiciels personnalisés, tels que des applications Web, la seule façon d’atténuer de manière permanente une vulnérabilité d’injection de commande du système d’exploitation est d’éliminer les fonctions d’appel du système d’exploitation du code de l’application, de les bloquer au niveau du serveur ou, si ce n’est pas possible, d’utiliser la liste blanche. nettoyage basé sur l’entrée utilisateur qui est utilisée dans les fonctions d’appel du système d’exploitation.
  • Dans le cas d’injections de commandes de système d’exploitation connues dans des logiciels tiers, vous devez vérifier les derniers avis de sécurité pour un correctif et mettre à jour vers une version non vulnérable.

Dans le cas d’injections de commandes de système d’exploitation zero-day dans des logiciels tiers, vous pouvez appliquer des règles WAF (pare-feu d’application Web) temporaires pour l’atténuation. Cependant, cela ne fait que rendre l’injection de commande du système d’exploitation plus difficile à exploiter et n’élimine pas le problème.

L’injection de commandes du système d’exploitation est une vulnérabilité qui permet à un pirate informatique malveillant d’amener une application à exécuter des commandes du système d’exploitation. L’injection de commande du système d’exploitation est également connue sous le nom d’injection de commande ou d’injection de shell.

Les outils de test dynamique de sécurité des applications (DAST) sont le meilleur moyen de détecter les vulnérabilités d’injection de commandes dans les applications Web. Ils offrent la meilleure couverture et certains d’entre eux, comme Cycuri, sont capables de prouver que la vulnérabilité est réelle et non un faux positif.

La meilleure façon d’empêcher l’injection de commandes du système d’exploitation consiste à suivre des pratiques de codage sécurisées. L’une d’elles consiste à utiliser le filtrage pour toutes les entrées utilisateur et à appliquer un codage de sortie contextuel aux données d’entrée contrôlées par l’utilisateur.

ClassificationIDENTIFIANT
CAPEC88
CWE78
WASC31
OWASP 2021A3
{"cpt":"service","style":"9","columns":"3","show":"6","order":"DESC","orderby":"DESC"}

Nos Services en Cybersécurité

Protégez-vous maintenant !

Forfait Évaluation de la surface d’attaque

La cible de cette évaluation de la surface d’attaque est les ressources réseau, les systèmes et les terminaux. Il n’y a pas de ciblage des membres ou des employés des organisations à des fins d’ingénierie sociale.

Forfait Évaluation de la vulnérabilité

Nous sommes en mesure de fournir des évaluations de vulnérabilité des applications web , des serveurs connectés à Internet et des gammes de réseaux connectés à Internet .

Analyse de vulnérabilité

Cycuri propose des analyses de vulnérabilité ponctuelles ou régulières de votre périmètre externe, de vos applications Web ou de votre réseau interne.

Forfait Évaluation WordPress

Nos services d’évaluation WordPress professionnelle sont populaires auprès de tous ceux qui souhaitent un examen par un tiers indépendant de leur posture de sécurité.

Test d’intrusion d’application Web

Que votre application Web soit destinée aux employés, B2B ou B2C, il existe un niveau de confiance inhérent qui est supposé lorsque les utilisateurs sont autorisés à entrer, naviguer et utiliser des applications et/ou des portails d’applications.

Test d’intrusion Black-Box externe

Un test d’intrusion externe Black-Box imite les actions d’un adversaire réel en tentant d’exploiter les faiblesses de la sécurité du réseau sans les dangers d’une menace réelle.

Injection de commandes du système d’exploitation