Les applications exécutant des scripts au format bat et cmd sur la plateforme Windows à l'aide des fonctions standard de lancement de processus sont vulnérables à une faille qui permet l'exécution de code malveillant en cas de passage d'arguments non échappés lors du lancement. Cette vulnérabilité a été nommée BatBadBut et se manifeste dans les applications utilisant les bibliothÚques standard de langages tels que Rust, PHP, Node.js, Python, Ruby, Go, Erlang et Haskell.
Le problÚme est qualifié de vulnérabilité car il concerne des fonctions de bibliothÚque, comme Command::arg et Command::args en Rust, qui sont conçues pour transmettre directement des arguments au processus, sans traitement par l'interpréteur de commandes. Il est sous-entendu que le développeur de l'application pourrait ne pas vérifier les arguments, car ils sont directement transmis au processus lancé. Alors que sous les systÚmes Unix les arguments sont passés séparément au processus dans un tableau, sous Windows, lors de l'utilisation de l'API CreateProcess, les arguments sont fournis sous forme d'une seule chaßne, dont l'analyse incombe au processus lancé.
Lors du lancement de scripts bat et cmd sur la plateforme Windows, la fonction CreateProcess() invoque implicitement le fichier exĂ©cutable cmd.exe, mĂȘme si l'application ne le spĂ©cifie pas lors de l'appel. Le programme cmd.exe contient sa propre logique complexe de sĂ©paration des arguments pour dissocier ses propres arguments de ceux du script lancĂ©. Pour protĂ©ger contre la substitution d'arguments sur la plateforme Windows, les bibliothĂšques standard des langages de programmation utilisent des gestionnaires d'Ă©chappement distincts, que l'on peut contourner par des manipulations de guillemets doubles.
Par exemple, dans un programme appelant le script â./test.batâ avec un argument basĂ© sur des donnĂ©es fournies par l'utilisateur, un attaquant peut transmettre la valeur â»&calc.exeâ, qui, lors de l'exĂ©cution du script, sera dĂ©veloppĂ©e en la chaĂźne âC:\Windows\System32\cmd.exe /c .\test.bat «»&calc.exeâ et entraĂźnera le lancement du processus calc.exe. Cette mĂ©thode fonctionne Ă©galement lors du lancement implicite de scripts, oĂč le fichier exĂ©cutable nommĂ© «test» est lancĂ© sans spĂ©cification d'extension, et oĂč un fichier «test.bat» se trouve dans l'un des rĂ©pertoires mentionnĂ©s dans la variable d'environnement PATH.
Une correction a dĂ©jĂ Ă©tĂ© publiĂ©e (CVE-2024-24576) pour la bibliothĂšque standard du langage Rust et a Ă©tĂ© intĂ©grĂ©e dans la mise Ă jour Rust 1.77.2. Des mises Ă jour pour Node.js et PHP sont en prĂ©paration pour corriger la vulnĂ©rabilitĂ© (les tags 8.2.18 et 8.3.5 ont dĂ©jĂ Ă©tĂ© créés, mais les versions n'ont pas encore Ă©tĂ© annoncĂ©es). Les projets Python, Ruby, Go, Erlang et Haskell se sont pour lâinstant contentĂ©s dâajouter un avertissement dans leur documentation concernant l'existence de la vulnĂ©rabilitĂ© en cas de non-appropriation correcte des caractĂšres spĂ©ciaux.
Dans Rust 1.77.2, une vĂ©rification supplĂ©mentaire a Ă©tĂ© ajoutĂ©e Ă la bibliothĂšque standard, renvoyant une erreur en cas de prĂ©sence de caractĂšres spĂ©ciaux dans les arguments d'un script exĂ©cutĂ©, qui ne peuvent pas ĂȘtre garantis d'ĂȘtre Ă©chappĂ©s de maniĂšre sĂ»re. Pour les dĂ©veloppeurs qui mettent en Ćuvre leur propre logique d'Ă©chappement, un nouveau mĂ©thode CommandExt::raw_arg est proposĂ©e, dĂ©sactivant complĂštement l'Ă©chappement au niveau des appels de bibliothĂšque.
L'ajout de protections est compliquĂ© par le fait qu'un simple Ă©chappement des guillemets doubles n'est pas suffisant, car l'interprĂ©teur de commande traite et dĂ©veloppe des variables telles que «%PATH%». Par exemple, un guillemet peut ĂȘtre insĂ©rĂ© par manipulation de la variable d'environnement «%CMDCMDLINE%», en indiquant Ă la place de â"&calc.exeâ â â%CMDCMDLINE:~-1%&calc.exeâ.
Source : opennet.ru
