# 需求文件干净无害？真正的陷阱藏在 Git 钩子里

**Summary:** 一份伪造的编程作业将下载器藏在 Git 元数据中，这让我现在对待陌生项目压缩包时，会在首次打开编辑器或执行 Git 操作前就将其视为不可信。

- Canonical: https://markhuang.ai/zh/news/clean-requirements-git-hook-trap
- Language: zh-CN
- Author: [Mark Huang](https://markhuang.ai/about)
- Published: 2026-07-24
- Section: News
- Tags: 网络安全, 开发者工具, Git, 招聘骗局, 恶意软件
- Source: [Appaji C.](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/)
- License: https://creativecommons.org/licenses/by-nc/4.0/

---

伪装成编程作业的恶意 Git 钩子

## 这份 offer 看起来很靠谱

![六个画面依次展现了这起招聘骗局：从主动找上门的 Python 岗位、异常高的月薪，到看似可信的公司名、精致的作业包、表面普通的后端代码，最后是 Mark 在信任压缩包前及时停手。](https://cdn.markhuang.ai/news/clean-requirements-git-hook-trap/comic-page-01.webp)

**Mode:** 事实陈述

Appaji C. 报告称，有猎头主动提供了一个远程 Python 职位，月薪高达 10,000 至 15,000 美元。声称的雇主是一家 Y Combinator 孵化的初创公司，编程作业以精致的 PDF 和 Google Drive 上的项目压缩包形式发送。这种速度让我不安：越是看着靠谱的来历，越容易让人对一个陌生压缩包放下戒心。

### Panels

1. Mark 在笔记本电脑上查看空白消息卡片，代表文中描述的主动 LinkedIn 招聘信息。 (caption: 报告始于一条主动发来的 LinkedIn Python 工作邀约。)
2. 笔记本电脑、合同文件夹和高高堆叠的硬币，象征该远程职位异常丰厚的月薪。 (caption: 职位承诺远程工作月薪 10,000 至 15,000 美元。)
3. Mark 思考着一家光鲜的初创公司办公室和一个空白工牌，象征这家公司借来的名气。 (caption: 所声称的公司是一家 Y Combinator 孵化的初创企业，增加了可信度。)
4. 一份简历快速通过审批关卡，进入云端文件夹和压缩包。 (caption: 随后通过 Google Drive 发来了一份精致的 PDF 和项目压缩包。)
5. 一个普通文件夹旁放着由中性连接块组成的整洁后端架构模型。 (caption: 最初看来，可见的后端代码和依赖列表都很普通。)
6. Mark 在触碰位于开放式机械陷阱中的项目方块前举起了手。 (thought: 包装再精致，也不等于我可以放心打开。)

### Sources

- [Appaji C.：伪造面试 Git 钩子调查](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/)

---

## 陷阱藏在代码之下

![六个画面从干净的依赖检查深入到隐藏的仓库元数据、恶意的 pre-commit 钩子、针对不同操作系统的下载机制、远程载荷，以及源作者推断出的用于触发钩子的 Git 任务。](https://cdn.markhuang.ai/news/clean-requirements-git-hook-trap/comic-page-02.webp)

**Mode:** 技术机制

压缩包中可见的 FastAPI 项目和 requirements 文件看起来都很普通。但列出隐藏文件后，发现了一个捆绑的 .git 目录，里面包含多个钩子，其中 pre-commit 脚本会根据操作系统选择下载命令并获取远程代码。Git 文档指出 pre-commit 是由 git commit 触发的钩子，这也解释了为什么包含 Git 任务的作业能提供触发条件。

### Panels

1. Mark 将普通软件包清单与可见的项目结构进行对比。 (caption: requirements 文件中没有明显的恶意软件包。)
2. Mark 打开文件树下方的隐藏抽屉，发现了一个藏起来的仓库文件夹。 (caption: 列出隐藏文件后，发现了一个捆绑的仓库目录。)
3. Mark 指向黑暗柜子中众多钩子机制里的一个活动杠杆。 (caption: 它的 pre-commit 钩子直接从一个裸 IP 地址下载代码。)
4. 一个触发器分叉指向三种计算机，然后连接到远处的红色端点。 (caption: 该钩子会根据目标操作系统选择对应的载荷。)
5. Mark 远离电脑，看着一个红色包裹沿着线缆进入电脑内部的隐藏齿轮。 (caption: 一次 commit 就能在业务代码运行之前触发下载。)
6. 空白的作业图将几个类 Git 操作引向触发杠杆，Mark 认出了其中的关联。 (caption: 作者推断这些 Git 任务就是为了触发钩子。)

### Sources

- [Appaji C.：钩子与载荷分析](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/)
- [Git 文档：hooks](https://git-scm.com/docs/githooks)

---

## 下载器清晰，动机模糊

![六个画面追踪 Linux 下载器到第二阶段脚本，展示服务器按请求标识符返回不同响应，检查可疑依赖项，区分已观察到的行为与推测，最终指向一台开了三个端口却查不出幕后身份的服务器。](https://cdn.markhuang.ai/news/clean-requirements-git-hook-trap/comic-page-03.webp)

**Mode:** 证据与边界

作者直接记录到一个 Linux 脚本先保存再启动了第二个载荷，随后安装工具、跑起一个混淆过的解析器。换掉请求标识符，服务器返回的脚本也跟着变，说明对不同目标做了定制。这些依赖项让人合理怀疑它在偷凭证或加密货币，但文章既没坐实最终目的，也没查出背后是谁。我的判断到此为止。

### Panels

1. Mark 将一个密封的红色载荷放入文件抽屉，旁边是一个隐藏的背景齿轮。 (caption: 第一个脚本保存并启动了第二个 Linux 载荷。)
2. Mark 在代表混淆解析器的缠绕丝带旁组装运行时模块和软件包盒子。 (caption: 该阶段安装了工具并启动了一个混淆的解析器。)
3. 四个不同的身份令牌到达同一台服务器，收到四个不同颜色的密封包裹。 (caption: 更改请求标识符会返回不同的脚本。)
4. Mark 将空白的依赖关系图与剪贴板和加密开发符号进行比较，但未确定最终目的。 (caption: 可疑的依赖项暗示可能在偷东西，但没有实锤。)
5. Mark 在明亮的证据边界前停下，一边是观察到的下载器阶段，另一边是未知的黑暗目标。 (thought: 我能追踪下载过程，但无法确定最终目标。)
6. 一个带锁的服务器机柜在冷清的线索尽头亮着三个连接端口。 (caption: 三个开放端口并未揭示服务器的运营者。)

### Sources

- [Appaji C.：分阶段载荷证据](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/)
- [Paradane：独立的伪造面试活动分析](https://paradane.com/blog/ming-or-job-scam-malware-campaign)

---

## 已知模式，未知幕后

![六个画面将报告的样本置于自 2022 年 12 月以来记录的招聘恶意软件模式中，比较了几种执行路径，保留了对行为者归因的限制，展示了受限编辑器，并将信任决策提前到每个开发者工具之前。](https://cdn.markhuang.ai/news/clean-requirements-git-hook-trap/comic-page-04.webp)

**Mode:** 公开背景

微软表示，“传染性面试”攻击活动至少从 2022 年 12 月就开始运作，它利用精心设计的招聘流程诱使开发者运行恶意软件包或命令。这一背景使本报告显得合理，但并未证明谁运营了这个特定服务器。VS Code 的受限模式很重要，因为在审查陌生文件夹时，它会限制任务、终端、调试、工作区设置、扩展和代理。

### Panels

1. 一条长路将几次精心设计的招聘接触引向远处密封的编程练习盒。 (caption: 微软将此攻击模式追溯到 2022 年 12 月。)
2. 四个招聘阶段在剧场中展开，而一个隐藏的机械陷阱在最后一步下方等待。 (caption: 这套诱饵就是照搬正常招聘流程。)
3. 三个密封的作业盒分别连接到软件包齿轮、Git 钩子杠杆和编辑器任务齿轮。 (caption: 软件包、Git 钩子和编辑器任务都可能成为触发器。)
4. Mark 在报告的压缩包周围画出明亮的证据边界，而一个未识别的阴影留在边界之外。 (caption: 这个样本符合已知模式，但背后是谁还没证据。)
5. Mark 在受限工作区中查看一个陌生的密封文件夹，旁边是未连接的工具和空白的黑色显示器。 (caption: 受限模式限制了任务、终端、调试和代理。)
6. Mark 在未打开的作业文件夹和未激活的开发者电脑之间的闸门前停下。 (thought: 我要在任何开发工具跑起来之前，先决定信不信这个项目。)

### Sources

- [微软安全：传染性面试](https://www.microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews/)
- [Visual Studio Code：工作区信任](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust)
- [Appaji C.：报告的样本](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/)

---

## 先检查，再信任

![六个画面将调查转化为更安全的编程作业工作流程：隔离压缩包、在打开编辑器前检查隐藏文件、检查可能的执行点、远离凭证、监控隔离运行，并保护主工作站。](https://cdn.markhuang.ai/news/clean-requirements-git-hook-trap/comic-page-05.webp)

**Mode:** 实操建议

我现在只在一次性隔离环境中打开招聘方提供的代码，然后在使用编辑器或运行 Git 前检查隐藏目录和可能的执行点。微软建议对编程测试使用非持久性虚拟机，让它们远离生产凭证，并监控可疑命令或网络活动。干净的依赖文件只是其中一项检查。

### Panels

1. Mark 将密封的作业压缩包放入与主计算机断开连接的透明沙箱中。 (caption: 在一次性隔离环境中打开编程作业。)
2. Mark 在打开编辑器前，用放大镜检查透明文件树的每一层。 (caption: 在编辑器中打开项目前，先检查隐藏目录。)
3. Mark 检查三个抽象的执行面，分别由钩子、任务齿轮组和软件包生命周期表示。 (caption: 首先审查钩子、编辑器任务和软件包生命周期脚本。)
4. 一堵石墙将 Mark 和几个凭证形状的钥匙与隔离的测试环境分开。 (caption: 让生产凭证和长期令牌远离那台机器。)
5. Mark 观察密封的作业在透明沙箱中运行，同时抽象的网络脉冲保持可见。 (caption: 仅在检查后运行，并持续监控网络活动。)
6. Mark 平静地审视一条受保护的路径，从密封压缩包到检查门再到隔离执行，远离他的主计算机。 (thought: 作业可以等；我的工作站不该冒这个险。)

### Sources

- [微软安全：防御建议](https://www.microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews/)
- [Visual Studio Code：受限模式](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust)
- [Git 文档：pre-commit 钩子](https://git-scm.com/docs/githooks)
