스택 트레이스 노출에 의한 정보 유출

Stack Trace Exposure

설명

애플리케이션이 오류를 처리할 때 err.stack(스택 트레이스)을 응답 본문이나 HTTP 헤더에 그대로 포함하면 내부 파일 경로, 함수 호출 흐름, 라이브러리/프레임워크 버전 등의 내부 정보가 외부로 노출됩니다. 공격자는 이 정보를 이용해 취약한 지점을 정밀하게 추적하고 추가 공격(예: 인젝션 튜닝, 내부 구조 파악)을 시도할 수 있습니다.

잠재적 영향

  • 정보 노출(Internal Info Leakage): 파일 경로, 소스 코드 라인, 모듈/버전 정보가 외부에 공개되어 공격 표면이 확대됩니다.

  • 공격 정밀화(Attack Refinement): 노출된 호출 스택을 바탕으로 취약 지점을 빠르게 파악하고 인젝션·취약 API 대상으로 공격을 정교화할 수 있습니다.

  • 시스템 정보 유출(System Data Exposure): 운영체제 사용자, 절대 경로 등 시스템 세부정보가 유출되어 추가 침해로 이어질 수 있습니다.

해결 방법

  • 클라이언트 응답에는 일반화된 오류 메시지만 반환하고 스택 트레이스(err.stack)는 서버 로그에만 기록합니다.

  • Express 중앙 오류 핸들러를 사용해 모든 오류 응답에서 스택을 제거하고 일관된 메시지/상태 코드를 반환합니다.

  • 헤더/본문/JSON 어디에도 err.stack을 포함하지 않습니다(res.send/res.json/res.end/res.setHeader 등 금지).

  • 운영 환경에서는 개발용 에러 핸들러(스택 노출)를 비활성화하고, 필요 시 traceId만 노출하여 내부 로그와 매칭합니다.

  • 민감정보(경로, 쿼리, 토큰)가 로그에 섞이지 않도록 로그도 최소화·마스킹 정책을 적용합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: err.stack을 그대로 응답에 포함하면 내부 경로, 호출 흐름 등의 민감 정보가 외부로 유출됩니다. 공격자는 이 정보로 취약한 코드 위치를 빠르게 파악하여 추가 공격을 시도할 수 있습니다.

  • 안전한 코드: 오류는 중앙 오류 핸들러로 위임하고, 클라이언트에는 일반화된 메시지와 traceId만 반환합니다. 스택 트레이스는 서버 로그에만 기록하므로 외부 노출이 방지되며, 문제 추적은 traceId로 안전하게 수행할 수 있습니다.

참조

Last updated