我检查了面试的家庭作业项目,发现它是一整套攻击行动
文章摘要
作者收到了一份看起来完全正常的招聘”家庭作业”(take-home)项目——一个 FastAPI 项目,附带一份 PDF 作业说明。出于打 CTF 养成的习惯,他用 tree -a 检查了隐藏目录,结果发现这份作业里带着一整套隐藏的恶意基础设施。
恶意代码藏在项目自带的 .git 目录里的 Git hooks 中。仓库本身是从一个公开的 GitHub 项目(一个个人理财服务)克隆来的,然后被武器化。关键的激活手法非常狡猾:作业 PDF 里刻意安排了 git 相关的任务,正如作者所说,”他们要确保候选人至少会执行其中一条 git 命令,这样 hooks 就会被触发”。
pre-commit hook 里包含操作系统检测逻辑(case "$(uname -s)"),用来判断受害者跑的是 macOS、Linux 还是 Windows,每个分支都会用 curl 或 wget 从 IP 地址 45.61.164.38:5777 拉取对应的远程载荷,请求里还带一个标识参数(id=402)。
载荷是多阶段架构。第一阶段是 pre-commit hook 拉取初始的 Linux 载荷。第二阶段的 tokenlinux.sh 以 tokenlinux.npl 的名字下载、重命名为 .sh,然后通过 nohup 在后台执行;这一阶段负责安装 Node.js、配置系统路径并下载后续文件。第三阶段是重度混淆的 parser.js,值得注意的是它是按追踪 ID 为每个受害者单独提供的——这说明这是针对个人定制的钱包窃取,而不是通用的挖矿程序。
package.json 里的依赖进一步暴露了意图:clipboardy(剪贴板访问)、hardhat(以太坊开发工具)、execp 以及进程管理工具,都指向针对加密货币钱包或浏览器扩展的窃取,而非传统挖矿。
在 OPSEC 方面,攻击者使用裸 IP 而非域名——作者调侃这个选择”简直在大喊’我是恶意软件’“。他还对服务器做了 nmap 扫描,发现跑着 OpenSSH 9.6p1,当时没有可利用的漏洞。他也提到这场攻击活动存在其他变种:有受害者收到的是配了 launch 命令的 .vscode 目录,只要在 VS Code 里打开项目就会自动执行,完全不需要手动跑任何 git 命令。文章将其定性为一场利用招聘流程投递定制化恶意软件的成熟社工行动,背后是朝鲜(DPRK)APT 组织。
HN 评论精华
-
IvanGoncharov 贡献了整个讨论中最令人不安的一条:读完这篇文章他才发现自己被黑了,而且手法更为高明。几周前他和一家”完全正规的公司”的 CTO 面了一场——对方关了摄像头、口音很重,但其余一切都像正常的筛选面试,而且那个人明显知道自己在讲什么。面试结束时对方解释说,技术面需要他对他们的项目(一个开源产品)做些修改,于是让他先克隆仓库把环境配好。之后 HR 说 CTO 病了,面试要延期;几天后那个 HR 的 LinkedIn 档案就被删除了。他后来补充细节:面试是通过 Calendly 预约、在 Google Meet 上进行的,持续了 45 分钟,而其他 HN 讨论里都没提到真的和骗子开视频通话,这让这次攻击显得格外老练。他维护着一个每周下载量超过 4300 万的 npm 包,因此判断自己是被刻意挑中的目标。所有地方都开了 2FA 救了他的账号,但他还是决定把笔记本整个抹掉重装。
-
Groxx 和 zeratax 做了一个非常重要的技术澄清,纠正了帖子里的普遍误解:克隆仓库时 git hooks 并不会被自动安装或启用,这是刻意的安全设计,git 把自动安装 hooks 视为严重的安全问题。这次能奏效是因为项目是以 zip 压缩包形式分发的,绕过了这层保护。Groxx 仍然希望 git 能在任何地方执行 hook 前都强制要求先审查。andOlga 给出了具体的加固方案:
git config --global core.hooksPath /dev/null全局关闭 hooks,再按需为单个仓库开启。 -
关于 VS Code 的讨论最为激烈。CM30 指出 VS Code 允许在打开项目时执行自定义代码,”这感觉像是一个非常明显的恶意软件载体”,并批评它缺乏相应的安全缓解措施。Scaled 表示震惊于”信任竟然意味着立刻自动运行脚本”,说自己以后绝不用 VS Code 打开不可信仓库。hyperhello 声称要卸载 VS Code,还质疑它”会不会留下什么还能继续运行的恶意软件”。作者 CITIZENDOT 出来做了准确的澄清:如果用户点了”不信任作者”,VS Code 是不会执行脚本的(他还贴了 VS Code 开发者的回复链接);但问题在于几乎没人真的注意 workspace trust 提示。他的建议很具体:当
.vscode里有 launch 命令时,提示应该改成”信任此工作区将代你执行以下命令”之类的明确措辞。zeratax 则为 VS Code 辩护,认为它的安全处理是正确的——它确实警告了用户,并反问有什么替代 IDE 会更好。denysvitali 补充说他自己 2024 年 5 月的博文就写过用.vscodehooks 针对开发者的 DPRK 定向恶意软件,证实这是一个反复出现的攻击模式。 -
关于如何防御,评论区形成了几条清晰的路线。throwatdem12311 主张彻底拒绝:他不会为了面试去克隆随便的项目,而是要求对方给出规格说明,自己从零写;他认为在 LLM 能覆盖所有技术栈生成代码的今天,这应该成为标准做法。skeptic_ai 认为用 devpod 或虚拟机跑不可信代码现在已是必需,光是随便一个 npm 包就有巨大的破坏潜力。wslh 问是不是应该用招聘方提供的 VM,simoneree 给出了正确答案:不该比信任他们的代码更信任他们的 VM,应该自己开一个一次性的 VM 或容器,不挂任何凭据、不挂宿主目录;虽然从最近的 OpenAI 新闻看沙箱也并非不可破,但至少里面没有值得偷的东西,用完就扔。作者 CITIZENDOT 对此的回应很实在:”是啊,我就是懒。”
-
gtowey 提出了最好记的心理模型:应该用和”银行打电话给你”时一样的防御姿态——当对方主动联系你时,去公司的真实官网投递、联系真实的招聘人员;如果事前无法验证这家企业是否合法,就假定有恶意。这条引来了实务上的反驳:technion 说公司自己把这件事搞得很难,正规公司的沟通经常来自看似随机的域名(点名 PayPal),而且往往公司是真的,但没有任何公开联系人知道这个招聘人员是谁。paxys 更直接:即使这次接触是正规的,跑去官网投递也是徒劳,你的申请会淹没在成千上万份里;最好的办法是要求招聘人员给你发邮件,检查是不是
@<company.com>的域名——而即使验证通过,也不要在自己的机器上跑不可信代码。 -
petterroea 报告了攻击面的扩大:针对开发者的朝鲜攻击明显增多,他每周大约收到一封所谓”合作者”的邮件;他还注意到一些可疑的 Discord 社群,攻击者会在不太可能的地方发布招聘信息,强调这类攻击正是在利用开发者的信任网络。
-
关于 LinkedIn 的责任,darth_avocado 提议:如果 LinkedIn 真在意防骗,就应该用公司邮箱验证在职信息;如果嫌负担太重,至少做成可选功能,让想证明自己正规的招聘人员去合规。作者 CITIZENDOT 回应说 LinkedIn 早在 2023 年就加了这个功能,但真去用邮箱验证的人极少,所以”没有验证标记”并不能作为判断非法的依据。burningChrome 分享了一个反向操作:他和朋友多年来一直创建假档案去”反钓”招聘人员和公司,以搞清楚他们开了什么岗、想要什么样的候选人;JS 框架大热那阵这招对区分正规公司和骗子非常有用,他猜想在如今的 AI 岗位热潮中同样适用。
-
ivanjermakov 对文章里”为什么用裸 IP,这简直在喊恶意软件”提出了合理的反驳:如果受害者已经深入到会去检查 hook 内容的程度,那他不太可能看到这里就打消疑虑;真正的问题是大多数开发者根本不会想到执行
git commit可能是恶意的。lantry 猜测用裸 IP 也许是不想给域名注册商留任何身份信息,或者只是为了最小化在线痕迹。cromka 提出了另一种可能:这些主机自己也是恶意软件的受害者,现在被当作代理使用。 -
floren 从招聘方的角度提供了一个有趣的侧面:虽然 AI 时代让家庭作业题的价值受到质疑,但这些题目有时会触发有用的幻觉——他们上一批招聘就靠一个被幻觉出来的 Go 标准库调用瞬间刷掉了一大批人,那些代码根本编译不过;另外你还可以让候选人当面讲自己的代码,他见过不少提交了好答案却连”sync.WaitGroup 是干什么的”都答不上来的人。
-
ChrisMarshallNY 的开场评论定下了整个帖子的基调:这类事情只会越来越常见,”这些人真的做足了功课;这很恶劣,但我不得不尊重他们的技术。我敢打赌这招经常能成”。LoganDark 冷冷地补了一刀:”他们的’技术’可能只是从某个 LLM 那里借来的。”作者本人则表示:”我到处翻了一圈还挺好玩的,感觉像在做 CTF 题——要是他们服务器上有漏洞就更棒了。”
-
vardalab 和 sailfast 从这件事里提取出一个对 AI 安全护栏的批评:在试图搞清楚自己正在遭受什么样的恶意软件攻击时,Claude 因为各种安全护栏而”完全没法当帮手”。sailfast 认为美国政府对 Fable 的过度反应给了大家一个在防御性能力上被阉割的 AI,”给防御方一个像样的机会吧”。
-
luciana1u 献上了本帖最佳黑色幽默:”到某个时候公司就会意识到,他们可以把整个 backlog 都当成家庭作业发出去,然后彻底裁掉工程部门。”ErroneousBosh 则给出了最硬气的立场:”如果你想雇我,那在我看到你的钱之前,我不想看到你的代码。”