Documentation et code de preuve de concept pour CVE-2022-24125 et CVE-2022-24126.
Une nouvelle mise à jour du jeu, la 1.15.1, est sortie pour Dark Souls III le 25/08/2022, en même temps que la restauration des services en ligne. Cette mise à jour a corrigé à la fois CVE-2022-24125 et CVE-2022-24126, ainsi qu'une grande variété d'autres vulnérabilités de sécurité potentielles présentes dans le réseau P2P du jeu (lectures/écritures hors limites). De plus, tous les exploits connus permettant de corrompre la sauvegarde d'autres joueurs ont été corrigés. De nombreuses tricheries mineures courantes (par exemple « curse knife ») souvent rencontrées lors du multijoueur en ligne ont également été corrigées.
Ce dépôt contient le code de preuve de concept et la documentation pour l'exploit RCE le plus récent affectant les jeux de FROM SOFTWARE, CVE-2022-24126. Bien que théoriquement possible dans d'autres jeux, l'accent est mis sur Dark Souls III, car c'est le jeu sur lequel mes recherches ont été menées. À l'heure actuelle, le code de preuve de concept n'existe que pour Dark Souls III. La vulnérabilité a été confirmée comme présente dans :
Le code vulnérable est également présent dans Sekiro (crédit : LukeYui), bien qu'il n'existe aucun moyen de le déclencher. Sa présence dans Demon's Souls n'a pas été confirmée mais est très probable. Bien que le test réseau fermé ait été affecté, la version finale d'Elden Ring ne l'est pas. En réalité, une énorme liste de crashs réseau, de lectures/écritures hors limites et d'exploits permettant aux joueurs de modifier les données de jeu de leurs pairs, présents dans Dark Souls III, a été corrigée dans Elden Ring. Merci à pour avoir compilé cette liste et à FROM SOFTWARE pour avoir agi rapidement ! Je suis heureux de dire qu'
Contrairement à la croyance populaire, il ne s'agit PAS d'un exploit de réseau pair-à-pair. Il est lié au serveur de matchmaking et est donc bien plus grave, car vous n'avez pas besoin de participer à une quelconque activité multijoueur pour être vulnérable, en raison d'une autre vulnérabilité du serveur de matchmaking (CVE-2022-24125).
Le jeu ayant une base de joueurs simultanés moyenne d'environ 20 000 joueurs dans les mois précédant la fermeture des serveurs, il était clairement nécessaire de corriger ce problème immédiatement, surtout avec la possibilité qu'il soit présent dans Elden Ring. Comme FROM SOFTWARE n'avait toujours pas agi plus de 40 jours après mon rapport initial accompagné de vidéos de preuve de concept et d'une documentation détaillée sur l'exploit (sur laquelle une grande partie de ce readme est basée), j'ai décidé de démontrer publiquement l'existence de l'exploit de manière bénigne, dans l'espoir d'attirer l'attention pour que les développeurs s'en occupent — et cela a fonctionné.
Voir ici pour plus de détails sur ces 3 gadgets. Si pour un autre jeu cette méthode d'appel virtuel n'est pas une approche réalisable, la redirection de code arbitraire peut toujours être utilisée pour mettre en place un exploit ROP plus traditionnel.
Pour exécuter le code de preuve de concept, vous devez d'abord disposer d'un serveur auquel vous connecter. Les serveurs officiels ayant été désactivés à cause de l'exploit, vous pouvez configurer un serveur privé en utilisant ds3os. ds3os est conçu pour imiter le comportement du serveur commercial aussi fidèlement que possible, mais des correctifs de sécurité ont déjà été déployés sur ce projet pour corriger cet exploit. Vous pouvez toutefois configurer un environnement de test en compilant le projet vous-même avec les constantes SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS et NRSSR_SANITY_CHECKS définies sur false dans BuildConfig.h. Cela imite le comportement non sécurisé du serveur commercial. Suivez les instructions fournies par ds3os pour démarrer le jeu et vous connecter à votre serveur.
Une fois cela fait et votre jeu connecté aux serveurs, compilez le code PoC et lancez l'exécutable Injector.exe. Il injectera une DLL contenant le code de l'exploit dans le processus de Dark Souls III. Cette DLL utilisera ensuite la fonction du jeu qui envoie les messages FRPG au serveur afin de livrer l'exploit à votre propre client.
La fonction 140ca5010 vérifie les tailles des entrées, mais 140ca4fa0 est destinée aux entrées de taille variable et n'effectue pas de vérifications de cohérence sur le champ de taille (Bug n° 1). Pour réaliser l'exploit de redirection de code arbitraire décrit ci-dessus, nous devons la définir sur 14F3B0. Cela provoquera une lecture hors limites d'environ 1,3 Mio, mais la page mémoire devrait être assez grande pour éviter les violations d'accès.
140ca56b0Cette fonction est appelée par la précédente avec nrssr_data comme argument. Elle crée l'objet DLMemoryInputStream sur la pile, qui est ensuite passé en argument à l'analyseur NRSSR.
141955f50 : ParseNRSessionSeachResultL'analyseur NRSessionSearchResult. Vérifie la signature NRSSR et les numéros de version (14196a0f0), analyse la liste de propriétés (14196a260), le nom de l'hôte (14195603a) et quelques informations supplémentaires (voir rce.h)
14195603aBoucle dans la fonction ci-dessus qui copie de manière non sécurisée le nom de l'hôte (Bug n° 2). Voici quelques adresses qui peuvent aider à suivre ce qui se passe pendant le débordement de tampon :
14F128DLMemoryInputStream : 14F3A0DLMemoryInputStream après l'écrasement : 1439e8b30DLMemoryInputStream utilisée par le DLInputStreamReader : 0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
C'est là que l'on aboutit après la première redirection de code provoquée par la vftable de flux mémoire écrasée. C'est ici que commence la chaîne de redirections d'appels virtuels.
Pour Dark Souls III version 1.15. La taille théorique maximale de la charge utile dépend de la disposition de la pile et varie donc selon le jeu et la version. ↩