Kurt 上钩了

Fly.io 的官方 Twitter 账号被黑:CEO Kurt Mackey 遭钓鱼攻击,攻击者借机拿到了账号控制权。官方表示除账号外没有其他系统或数据受损,并说明了事后处置。

中文
复制
插画:一个钓鱼钩挂着一封信,旁边是被钓走的账号

图片作者 Annie Ruygt

$FLY 空投上线了!快来领取属于你的份额——这枚代币驱动着 Fly.io 覆盖 300 多万应用的全球网络,(🤮) 拥有一片天空!

我们知道。我们的 Twitter 账号被黑了。事情发生的那一刻我们就知道了。我们完全清楚它是怎么发生的。除了我们的 Twitter 账号(以及一位 Fly.io 员工的自尊心),没有任何东西受到威胁。另外:他妈的。

事情是这样的:我们那位胆识过人的 CEO Kurt Mackey 中了钓鱼攻击。 如果这是一次有实质影响的攻击,我们不会用这种轻佻的口吻。但就这件事而言,换任何别的语气都是装。

他们是怎么拿下 Kurt 的

两个原因:一,这是一次相当高明的钓鱼攻击;二,Twitter 不在我们“认真对待”的范围之内。

这次钓鱼之所以奏效,是因为它利用了我们管理层一个深层的心理弱点:我们老了,跟今天的年轻人脱节了。

好几个月来,我们一直让一位承包商/实习生之类的人在 Twitter 上替我们 Boosting Our Brand,发一些 dank developer memes(我猜是这么叫的)。问题在于,这种 dank 玩意儿我们其实看不太懂。我是说,打住——从技术上讲,我们知道这些 meme 是什么意思。我们只是不明白它们为什么好笑。

然而,要想反对它们,我们得面对两股强大的力量:

  1. 这些 dank meme 的表现似乎比我们自己发在 Twitter 上的东西更好。
  2. 我们的 Z 世代孩子一再告诉我们,在这类事情上我们太 cringe,不值得信任。

这就是 Kurt 收到的钓鱼邮件:

一封看起来相当可信的 Twitter 警告

太狠了。就像一把手术刀,精准地切向 Kurt 作为一个中年男人最深的insecurity。我们那些冷酷无情的攻击者精心设计这封邮件,就是为了触发 Kurt 的自主反应:“操,这是什么,我们为什么发了它?” ATO 是潮人说法,意思是“被拿下了”

这里我讲得有点太快了。我们之所以知道 X.com 账号遭遇了 ATO,是因为我们中有几个人同时收到另一封邮件,说 @flydotio 账号的邮箱地址现在指向了 achilles19969@gmail.com。我们的第一反应是审计 1Password 中登录信息的所有访问记录,并切断所有近期调用过该信息的人的访问权限;在这种情况下,最坏的假设就是某人的终端已经被攻陷。

所幸没有人被切断访问太久。我打电话给 Kurt,告诉他为什么会被锁在外面,5 秒后他就意识到发生了什么。那里什么都别点。

为什么它会奏效

这才是该问的问题,对吧?这事情一开始怎么可能会发生?

与一种流行观点相反,靠训练人们不要点击东西是打不败钓鱼的。我是说,当然要告诉他们别点!但最终,在持续的压力下,每个人都会点。这是有科学依据的。真正懂行的人已经好几年不做钓鱼模拟训练了。

你该做的是使用抗钓鱼认证。这几乎就是 U2F、FIDO2 和 Passkeys 的全部背景故事。

抗钓鱼认证靠的是双向认证(或者,如果你较真,靠的是来源绑定和通道绑定)。钓鱼攻击是凭据的恶意代理。像 FIDO2 这样的现代 MFA 方案会打断这种代理流程;你的浏览器不会把真实凭据发给假网站。 这里面还有更多细节,但大致如此。

事实上,Fly.io 的所有基础设施都是这样保护的;具体来说,我们把所有东西都放在一个 IdP 后面(我们用的是 Google 的),并要求使用防钓鱼的 MFA。你不太可能靠钓鱼在这里查看日志、在 Stripe 上给客户账单退款,或者查看基础设施指标,因为所有这些都需要通过 Google 进行 SSO 登录。

至于 Twitter,嗯,那就得说说这个了。你可能听说过,几年前 Twitter 出过一些事。Fly.io 的很多人搬去了 Mastodon,后来又去了 Bluesky。在 2023 到 2024 年有一段时间,看起来 Twitter 对我们来说可能根本就不是一个长期选项。 † (我真诚地向此人道歉,因为我曾假设其终端已被攻陷,并且是这次入侵的直接原因)

于是,Twitter 对我们来说一直算是个历史遗留的共用账号,凭据存在 1Password 里,和我们的 Z 世代外包†共享。

所以 Kurt 才能在收到 alerts-x.com 的邮件后,从 1Password 里取出凭据,登录 members-x.com。 不过话说回来,这本可以用基本卫生习惯避开的:Kurt 抱怨说 “x.com” 是个极易被钓鱼的域名,这话没错,但还有一点:1Password 的浏览器插件本该发现 “members-x.com” 并不是 “x.com” 的主机。

为什么拖了这么久

攻击者立刻吊销了所有 token 并重新设置了 2FA,所以我们虽然很快就能重置密码,却没法在不借助 X.com 干预的情况下把他们踢出账号,而这一干预花了大概 15 个小时才搞定。

(这不是在挑 X.com 的刺;15 小时处理一次 2FA 重置并没有超出行业常规。)

我们现在显然在大张旗鼓地讲这件事,但事发当时我们相当安静(除了那句“我们知道。事发 45 秒后我们就知道了。我们完全清楚是怎么发生的。就是 Twitter 那点破事。”)

因为从大局来看,这次攻击相当温和:一个不太可信的加密货币骗局,估计给攻击者带来了 0 美元收入、15 个多小时的brand damage,以及额外烧在警戒等待上的安全工程时间。我们的用户没有受到攻击,账号也没有被用来进一步拦截客户账号。有一刻,攻击者似乎把我们整个 Twitter 历史都删了,怎么说呢,别拿好事来威胁我们。所以我们任由它去,直到第二天早上把账号找了回来。

这个故事告诉我们

“对我来说最大的收获其实是,Kurt 会看自己的邮件。”

显然 Kurt 失去了他的提交权限。每个 CEO 都会等到这一天,现在轮到他了。

另外,我们下一次 SOC2 终于会有“事件响应”的样本数据了。

也许我们会在 Twitter 上多发点东西。也许我们会加倍投入 Z 世代梗图。我不知道。社交媒体现在真的很怪。不管怎样:我们的 Twitter 访问现在用 Passkeys 了。 说真的,别点那个页面上的任何东西

如果你当时动了心,想参与我们那个 Fly.io 的“空投”、去“领取一份”支撑它的“代币”,网站现在还开着。你可以把钱包连上去!你会赔光所有的钱。但就算我们真做了 ICO,你照样会赔光所有的钱。

策划这起攻击的人里,总得有人想出“拥有一片天空!”这句文案,我觉得这惩罚已经够重了。

不管你手上跑着什么,只要它背后没有抗钓鱼的 MFA,或者更好一点,没有一套要求抗钓鱼 MFA 的 SSO IdP:那东西迟早会被钓鱼。你要围观我们这场灾难的小丑之火,随你,但也请把我们当成一个教训。

来源: Fly.io← 返回首页