Date: 29 Sep 2003 Hey, alcune settimane fa' trovai un format string bug nel client di Half-Life. Il bug compare quando e' usato un comando sconosciuto ed il gioco ritorna una stringa come la seguente: \x02Unknown command: comando_errato_usato\n | | | | | | | line feed (a capo) | | comando utilizzato (esattamente cio' che e' stato | | scritto nella console) | stringa tipo di messaggio La funzione che mostra questa stringa e' vulnerabile ad un format string bug, infatti il prossimo e' un semplice esempio: ]%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x Unknown command: 270b4768.270b47e8.270b4868.270b48e8.27031ae9.0a07f128.00000002.01e11f28.01d1105c 01e11f28 e' il puntatore alla stringa usata per formattare ("\x02Unknown command: %08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x\n") 01d1105c invece e' l'indirizzo di ritorno della funzione (comunque c'e' da notare che Half-Life usa un eseguibile codificato e nei miei test ho visto che tale indirizzo "a volte" cambia...): ... 01d11058 57 push edi 01d11059 56 push esi 01d1105a ffd0 call eax <--- 27031ad0 of client.dll 01d1105c 83c40c add esp, 0c .. Naturalmente il problema non e' solo locale... ma remoto in quanto tutti i comandi scritti nella console del client sono inviati al server che li gestisce e se il comando e' sconosciuto invia il messaggio "Unknown command" al client (dato di tipo 0x4d). Cio' significa che un server/attacker puo' inviare stringhe formattate per crashare il client. Sfortunatamente, non ho molta esperienza con i format string bugs quindi non posso essere sicuro riguardo il "reale" sfruttamente (exploit) di tale problema per eseguire codice remoto sul client. Ho rilasciato un proof-of-concept per testare la vulnerabilita' (funzionante sia su *nix che Win) il quale invia la stringa maliziosa al client connesso quando quest'ultimo o lo stesso server invia un messaggio (per esempio "ciao a tutti"): http://aluigi.org/poc/hlclientfs.zip (Comunque ricordo ancora che il bug puo' essere testato anche localmente) Questo bug puo' essere usato realmente per eseguire codice remoto? Puo' essere sfruttato?