goHardDrive、数千人の顧客の個人データを漏えい
中古ハードドライブの販売を専門とする業者、goHardDrive に最近、製品を返品しました。その手続きの過程で、同社が数千人の顧客について、氏名、郵送先住所、メールアドレス、注文の詳細を含む情報を誤って公開していることに気付きました。
漏えい
goHardDrive に返品を依頼すると、末尾が5桁の数字である返品承認番号(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=112345 を 00001 から 99999 までのすべての数字に置き換えてHTTP GETリクエストを送信し、返品を依頼したすべてのgoHardDrive顧客の個人情報をスクレイピングするスクリプトを書くのは、あまりに簡単です。ソフトウェア開発の知識がまったくない人でも、フォームに任意のRMA番号を入力するだけで、その顧客のデータをすべて取得できました。
このフォームは公開されており、認証、レート制限、CAPTCHAはいずれもありませんでした。
漏えいの規模
この漏えいの影響を受けた顧客は、1万人から10万人の間だと見積もっています。
この脆弱性の影響を受けたgoHardDrive顧客の正確な数はわかりません。しかし、goHardDrive がRMA番号を 10000 以下から始め、1ずつ増やしていると仮定すると、この漏えいで1万人から10万人の顧客が晒されたことになります。
goHardDriveによる修正の試み
この問題について、2025年5月21日にgoHardDriveへメールしました。評価すべき点として、同社は2時間以内に返信し、問題を認識したことと、3〜5営業日以内に修正を展開することを確認しました。
1週間後になっても何の連絡もなかったため、goHardDrive にフォローアップしました。同社は、攻撃者がRMA番号を列挙できないようフォームを更新したと回答しました。
RMAフォームを確認したところ、顧客に郵便番号と番地の入力を求める仕様に変更されていました。

最初は、これで十分に思えました。連番のRMA番号であれば、ほかの有効なRMA番号をすべて簡単に推測できます。しかし、RMA番号に加え、それに対応するZIPコードと番地まで推測できる確率はどれほどでしょうか。
その後、さらに考えました。米国のZIPコードは5桁しかないため、可能なZIPコードは10万通りしかありません。実際にはその半分未満で、有効なZIPコードは 約4万2,000件 しかありません。また、ZIPコードは均等に分布しておらず、特定のZIPコード ははるかに一般的です。
番地としてあり得る値の範囲は広いですが、大半は1〜100の範囲に収まり、低い数字に大きく集中している可能性が高いでしょう。
つまり最悪の場合、攻撃者はRMA番号に紐付く詳細を漏えいさせるために、約4万2,000 x 100 = 420万通りの組み合わせを試せばよいことになります。よく使われるZIPコードと番地を優先すれば、約5万回の試行後には攻撃者が成功する確率は50%を超えるでしょう。
Web APIに対して5万回試行するには、どれくらい時間がかかるのでしょうか。セキュリティ研究者のbrutecatは最近、GoogleのWeb APIで電話番号を列挙する方法について書いています。$0.30/時のクラウドサーバーで、毎秒 4万件のHTTPリクエスト を送れたそうです。goHardDriveのRMAフォームが毎秒4万リクエストを処理できるとは思いませんが、攻撃者が毎秒1,000通りを試せても驚きません。つまり、約1分で正しく推測できる確率が50%に達することになります。
goHardDrive、RMA状況確認を完全に削除
新たな緩和策は不十分だと考えることを、goHardDrive にフォローアップで伝えました。
RMA状況ページを簡素化し、私の個人情報をすべて無造作に表示するのではなく、RMAのステータスだけを公開するよう提案しました。顧客である私は、RMAのステータスを確認する際に、自分の住所、メールアドレス、電話番号を見る必要はありません。知りたいのは、goHardDrive が返品を受け取った時期と、交換品を発送した時期だけです。私的な詳細をすべて公開する必要はありません。もっとも、goHardDrive側の何らかの内部プロセスのために表示しているのだとは思います。
goHardDrive から返信はなかったため、1週間後に、これを問題だと認識しているのか尋ねるため再度フォローアップしました。数時間後、同社はウェブサイトから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: 新しいRMA検索機能についての懸念をgoHardDrive に伝達。
- 2025-06-20: goHardDrive はRMA検索フォームを恒久的に削除し、今後はRMAの状況をメールでのみ共有すると私に確認。
余談: 漏えいを別にしても、これはひどい返品プロセスです
たとえ私のデータをすべて漏えいしていなかったとしても、goHardDrive のRMAプロセスは、私がこれまで遭遇した業者の中で最悪です。
もともとgoHardDrive を選んだのは、redditで同社について非常に高く評価するレビューを読んだからです。あるユーザーは、故障したドライブをgoHardDrive に報告したところ、業者は返品を受け取る前に交換品を発送し、故障したユニットを返送するための送料支払い済みラベルも顧客に提供したと熱弁していました。

私の場合、goHardDrive で購入した3台のハードドライブのうち2台が到着時に故障していました。別々の2台のドライブがともに到着時に故障しているとは考えにくかったため、サーバーのハードウェア問題を診断しようとして多くの時間を無駄にしました。しかし最終的に、goHardDrive が単に故障したドライブを2台送ってきたのだと気付きました。
返品手続きを始めると、goHardDrive が注文と住所の詳細をすべて再入力させることに驚きました。

goHardDriveのRMAフォームでは、顧客が住所と注文の詳細をすべて手作業で再入力しなければなりません。
通常、RMAプロセスでは注文番号を入力すれば業者が情報を呼び出し、返品する必要のある商品を伝えるだけで済みます。goHardDrive では、購入から2週間しか経っていないのに、私が誰なのかを完全に忘れたかのようでした。
また、redditでの主張とは異なり、goHardDrive は返品送料を負担しません。goHardDrive が故障したハードウェアを送ってきたにもかかわらず、送料を自腹で支払う必要がありました。不具合を報告してから2日後に交換品が手元に届くどころか、2週間待たなければなりませんでした。
最後に、goHardDrive は返品プロセスを通じて、メールによる確認や更新を一度も送りませんでした。発送前に返品パッケージを撮影しておこうと思って本当によかったです。そうしていなければ、RMA番号の記録が何も残らなかったでしょう。安全でないRMA状況ページを確認すると、追加情報や追跡番号なしに、私のリクエストが OPEN から RECEIVED、そして CLOSED へ移行するのを見ることができました。
記事をランダムに読む