1. A backdoor in a LinkedIn job offer (roman.pt)
上周,作者收到一家小型加密初创公司“招聘人员”的LinkedIn私信。对方以招聘牵头工程师修复概念验证项目为由,要求作者审查一个公开的GitHub仓库,并特别让其“查看已弃用的Node模块问题”。
出于警觉,作者未在本地直接克隆,而是在Hetzner上启动了一次性VPS,并在只读模式下使用AI代理Pi(仅启用文件读取工具)审查代码。代理几乎立刻在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。在大量被注释掉的测试代码之间,隐藏着一个压缩成单行的payload,会执行服务器返回的任意内容。
该后门不需要等待测试运行。app/index.js通过require('./test')直接加载并执行app/test/index.js。而package.json中的prepare脚本会在运行npm install时自动执行,它调用app:pre脚本,即node app/index.js。因此,只要受害者按照“检查弃用模块”的指示运行npm install,就会触发后门,从远程服务器下载并执行第二阶段代码。
作者进一步调查发现,仓库全部39条提交均冒用了一位真实全栈开发者的姓名和邮箱。联系后,该开发者表示自己从未参与此项目,此前也曾被人冒用身份创建仓库并投诉下架。
此外,LinkedIn上的“招聘人员”身份也盗自一位真实的艺术记者,其背景完全非技术。当作者佯称项目无法安装时,这位“记者”立刻变身为Node.js与npm专家,反复催促运行npm install。
作者指出,这类攻击极具欺骗性,即使在疲惫或匆忙时也可能中招。此次使用只读AI代理审查代码,比人工阅读更快发现了被伪装成新手拙劣代码的后门。作者已向GitHub和LinkedIn举报,但截至目前仓库与相关账号仍未被处理。