Documentazione e codice proof of concept per CVE-2022-24125 e CVE-2022-24126.
Un nuovo aggiornamento di gioco, 1.15.1, è stato rilasciato per Dark Souls III il 25/08/2022, insieme al ripristino dei servizi online. Questo aggiornamento ha corretto sia CVE-2022-24125 che CVE-2022-24126, insieme a un'ampia varietà di altre potenziali vulnerabilità di sicurezza presenti nella rete P2P del gioco (letture/scritture fuori dai limiti). Inoltre, tutti gli exploit conosciuti che permettevano di corrompere il salvataggio di altri giocatori sono stati risolti. Molti comuni cheat di poco conto (ad es. "coltello della maledizione") che si potevano incontrare spesso durante il multiplayer online sono stati anche corretti.
Questo repository contiene codice proof of concept e documentazione per il più recente exploit RCE che colpisce i giochi FROM SOFTWARE, CVE-2022-24126. Sebbene teoricamente possibile in altri giochi, l'attenzione è su Dark Souls III poiché è il gioco su cui è stata condotta la mia ricerca. Al momento il codice proof of concept esiste solo per Dark Souls III; la vulnerabilità è stata confermata presente in:
Il codice vulnerabile è presente anche in Sekiro (crediti: LukeYui), sebbene non ci sia modo di attivarlo. La presenza in Demon's Souls non è stata confermata ma è molto probabile. Mentre il network test chiuso è stato colpito da ciò, la versione finale di Elden Ring non lo è. Di fatto, un'enorme lista di crash di rete, letture/scritture fuori dai limiti ed exploit che permettevano ai giocatori di modificare i dati di gioco dei pari, presenti in Dark Souls III, sono stati corretti in Elden Ring. Complimenti a LukeYui per aver compilato questa lista e a FROM SOFTWARE per aver agito rapidamente! Sono felice di dire che Elden Ring è innegabilmente il titolo FROM SOFTWARE più sicuro per quanto riguarda l'entità del danno che gli hacker possono infliggere.
Contrariamente a quanto si crede, questo NON è un exploit di rete peer-to-peer. È correlato al server di matchmaking e quindi molto più grave, poiché non è necessario partecipare ad alcuna attività multiplayer per essere vulnerabili a causa di un'altra vulnerabilità del server di matchmaking (CVE-2022-24125).
Considerando che il gioco aveva una base di giocatori contemporanei media di circa 20.000 nei mesi precedenti la chiusura del server, era chiaramente un problema che necessitava di una correzione immediata, specialmente con la possibilità che fosse presente in Elden Ring. Poiché FROM SOFTWARE non aveva ancora agito dopo oltre 40 giorni dal mio rapporto iniziale con video proof of concept e documentazione dettagliata dell'exploit (su cui gran parte di questo readme si basa), ho deciso di dimostrare pubblicamente l'esistenza dell'exploit in modo benigno, nella speranza di attirare l'attenzione per farlo affrontare dagli sviluppatori, e ha funzionato.
Un controllo errato dei limiti su un buffer dello stack e sul campo della dimensione dei dati durante l'analisi dei dati di matchmaking NRSessionSearchResult permette a un attaccante di eseguire codice arbitrario. L'overflow dello stack consente di sovrascrivere i due byte inferiori di vftable_ptr dell'oggetto DLMemoryInputStream utilizzato internamente dal lettore di flusso, reindirizzando l'esecuzione a codice vicino accuratamente scelto. Lo sfruttamento intelligente della struttura dell'oggetto DLMemoryInputStream e del campo della dimensione dei dati permette quindi di ottenere un reindirizzamento arbitrario del codice, con RCX che punta all'indirizzo del nostro pacchetto. Da lì, una serie di reindirizzamenti di codice tramite chiamate virtuali con offset diversi (che ora salteranno agli indirizzi che abbiamo scritto nel buffer del pacchetto) può essere utilizzata per ottenere l'esecuzione di codice arbitrario.
I vettori di distribuzione sono ciò che rende questo particolare RCE particolarmente grave (al di là del fatto che è già un RCE). L'exploit viene trasmesso attraverso richieste push di matchmaking contenenti informazioni NRSessionSearchResult. Ciò significa che l'attaccante può prendere di mira chiunque si unisca alla sua sessione online. In particolare, per DS3:
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)Questo è già piuttosto grave, ma il vero potenziale è sbloccato dalla richiesta RequestSendMessageToPlayers:
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
L'host usa questa richiesta per inviare direttamente il push message PushRequestAllowBreakInTarget agli invasori in modo che possano ottenere le coordinate di spawn e unirsi alla sessione P2P. Tutto qui. È l'unico modo in cui questa richiesta viene utilizzata dal gioco.
Non posso sottolineare abbastanza quanto sia terribilmente insicuro. Qualsiasi giocatore può praticamente impersonare il server di matchmaking. Usando questa richiesta per inviare l'exploit tramite un PushRequestVisit, qualsiasi giocatore online può essere preso di mira a distanza dall'attaccante purché il suo ID giocatore sia noto. L'attaccante può anche inviare l'exploit all'intera base di giocatori online molto rapidamente inviando più richieste, ciascuna contenente un grande intervallo di possibili ID giocatore.
Sebbene l'RCE non sia esattamente portabile a ogni gioco, l'idea centrale dell'exploit che fornisce all'attaccante il reindirizzamento arbitrario del codice è la stessa. Se questo può essere ottenuto, è molto probabile che si possa poi trovare una catena di chiamate virtuali o una catena ROP specifica per il gioco. Questo "primo passo" sfrutta le seguenti vulnerabilità: