####################################################################### Luigi Auriemma Applicazione: dim3 (dimension 3 engine) http://www.klinksoftware.com Versioni: <= 1.5 Piattaforme: Windows e Mac Bugs: A] network_receive_packet/data buffer-overflow B] network_host_handle_join buffer-overflow Exploitation: A] remoto, contro server e client B] remoto, contro server Data: 23 Apr 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== dim3 e' un progetto open source interessante per la creazione di un motore di gioco facile da usare per i modders. NOTA IMPORTANTE: Il codice di rete nella versione corrente deve essere considerato ancora un work in progress (come scritto sul sito web) quindi questi bugs descritti in questo advisory non devono essere considerati una vera minaccia. ####################################################################### ======= 2) Bugs ======= ---------------------------------------------- A] network_receive_packet/data buffer-overflow ---------------------------------------------- La funzione network_receive_packet e' utilizzata per leggere i dati dalla rete. Prima viene letta l'intestazione dei dati che e' composta da 3 campi di 16 bit che identificano la grandezza del blocco dati, il tipo di azione e l'uid remoto. Tutti questi campi sono signed short ed il primo (data_len) puo' essere usato per bypassare il controllo "if (data_len>net_max_msg_size) return(FALSE);" e quindi forzare la lettura di una quantita' arbitraria di dati in network_receive_data causando l'overflow del buffer di 2048 (net_max_msg_size) bytes. Da Code/dim3NetworkUtility/Sources/socket.c: bool network_receive_packet(d3socket sock,int *action,int *from_remote_uid,unsigned char *data,int *len) { int data_len; network_header head; if (!network_receive_data(sock,(unsigned char*)&head,sizeof(network_header))) return(FALSE); *len=data_len=(signed short)ntohs(head.len); *action=(signed short)ntohs(head.action); *from_remote_uid=(signed short)ntohs(head.from_remote_uid); if (data_len==0) return(TRUE); if (data_len>net_max_msg_size) return(FALSE); // get the data return(network_receive_data(sock,data,data_len)); } ------------------------------------------- B] network_host_handle_join buffer-overflow ------------------------------------------- La funzione network_host_handle_join e' utilizzata per la gestione dei giocatori che entrano nel server. Questa funzione legge il nickname inviato dal client ed usa strcpy per copiarlo in un buffer di 32 (name_str_len) bytes. From Code/dim3Server/Sources/host.c: int network_host_handle_join(int sock,network_request_join *request_join) { int remote_uid; network_reply_join reply_join; network_request_remote_add remote_add; ... if (remote_uid!=-1) { strcpy(remote_add.name,request_join->name); remote_add.score=0; network_player_send_others_packet(remote_uid,net_action_request_remote_add,(unsigned char*)&remote_add,sizeof(network_request_remote_add),FALSE); } return(remote_uid); } ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/dim3bof.zip ####################################################################### ====== 4) Fix ====== La versione 1.6 sara' rilasciata abbastanza presto e implementera' molti cambiamenti nel codice di rete, incluse le correzioni per questi bugs. #######################################################################