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 per aver compilato questa lista e a FROM SOFTWARE per aver agito rapidamente! Sono felice di dire che
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.
Vedi qui per maggiori dettagli su questi 3 gadget. Se per qualche altro gioco questo metodo di chiamata virtuale non è un approccio fattibile, il reindirizzamento arbitrario del codice può comunque essere utilizzato per impostare un exploit ROP più tradizionale.
Per eseguire il codice proof of concept, devi prima avere un server a cui connetterti. Mentre i server ufficiali sono stati disabilitati a causa dell'exploit, puoi impostarne uno privato usando ds3os. ds3os è progettato per imitare il comportamento del server retail il più fedelmente possibile, ma le patch di sicurezza sono già state implementate in questo progetto per risolvere questo exploit. Tuttavia puoi comunque impostare un ambiente di test compilando tu stesso il progetto con le costanti SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS e NRSSR_SANITY_CHECKS impostate su false in BuildConfig.h. Questo imita il comportamento pericoloso del server retail. Segui le istruzioni fornite da ds3os per avviare il gioco e connetterti al tuo server.
Una volta fatto ciò e il tuo gioco è connesso ai server, compila il codice PoC e avvia l'eseguibile Injector.exe. Inietterà una DLL contenente il codice exploit nel processo di Dark Souls III. Questa DLL utilizzerà quindi la funzione di gioco che invia messaggi FRPG al server per consegnare l'exploit al tuo stesso client.
La funzione 140ca5010 controlla le dimensioni delle voci, ma 140ca4fa0 è per voci di dimensione variabile e non esegue controlli di sicurezza sul campo size (Bug #1). Per ottenere l'exploit di reindirizzamento arbitrario del codice descritto sopra, dobbiamo impostarlo a 14F3B0. Ciò causerà una lettura fuori dai limiti di circa 1,3 MiB, ma la pagina di memoria dovrebbe essere abbastanza grande da evitare violazioni di accesso.
140ca56b0Questa funzione viene chiamata dalla precedente con nrssr_data come argomento. Crea l'oggetto DLMemoryInputStream sullo stack che viene poi passato come argomento al parser NRSSR.
141955f50: ParseNRSessionSeachResultIl parser NRSessionSearchResult. Verifica la firma NRSSR e i numeri di versione (14196a0f0), analizza l'elenco delle proprietà (14196a260), il nome dell'host (14195603a) e alcune altre informazioni (vedi rce.h)
14195603aCiclo nella funzione sopra che copia in modo non sicuro il nome dell'host (Bug #2). Ecco alcuni indirizzi che possono aiutare a tenere traccia di ciò che accade durante l'overflow del buffer:
14F128DLMemoryInputStream: 14F3A0DLMemoryInputStream dopo la sovrascrittura: 1439e8b30DLMemoryInputStream utilizzato da DLInputStreamReader: 0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
Dove finiamo dopo il primo reindirizzamento del codice causato dalla vftable corrotta del flusso di memoria. Qui inizia la catena di reindirizzamenti delle chiamate virtuali.
Per Dark Souls III Ver. 1.15. La dimensione massima teorica del payload dipende dal layout dello stack e quindi varierà in base al gioco e alla versione. ↩