무단 사용자에 대한 민감 정보 노출

Exposure of Sensitive Information to an Unauthorized Actor

설명

이 취약점은 서버가 0.0.0.0 또는 빈 주소로 bind 하여, 모든 네트워크 인터페이스(내부망, 외부망 포함)에서 접속이 가능해질 때 발생합니다. 원래 내부에서만 접근해야 하는 서비스가 인터넷에 그대로 노출될 수 있습니다. 공격자는 외부에서 포트를 스캔하고, 해당 서비스에 직접 접속해 인증 우회, 디버그 정보 열람, 상태 정보 및 로그 등 민감 정보를 얻을 수 있습니다.

잠재적 영향

  • 민감 정보 노출: 내부 관리용 서비스나 디버그/메트릭 엔드포인트가 인터넷에 노출되어 설정, 시스템 정보, 토큰, 세션 정보 등이 유출될 수 있습니다.

  • 접근 통제 우회: 원래 특정 서버나 내부망에서만 접근 가능한 기능(관리 페이지, 내부 API 등)을 외부 공격자가 직접 호출할 수 있습니다.

  • 공격 표면 확대: 불필요한 포트/서비스가 외부에 열려 있어 취약한 버전의 서비스, 기본 계정, 기타 취약점을 이용한 추가 공격(권한 상승, 데이터 탈취 등)의 진입점이 됩니다.

해결 방법

  • Listen 주소 명시: net.Listen, tls.Listen 사용 시 "0.0.0.0:포트"나 ":포트" 대신 실제로 필요한 인터페이스 IP(예: "127.0.0.1:포트", 내부망 IP 등)를 명시합니다.

  • 환경별 설정 분리: dev/stage/prod 환경별로 bind 주소와 포트를 설정 파일 또는 환경 변수로 관리하고, prod에서는 절대 0.0.0.0를 사용하지 않도록 정책화합니다.

  • 방화벽 / Security Group 설정: 반드시 외부에 노출할 필요가 없는 포트는 방화벽, 클라우드 Security Group 등으로 내부망 또는 특정 IP만 허용합니다.

  • 리버스 프록시 사용: 직접 애플리케이션을 외부에 열지 말고, Nginx, API Gateway 등 리버스 프록시 뒤에 두고, 애플리케이션은 127.0.0.1 등 로컬로만 bind 하도록 합니다.

  • 정기 점검: port scan, cloud security 검사 도구 등을 사용해 외부에서 열린 포트를 주기적으로 점검합니다.

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

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 비준수 코드에서는 net.Listen("tcp", "0.0.0.0:9000")를 사용해 모든 네트워크 인터페이스에 대해 포트 9000을 엽니다. 이 경우 해당 서버가 인터넷에 연결되어 있다면, 원래 내부 전용이어야 할 admin 포트가 외부에서도 접근 가능해집니다. 공격자는 포트 스캐닝을 통해 이 포트를 찾고, 인증이 없거나 취약한 인증을 우회해 상태 정보, 설정 정보 등 민감 데이터를 획득할 수 있습니다.

  • 안전한 코드: 준수 코드에서는 기본적으로 127.0.0.1:9000에 bind 하여 같은 서버 내 프로세스에서만 접근 가능하도록 제한합니다. 또한, bind 주소를 환경 변수로 분리해 운영 환경에서 필요한 경우에만 명시적으로 내부망 IP 등으로 조정할 수 있게 했습니다. 이를 통해 불필요하게 모든 인터페이스에 서비스가 열리는 것을 방지하고, 민감 정보나 관리 기능이 외부에 노출될 가능성을 크게 줄입니다.

참조

Last updated