goHardDrive Leaked Personal Data for Thousands of Customers

Michael Lynch

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

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

유출 경위

goHardDrive에 반품을 요청하자 다섯 자리 숫자로 끝나는 반품 승인 번호(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가 RMA 번호를 10000 이하에서 시작해 1씩 증가시키는 방식이라고 가정하면, 이번 유출로 1만~10만 명의 고객 정보가 노출된 셈입니다.

goHardDrive의 1차 조치

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

일주일이 지나도 소식이 없어 다시 연락했습니다. goHardDrive 측은 공격자가 RMA 번호를 무차별 대입하는 것을 막기 위해 폼을 업데이트했다고 답했습니다.

RMA 폼을 확인해 보니 우편번호와 번지를 함께 입력하도록 바뀌어 있었습니다.

처음에는 이 정도면 충분해 보였습니다. RMA 번호가 순차적으로 부여된다면 다른 유효한 번호를 추측하는 건 매우 쉽지만, 거기에 우편번호와 번지까지 정확히 맞출 확률은 얼마나 될까 싶었습니다.

하지만 곰곰이 생각해 보니 이야기가 달라졌습니다. 미국 우편번호(ZIP 코드)는 다섯 자리 숫자라 가능한 조합이 10만 개뿐입니다. 실제로는 그 절반도 안 됩니다. 유효한 ZIP 코드는 약 4만 2천 개에 불과하기 때문입니다. 게다가 ZIP 코드는 균등하게 분포되어 있지 않아 특정 ZIP 코드에 인구가 훨씬 몰려 있습니다.

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

따라서 최악의 경우 공격자는 RMA 번호 하나당 약 42k x 100 = 4.2M가지 조합을 시도하면 정보를 빼낼 수 있습니다. 흔한 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에 일치하는 우편번호와 번지를 입력하도록 해 문제를 해결했다고 답했습니다.
  • 2025-06-05: 새로운 RMA 조회 기능에 대한 우려를 goHardDrive에 전달했습니다.
  • 2025-06-20: goHardDrive가 RMA 조회 폼을 영구적으로 제거했으며 이제 이메일로만 RMA 상태를 공유한다고 확인했습니다.

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

설령 제 정보가 유출되지 않았더라도, goHardDrive의 RMA 절차는 제가 경험한 어떤 업체보다도 최악이었습니다.

애초에 goHardDrive를 선택한 이유는 reddit에서 이 업체에 대한 칭찬 일색의 후기를 봤기 때문입니다. 한 사용자는 불량 드라이브를 신고하자 업체가 반품을 받기도 전에 교체품을 먼저 발송하고, 반송용 선불 배송 라벨까지 제공했다고 극찬했습니다.

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

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

반품을 진행하려고 하자 goHardDrive가 주문 정보와 주소 정보를 모두 다시 입력하라고 해서 놀랐습니다.

goHardDrive의 RMA 신청 폼에서는 고객이 주소와 주문 정보를 모두 직접 다시 입력해야 한다.

보통 RMA 절차라면 주문 번호만 입력하면 판매자가 고객 정보를 불러오고, 어떤 제품을 반품할지만 알리면 됩니다. 그런데 goHardDrive는 구매한 지 2주밖에 되지 않았는데도 저를 완전히 잊어버린 것처럼 굴었습니다.

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

마지막으로 goHardDrive는 반품 절차 전반에 걸쳐 이메일 확인이나 진행 상황 안내를 전혀 보내지 않았습니다. 발송 전에 반품 패키지 사진을 찍어둔 것이 다행이었습니다. 그렇지 않았다면 RMA 번호를 기록해 둘 방법이 없었을 테니까요. 보안이 취약한 RMA 상태 페이지에서나마 제 요청이 OPEN에서 RECEIVED, CLOSED로 바뀌는 것을 확인할 수 있었을 뿐, 추가 정보나 운송장 번호는 제공되지 않았습니다.

원문은 Michael Lynch님이 에 게재했습니다.

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