为什么过时的插件是 WordPress 被入侵的头号原因

大多数 WordPress 网站并不是被巧妙的漏洞利用攻破的,而是被几个月未更新的插…

Padlock over code symbolising WordPress plugin security risk

如果你去问任何一家代理机构或安全研究人员,是什么造成了最多的 WordPress 被入侵事件,你每次都会得到同样的答案:插件。不是 WordPress 核心,不是服务器,也不是被盗的密码,而是插件。原因很简单。仅官方仓库就有近 6 万个插件,另有数千个以私下方式销售,而它们全都以完整的 PHP 权限运行在你的网站上。当其中一个存在安全缺陷而你又没有更新它时,你的服务器上就敞开着一扇已知的门。

本文将探讨为什么过时插件会成为如此持续的难题、漏洞在实践中是如何被利用的,以及你能做些什么,让你的网站不至于成为下个月统计数字的一部分。

一个插件漏洞的结构

你安装的每一个插件都会添加作为 WordPress 网站一部分运行的代码。这些代码可以读取你的数据库、向服务器写入文件、发送电子邮件、调用外部 API 并执行命令。当代码编写得当时,它会安全地完成这一切;当编写不当时,它就把可被滥用的工具交到了攻击者手中。

常见的插件缺陷包括:未经身份验证的文件上传,即本应只供已登录管理员使用的功能,却能被互联网上的任何人访问;SQL 注入,即用户输入未经妥善转义就被拼接进数据库查询;跨站脚本,即攻击者控制的内容在管理员浏览器中被渲染为可执行的 HTML;权限提升,即订阅者级别的账户能够变为管理员;以及不安全的反序列化,即从外部发来的复杂数据结构触发代码执行。

这些缺陷中的每一个,都可能让攻击者得以安装后门、植入恶意文件、创建非法管理员账户,或横向渗透到同一主机上的其他网站。插件并不一定要冷门。WordPress 历史上一些被利用最多的插件,安装量高达数千万。

为什么漏洞披露是一把双刃剑

安全社区依靠负责任的披露来运转。研究人员发现一处缺陷,私下报告给插件作者,作者发布修补版本,几天或几周后,细节会在 CVE 公告和安全简报中公布。这是健康的,生态系统正是这样得以改进的。

不健康的部分在于随后发生的事。自动化扫描器会密切关注这些公告。在公开披露后数小时内,机器人便会扫描公网,对 WordPress 网站进行指纹识别,并与易受攻击的版本清单逐一比对。如果你的网站仍在运行未修补的版本,你就会被发现——往往就在第一天之内。

这正是为什么你的网站从披露到完成更新之间的时间窗口如此重要。每周一次的更新例程通常能及时拦下问题,而每季度一次的几乎从不奏效。

再也没人维护的那个插件

比过时插件更糟糕的,是被废弃的插件。插件作者来来去去,并非所有人都会宣布自己何时停止维护代码。一个两年未更新的插件,并不会因为什么都没变就更安全;它更危险,因为此后被发现的任何漏洞都将永远得不到修补。

WordPress 仓库如今会标记长期未更新的插件,但在彻底下架方面态度保守。注意到这一点并完成迁移的责任在你。每月一次的维护例程应包含检查你所运行的每一个插件的最后更新日期。

案例:一个文件管理器插件如何拖垮了一个悉尼网站

最近一次客户审查讲述了一个清晰的故事。这个由悉尼一家小型代理机构运营的网站,安装了一个文件管理器插件,为管理员提供了一个基于网页、用于浏览和编辑服务器文件的界面。方便,但也是历史上的已知攻击目标。这一类插件多年来已被公布过多个严重的远程代码执行漏洞。

该插件没有保持更新。攻击者利用了一个已知缺陷,获得了对文档根目录的写入权限,并在模仿真实 WordPress 页面名称的目录中植入了十五个恶意文件。其结果是一场 SEO 隐藏(cloaking)攻击,向 Googlebot 投放垃圾内容,并烧毁了该域名的搜索排名。

清理代价高昂,而失去的 SEO 代价更高。一套每月一次的更新例程本可发现这个有漏洞的插件,并促成立即修补或彻底移除该插件。整套修复本只需在例行维护中花十五分钟即可完成。

人们为什么不更新插件

人们给出的不更新插件的理由,归结为几种常见的模式。值得了解它们,因为每一种都有更好的应对之道。

有些站长担心更新会弄坏网站。应对之道是先在预发布环境测试、做好备份,并以可控的方式更新——而不是干脆永不更新。

有些站长不常查看自己的网站。应对之道是设置更新可用时的邮件提醒,或将网站纳入由他人负责检查的支持计划。

有些站长使用了高度定制的插件,担心更新会覆盖他们的改动。应对之道是绝不直接编辑插件文件。请通过子主题或自定义插件来使用插件的钩子(hooks)和过滤器(filters),这样更新就不会再破坏你的定制。

有些站长根本不知道某个插件的存在。他们接手了网站,或多年前某个自由职业者装了点东西却从未告知。应对之道是做一次审查。打开插件页面看看。如果你不知道某样东西的用途,就去弄清楚,或把它移除。

一套安全的插件更新例程是什么样的

在我们管理的每一个网站上,基本例程都是相同的。做一份完整备份,包括数据库和文件。如果改动看起来有风险,就先在预发布环境应用更新。分批更新插件,而不是一次全部更新,这样一旦出问题,你就能知道是哪个插件造成的。随后快速测试网站,至少访问首页、一个关键落地页、有的话还有结账流程,以及后台区域。把任何反复造成问题的插件记录下来,并考虑替换它。

对于高级插件,请保持许可证有效。许可证过期意味着没有更新、没有安全补丁、也没有支持。每年的许可证费用,几乎总是低于一次入侵后恢复的成本。

减少你所运行的插件数量

最被低估的安全举措,就是干脆少装一些插件。每一个插件都是更多的攻击面,每一个插件都是又一个你要依赖其更新节奏的供应商。我们审查过的许多 WordPress 网站都装有 25 到 30 个启用中的插件,其中至少三分之一所做的事,要么已不再被用到,要么本可合并。

把清单过一遍。如果你想不起当初为什么装某样东西,那你多半不需要它。如果两个插件功能重叠,就把它们合并。能交付你真正所需功能的最小插件占用,就是最安全的。

小结

插件是 WordPress 中最强大、也最危险的部分。它们赋予你让这个平台如此吸引人的功能,也给了攻击者使 WordPress 网站成为常见目标的那一道道门。解决之道不是回避插件,而是管理它们。让它们保持更新,让它们保持精简,留意某个插件何时被废弃并迁移离开。把你的插件清单当成一份预算来对待,而不是一个杂物抽屉。

需要帮忙吗?

如果你希望 Defyn 审查你 WordPress 网站上的插件,并告诉你哪些存在风险、哪些可以移除、哪些需要替换,欢迎与我们联系。一次聚焦的插件审查,是你能为网站安全所做的影响最大的事情之一。

Claire Smith 的头像
Sponsored Loved this story? Defyn turns articles like this into the websites your competitors wish they had. Talk to us → defyn.com.au