
Exploit de preuve de concept pour CVE-2025-51495, un dépassement d'entier dans la fonction mg_ws_cb de Mongoose WebSocket conduisant à un accès mémoire hors limites et à une potentielle exécution de code à distance.
Je souhaite signaler une vulnérabilité de sécurité identifiée dans la dernière version de Mongoose (v7.17). Le problème réside dans le module WebSocket, plus précisément dans la fonction mg_ws_cb responsable du traitement des trames WebSocket entrantes.
La fonction est vulnérable à un débordement d'entier, ce qui peut entraîner un accès mémoire hors limites dans certaines conditions d'entrée spécialement conçues. Cette condition pourrait potentiellement être exploitée par un attaquant distant pour causer une corruption de la mémoire ou un plantage de l'application.
En raison des différentes implémentations de la logique métier WebSocket par les différents fournisseurs, cette vulnérabilité pourrait potentiellement conduire à une exécution de code à distance.
Détails :
La vulnérabilité racine se trouve dans la fonction mg_ws_cb :
Un paquet WebSocket spécialement conçu envoyé par le client peut définir ofs=0 à ce stade, ce qui provoquera un débordement d'entier lors du calcul de ofs-1, résultant en une valeur beaucoup plus grande que la longueur de recv.buf.
Dans les fonctions de traitement WebSocket suivantes, ce buf peut être utilisé, et comme sa longueur est supérieure à la longueur réelle, cela peut conduire à un accès hors limites ou à un plantage du programme.
Déclenchement de la vulnérabilité :
Pour des besoins de démonstration, j'ai choisi l'exemple websocket existant nommé "websocket-server" dans le projet. Je n'ai apporté aucune modification au code, à l'exception de l'ajout des vérifications ASAN lors de la compilation.
Lors de l'exécution du programme et de l'envoi d'un paquet websocket spécifique, cela provoque directement un plantage.
poc :
J'ai également choisi le "websocket-client" existant dans le projet comme client, et j'ai modifié uniquement les deux paramètres dans la fonction fn de main.c pour envoyer la requête.
L'exécution du programme modifié entraîne le plantage du serveur.