传染性面试:骗子如何利用虚假工作机会部署恶意软件
开发者的现代求职过程通常发生在私信(DMs)中。虽然 LinkedIn 是建立人脉的金矿,但它也已成为复杂社会工程学攻击的主要媒介。开发者 ashishb 最近分享的一个案例揭示了一个令人不安的趋势:骗子冒充招聘人员或创始人,以“技术面试”或“项目评估”为幌子,诱骗技术专家在本地机器上安装恶意软件。
这不仅仅是一个简单的钓鱼链接;这是一种多阶段攻击,利用了开发者对其工具的信任——特别是 GitHub、VS Code 和 npm 生态系统。
攻击解剖:两个案例研究
在两个独立的事件中,作者在 LinkedIn 上被邀请担任技术顾问。这两个案例都遵循了几乎相同的剧本:专业的接触、简短的介绍性对话以建立信任,然后请求审查代码库。
案例 1:VS Code 和 npm 生命周期触发器
在第一个案例中,攻击者冒充一名欧洲软件工程师。在简短的会议并审查了 Figma 模拟图后,“招聘经理”敦促候选人克隆一个 GitHub 仓库并使用 VS Code 进行屏幕共享。
危险在于仓库的配置。分析显示了四个不同的攻击向量:
- VS Code 自动运行:
.vscode/tasks.json文件配置了runOn: folderOpen触发器。一旦在 VS Code 中打开该文件夹,它就会执行一个 curl/wget 命令,从托管在 Vercel 上的 C2(命令与控制)服务器下载并运行一个 shell 脚本。 - 环境信息泄露: 服务器代码包含一个函数,在启动时会解码 C2 URL 并将整个
process.env(包括 AWS keys、Stripe secrets 和数据库 URIs)POST 到攻击者那里。 - 远程代码执行 (RCE): 同样的服务器端逻辑将来自 C2 服务器的 HTTP 响应直接管道传输到
new Function()调用中,允许攻击者在受害者的机器上执行任意代码。 - npm 生命周期钩子:
package.json包含一个prepare脚本。由于npm install会自动触发prepare脚本,因此在开发者尝试安装依赖项的那一刻,恶意软件就会被激活——甚至在应用程序启动之前。
案例 2:混淆的后门
第二个攻击涉及一个用于所谓房地产 MVP 的 Bitbucket 仓库。这次攻击更加隐蔽,将其载荷隐藏在错误处理器中。
- 载荷: 一个名为
errorHandler.js的文件使用Function.constructor来执行传递给它的字符串。 - 触发器: 恶意软件在验证器中间件(validator middleware)的模块顶层被触发。这意味着一旦服务器启动并加载了该中间件,后门就会处于激活状态。
- 伪装: 攻击者使用
config.env.example文件来存储 C2 URL 和秘密标头。通过使用dotenv显式加载这个“示例”文件,即使在用户没有创建真实的.env文件的情况下,恶意软件也能保持功能。
更大的背景:国家支持的威胁
这些攻击反映了已知高级持续性威胁 (APT) 组织的战术。作者指出,这与总部位于北朝鲜的骗子(例如 Lazarus Group)非常相似,他们此前曾使用社会工程学手段入侵开发者并从 DeFi 协议中窃取数亿美元。
通过针对“技术顾问”这一角色,攻击者可以接触到高价值目标,这些人很可能拥有访问敏感生产环境或加密密钥的权限。
如何保护自己
对于开发者来说,在处理未知仓库时,“信任但验证”模式是不够的。以下是需要记住的红旗信号和防御策略:
需要警惕的红旗信号
- 立即要求访问代码: 在签署 NDA 之前,或者在你正式入职一个组织之前,要警惕任何要求你访问代码库的人。
- 施加运行本地代码的压力: 对于那些在实时通话期间坚持要求你在个人机器上克隆仓库并运行
npm install或npm start的面试官,要保持怀疑。 - Web3 “顾问”角色: 正如社区所指出的,目前“Web3 技术顾问”这一类未经请求的职位邀请是高风险信号。
技术防御措施
避免本地执行: 绝不要在你的宿主机器上从不受信任的来源运行
npm install或执行二进制文件。使用云端 IDE: 像 GitHub Codespaces 或 Gitpod 这样的工具可以提供一个可丢弃的、隔离的环境,从而保护你的本地文件系统和环境变量,免受侵害。
容器化: 在 Docker 容器或专门的沙盒中运行不受信任的代码。这可以确保如果一个进程尝试泄露
process.env,它只能看到容器的有限环境,而不是你的个人秘密。虚拟机: 对于高风险评估,在云端租用一个可丢弃的 VM,以确保与你的家庭网络完全隔离。
"没有人在意图不是开源的情况下公开其代码仓库……没有人在签署 NDA 之前分享其私有代码库。"
通过将每一个未经请求的仓库视为潜在的恶意软件分发媒介,开发者可以保护自己的机器和所持有的秘密。