디버그 엔드포인트 노출 (pprof Debug Exposure)
Debug Code Exposure
설명
Go 애플리케이션에서 import _ "net/http/pprof"를 사용하면 기본 HTTP 서버에 /debug/pprof 디버그/프로파일링 엔드포인트가 자동으로 등록됩니다. 이 상태에서 http.ListenAndServe(":8080", nil)과 같이 전체 네트워크에 열려 있는 주소로 서버를 띄우면, 인증 없이 누구나 pprof 정보를 조회할 수 있습니다. 공격자는 /debug/pprof, /debug/pprof/goroutine, /debug/pprof/heap 등의 엔드포인트를 호출하여 현재 실행 중인 goroutine, 메모리 상태, 내부 경로, 일부 요청 정보 등 민감한 런타임 정보를 수집할 수 있습니다. 이 정보는 직접적인 코드 실행 취약점이 아니더라도, 추가 공격(예: 취약한 핸들러 식별, 비밀 값 추측, 서비스 구조 분석)에 큰 도움을 줄 수 있습니다.
잠재적 영향
디버그 정보 노출: pprof가 제공하는 goroutine, heap, threadcreate 등의 정보로 내부 구조와 실행 상태가 외부에 드러날 수 있습니다.
시스템 정보 노출: 서버의 메모리 사용량, 처리 패턴, 일부 에러 메시지 경로 등 인프라 정보가 유출될 수 있습니다.
추가 공격에 활용(정보 수집): 공격자가 이 정보를 바탕으로 취약한 엔드포인트, 성능 병목, 비정상 동작 등을 분석해 후속 공격(DoS, 취약 API 공략 등)을 정교하게 준비할 수 있습니다.
해결 방법
내부에서만 접근 가능하도록 바인딩
개발/테스트 환경에서는
http.ListenAndServe("localhost:8080", nil)또는127.0.0.1로만 바인딩하여 외부 네트워크에서 접근하지 못하게 합니다.
별도 ServeMux로 pprof 분리
http.NewServeMux()를 사용해 pprof 핸들러를 별도 mux에 등록하고, 내부 전용 포트/주소에서만 띄웁니다.
인증/인가 적용
가능하면 pprof 엔드포인트 앞에 인증(예: mTLS, VPN, 사내 프록시 인증, basic auth 등)을 두고, 운영 환경에서는 인터넷에서 직접 접근할 수 없도록 합니다.
운영 환경에서 불필요한 pprof 제거
운영 환경에서는 기본적으로
import _ "net/http/pprof"를 제거하고, 필요할 때만 일시적으로 활성화하거나, 별도 디버그 전용 인스턴스를 사용합니다.
방화벽 / 보안 그룹 설정
pprof가 열려 있는 포트는 외부에서 직접 접근하지 못하도록 보안 그룹, 방화벽, Ingress 설정으로 차단합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 취약 코드에서는
import _ "net/http/pprof"로 인해 기본 HTTP mux(nil)에/debug/pprof관련 핸들러가 자동 등록됩니다. 그리고http.ListenAndServe(":8080", nil)로 전체 인터페이스에 서버를 띄우기 때문에, 같은 포트에서 애플리케이션 엔드포인트와 함께 pprof 디버그 정보도 인터넷에 그대로 노출됩니다. 별도의 인증이나 접근 제어가 없으므로, 누구나 pprof 엔드포인트에 접근해 내부 런타임 정보를 수집할 수 있습니다.안전한 코드: 안전한 코드에서는 pprof를 기본 mux에 자동 등록하지 않고, 별도의
http.NewServeMux()에만 등록합니다. 그리고 이 pprof 서버는localhost:6060과 같이 내부 주소로만 바인딩하여 외부 네트워크에서 직접 접근할 수 없게 합니다. 실제 서비스용 HTTP 서버(":8080")에는 pprof를 전혀 등록하지 않아, 외부 사용자는 디버그/프로파일링 정보를 볼 수 없습니다. 이렇게 분리와 접근 통제를 적용함으로써 디버그 엔드포인트 노출 취약점을 효과적으로 제거합니다.
참조
Last updated