피드로 돌아가기
Node.js BlogSecurity
원문 읽기
Node.js 6.17.0이 keep-alive HTTP 연결 타임아웃과 Slowloris 공격 방어 기능을 추가해 세 가지 CVE 취약점 해결
Node.js 6.17.0 (LTS)
AI 요약
Context
Node.js의 keep-alive HTTP 연결이 장시간 활성화되지 않은 상태로 유지되면서 리소스 고갈을 초래할 수 있었다. Slowloris 공격을 통해 클라이언트가 HTTP 헤더를 느리게 전송하여 서버 연결을 소진시키는 문제가 존재했다. OpenSSL의 TLS 패딩 오라클 취약점(CVE-2019-1559)으로 인해 암호화된 데이터가 복호화될 위험이 있었다.
Technical Solution
- server.keepAliveTimeout 기능을 http 모듈에 백포트: keep-alive 모드의 HTTP/HTTPS 연결이 일정 시간 이상 유휴 상태로 유지되면 자동 종료
- server.headersTimeout을 keep-alive 모드 연결에 일관되게 적용: HTTP 헤더 수신 타임아웃을 모든 연결 상태에서 강제하여 Slowloris 공격 방어
- OpenSSL을 1.0.2r로 업그레이드: CVE-2019-1559 패딩 오라클 공격 패치 적용
- CVE-2019-5739 해결: keep-alive 연결에서 무한정 열린 상태를 방지하는 타임아웃 메커니즘 도입
- CVE-2019-5737 해결: 헤더 수신 제한 시간을 일관되게 적용하여 느린 클라이언트 공격 차단
Impact
아티클에 정량적 성능 수치가 명시되지 않음
Key Takeaway
Denial of Service 공격으로부터 보호하기 위해서는 단순히 연결 수립 단계뿐 아니라 keep-alive 상태와 헤더 수신 단계에서도 타임아웃을 일관되게 적용해야 한다. 특히 장시간 유지되는 연결의 리소스 점유 시간을 제한하는 것이 서버 안정성의 핵심이다.
실천 포인트
HTTP 서버를 운영하는 백엔드 팀은 keep-alive 연결의 타임아웃을 명시적으로 설정하고 모든 연결 단계(초기 연결, 헤더 수신, keep-alive 유지)에 동일한 수신 타임아웃을 적용하면 Slowloris 같은 단순하지만 치명적인 Denial of Service 공격으로부터 서버를 보호할 수 있다.