攻击者在Flippa上购买了30个WordPress插件,并在所有插件中植入了后门

一名攻击者在数字市场 Flippa 上以六位数的价格购入了 Essential Plugin 的全部产品组合,其中包括 30 多个 WordPress 插件,总安装量达 40 万次。该买家的首次代码提交便是一个 PHP 反序列化后门。该后门潜伏了八个月,直至 2026 年 4 月才被激活,它向所有运行着受感染插件的网站注入了伪装的 SEO 垃圾内容。WordPress.org 在一天之内永久下架了全部 31 个插件。Anchor Hosting 创始人、此次攻击的发现者 Austin Ginder写道:

两周内发生了两起供应链攻击,而且攻击模式如出一辙:购买一个拥有稳定用户群的受信任插件,借此获得 WordPress.org 的提交权限,然后植入恶意代码。

这种攻击模式并非 WordPress 所独有。它利用了所有允许维护权转移的软件包生态系统共有的结构性弱点:npm、PyPI、浏览器扩展商店以及 VS Code 市场都面临着同样的风险。接手者将继承前任维护者的提交权限、声誉,以及所有启用了自动更新的用户默认给予的信任。系统不会触发任何额外的代码审查,也不会发送控制权变更通知。

之前已经有相关案例的详细记录。2018 年,npm 包 event-stream 被移交给了新的维护者,而后者嵌入了窃取比特币钱包的代码。在人们注意到之前,它每周的下载量达到了数百万次。2024 年,XZ Utils 后门几乎让攻击者获得了全球大量 Linux 服务器的根权限。在此之前,攻击者花费了两年时间在开源社区中建立信任。这种模式始终如一:建立信任,获取权限,等待时机,然后发动攻击。

在 LinkedIn 上关于此次攻击的一场讨论中,软件工程师 Levent Sali 指出,放弃使用 WordPress 并不能消除风险:

如果你从 WordPress 迁移到 React/Next.js 技术栈,就等于将信任寄托在数百个 npm 包上,其中许多包仅由一名无偿的志愿者维护。这只不过是换了个供应商罢了,并不能消除风险。

在同一个话题讨论中,软件开发人员 Kevin Riedl 提出了类似的观点,并补充说,npm 包潜在的影响范围可能更大,因为“它们也会在你的本地设备上运行”,这意味着遭到入侵的 npm 依赖项不仅会影响 Web 服务器,还会直接影响开发者的工作站。

这次攻击的技术实施过程既耐心又精巧。该后门于 2025 年 8 月 8 日植入 2.6.7 版本中,伪装在一条名为“检查与 WordPress 6.8.2 版本的兼容性”的更新日志条目之下。新增的 191 行代码中包含:一个 fetch_ver_info()方法,它会在攻击者的服务器上调用 file_get_contents()并将响应传递给 @unserialize();一个未经过身份验证的 REST API 端点,其 permission_callback 设置为__return_true;一个 version_info_clean()方法,其中函数名、参数和执行上下文均来自远程有效载荷。这正是教科书式的任意函数调用。当该有效载荷于 4 月 5 日至 6 日被激活时,它下载了一个名为 wp-comments-posts.php 的文件(文件名称刻意模仿了 WordPress 的合法文件 wp-comments-post.php),向 wp-config.php 中注入了 PHP 代码,专门向 Googlebot 提供垃圾链接和虚假页面,同时对网站所有者保持隐形。

该命令与控制基础设施利用 Ethereum 智能合约来解析其域名,并查询公共区块链的 RPC 端点。在这种情况下,传统的域名下线措施无效,因为攻击者可以随时更新智能合约,使其指向新的域名。人们在 2026 年 3 月发现的CanisterWorm区块链供应链攻击中也观察到了这一技术。

Ginder 通过 939 个备份快照追溯了时间线,对每日备份数据进行二分搜索,最终将注入时间窗口锁定在了 4 月 6 日的 6 小时 44 分钟内。他采用的取证方法——对比不同备份日期下 wp-config.php 文件的大小差异——是任何负责维护生产环境依赖关系的团队均可采用的技术。

在发现此次攻击后,WordPress.org 迅速采取了应对措施。插件团队关闭了所有 31 个插件,推送了一次强制自动更新(v2.6.9.1)以消除“回传”机制,并在仪表盘中添加了警告提示。但此次强制更新并未清除 wp-config.php 文件中已经植入的代码。也就是说,此前已经遭到入侵的网站将继续发送隐藏的垃圾信息,直到管理员手动检查并修复该文件为止。

人们从这一事件中得到的教训适用于 WordPress,也适用于更广泛的生态系统。正如The Next Web所指出的,npm 针对自身遭遇的供应链攻击,采取了强制要求高影响度包的维护者启用双因素认证、来源证明以及自动化安全扫描等措施。PyPI 也采取了类似的应对措施。尽管 WordPress 支撑着约 43%的网站,却未实施任何这一类的安全防护措施。

这并非什么新伎俩。早在 2017 年,一个化名“Daley Tias”的买家就曾以 15000 美元的价格购得 Display Widgets 插件(安装量达 20 万次),在其中植入了发薪日贷款垃圾信息,并最终通过相同手段入侵了至少九个插件。本质上,Essential Plugin 事件是同一类攻击,只不过规模更大,且采用了更复杂的规避手段。

对于在任何生态系统中使用依赖项的开发者而言,这次事件再次强调了以下几点做法的重要性:固定依赖项版本而非盲目自动更新;密切关注变更日志,留意所有权变更及可疑的“兼容性”更新;审核关键依赖项背后的维护者;将任何所有权转移视为需仔细审查下个版本的信号。