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 à LukeYui pour avoir compilé cette liste et à FROM SOFTWARE pour avoir agi rapidement ! Je suis heureux de dire qu'Elden Ring est sans conteste le titre de FROM SOFTWARE le plus sûr en ce qui concerne l'étendue des dégâts que les pirates peuvent infliger.
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é.
Une vérification des limites inappropriée sur un tampon de pile et le champ de taille des données lors de l'analyse des données de matchmaking NRSessionSearchResult permet à un attaquant d'exécuter du code arbitraire. Le débordement de pile permet d'écraser les deux octets inférieurs de vftable_ptr de l'objet DLMemoryInputStream utilisé en interne par le lecteur de flux, redirigeant l'exécution vers du code voisin soigneusement choisi. Une exploitation astucieuse de la structure de l'objet DLMemoryInputStream et du champ de taille des données permet ensuite d'obtenir une redirection de code arbitraire, avec RCX pointant vers l'adresse de notre paquet. À partir de là, une série de redirections de code via des appels virtuels avec différents décalages (qui sauteront désormais vers les adresses que nous avons écrites dans le tampon du paquet) peut être utilisée pour parvenir à l'exécution de code arbitraire.
Les vecteurs de distribution sont ce qui rend cet RCE particulièrement grave (au-delà du fait qu'il s'agisse déjà d'un RCE). L'exploit est transmis via des requêtes push de matchmaking contenant des informations NRSessionSearchResult. Cela signifie que l'attaquant peut cibler toute personne qui rejoint sa session en ligne. En particulier, pour DS3 :
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)C'est déjà assez grave, mais le véritable potentiel est débloqué par la requête RequestSendMessageToPlayers :
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
L'hôte utilise cette requête pour envoyer directement le message push PushRequestAllowBreakInTarget aux envahisseurs afin qu'ils puissent obtenir les coordonnées d'apparition et rejoindre sa session P2P. C'est tout. C'est la seule façon dont cette requête est utilisée par le jeu.
Je ne saurais trop insister sur le danger extrême que cela représente. N'importe quel joueur peut essentiellement se faire passer pour le serveur de matchmaking. En utilisant cette requête pour envoyer l'exploit via un PushRequestVisit, tout joueur en ligne peut être ciblé à distance par l'attaquant, à condition que son identifiant de joueur soit connu. L'attaquant peut également envoyer l'exploit à l'ensemble de la base de joueurs en ligne très rapidement en envoyant plusieurs requêtes, chacune contenant une grande tranche d'identifiants de joueurs possibles.
Bien que le RCE ne se transpose pas exactement à chaque jeu, l'idée centrale de l'exploit, qui donne à l'attaquant une redirection de code arbitraire, est la même. Si cela peut être réalisé, il est très probable qu'une chaîne d'appels virtuels ou une chaîne ROP spécifique au jeu puisse ensuite être trouvée. Cette « première étape » utilise les vulnérabilités suivantes :