coordinated-disclosure · data-exposure · elasticsearch · aviation · apis · pii · default-credentials · vietnam

2억 2천만 건의 여행자 기록: 베트남 연계 승객 데이터베이스 노출 사례

Kinryū Labs는 9년간 베트남을 오간 모든 항공 승객의 사전 승객 정보(Advance Passenger Information)를 보관한 데이터베이스를 확인하였다. 승객 기록 210,318,069건과 승무원 기록 10,465,631건이 담겨 있었으며, 각 기록은 이름, 생년월일, 여권번호를 수하물 태그까지 포함한 전체 여정과 결합하고 있었다. 해당 시스템은 변경되지 않은 기본 로그인 정보로 응답하였다. 노출 범위는 Aeroflot 및 Belavia 승무원부터 깜라인을 찾은 벨라루스 관광객까지 이르렀다. 협력 공개 절차를 거쳐 2026년 6월 접근이 차단되었다.

작성자 Davis Zheng·

CWE
CWE-1392
Product
Elasticsearch 8.3.3 (APIS/PNR cluster)

TLP:CLEAR. Kinryū Labs는 노출된 데이터베이스에 대한 조사 과정에서 2026년 6월 3일 이 노출을 발견하였고 같은 날 신고하였으며, 며칠 내에 접근이 차단되었다. 열거 작업은 읽기 전용으로 수행되었다. 집계 건수, 데이터 기간, 필드 스키마, 소수의 스크린샷만이 기록되었다. 이 보고서의 모든 스크린샷은 개인을 식별하는 필드인 이름, 여권번호, 생년월일을 가린 상태이다. 개별 승객 또는 승무원 기록은 공개 절차 중 통보한 당국 외에는 보관, 공개, 공유되지 않았다. 원본 호스트 주소, 포트, 자격증명은 공개하지 않는다. 해당 시스템의 운영 주체는 확인되지 않았다.

요약

  • 210M승객 기록
  • 10.4M승무원 기록
  • 9 years2017년부터 2026년까지의 운항
  • 1,008데이터에 등장한 항공사

2026년 6월 3일, 인터넷에 개방된 데이터베이스를 광범위하게 조사하던 중 pax-info라는 이름의 Elasticsearch 클러스터를 발견하였다. Elasticsearch는 대량의 기록을 검색하기 위한 데이터베이스 엔진이다. 이 클러스터는 인터넷 전체에 완전히 개방되어 있지는 않았다. 직접 전송한 요청은 거부되었다. 그러나 클라우드 경유 지점을 통해서는 접근이 가능하였고, 접근이 이루어지자 클러스터는 Elasticsearch 기본 로그인 정보, 즉 운영자가 한 번도 변경하지 않은 공장 출고 상태의 사용자명과 비밀번호를 그대로 수용하였다. 이는 실질적인 보호 수단이 아니다. 그 뒤에는 2017년 1월 7일부터 2026년 4월 30일까지의 여행 기록 220,783,700건이 있었다.

이 노출을 찾아낸 조사는 대체로 시시한 것들을 발견한다. 개발자가 남겨둔 테스트 데이터, 상점의 상품 목록, 기록이 있던 자리에 랜섬 노트만 남은 삭제된 데이터베이스 따위이다. 이 클러스터는 시시하지 않았다. 9년치 국경 통제 데이터를 보관하고 있었고, 발견 당시 최신 기록은 약 5주 전의 것이었다. 즉 시스템에 여전히 데이터가 기록되고 있었다. 운영 중인 시스템이었다.

해당 데이터는 사전 승객 정보(Advance Passenger Information)이다. 국제선 운항 전에 항공사는 목적지 국가에 탑승자 명단을 전송하며, 이를 통해 국경 관리 기관이 탑승자 전원을 사전 심사한다. 필드 구성은 국제민간항공기구(ICAO), 즉 민간항공 규정을 정하는 유엔 산하 기구가 표준화하였다. 쉽게 말해 이는 일반 여행자에 대해 국가가 보유한 가장 민감한 데이터에 속한다. 개인별로 실명과 생년월일이 여권번호와 결합되어 있고, 언제 어디로 이동했는지가 정확히 기록되어 있다.

핵심 판단
  • 9년치 아카이브이며, 여전히 운영 중이었다. 승객 기록 210,318,069건과 승무원 기록 10,465,631건이 있었고, 최신 기록은 약 5주 전의 것이었다. 이는 덤프된 뒤 방치된 오래된 사본이 아니라 운영 중인 시스템의 실사용 아카이브였다. 높은 신뢰도, 직접 측정함.
  • 모든 기록은 신원과 이동 이력의 결합이다. 성명, 생년월일, 성별, 국적이 여권번호, 만료일, 발급국과 결합되고, 이어서 운항 정보인 편명, 날짜, 공항, 좌석, 수하물 태그가 붙는다. 이 필드들이 결합되면 사칭과 문서 위조의 원재료가 되며, 동시에 특정 인물이 특정일에 어디에 있었는지에 대한 기록이 된다. 높은 신뢰도.
  • 영향 범위는 전 세계적이었고, 세부 수준도 정밀하였다. 항공사에는 러시아와 벨라루스의 국적 항공사인 Aeroflot과 Belavia가 포함되고, 승객은 네덜란드, 중국, 벨라루스, 한국, 일본 등지에 걸쳐 있으며, 세부 정보는 개별 수하물 태그 참조번호까지 내려간다. 그 범위는 베트남에서 여정이 시작되거나 종료된 승객뿐 아니라 환승 및 통과 승객까지 포함하였다. 높은 신뢰도.
  • 침입도 익스플로잇도 없었다. 클러스터는 한 번도 변경되지 않은 Elasticsearch 공장 기본 자격증명을 수용하였고, 자체 웹 인터페이스는 클릭 한 번으로 JSON 내보내기를 제공하였다. 기본 로그인 정보는 공개적으로 문서화되어 있으며 모든 스캐너가 가장 먼저 시도하는 대상이다. 소프트웨어 취약점은 개입되지 않았다. 높은 신뢰도.
  • 데이터는 베트남과 연계되어 있으나 운영 주체는 확인되지 않았다. 하노이의 베트남 국영 통신 인프라에 호스팅되었고, ICAO 피드 형태로 구조화되었으며, 베트남 최대 항공사 두 곳이 데이터의 다수를 차지하였다. 어느 조직이 운영했는지는 확인하지 못하였으며, 통보한 베트남 당국은 응답하지 않았다. 소유 주체에 대해서는 중간 신뢰도. 호스팅과 스키마는 직접 관측하였으나 운영 주체는 그렇지 않다.
pax-info 클러스터, node-32 노드, Elasticsearch 8.3.3 버전, 29개 인덱스, 약 2억 2,079만 개 문서, 디스크 107GB를 보여주는 Elasticvue 클러스터 개요.
변경되지 않은 기본 로그인 정보로 클라우드 경유 지점을 통해 확인한 클러스터 개요. pax-info 클러스터는 29개 인덱스와 107GB에 걸친 약 2억 2,079만 개 문서를 보관하고 있었다. 승객 및 승무원 인덱스 두 개가 그중 220,783,700개 문서를 차지하며, 나머지는 소규모 참조 및 테스트 인덱스이다.

각 기록에 담긴 내용

각 기록은 성명, 생년월일, 성별, 국적을 여권 또는 여행증명서 번호, 만료일, 발급국과 연결하고, 여기에 여정을 덧붙인다. 편명, 날짜, 출발지, 경유지, 목적지 공항, 좌석, 수하물 참조번호가 그것이다. 이름, 생년월일, 여권번호가 결합되면 타인이 여행자를 사칭하거나 여행증명서를 위조할 수 있으며, 여정은 특정 여행자가 특정일에 어디에 있었는지를 보여준다.

모든 신원 값을 제외하고 기록한 단일 레코드의 형태는 다음과 같다.

flightDate: 2026-04-30  flightNumber: VN0402  fromAirportCode: HAN (하노이)  toAirportCode: ICN (서울-인천)  guestNameOriginal: [REDACTED]  birthday: [REDACTED]  nationalityCode: [REDACTED]  documentNumberOriginal: [REDACTED]

이름과 여권번호 열이 가려지고 REDACTED로 표시된 승객 기록 표. 항공사, 국적, 목적지, 운항일 열은 그대로 보이며 서울, 시드니, 칭다오 등의 목적지가 나타난다.
클러스터에 나타난 승객 기록. 개인을 식별하는 두 개 열인 성명과 여권번호는 가렸다. 나머지는 그대로 두어 국적과 목적지를 보여준다. 서울, 시드니, 칭다오, 쿤밍 등 베트남을 훨씬 넘어서는 국제 노선과 여권 발급국의 분포가 드러난다.

데이터베이스에 포함된 대상

베트남 승객 시스템이라면 베트남 여행자를 보관하리라는 것이 자연스러운 해석이다. 실제로는 그보다 훨씬 많은 것이 담겨 있다. 기록에 나타난 국적은 네덜란드, 중국, 벨라루스, 한국, 일본, 프랑스, 독일, 캐나다, 말레이시아 등 전 세계에 걸쳐 있으며, 항공사는 1,008개에 달한다. 9년에 걸쳐 거의 모든 항공사로 베트남 공항을 경유하는 노선을 이용한 사람이라면 누구나 여기에 포함되었을 가능성이 있다.

그중 두 항공사가 눈에 띈다. 승무원 기록에는 러시아 국적 항공사인 Aeroflot과 벨라루스 국적 항공사인 Belavia의 명단이 포함되어 있으며, 두 항공사 모두 서방 제재 대상이다. 이들 승무원의 이름, 생년월일, 여권번호가 다른 모든 사람의 정보와 같은 개방된 저장소에 있었다. 승객 측에는 이에 대응하는 민간 이동 기록이 있다. 나트랑 옆에 위치하여 오랫동안 러시아 및 구소련권 관광의 목적지였던 해변 도시 깜라인행으로 예약한 벨라루스 국적자들이다. 이를 어떻게 평가하든, 이 기록들은 전체 여행 기록 중에서도 가장 손쉽게 노출된 축에 속하였다.

승무원 기록 표. 승무원 이름, 생년월일, 출생연도, 여권번호 열은 가려지고 REDACTED로 표시되어 있다. 항공사 열은 보이며 Korean Air, All Nippon Airways, Eastar Jet, Colorful Guizhou Airlines와 함께 Aeroflot Russian 행이 포함되어 있다. 하단에 DOWNLOAD AS JSON 버튼이 보인다.
식별 열을 가린 승무원 기록. 그대로 노출된 항공사 열은 그 범위를 보여준다. Aeroflot Russian이 Korean Air와 Eastar Jet 사이에 있고 그 아래에 Colorful Guizhou Airlines가 있다. 오른쪽 하단의 Download as JSON 버튼은 클러스터 자체 인터페이스이다. 데이터를 가져가는 데 별도의 도구는 필요하지 않았다.

이 시스템은 베트남에서 여정이 시작되거나 종료된 사람들의 범위를 넘어서기도 하였다. 각 기록에는 최초 공항, 경유 공항, 목적지 공항 필드가 별도로 있으며, 상당수는 홍콩, 싱가포르 창이, 상하이, 마카오, 쿠알라룸푸르 등 외국 공항만을 지정하고 있다. 환승 및 통과 승객이 다른 모든 이들과 나란히 수집되었고, 이들의 완전한 신원이 베트남에서 시작하거나 끝날 필요조차 없는 여정에 결합되어 있었다.

여권번호와 이름 열이 가려진 승객 기록 표. 보이는 열에는 다낭, 깜라인, 홍콩, 싱가포르 창이, 상하이, 쿠알라룸푸르 등의 목적지 공항과 NLD(네덜란드), CHN(중국), BLR(벨라루스) 등의 국적 코드가 표시되어 있다.
같은 인덱스를 경로 필드까지 스크롤한 화면. 국적에는 네덜란드(NLD), 중국(CHN), 벨라루스(BLR)가 포함되어 있고, 공항은 베트남 휴양지(깜라인, 푸꾸옥, 다낭)와 해외 허브(홍콩, 싱가포르 창이, 상하이, 마카오)가 뒤섞여 있다. 여기 보이는 벨라루스 국적 두 행은 모두 깜라인행이다.

수하물 태그까지

세부 정보는 누가 어디로 갔는지에서 그치지 않는다. 각 기록에는 해당 승객 명의로 위탁된 수하물 태그 참조번호를 포함한 여정의 운영 기록도 담겨 있다. 이는 여행 가방 손잡이에 감긴 스티커에 적힌 번호로, 가방의 행선지를 표시하고 그것을 승객과 연결하는 값이다. 이 정도 규모의 데이터셋에서 이는 이례적인 수준의 세밀함이다. 어떤 사람이 비행했다는 사실뿐 아니라 어느 가방이 그 사람의 것이었는지까지 알 수 있다.

생년월일과 여권번호 열이 가려진 승객 기록 표. 128454358, CX480085 같은 값이 담긴 수하물 열이 보인다. 국적, 항공사, 목적지 열도 보이며 깜라인행 벨라루스 승객이 포함되어 있다.
값이 채워진 수하물 열. 생년월일과 여권번호는 가렸고, 수하물 참조번호와 경로는 원래대로 두었다. 네 번째 행의 벨라루스(BLR) 기록은 깜라인행 승객과 그 수하물이다.

클러스터에 접근이 가능했던 경위

클러스터가 인터넷 전체에 완전히 개방되어 있던 것은 아니다. 직접 전송한 요청은 거부되었다. 접근을 가능하게 한 것은 클라우드 경유 지점이었다. 그곳에서는 데이터베이스가 응답하였고, 운영자가 한 번도 변경하지 않은, 소프트웨어에 기본 탑재된 Elasticsearch 기본 로그인 정보를 그대로 수용하였다. 기본 자격증명은 방어 수단이 아니다. 공개적으로 문서화되어 있으며 모든 스캐너가 가장 먼저 시도하는 대상이다. 소프트웨어 취약점은 악용되지 않았고, 그럴 필요도 없었다. 일단 접근한 뒤에는 클러스터 자체 웹 콘솔이 Download as JSON 버튼을 제공하였다. 데이터를 가져가는 데 스크립트조차 필요하지 않았다.

노출은 며칠 수준의 문제가 아니었다. 승객 인덱스는 2022년 9월 15일에 생성되었다. 공개 인터넷 스캔 서비스 FOFA는 2022년 10월에 이 호스트를 처음 기록하였고, 2023년 중반에는 이를 데이터베이스로 분류하고 있었다. 즉 이 저장소는 우리가 발견하기 3년도 더 전부터 기본 로그인 정보 상태로 접근 가능하였다. 그 기간 전체에 걸쳐 승객 데이터를 조회할 수 있었는지, 그리고 다른 누가 접근하였는지는 알 수 없다.

문서 10,465,631건의 crew-index와 문서 210,318,069건의 guest-v3-index를 보여주는 Elasticvue 인덱스 목록. 생성일은 guest-v3-index가 2022년 9월 15일, crew-index가 2023년 5월 23일이며, 소규모 항공사, 공항, 국가 참조 인덱스가 함께 표시되어 있다.
인덱스 목록. 승객 인덱스(guest-v3-index)는 210,318,069건, 승무원 인덱스(crew-index)는 10,465,631건을 보관하고 있었고, 소규모 참조 테이블이 함께 있었다. 승객 인덱스는 2022년 9월, 승무원 인덱스는 2023년 5월이라는 생성일은 이 시스템이 얼마나 오래 운영되었는지를 보여준다.

기록을 읽지 않고 집계한 방법

우리는 누구의 기록도 읽지 않고 클러스터를 집계하였다. Elasticsearch는 “이 조건에 부합하는 기록이 몇 건인가”, “이를 항공사별로 분류하라” 같은 질의에 count 및 aggregation 인터페이스를 통해 답하며, 이 인터페이스는 총계와 범주별 집계값을 반환할 뿐 개별 행을 결코 반환하지 않는다. 우리는 문서 건수, 데이터의 기간, 스키마의 필드명 목록, 그리고 모든 식별 필드를 가린 소수의 스크린샷만을 보관하였으며, 스크린샷은 해당 필드에 값이 채워져 있음을 확인하기 위해서만 촬영하였다. 개별 승객 또는 승무원 기록은 조회, 저장되거나 우리가 통보한 당국 외의 누구에게도 전달되지 않았다.

Elasticsearch의 인덱스는 대략 하나의 테이블에 해당한다. 사람의 정보를 담은 두 인덱스의 규모는 다음과 같다.

  • 109,232,811남성으로 표기된 기록
  • 101,085,255여성으로 표기된 기록
  • 1,008데이터에 명시된 항공사
인덱스기록 수크기
승객 (guest-v3-index)210,318,06995.3 GB
승무원 (crew-index)10,465,6314.3 GB

100만 건을 넘는 항공사 20곳

노출된 데이터는 베트남 자국민을 훨씬 넘어서는 여행자에게 미친다. 1,008개 항공사가 명시되었고, 그중 20개 항공사가 각각 100만 건 이상을 보유하였다.

항공사기록 수
VietJet Air45,820,123
Vietnam Airlines43,184,871
한국 항공사 (Korean Air, Asiana, Jeju Air, Jin Air, Tway)약 2,470만
싱가포르 항공사 (Singapore Airlines, Scoot)약 770만

Qatar Airways, Emirates, All Nippon Airways, Cathay Pacific, China Southern도 각각 수백만 건을 보유하고 있다. 목록 상위가 베트남 항공사 두 곳이라는 점은 놀랍지 않다. 그 뒤로 한국, 걸프, 일본, 중국의 국적 항공사가 이어진다는 점이 핵심이다. 이는 애초에 베트남만이 잃을 수 있는 데이터가 아니었다. 어떤 협정에 따라 외국 항공사의 승객 명단이 베트남에 호스팅된 단일 저장소로 유입되고 9년간 그곳에 보관되었는지는 기록만으로는 알 수 없다.

클러스터의 호스팅 위치

귀속 판단은 이미 확보한 정보, 즉 호스팅 네트워크, 인덱스 구조, 항공사 구성, 데이터 최신성, 접근 통제 상태만을 근거로 평가하였다. 클러스터는 베트남 국영 통신사 Viettel에 할당된 네트워크 공간, AS38731 아래에 있었다. ASN은 인터넷 주소 뒤에 있는 네트워크 운영자를 식별하는 값이며, 이 ASN은 하노이의 한 기술단지로 등록되어 있다. 스키마는 ICAO 사전 승객 정보 피드이며, 항공사 구성은 베트남 항공사 두 곳이 주도하여 VietJet Air가 45,820,123건, Vietnam Airlines가 43,184,871건을 차지한다. 이러한 호스팅과 항공사 구성은 베트남을 통과하는 모든 국제 이동을 수집하는 시스템과 부합한다.

당시 우리의 평가는 다음과 같았다.

이미 확보한 데이터로 확인 가능한 모든 축에서, 증거는 이것이 제3자가 다른 곳에 호스팅한 사본이 아니라 노출된 상태로 방치된 실제 운영 중인 베트남 승객 정보 시스템이라는 점과 일치한다.

탈취한 데이터를 재판매하는 주체는 대체로 피해국 내부의 추적 가능한 국내 네트워크에 데이터를 호스팅하지 않으며, 이들의 사본은 표면화될 무렵이면 이미 오래된 것이다. 국내 호스팅, 목적에 맞게 설계된 스키마, 5주 수준의 최신성은 종합적으로 재판매된 덤프가 아니라 운영 중인 데이터임을 시사한다.

운영 주체의 신원에 관하여

어느 조직이 이 클러스터를 운영했는지는 확인하지 못하였으며, 연관성을 과장하지 않도록 유의하고 있다. 우리는 다른 당국과 함께 베트남 국가 사이버 침해사고 대응 기관(VNCERT)에 통보하였으나 응답을 받지 못하였다. 이 시스템을 베트남과 결부시키는 근거는 호스팅과 스키마이다. 운영 주체의 신원은 외부에서 확정할 수 있는 사안이 아니며, 우리는 이를 미확정으로 남겨둔다.

공개 경과

  • 2026년 6월 3일개방된 데이터베이스에 대한 조사 과정에서 노출된 클러스터를 발견하였고, 같은 날 피해 당사자 및 책임 기관에 대한 통보를 시작하였다. 대상은 각국 CERT, 데이터 보호 당국, 항공 관련 기구, 그리고 해당 데이터에 승객이 포함된 항공사들이다.
  • 수일 내호스트가 오프라인 상태가 되어 더 이상 접근할 수 없게 되었다. 해당 노출은 차단되었다.

우리는 발견한 날 이를 신고하였고, 접근이 차단될 때까지 공개하지 않았다. 열거 작업은 읽기 전용이었으며, 통보한 당국 외에 어떤 개인의 기록도 보관하거나 공유하지 않았다.

여전히 알 수 없는 것

특정 취약 지점은 차단되었으나, 더 큰 질문들은 우리가 답할 수 있는 사안이 아니다.

  • 얼마나 오래 개방되어 있었는가. 승객 인덱스는 2022년 9월로 거슬러 올라가며, 공개 스캐너는 2022년 10월부터 이 호스트를 기록하였다. 그 기간 전체에 걸쳐 데이터를 조회할 수 있었는지, 그리고 다른 누군가가 접근하거나 복제하였는지는 확정할 수 없다.
  • 누가 책임 주체인가. 운영 주체는 여전히 특정되지 않았고, 통보한 베트남 당국은 응답하지 않았다.
  • 여행자들에게 통지될 것인가. 항공사와 각국 데이터 보호 당국이 기록이 노출된 개별 여행자에게 통지할지는 답을 알 수 없다.
  • 데이터가 어떻게 한곳에 모였는가. 그토록 많은 외국 항공사의 명단이 왜 베트남에 호스팅된 단일 저장소로 통합되어 9년간 보관되었는지는 기록으로 설명되지 않는다.

인터넷에 데이터베이스를 운영한다면

여기서 발생한 실수는 흔하면서도 손쉽게 피할 수 있다. Elasticsearch나 유사한 저장소를 운영하는 팀에게 권고한다.

  • 기본 로그인 정보를 변경하고, 데이터 포트를 공용 인터넷에서 차단하라. 소프트웨어에 기본 탑재된 자격증명은 널리 알려진 정보이며, 이를 그대로 두는 것은 비밀번호가 없는 것과 같다. 실질적인 인증을 활성화하고 데이터베이스를 네트워크 경계 뒤에 두어야 한다.
  • 접근 가능한 것은 반드시 발견된다고 가정하라. 인터넷 전역 스캔은 지속적이고 자동화되어 있다. 이 호스트는 우리가 발견하기 수년 전에 이미 공개 스캐너에 등재되어 있었다.
  • 가장 민감한 데이터가 어디에 있고 누가 접근할 수 있는지 파악하라. 이번 피해는 수억 명의 신원 및 이동 데이터를 보유한 단일 저장소가 변경되지 않은 기본 로그인 정보로 경유 접근이 가능했다는 데서 비롯된다. 그러한 저장소부터 목록화해야 한다.
How to cite
Kinryū Labs (2026). 2억 2천만 건의 여행자 기록: 베트남 연계 승객 데이터베이스 노출 사례. https://kinryu.sh/ko/reports/vietnam-apis-exposure/