资讯社区动态

一道面试作业题,怎么成了 63 亿美元被盗的入口

一家海外交易平台公布被盗约 63.4 亿美元的调查:攻击链的关键一步,是一名在职工程师在工作电脑上做了一道假面试的作业题。本文拆开这道作业从哪一步开始执行别人的代码,以及求职时怎么把面试和工作环境分开。

开发者Club
假面试求职安全面试作业恶意代码npmVS Code
阅读 —收藏 —

11 月 3 日,一家海外大型交易平台公布了 10 月 29 日被盗事件的初步调查结果,被盗资产约 63.4 亿美元。截至 10 月 31 日,这家公司已经用储备金等资金补足了其中 98% 的受影响资产,FBI 把这次攻击归到了一个叫 TraderTraitor 的黑客组织名下。

这件事估计大部分人都已经看过了。不过调查报告里有一个细节,和每个找过工作的程序员都有关系:攻击链里最关键的一步,是这家公司的一名工程师在工作电脑上做了一道面试作业题。

两轮面试、一份作业,攻击者准备了好几个月

动画:一道面试作业像第一张多米诺被推倒,一路推倒工作电脑、同事电脑和部署令牌,最后撞开机房门

我们根据几家媒体转述的公司调查报告,把时间线梳理了一下:

  • 6 月:一名负责资金系统运维的工程师在找 AI 编程工具时,装了一个被篡改过的 Homebrew(macOS 上常用的软件包管理工具)。安全团队发现后给他换了电脑、重置了账号凭证。不过攻击者已经知道了他的岗位,以及资金系统团队里有哪些同事。
  • 9 月:另一名软件工程师在一个正规的求职平台上,被一个自称「项目总监」的人联系。对方先安排了一轮 HR 视频面试,面试官还给他看了自己的社交账号,上面有照片和视频,以此来取得信任。第二轮换到另一款常用的聊天软件上,和一位自称公司 CEO 的人进行面试。这位「CEO」让他下载一份代码仓库作为作业,而这名工程师是在公司配发的工作电脑上打开它的。
  • 10 月 20 日:攻击者利用这台被控制的电脑和公司内部的一个 AI 工具,又控制了另外两名工程师的电脑,并在其中一台上找到了一个容器部署令牌,也就是一个可以直接往生产环境部署服务的权限凭证。
  • 10 月 29 日:攻击者用这个令牌部署了容器,运行了转移资产的脚本。

从 6 月第一次得手到 10 月底动手,攻击者前后花了四个多月。这家公司的联合 CEO 也说,攻击者「花了好几个月一步步渗透进来」,他不认为问题能归到某一个员工的笔记本电脑上。

用公司电脑面试是错的,但换成私人电脑也躲不过

这条消息在 Hacker News 上引起了很多讨论,排在前面的不少评论都在说:怎么会有人用公司电脑去做别家公司的面试题?

用工作电脑做私人的事情当然是错的,这一点没有什么争议。不过评论区里也有人提出了另一个问题:如果这名工程师当时用的是自己的私人电脑,私人电脑一样会中招,只是被盗的东西不一样而已。

Hacker News 上一条关于私人电脑也会中招的评论 图注:Hacker News 网友 flerchin 的评论,意思是:就算没用工作电脑,私人电脑一样会被攻破;一边在职一边找工作时,怎么保护好自己并不清楚。

把这件事拆开看,会发现它分成两层:

  • 第一层是招聘流程本身:攻击者用的每一步都是正常的技术招聘流程。从在正规平台上被联系,到 HR 先面、和老板聊,再到拿一道带回家的作业题,几乎所有程序员都经历过。这名工程师并没有点开什么奇怪的链接,他只是按面试的要求做了一道题。
  • 第二层才是公司的防线:有一位网友指出,这么大的公司,部署本来应该只通过 CI 流水线来做,一个能直接部署容器的令牌存在工程师自己的电脑上,比用公司电脑面试更危险。公司的调查报告也承认,那段恶意代码当时没有被公司的终端安全软件发现。

第二层是公司的事,普通从业者能控制的是第一层。所以接下来,我们就重点来分析一下这道作业题是怎么起作用的。

下载作业、装依赖、跑起来,从哪一步开始执行了别人的代码?

一道面试作业从打开文件夹、npm install 到运行项目的三个执行时机,前两个发生在运行项目之前

公司没有公开这名工程师具体是在哪一步触发的恶意代码,只说代码执行之后,把 Homebrew 目录里的 pyenv(一个管理 Python 版本的工具)换成了恶意版本,再借它启动终端进程,接收攻击者服务器发来的命令。如果你在终端配置里加了 pyenv 的初始化,每次打开终端都会调用它,所以换掉 pyenv 就等于在电脑上留了一个长期的后门。

这类假面试攻击已经持续了好几年,安全公司给它起了一个名字叫 Contagious Interview。从公开的分析来看,一道作业题至少有三个时机会执行别人的代码,其中两个发生在你正式「运行项目」之前:

  • 装依赖的时候:npm 包可以在 package.json 里定义 preinstall、postinstall 这类安装脚本,你执行 npm install 的那一刻,这些脚本就已经跑起来了。安全公司 Socket 在 2025 年 10 月统计过,和这个活动有关的恶意 npm 包已经有 338 个,累计下载超过 5 万次。投放方式就是在 LinkedIn 上冒充招聘人员,发一个仓库当作面试作业,再催一句「先 npm install 跑起来看看」。
  • 代码被引用的时候:有些恶意包不靠安装脚本,而是在被 import 的时候执行。所以哪怕你装依赖时关掉了脚本,只要运行了项目,代码还是会执行。
  • 用编辑器打开文件夹的时候:仓库里可以放一个 .vscode/tasks.json,把任务设置成打开文件夹时自动运行。如果你在弹窗里点了「信任这个工作区」,任务就会直接执行。2026 年还有安全公司报告过,有黑客组织专门用这种方式投放恶意代码。

最后一种需要单独说一下:VS Code 在今年 2 月发布的 1.109 版本里,已经把 task.allowAutomaticTasks 这个设置的默认值改成了关闭,所以新版本里自动任务默认不会跑。不过如果你以前手动打开过这个设置,或者用的是其他基于 VS Code 改的编辑器,它们是否跟进了这个默认值并不确定,最好自己去设置里搜一下确认。

VS Code 1.109 更新说明中自动任务默认关闭的小节 图注:VS Code 1.109 版本更新说明。为了防止打开工作区时意外执行 tasks.json 里的任务,task.allowAutomaticTasks 的默认值从 on 改成了 off,想恢复旧行为需要在用户设置里手动改回 on。

对求职者来说,这意味着:收到一道作业题,其实就是有人请你在自己的电脑上运行他写的代码。你在面试官面前要表现得配合和高效,攻击者正是利用了这一点。

简历上的公司名,也是攻击者筛人的条件

那攻击者为什么偏偏找上了这名工程师?报告里的说法是,他的求职资料上写着现在这家公司的名字,这让他成了一个有价值的目标。再加上 6 月那次入侵,攻击者已经拿到了资金系统团队的人员名单。

这家公司的发言人后来表示,公司规定不面向公众的岗位,员工不能保留 LinkedIn 资料,但拒绝说明这名工程师是否违反了规定,也没说会不会处分他。

这里有一个很难两全的地方:对公司来说,员工公开写自己在哪个团队、做什么,等于把内部结构告诉了外人;但对员工来说,不写清楚经历,猎头和招聘方就找不到你。大部分人在职看机会,靠的恰恰是这份公开的履历。

这也是这类攻击和普通钓鱼邮件不一样的地方。普通钓鱼是广撒网,假面试是按简历挑人。你的公司越值钱、你的岗位权限越高,你收到的「好机会」就可能越精准。如果你在金融、支付这类行业,或者做云平台运维、手上有生产环境权限,尤其要对主动找上门的机会多留个心眼。

准备一台只用来面试的机器,遇到这几种要求就停下

自己能做的事情,主要是把面试和日常工作的环境彻底分开:

  1. 面试作业永远不在工作电脑上做。这一条没有例外,哪怕作业看起来只是一个很小的前端页面。
  2. 最好也不在存着重要账号的私人电脑上做。可以用一台旧电脑专门面试,或者开一个虚拟机,或者用 GitHub Codespaces、腾讯云 Cloud Studio 这类云端开发环境,做完就删掉。云端环境里就算中了招,丢的也只是一台临时机器。
  3. 打开仓库之前先看几个文件:package.json 里的 scripts,尤其是带 install 字样的几项;.vscode 文件夹里有没有 tasks.json;依赖列表里有没有名字和常见库很像、但你没见过的包(比如在 express 后面多了一个后缀)。
  4. 装依赖时先关掉安装脚本:用 npm install --ignore-scripts,这样 postinstall 这类脚本不会执行。不过前面说过,代码被引用时仍然可能执行,所以这一步只能减少风险,不能代替隔离环境。
  5. 编辑器弹出「是否信任此工作区」时,先选不信任,用受限模式把代码看完再决定。

另外,招聘流程里的这几种情况,都值得先停下来核实一下:

  • 面试从正规平台转到了私人聊天软件上,而且是「老板」亲自发作业。
  • 作业要求在你自己的电脑上完整跑起来,而不是在线编辑器或者只交代码。
  • 对方催得很急,比如要求半小时内跑通,或者说「先装好依赖,我们马上开会看」。
  • 公司官网、工商信息、邮箱域名对不上,或者公司成立时间很短、却说自己在做很大的项目。

核实的成本并不高:去公司官网找招聘页,看这个职位是不是真的存在;用公司官网上的公开联系方式,问一句这个人是不是他们的员工。如果对方是真的招聘方,正常的公司一般不会因为你多问一句就取消面试。

回到这次事件,攻击者从 6 月准备到 10 月底,中间要一步步拿到电脑、账号和部署权限,每一步都得成功。而这名工程师在整条链里做的,只是一件求职者几乎都做过的事:打开一道面试作业。如果当时作业是在一台临时的云端环境里打开的,攻击者很可能就拿不到通往公司内部的那台电脑。所以下次再收到一个仓库链接当作业,可以先把它放进云端环境或虚拟机里,再决定要不要在自己的电脑上运行。

资料来源:

  • BleepingComputer 对此次事件调查报告的报道,2026 年 11 月 3 日
  • The Register 对此次事件调查报告的报道,2026 年 11 月 3 日
  • Help Net Security 对此次事件调查报告的报道,2026 年 11 月 4 日
  • CNBC 对涉事公司联合 CEO 的采访报道,2026 年 11 月 3 日
  • Fortune 对此次事件中求职平台细节的报道,2026 年 11 月 3 日
  • Socket 关于 Contagious Interview 活动恶意 npm 包的分析,2025 年 10 月 10 日
  • Visual Studio Code 1.109 版本更新说明,https://code.visualstudio.com/updates/v1_109
  • Trend Micro 关于假面试代码仓库攻击的分析(经 VPNCentral 转述)
  • Hacker News 讨论;配图中的评论,https://news.ycombinator.com/item?id=50367452

评论

登录后即可发表评论

登录账户

加载评论中...