goHardDrive Leaked Personal Data for Thousands of Customers

Michael Lynch

goHardDrive, 수천 명 고객 개인정보 유출

원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기

최근 중고 하드 드라이브 전문 판매업체인 goHardDrive에 제품을 반품했다. 반품 과정에서 이 업체가 실수로 수천 명 고객의 이름, 주소, 이메일 주소, 주문 내역 등 세부 정보를 공개하고 있다는 사실을 발견했다.

유출 경위

goHardDrive에 반품을 요청하자 다섯 자리 숫자로 끝나는 반품 승인 번호(RMA 번호)를 받았다. 실제 RMA 번호는 공개하지 않겠지만, 대략 다음과 같은 형태였다고 보면 된다:

  • GHD12345

반품 상태를 확인하기 위해 ghdwebapps.com/rma에 있는 양식에 RMA 번호를 입력했다:

goHardDrive의 RMA 상태 조회 양식. 실제로는 RMA 번호를 입력해야 하는데 “Enter email”이라고 표시되어 있다.

RMA 번호를 입력하자 다음과 같은 화면이 나타났다:

그 화면에는 goHardDrive가 나에 대해 알고 있던 모든 개인정보가 그대로 표시되어 있었다:

  • 내 이름
  • 내 주소
  • 내 이메일 주소
  • 내 전화번호(다행히 제공하지 않았었다)
  • 내 주문 번호와 주문일
  • 반품한 제품과 반품 사유

goHardDrive가 얼마나 많은 정보를 노출하고 있는지 처음에는 알아차리지 못했다. RMA 번호의 마지막 숫자를 실수로 잘못 입력했는데, 양식이 같은 날짜에 제품을 반품한 다른 고객의 모든 정보를 보여준 것이다.

이 페이지의 URL은 다음과 같은 형태였다:

https://ghdwebapps.com/rma/check?rmaNo=GHD12345&fromButton=1

12345 부분을 00001부터 99999까지 모든 숫자로 바꿔 HTTP GET 요청을 보내, 반품을 요청한 모든 goHardDrive 고객의 개인정보를 긁어오는 스크립트를 작성하는 것은 일도 아니었다. 소프트웨어 개발 지식이 전혀 없는 사람이라도 양식에 아무 RMA 번호나 입력하면 해당 고객의 모든 데이터를 볼 수 있었다.

이 양식은 공개되어 있었으며 인증이나 요청 횟수 제한, CAPTCHA도 없었다.

유출 규모

이번 유출로 영향을 받은 고객은 1만 명에서 10만 명 사이로 추정된다.

이 취약점이 정확히 몇 명의 goHardDrive 고객에게 영향을 미쳤는지는 단정할 수 없지만, goHardDrive가 RMA 번호를 10000 이하에서 시작해 1씩 증가시켰다고 가정하면 이번 유출로 1만~10만 명의 고객 정보가 노출된 셈이다.

goHardDrive의 1차 조치

2025년 5월 21일 이 문제를 goHardDrive에 이메일로 알렸다. 다행히 두 시간 안에 답장이 왔고, 문제를 인정하며 3~5영업일 안에 수정 사항을 배포하겠다고 했다.

일주일이 지나도 소식이 없어 다시 연락했다. goHardDrive 측은 공격자가 RMA 번호를 무차별 대입하지 못하도록 양식을 업데이트했다고 답했다.

RMA 양식을 확인해 보니 고객이 우편번호와 번지수를 함께 입력하도록 바뀌어 있었다.

처음에는 이 정도면 충분해 보였다. RMA 번호가 순차적으로 발급되니 다른 유효한 RMA 번호를 추측하는 건 어렵지 않지만, RMA 번호에 더해 대응하는 ZIP 코드와 번지수까지 맞출 확률은 얼마나 될까 싶었다.

그러다 다시 생각해 보니 미국의 ZIP 코드는 다섯 자리 숫자에 불과해 가능한 조합이 10만 개뿐이다. 실제로는 그 절반도 안 된다. 유효한 ZIP 코드는 약 4만 2천 개에 불과하기 때문이다. 게다가 ZIP 코드는 균등하게 분포되어 있지 않아 특정 ZIP 코드가 훨씬 더 흔하다.

가능한 번지수 범위는 넓지만, 대부분은 1에서 100 사이에 몰려 있을 가능성이 크고, 특히 낮은 숫자에 더 집중되어 있을 것이다.

따라서 최악의 경우에도 공격자가 RMA 번호 하나에 연결된 정보를 빼내기 위해 시도해야 하는 조합은 약 4만 2천 × 100 = 420만 가지 정도다. 흔한 ZIP 코드와 번지수부터 시도하도록 최적화하면 약 5만 번 정도 추측했을 때 성공 확률이 50%를 넘을 것이다.

웹 API에 대해 5만 번 추측하는 데 얼마나 걸릴까? 보안 연구원 brutecat은 최근 Google 웹 API에서 전화번호를 열거한 사례에 대해 글을 썼다. 그는 시간당 0.30달러짜리 클라우드 서버로 초당 4만 건의 HTTP 요청을 보낼 수 있었다고 한다. goHardDrive의 RMA 양식이 초당 4만 건의 요청을 처리할 수 있을지는 의문이지만, 공격자가 초당 1천 가지 조합을 시도할 수 있다고 해도 약 1분 안에 50% 확률로 맞출 수 있다는 얘기다.

goHardDrive, RMA 상태 조회 기능 전면 폐쇄

goHardDrive에 연락해 새로 적용한 완화 조치가 충분하지 않다고 전했다.

RMA 상태 페이지에서 내 모든 개인정보를 그대로 노출하는 대신 상태 정보만 표시하도록 간소화할 것을 제안했다. 고객 입장에서는 RMA 상태를 확인할 때 내 주소나 이메일, 전화번호를 볼 필요가 없다. goHardDrive가 반품을 언제 받았고 대체품을 언제 발송했는지만 알면 된다. 모든 개인정보를 공개할 필요는 없는데, 아마 goHardDrive 내부 프로세스상 필요해서 그렇게 한 것으로 보인다.

답이 없어 일주일 뒤 이 문제를 어떻게 생각하는지 다시 물었다. 몇 시간 뒤 goHardDrive는 웹사이트에서 RMA 상태 조회 기능을 아예 제거하겠다고 답했다.

다음 주에 다시 확인해 보니 실제로 RMA 상태 페이지가 내려가 있었다. 앞으로 RMA 상태는 어떻게 확인하냐고 묻자, goHardDrive는 고객이 이메일로 문의하면 상태를 알려주겠다고 했다.

버그 바운티

보안 취약점을 책임감 있게 제보한 사람에게 버그 바운티를 제공하는지 goHardDrive에 물었다. goHardDrive는 버그 바운티 프로그램은 운영하지 않지만 감사의 표시로 330달러 결제액 중 20달러를 환불해주겠다고 했다.

이 정도 규모의 정보 노출에 대한 포상금은 일반적으로 수백에서 수천 달러 수준이므로 20달러는 상당히 적은 금액이다.

타임라인

  • 2025-05-21: goHardDrive에 취약점을 제보함.
  • 2025-05-21: (2시간 후) goHardDrive가 문제를 인정하고 수정 작업 중이며 3~5영업일 내 수정 예정이라고 답함.
  • 2025-05-29: goHardDrive에 진행 상황을 문의함.
  • 2025-05-29: goHardDrive가 RMA에 대해 일치하는 ZIP 코드와 번지수를 입력하도록 하여 문제를 완화했다고 답함.
  • 2025-06-05: goHardDrive의 새로운 RMA 조회 기능에 대한 우려를 전달함.
  • 2025-06-20: goHardDrive가 RMA 조회 양식을 영구적으로 제거하고 이제 이메일로만 RMA 상태를 공유한다고 확인함.

덧붙임: 유출을 떠나서도 최악인 반품 절차

내 데이터를 유출하지 않았더라도 goHardDrive의 RMA 절차는 내가 경험한 어떤 업체보다도 최악이었다.

원래 goHardDrive를 선택한 이유는 reddit에서 이 회사에 대한 극찬 리뷰를 봤기 때문이다. 한 사용자는 불량 드라이브를 신고하자 업체가 반품을 받기도 전에 교체품을 먼저 보내주고, 불량 제품을 반송할 수 있는 선불 배송 라벨까지 제공했다고 자랑했다:

방금 goHardDrive에서 24TB Seagate Exos를 샀습니다. 어제 설치했는데 도착하자마자 불량이더군요(모터에서 삐 소리만 나고 아무 반응 없음). 오전 6시 30분에 이메일 보냈더니 오후에 답장이 왔고 당일이 끝나기 전에 2일 배송(업체 부담)으로 교체품을 발송했습니다. 불량 드라이브는 '편할 때' 반송하라며 선불 라벨도 제공했습니다. 처음부터 정상 작동했으면 더 좋았겠지만, 대응은 완벽했습니다. 교체품은 내일 도착 예정인데, 제발 정상이길 바랍니다.

내 경우에는 goHardDrive에서 구매한 하드 드라이브 세 개 중 두 개가 고장 난 상태로 도착했다. 두 개의 드라이브가 동시에 고장 났을 리 없다고 생각해 서버의 하드웨어 문제를 진단하느라 많은 시간을 허비했지만, 결국 goHardDrive가 그냥 고장 난 드라이브 두 개를 보낸 것이었다는 걸 깨달았다.

반품 절차를 시작했는데, goHardDrive가 주문 정보와 주소 정보를 모두 다시 입력하게 해서 놀랐다.

goHardDrive의 RMA 양식은 고객이 주소와 주문 정보를 모두 직접 다시 입력하도록 한다.

보통 RMA 절차에서는 주문 번호만 입력하면 업체가 고객 정보를 불러오고, 어떤 제품을 반품할지만 알리면 된다. 하지만 goHardDrive에서는 구매한 지 2주밖에 안 됐는데도 내가 누군지 완전히 잊은 것처럼 굴었다.

또한 reddit의 주장과 달리 goHardDrive는 반품 배송비를 부담하지 않았다. 고장 난 제품을 보냈으면서도 배송비를 내가 직접 부담해야 했다. 불량을 신고한 지 이틀 만에 교체품을 받는 대신 2주를 기다려야 했다.

마지막으로, goHardDrive는 반품 절차 전반에 걸쳐 이메일 확인이나 업데이트를 전혀 보내지 않았다. 발송 전에 반품 패키지를 사진으로 남겨두길 잘했다. 그러지 않았다면 RMA 번호를 기록해 둘 방법이 없었을 것이다. 보안이 취약한 RMA 상태 페이지에서 내 요청이 OPEN에서 RECEIVED, CLOSED로 바뀌는 것만 확인할 수 있었을 뿐, 추가 정보나 운송장 번호는 제공되지 않았다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글