Wordfence近期公布了一项广泛影响WordPress站点的安全漏洞,大量网站因此遭受攻击。该漏洞利用WordPress的自动更新功能——该功能默认开启,覆盖全球约27%的网站。换言之,超过四分之一的互联网站点都可能被同一攻击手法同时攻破。
简而言之,攻击者将目标锁定在WordPress的更新服务器,一旦获取控制权,就能迫使所有依赖该服务器的WordPress站点自动安装恶意代码。

一次攻击即可入侵全球1/4的WordPress网站
在WordPress生态系统中,api.wordpress.org服务器肩负关键职责——为所有WordPress站点提供自动更新推送。每个站点每小时都会向该服务器发送请求,查询插件、主题及WordPress核心是否需要更新。
服务器的响应不仅包含需更新的组件列表,还提供了下载和安装更新包的URL地址。问题就在于此:一旦攻击者攻破该服务器,便能迫使所有WordPress站点自动从其指定的URL下载并安装恶意程序,一次操作即可感染大量站点。

该攻击之所以可行,根本原因在于WordPress自身不对更新包进行签名验证,完全信任api.wordpress.org提供的任何URL和安装包。官方文档明确说明:默认情况下,每个站点均开启自动更新,接收核心文件更新。因此,Wordfence指出,攻击者只需对api.wordpress.org实施一次精准打击,即可使全球超过四分之一的网站感染恶意程序。
api.wordpress.org漏洞技术深度解析
该更新服务器配置了GitHub webhook,使WordPress核心开发者能够将代码同步至wordpress.org的SVN库——实质上将GitHub用作源码仓库。核心开发者在GitHub提交更改后,会触发api.wordpress.org上的一个进程,直接从GitHub拉取最新代码。
该webhook使用PHP编写,且代码开源。Wordfence分析代码后发现了一个远程代码执行漏洞:攻击者可利用该漏洞在api.wordpress.org上执行任意代码,从而获取服务器访问权限。
正常流程如下:GitHub向api.wordpress.org发送请求时,webhook通过共享哈希算法验证请求来源。GitHub将JSON数据与共享密钥混合计算哈希值,然后将哈希值与JSON数据一同发送。服务器收到后,同样将JSON数据与共享密钥混合计算哈希,若结果匹配,则确认来源可信。

GitHub采用SHA1算法,签名置于HTTP头X-Hub-Signature: sha1={hash}中。webhook从中提取算法和哈希值进行签名验证。漏洞恰好在此:代码直接使用客户端(即GitHub)提供的哈希函数。若攻击者能绕过webhook的认证机制,即可将POST参数直接传递给shell_exec,执行远程代码,从而控制更新服务器。
当然,攻击者需要让webhook相信其知晓共享密钥。但webhook允许攻击者自由选择哈希算法——PHP提供多种算法,攻击者可选择较弱的算法,通过暴力破解webhook,不断发送哈希值猜测共享密钥与数据的哈希,直至匹配成功。此时api.wordpress.org便会响应请求。具体细节可参考文末Wordfence的原文链接。
问题根源尚未解决?
Wordfence于今年9月将该漏洞上报给Automattic(WordPress母公司),Automattic于9月7日向代码库推送了修复补丁。但Wordfence指出,api.wordpress.org仍是部署WordPress核心、插件及主题升级的单点故障根源——换言之,只要该服务器出现问题,整个自动更新体系就可能被攻破。
Wordfence表示,他们曾试图与Automattic安全团队讨论自动升级系统的安全问题,但未获回应。大约三年前,已有关于WordPress服务器部署认证机制的讨论,但至今未见任何进展。
