LinkedIn Job Offer Backdoor: Analysis of a Social Engineering Attack

一名软件工程师最近详细描述了一场复杂的社会工程学攻击,一名来自“加密货币初创公司”的虚假 LinkedIn 招聘人员试图在其机器上安装后门。该攻击利用了开发人员常见的流程——为潜在的工作机会审查代码库——来诱骗受害者运行 npm install,从而触发远程代码执行 (RCE) 有效载荷。

The Attack Vector: npm install as a Trigger

这种攻击的主要机制是使用 npm 生命周期脚本。攻击者提供了一个公开的 GitHub 仓库,并指示目标“检查已弃用的 Node modules 问题”,从而有效地诱导他们运行 npm install 以搭建环境。

在提供的仓库中,package.json 文件配置如下:

  • prepare 脚本被设置为运行 npm run app:pre
  • app:pre 脚本执行 node app/index.js

由于 npm 会在 npm install 之后自动运行 prepare 脚本,因此恶意代码会在安装依赖项后立即执行,而用户无需手动运行应用程序。

Technical Breakdown of the Backdoor

恶意有效载荷隐藏在 app/test/index.js 中,伪装成测试套件。代码使用了几种混淆技术以避免检测:

  1. String Fragmentation: C2 (Command and Control) 服务器 URL 是通过片段组合而成的,以避免简单的字符串搜索:

    const protocol = "https",
      domain = "store",
      separator = "://",
      path = "/icons/",
      token = "77",
      subdomain = "rest-icon-handler",
      bearrtoken = "logo";
    

    这组合成了 URL:https://rest-icon-handler.store/icons/77

  2. Obfuscation via Comments: 实际的执行有效载荷被埋在单行压缩代码中(第 225 行),周围环绕着大量的注释掉的测试代码,以阻碍人工审查。

  3. Execution Flow: 入口点 app/index.js 包含 const test = require('./test') 这一行,这会在启动时加载并执行 app/test/index.js 中的代码。

Identity Theft and Impersonation

攻击者使用窃取或借用的身份来建立信任。GitHub 仓库的提交历史(39 次提交)被归功于一名真实的全文栈工程师,而该工程师与该项目并无关联。在被联系后,该工程师确认自己此前曾在 GitHub 上被冒充,且与此仓库无关。

同样,招聘人员的 LinkedIn profile 属于一名真实的艺术新闻记者。攻击者伪装成该招聘人员,在技术能力方面表现出突然且意想不到的转变,当受害者遇到安装问题时,从一个非技术背景的 profile 转向讨论特定的 Node.js 版本(例如,Node.js v24)。

Community Insights and Patterns

Hacker News 上的开发者讨论揭示了这是一种针对软件工程师的广泛模式,特别是那些在加密货币/Web3 领域的工程师。

Common Tactics

  • High-Pressure Recruitment: 攻击者经常使用虚假 profile 强迫候选人为了“修复”一个损坏的 proof-of-concept 而在本地运行代码。
  • Impersonation: 使用真实人物的身份,通过提交历史让仓库看起来很正当。
  • AI-Enhanced Social Engineering: 一些受害者报告称,经历过漫长且具有真实感的面试过程,包括关闭摄像头的视频通话,以在提出最终的安装恶意软件请求之前建立信任。

Security Recommendations

  • Sandboxing: 原报告的作者使用 Hetzner 上的一个临时 VPS 和一个只读的 AI agent 来分析代码,这在几秒钟内就标记了后门。
  • Vigilance with npm: 在运行 npm install 处理不受信任的仓库时要极其谨慎,因为生命周期脚本可以执行任意代码。
  • Identity Verification: 警惕那些在面试过程中催促进行代码本地执行的招聘人员,尤其是在其 profile 与其技术专业知识不符时。

"This is uncomfortably close to a normal interview task now. Someone sends you a repo, says the install is broken, and asks you to take a look. A lot of developers would run npm install before thinking twice, especially if they were tired or looking for most work."

Platform Response

作者将该仓库报告至 GitHub 和招聘人员报告至 LinkedIn。然而,报告指出,GitHub 和 LinkedIn 平台在处理这些恶意仓库和 profile 时往往反应迟缓,使得活跃的威胁持续存在了很长时间。

Sources