####################################################################### Luigi Auriemma Applicazione: Kaillera http://www.kaillera.com Versioni: <= 0.86 Piattaforme: Windows, Linux e FreeBSD Bug: buffer-overflow Exploitation: remoto, contro server Date: 06 Jul 2006 Author: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Kaillera e' un software middleware per implementare il multiplayer negli emulatori come MAME, MameLang32+, Bliss, NESten, Jnes, Nemu64, Modeler, Gens, WinUAE, PCAE, Kawaks ed altri. Nonostante l'ultima versione del server sia stata rilasciata oltre 4 anni fa' esso e' ancora molto utilizzato come dimostrato dalle liste di servers online. ####################################################################### ====== 2) Bug ====== La gestione di quasi tutti i messaggi di Kaillera avviene con la lettura della prima stringa delimitata da un byte NULL e la successiva lettura del resto del messaggio (il cui contenuto viene gestito in un passo successivo). Per queste operazioni Kaillera utilizza un buffer statico di 32 bytes ed un buffer dati che viene riallocato ogni qualvolta che il messaggio del client e' piu' grande dell'attuale quantita' di bytes allocata per il buffer. Le istruzioni per gestire questi tipi di messaggi iniziano circa all'offset 004019f1 del server 0.86 per Windows: 004019F1 |. 33C9 XOR ECX,ECX 004019F3 |. 8A06 MOV AL,BYTE PTR DS:[ESI] 004019F5 |. 57 PUSH EDI 004019F6 |. 84C0 TEST AL,AL 004019F8 |. 74 0C JE SHORT KAILLERA.00401A06 004019FA |> 46 /INC ESI 004019FB |. 88440B 04 |MOV BYTE PTR DS:[EBX+ECX+4],AL 004019FF |. 41 |INC ECX 00401A00 |. 8A06 |MOV AL,BYTE PTR DS:[ESI] 00401A02 |. 84C0 |TEST AL,AL 00401A04 |.^75 F4 \JNZ SHORT KAILLERA.004019FA 00401A06 |> 8B6C24 18 MOV EBP,DWORD PTR SS:[ESP+18] 00401A0A |. C64419 04 00 MOV BYTE PTR DS:[ECX+EBX+4],0 00401A0F |. 2BE9 SUB EBP,ECX 00401A11 |. 8BCB MOV ECX,EBX 00401A13 |. 83ED 02 SUB EBP,2 00401A16 |. 55 PUSH EBP 00401A17 |. E8 D4FCFFFF CALL KAILLERA.004016F0 00401A1C |. 8B7B 24 MOV EDI,DWORD PTR DS:[EBX+24] 00401A1F |. 8BCD MOV ECX,EBP 00401A21 |. 8BD1 MOV EDX,ECX 00401A23 |. 46 INC ESI 00401A24 |. C1E9 02 SHR ECX,2 00401A27 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> che a grandi linee puo' essere tradotto nel seguente codice C: static char nick[32], *data; ... int nick_size, data_size; for(nick_size = 0; *client_msg; nick_size++, client_msg++) { nick[nick_size] = *client_msg; } nick[nick_size] = 0; client_msg++; data_size = (client_msg_size - nick_size) - 2; data = 004016f0(data_size); // realloc data if needed memcpy(data, client_msg, data_size); ... 004016f0(int size) { if(size <= data_alloc_size) return; do { data_alloc_size <<= 1; } while(size > data_alloc_size); data = realloc(data, data_alloc_size); } Se un attacker utilizza un nickname piu' lungo di 32 bytes puo' sovrascivere l'indirizzo del buffer data ed il valore nel quale e' immagazzinata la sua attuale grandezza, quello che segue e' un piccolo schema di quella porzione di memoria: ooooooooooooooooooooooooooooooooXXXXYYYY | | | | | amount of data currently allocated | pointer to the data buffer static buffer of 32 bytes Con la sovrascrittura di YYYY si puo' bypassare il primo controllo effettuato dalla funzione all'offset 004016f0 che effettua un realloc del buffer quando necessario in quanto siamo noi a controllare la variabile contenente l'attuale quantita' di dati allocata e possiamo anche decidere dove copiare il resto del nostro messaggio nella memoria del server visto che anche l'indirizzo di data XXXX e' sotto il nostro controllo. Tutto cio' puo' portare all'esecuzione di codice malevolo. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/kailleraex.zip ####################################################################### ====== 4) Fix ====== La nuova versione sara' rilasciata a breve #######################################################################