迷雾通安全事件报告

来源: https://community.geph.io/t/topic/22227

摘要

2026 年 9 月 11 日,攻击者利用一个于 2021 年被意外发布到 GitHub 上的数据库密码,复制了迷雾通 PostgreSQL 账户数据库的大部分内容。

对于绝大多数用户,没有任何敏感个人信息被泄露。 注册迷雾通账户无需提供任何联系方式,我们也从不存储浏览记录、银行卡号或支付宝/微信账号。只要您没有购买或收到过礼品卡(也没有使用包含电子邮件地址的旧版用户名),泄露的数据中就不包含您的电子邮件、姓名或其他可识别身份的信息。您唯一需要做的,是更换账户密钥(见下文)。

  • :clock1: 时间: 从 UTC 01:28 起,直至 UTC 03:57 该凭据被吊销。
  • :open_file_folder: 泄露的信息: 账户密钥、旧版密码哈希、支付记录(金额、时间和交易编号等,不含卡号或支付宝/微信账号),以及 1,053 个礼品卡收件人电子邮件地址。
  • :shield: 未泄露的信息: 浏览记录、流量加密密钥和支付卡信息,因为迷雾通从不存储这些信息。
  • :warning: 服务影响: 数据导出引发了数据库锁定故障,导致中介服务器(broker)在 UTC 01:58 至 03:44 期间服务中断。
  • :white_check_mark: 需要您采取的行动: 将迷雾通更新至 5.9.0 版本,并更换您的账户密钥。Plus 用户更换密钥后,将额外获赠 7 天 Plus 时长作为补偿。

泄露了哪些信息?

根据数据库日志,我们可以确定以下信息已被泄露。但在未授权访问期间,耗时不到一秒的查询没有被记录,因此攻击者可能在我们不知情的情况下获取了其他少量信息。

未被泄露的信息请参见我们从未存储的信息。

最主要的泄露信息如下:

  • 账户凭据:
    • 账户密钥:所有账户密钥(明文)及其关联的内部账户 ID。
    • 与账户 ID 关联的身份验证令牌。
    • 旧版用户名、密码哈希及关联的账户 ID。
  • 账户元数据:登录时间戳,以及订阅等级及其开始和结束时间。
  • 支付账单:与迷雾通账户关联的购买金额、时间戳、支付方式和内部使用的的交易编号。
    • 请注意: 这里的“支付记录”仅指订单/发票编号、交易编号这类账单数据,不包括银行卡号、信用卡信息或支付宝/微信账号或单号——这些信息我们从未存储,因此也不可能泄露。
  • 礼品卡信息:
    • 全部 1,053 个不重复的收件人电子邮件地址。
    • 礼品卡兑换码、赠送人姓名、购买账户和兑换数据。
  • 迷雾通 4 旧版基础设施密钥:泄露的旧版凭据中,除 bridge_secret(中介服务器的网桥注册令牌)外均已失效。该令牌现已更换。

我们从未存储的信息

以下信息没有泄露,因为我们的数据库从未存储过它们:

  • VPN 浏览记录或加密密钥:迷雾通从不存储任何用户的浏览记录或隧道加密密钥。
  • 用户联系方式:电子邮件、电话号码、地址等。注册迷雾通账户无需提供任何联系方式,因此我们没有可存储的联系信息。例外: 礼品卡收件人的电子邮件,以及包含用户电子邮件地址的旧版用户名。
  • 可识别身份的支付信息:我们从不存储银行账号、信用卡信息以及支付宝/微信支付账户。

用户需要做什么

迷雾通账户密钥通常无法让攻击者获取任何敏感信息。但是,攻击者可以随时登录任何现有账户,消耗用户的流量和设备数量限额。

只要您在攻击者之前更换账户密钥,您的账户就不会受到攻击者的影响。我们在 5.9.0 版本中设计了一项功能,可自动完成这一过程:

更换您的账户密钥

  1. 将迷雾通更新至 5.9.0 版本。 迷雾通会提示您更换账户密钥:


迷雾通提示您更换账户密钥。
2. 保存新密钥,确认后继续。 旧密钥将失效,您的其他设备也将无法继续使用。


您的新密钥。(图中显示的密钥仅为示例。)

  1. 在您的每台其他设备上,使用新密钥登录。 迷雾通会检测到旧密钥已被更换;请选择“我在其他设备上更换了”,然后输入新密钥。


迷雾通检测到旧密钥已失效。


使用第一台设备上显示的新密钥登录。

  1. 如果您有旧版用户名和密码,更换账户密钥后它们将失效。如果您在其他服务中也使用了该密码,请在那些服务中修改密码。

:gift: Plus 用户: 为补偿给您带来的不便,更换账户密钥后,您的账户将额外获赠 7 天 Plus 时长 。

如果有其他人更换了您的密钥

目前我们尚未发现任何恶意篡改账户的行为。但是,如果攻击者在您之前更换了您的密钥,您将被退出登录且无法重新登录。如果迷雾通显示“此密钥已被更换”,而您并没有自己更换密钥,请选择“不是我操作的”,然后:

  • 免费用户: 退出登录并创建新账户。
  • Plus 用户: 创建新账户,然后发送邮件至 [email protected],将剩余的 Plus 时长转移到新账户。邮件中请提供:
    1. 您的旧账户密钥
    2. 您的新账户密钥
    3. Plus 套餐的付款凭证

事件经过

数据库凭据是如何泄露的?

我们发现,泄露的凭据于 2021 年被意外上传到了 GitHub 上的这个网站计费源代码文件 中。


GitHub 上公开的 racket/billing.rkt 中的数据库连接设置。

过去 5 年间,数据库凭据从未更改;但 2026 年 9 月 11 日的入侵是已知唯一一次对迷雾通数据库的未授权访问。

具体发生了什么?

日志显示,有两个 IP 地址对数据库进行了未授权访问。

其中一个客户端似乎是 Navicat (一款常见的数据库管理工具),它以交互方式查询了数据库,其中包括对旧版 secrets 表的一次完整读取。

另一个客户端自称为 pg_dump,试图导出整个数据库。两者都使用了数据库管理员凭据进行身份验证。我们不知道这两个地址是否由同一人操作。

随后,这次导出导致了中介服务器服务中断:

  1. 长时间运行的全库导出在出口服务器注册表上持有读锁。
  2. 几分钟后,中介服务器对该表启动了例行的 VACUUM FULL 维护操作。该操作请求排他锁,并排在导出之后等待。
  3. 此后,中介服务器的读写操作都排在这个等待中的维护操作之后。
  4. 被阻塞的请求占满了中介服务器的上游连接容量。失败和重试急剧增加,产生了大量短时 HTTPS 连接。
  5. 主机的网络连接跟踪(conntrack)表被占满,内核开始丢弃数据包。

我们的团队首先注意到连接跟踪表已满,并扩大了该表的容量;这缓解了网络症状,但没有解决数据库锁死的问题。


服务中断前、中、后的中介服务器 RPC 延迟。

服务中断期间:

  • 新建连接、重新连接以及其他依赖中介服务器的操作受到影响。
  • 已建立的隧道继续转发流量。
  • 由于流量额度无法补充,Plus 连接可能出现降速。

UTC 03:40 终止等待中的维护会话后,中介服务器的查询恢复执行;导出会话于 03:42 被终止。中介服务器在 03:44 前恢复正常。

攻击者是谁?

我们只知道攻击者从 2 个香港 IP 地址访问了数据库,一个属于阿里云,另一个属于 StarCloud。这些是云主机地址,其所在地并不代表攻击者的实际位置。本报告通篇使用“攻击者”一词,但我们并不知道涉及的是一人还是多人。

来源 IP 客户端 AS 号 注册网络
154.31.217.202 pg_dump AS18186 StarCloudGlobal-HK
47.242.228.124 Navicat AS45102 ALIBABA CLOUD-HK

时间线

以下时间均为 2026 年 9 月 11 日的 UTC 时间。

时间 事件 执行方
01:28 首次记录到来自 Navicat 来源的未授权数据库身份验证;随后成功建立了主数据库会话。 攻击者
01:51 未授权的 pg_dump 导出会话建立连接。 攻击者
01:58 出口服务器表的维护操作被导出阻塞,中介服务器的查询开始积压。 迷雾通中介服务器
02:06 内核开始报告网络连接跟踪表已满。 迷雾通中介服务器
02:10 Navicat 完成了对 secrets 表的直接查询。 攻击者
03:40 等待中的维护会话被终止;被阻塞的中介服务器查询恢复执行。 迷雾通团队
03:42 未授权的 pg_dump 导出会话被终止。 迷雾通团队
03:44 最新的响应采样显示中介服务器已恢复。 迷雾通中介服务器
03:57 数据库管理员密码被重置。 迷雾通团队

补救措施

遏制

  • 清除了攻击者的访问权限。 数据库管理员凭据已于 UTC 03:57 被吊销。由于非管理员数据库凭据可通过管理员权限获取,我们也停用了所有非管理员数据库凭据。
  • 吊销了已泄露的网桥注册密钥,使攻击者无法注入虚假网桥来监视用户流量。
  • 暂时停用了删除用户功能,以防攻击者破坏用户账户。目前我们尚未发现任何恶意篡改账户的行为。待大多数用户更换账户密钥后,我们将重新启用该功能。
  • 迷雾通 5.9.0 中的账户密钥更换功能(参见用户需要做什么)。

加固

  • 账户密钥现以哈希形式存储,不再使用明文,因此即使数据库今后再次遭到入侵,也不会像这次一样泄露全部账户密钥。
  • 数据库访问已通过 IP 白名单进行限制。
  • 旧版用户名/密码登录方式正在逐步停用,因为许多用户设置的密码强度较弱,其哈希很容易被暴力破解。

经验教训

这是我们所知的首次针对迷雾通系统的入侵。以下三项失误导致了这次事件:

  1. 我们将主数据库管理员凭据发布到了公开的 GitHub 仓库中,并且 5 年来一直没有发现。
  2. 我们以明文形式存储账户密钥,而没有进行哈希处理。(我们当初这样选择,是因为账户密钥熵值高、无法猜测,这消除了使用密码哈希的理由之一)
  3. 我们没有按 IP 地址限制数据库访问,否则本可以阻止所有未授权 IP 地址的访问。

由于我们长期坚持尽可能少地收集数据(例如注册时不收集任何联系方式),并对所收集的数据尽量少做记录,数据库中不包含注册联系信息、浏览记录或支付卡信息。

对于此次数据泄露,以及更换账户密钥给所有用户带来的不便,我们深表歉意。我们希望通过对泄露内容和入侵经过保持最大程度的透明,让用户尽可能清楚地了解情况,同时也让我们自己更好地从过去的错误中吸取教训。我们将继续改进数据库管理实践和全系统的安全防御,让迷雾通成为更安全的 VPN。

– @nullchinchilla + @thisbefruit,迷雾通团队

网络安全 101:

1.数据库不要暴露在公网
2.不要硬编码凭证

迷雾通团队两个雷全踩了,幸好它们不记录太多信息。