返回

文章详情

LinkedIn工作机会中的后门

Hacker News2026年6月15日 20:00

上周,我收到了一个小型加密初创公司的招聘人员发来的LinkedIn消息。我们在几天内交换了几条消息,她描述了他们需要一个首席工程师的破损原型,并给我发送了一个公共GitHub库进行审查。具体来说,她让我“查看已弃用的Node模块问题。”请求审查现有代码库并不罕见,但我觉得有些不对劲,心中警钟大作,因此我决定多加小心。与其克隆并安装依赖项,我在Hetzner上创建了一个临时VPS,克隆了该库,并在只读模式下将Pi指向该库,同时仅启用文件阅读工具:pi --tools read,grep,find,ls。我让代理审查代码库并标记任何可疑之处。它几乎立即在app/test/index.js处停止。后门该库让我觉得像是一个带有Node后端的React前端。陷阱位于app/test/index.js,大约250行伪装成测试套件。内部,一个URL由多个片段组装而成:const protocol = "https" , domain = "store" , separator = "://" , path = "/icons/" , token = "77" , subdomain = "rest-icon-handler" , bearrtoken = "logo" ; 这些组合成https://rest-icon-handler.store/icons/77。然后,在被注释掉的测试的墙壁之间,载荷会运行服务器发送回你机器的任何内容。载荷在第225行,隐藏在注释掉的测试之间。如何触发该文件并不等待测试运行。app/index.js本身执行const test = require('./test'),这会加载并运行app/test/index.js。package.json将app/index.js连接到启动:prepare运行app:pre,即node app/index.js。prepare脚本是重要的。npm在npm install后自动运行prepare,因此只要安装依赖项就会执行后门。指示“查看已弃用的Node模块问题”是为了诱使我运行npm install。我本可以让载荷在沙盒中运行并观察服务器在第二阶段发送回来的内容,但我停在那里。一个执行服务器交付内容的库已足够成为证据。借用身份库中的提交是由一位真实开发者的名字和电子邮件编写的,他是一名全栈工程师,拥有普通的LinkedIn资料、个人网站和拥有悠久历史的GitHub帐户。我给他发了消息,装作我继承了代码库并有几个实现问题,看看他的反应。他告诉我他从未为他们工作过。他之前曾在GitHub上被冒充过,并因此让一个库下架,与这个库毫无关系。他也在报告这些库。整个提交历史,39次提交,都归因于一个从未接触过该库的开发者。第二个借用身份招聘者的资料属于一位真实的艺术记者,一位后来我查到的知名人士,拥有丰富的文化背景,但没有任何技术背景。当我假装并告诉她我无法安装该项目时,这位记者立即变成了npm和Node版本的专家。我可以说,这非常有趣。这位非技术招聘者,突然开始讨论Node版本并催促我运行npm install。这种情况可能发生在任何人身上。我听说过这些攻击,并在HN上读过有关它们的文章,但当一个攻击针对我时,我仍然有些措手不及。我从前几条消息中怀疑了某些事情,但在一个更疲惫或匆忙的日子里,我很容易就会在没有仔细思考的情况下运行npm install。所以,如果你收到一条LinkedIn消息,要求你审查一个库,稍微有点偏执和良好的安全卫生总是没有坏处。另一个教训是,使用只读代理审查代码结果比自己阅读更有效。后门伪装得像是粗心的初学者代码,但代理在几秒钟内就标记了它。我向GitHub报告了该库,并向LinkedIn报告了招聘人员。到目前为止,依旧没有变化,代码仍然在线。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡