피드로 돌아가기
V8 Memory Corruption and Stack Overflow (fixed in Node v0.8.28 and v0.10.30)
Node.js BlogNode.js Blog
Backend

Node.js v0.8과 v0.10의 V8 엔진에서 깊은 재귀 워크로드 중 스택 오버플로우로 인한 세그멘테이션 폴트 발생 문제를 스택 가드 체크 로직 수정으로 해결

V8 Memory Corruption and Stack Overflow (fixed in Node v0.8.28 and v0.10.30)

2014년 7월 31일6advanced

Context

Node.js 0.8과 0.10 버전에 포함된 V8 엔진에서 깊은 재귀 워크로드(예: 깊이가 큰 JSON 객체 파싱)가 가비지 컬렉션과 인터럽트를 동시에 트리거할 때 스택이 오버플로우되어 프로세스가 비정상 종료되는 메모리 손상 취약점이 발생했다.

Technical Solution

  • StackLimitCheck 클래스의 HasOverflowed() 메서드를 inline 키워드로 인라인화: 함수 호출 오버헤드 제거
  • 스택 오버플로우 확인 로직 단순화: 기존 복잡한 조건문(C++ 스택 가드와 인터럽트 상태 조합 확인) 제거
  • 스택 포인터 비교 대상 변경: stack_guard->climit() 대신 stack_guard->real_climit() 사용으로 인터럽트 대기 상태에서도 정확한 스택 오버플로우 감지
  • Node.js 버전 업그레이드: v0.8.28과 v0.10.30으로 패치 배포
  • JSON 파싱 입력 크기 제한: 알려진 메시지 본문 크기 기준으로 최대 JSON 문자열 길이 설정(예: 최대 20KB 메시지는 1MB 이상 수용 금지)

Key Takeaway

스택 가드 메커니즘은 단순한 경계값 확인이 아니라 런타임 상태(GC, 인터럽트)와 연관되어 있으므로, 보안 핵심 경로의 로직 수정 시 모든 실행 경로의 상호작용을 재검증해야 한다.


JSON 파싱을 자동으로 수행하는 웹 프레임워크 사용 환경에서 의도하지 않은 깊은 중첩 구조에 의한 스택 오버플로우를 방지하려면, JSON 페이로드를 수용하는 라우트에 명시적인 최대 바디 크기 제한을 설정하고 프로덕션 메시지 본문의 실제 크기 기준으로 보수적으로 구성해야 한다.

원문 읽기