goHardDrive 泄露了数千名客户的个人数据
我最近向 goHardDrive 退货了一件商品,这是一家专门销售二手硬盘的商家。在退货过程中,我发现他们意外地公开了数千名客户的详细信息,包括全名、邮寄地址、电子邮箱地址和订单详情。
泄露事件
当我向 goHardDrive 申请退货时,他们给我分配了一个以五位数字结尾的退货授权(RMA)编号。我不会公布我实际的 RMA 编号,但你可以想象它是类似这样的编号:
GHD12345
为了查询我的退货状态,我在 ghdwebapps.com/rma 的表单中输入了我的 RMA 编号:

goHardDrive 的 RMA 状态查询表单。没错,它写着“输入邮箱”,实际上却要求输入 RMA 编号。
当我输入 RMA 编号后,看到了这个页面:

这个页面显示了 goHardDrive 所知道的关于我的全部隐私信息,包括:
- 我的姓名
- 我的邮寄地址
- 我的电子邮箱地址
- 我的电话号码(幸好我没有提供)
- 我的订单号和订单日期
- 我要退回的商品以及退货原因
直到我不小心把 RMA 编号的最后一位数字输错了,我才注意到 goHardDrive 暴露了多少信息——表单向我显示了另一位在同一天退货的客户的完整信息。
该页面的 URL 格式如下:
https://ghdwebapps.com/rma/check?rmaNo=GHD12345&fromButton=1编写一个脚本,发送 HTTP GET 请求并把 12345 替换为从 00001 到 99999 的每一个数字,从而抓取每一位申请过退货的 goHardDrive 客户的个人详情,这是轻而易举的事。即使是不懂软件开发的人,也只需在表单中随便输入一个 RMA 编号,就能获取该客户的所有数据。
这个表单是公开的,没有任何身份验证、速率限制或验证码。
泄露规模
我估计这次泄露影响了 1 万到 10 万名客户。
我无法确定这一漏洞究竟影响了多少 goHardDrive 客户,但假设 goHardDrive 的 RMA 编号是从 10000 或更小的数字开始、每次递增一,那就意味着有 1 万到 10 万名客户的信息在此次泄露中被暴露。
goHardDrive 的补救尝试
我于 2025 年 5 月 21 日就此问题给 goHardDrive 发了邮件。值得肯定的是,他们在两小时内就回复确认了该问题,并表示会在三到五个工作日内部署修复。
一周后,我没有收到任何消息,于是再次联系了 goHardDrive。他们说已经更新了表单,以防止攻击者枚举 RMA 编号。
我查看了他们的 RMA 表单,发现他们将其改为要求客户输入邮政编码和门牌号。

起初,这看起来足够了。给定一个连续的 RMA 编号,你可以轻易猜出其他所有有效的 RMA 编号,但同时猜出一个 RMA 编号及其对应的邮政编码和门牌号的概率有多大呢?
然后,我又仔细想了想。美国邮政编码只有五位数,也就是说只有 10 万种可能的邮政编码。实际上还不到这个数的一半,因为只有约 4.2 万个有效邮政编码。而且邮政编码的分布并不均匀,所以某些邮政编码要常见得多。
门牌号的可能范围很广,但大多数很可能落在 1 到 100 之间,而且很可能集中在较小的数字上。
因此,最坏的情况下,攻击者需要尝试大约 42k × 100 = 420 万种组合才能泄露与某个 RMA 编号相关的信息。如果按常见邮政编码和门牌号进行优化,攻击者大概尝试约 5 万次后就有超过 50% 的成功概率。
对一个 Web API 发起 5 万次猜测需要多长时间?安全研究员 brutecat 最近撰文介绍了如何枚举 Google 某 Web API 上的电话号码。他在一台每小时 0.30 美元的云服务器上实现了每秒 4 万次 HTTP 请求。我怀疑 goHardDrive 的 RMA 表单能否每秒“响应”4 万次请求,但如果攻击者能每秒测试 1000 种可能,我也不会感到惊讶,这意味着他们大约在一分钟内就有 50% 的概率猜对。
goHardDrive 彻底下线了 RMA 状态查询功能
我再次联系 goHardDrive,告诉他们我认为新的缓解措施并不充分。
我建议 goHardDrive 简化其 RMA 状态页面,只显示 RMA 状态,而不是把我的所有个人细节一股脑儿吐出来。作为客户,查询 RMA 状态时我并不需要看到自己的地址、邮箱和电话号码。我只想知道 goHardDrive 什么时候收到了我的退货、什么时候给我寄了替换品。没有必要公开我所有的隐私信息,不过我猜这对 goHardDrive 内部的某个流程有用。
goHardDrive 没有回复,于是一周后我再次跟进,询问他们是否认为这是一个问题。几小时后他们回复说,他们会把 RMA 状态查询功能从网站上彻底移除。
又过了一周,我再查看时发现他们确实下线了 RMA 状态页面。我问现在查询 RMA 状态的新流程是什么,goHardDrive 说客户可以直接发邮件询问状态更新。
漏洞赏金
我问 goHardDrive 是否为通过协同披露报告安全漏洞的人提供漏洞赏金。goHardDrive 说他们没有漏洞赏金计划,但从我 330 美元的订单中退还了 20 美元作为感谢。
这种规模的信息披露漏洞的赏金通常高达数百到数千美元,所以 20 美元相当低。
时间线
- 2025-05-21:我向 goHardDrive 报告了该漏洞。
- 2025-05-21:(两小时后)goHardDrive 确认收到该问题,并表示正在着手修复。他们说预计在三到五个工作日内完成修复。
- 2025-05-29:我向 goHardDrive 请求进度更新。
- 2025-05-29:goHardDrive 回复称,他们已通过要求客户输入与 RMA 匹配的邮政编码和门牌号来 remediate 该问题。
- 2025-06-05:我向 goHardDrive 表达了对新 RMA 查询功能的担忧。
- 2025-06-20:goHardDrive 向我确认,他们已永久移除 RMA 查询表单,今后只通过电子邮件共享 RMA 状态。
题外话:撇开数据泄露不谈,这本身就是个糟糕透顶的退货流程
即便他们没有泄露我的全部数据,goHardDrive 的 RMA 流程也是我遇到过的所有商家中最差的。
我当初选择 goHardDrive 是因为 reddit 上关于这家公司的好评如潮。一位用户兴奋地说,当他向 goHardDrive 报告一块坏硬盘时,商家甚至在还没收到退货之前就寄出了替换品,还给客户提供了一张邮资已付的标签用于退回故障硬盘:

而在我这里,我从 goHardDrive 购买的三块硬盘中就有两块到货时是坏的。我浪费了大量时间试图排查服务器上的硬件问题,因为我觉得两块不同的硬盘同时到货即坏的可能性实在太低了,但最终我才意识到,goHardDrive 就是给我寄了两块坏硬盘。
我开始走退货流程时惊讶地发现,goHardDrive 竟然要求我重新输入所有的订单和地址信息。

goHardDrive 的 RMA 表单要求客户手动重新输入全部地址和订单信息。
通常情况下,RMA 流程只需你输入订单号,商家调出你的信息,然后你告诉他们需要退回哪件商品即可。而在 goHardDrive 这里,就好像在我购买后的两周内,他们完全忘记了我这个人。
此外,与 reddit 上的说法相反,goHardDrive 并不承担退货运费。尽管 goHardDrive 给我寄来的是坏掉的硬件,我却不得不自掏腰包付邮费。我没有像那位用户一样在报告故障两天后就拿到替换品,而是等了两个星期。
最后,在整个退货过程中,goHardDrive 从未发送过任何邮件确认或进度更新。幸好我想起在寄出前给我的退货包裹拍了照,否则我连自己 RMA 编号的任何记录都没有。通过那个不安全的 RMA 状态页面,我只能看到我的申请从 OPEN 变成 RECEIVED 再变成 CLOSED,没有任何进一步的信息或物流单号。
随机一篇博客