ProfilePress 安全通知
如果您收到我发来的邮件,指引您访问本页面,那是因为您的网站似乎正在运行 ProfilePress(这款
WordPress 插件仍以文件夹名 wp-user-avatar 发布,由 ProperFraction 开发)的某个版本,而该版本
落在一个已知安全问题的受影响范围之内。本页面将说明这个问题是什么、如何判断它是否适用于您的站点,
以及如何更新。
在其他一切之前,先说一下名称,因为它常让人困惑:这款插件最初名为 WP User Avatar,并在更换品牌
后保留了那个标识符(slug),因此在您的文件中它位于 /wp-content/plugins/wp-user-avatar/,而
WordPress 后台则以其当前的完整名称列出它,即 “Paid Membership Plugin, Ecommerce, User
Registration Form, Login Form, User Profile & Restrict Content – ProfilePress”。WP User Avatar
和 ProfilePress 是同一款插件。它自始至终都是一款 WordPress 插件。
在其他一切之前,先说关于本通知最重要的一点:处于受影响范围内的版本,本身并不意味着您的站点会
暴露。 下面描述的问题,只有当 ProfilePress 发布一个 包含角色选择字段的前端注册表单(即
[reg-select-role] 短代码,或拖放式表单构建器中的 “reg-select-role” 字段),并以某种特定方式配置
时,才可能被利用。如果您的站点不提供公开的自助注册,或者您的注册表单不允许访问者选择角色,那么即便
处于受影响的版本,它也很可能不会暴露。我可以从公开文件中读取您的插件版本,但我无法看到您的注册
表单,因此本通知是一份预防性的提醒,而不是关于您站点的确认结论。
这个问题是 CVE-2026-12497,是该插件前端注册处理程序中的一个未经身份验证的权限提升(CWE-269, 不当的权限管理)。分配该 CVE 的机构并未公布严重性评分,我也不会杜撰一个;判断它时要紧的是,它虽 无需身份验证,但 被限制在非管理员角色之内,并且取决于上面描述的注册配置。它影响 3.0.0 至 4.16.17 版本,并已在 4.16.18 中修复。如果您正在运行受影响的版本,请 将 ProfilePress 更新 到 4.16.18 或更高版本(当前发行版为 4.16.19)。没有任何迹象表明这个问题正在任何地方被利用。
关于紧迫程度需要说明一点,因为这是一份带条件的通知:它对您有多重要,几乎完全取决于您是否发布那种 注册表单。如果您不提供带有角色选择字段的公开自助注册,那么更新只是例行的插件维护。如果您提供, 请把更新当作优先事项:在这种配置下,该缺陷可能让一个未经身份验证的访问者 以高于您表单所提供的 角色进行注册(例如编辑或作者)。即便如此,本页面也是一份预防性的提醒,而不是事件报告,并不意味着 需要任何紧急响应。
这是一个 插件 缺陷,而不是 WordPress 核心的缺陷。如果 ProfilePress 插件本身处于受影响的版本, 那么即便是完全最新的 WordPress 也 无法 保护您。
这条消息是否可信?
是的。这是一份来自独立安全研究人员的善意、负责任披露通知。我 不会 向您索要金钱、密码或对您 站点的访问权限,也 没有 试图入侵它、上传任何东西或利用任何漏洞。
我所做的一切,只是查看您的网站向每一位访问者提供的公开可见文件(就像您的主页是公开的一样),并
记录该插件在其公开的 readme.txt 文件中公布的版本号。我特意 没有 触碰注册系统,而且这项检查
完全不涉及您的数据、您的后台管理区域,或您站点的任何私密部分(更多细节见下方我做了什么、没做
什么)。
如果您想核实我的身份,请查看本页底部的联系方式以及关于页面。
为什么这很重要
ProfilePress 是一款被广泛使用的 WordPress 会员、用户注册和登录插件(约有 100,000 个活跃安装)。 除其他功能外,它让站点能够发布前端注册表单,使访问者可以创建自己的账户,而这些表单可以选择性地 包含一个字段,让访问者选择其新账户应当拥有的角色。
在受影响的版本中,注册处理程序使用两段不同的代码分别确定表单所 提供 的角色和它将 接受 的 角色。对于某些有效的角色字段配置,计算被接受角色的那段代码未能读取表单的角色列表,而是悄悄回退到 接受 任何可编辑的角色(也就是除管理员之外的任何角色)。又因为公开的注册处理程序 没有 nonce 加以保护,一个未经身份验证的访问者便可以提交自己所选的角色,并以 高于表单所提供的角色 被注册, 例如注册为编辑或作者,而不是原本设定的订阅者。
有两点有助于客观看待此事。第一,其影响有一个明确的上限:该插件明确将管理员角色排除在注册所能 分配的范围之外,因此这是一个 被限制在非管理员角色之内的权限提升问题,而不是服务器接管、管理员 账户接管或远程代码执行。第二,入口是一个已发布的、带有角色选择字段的注册表单,因此这个问题只 波及以那种方式配置的站点;没有公开自助注册的站点,或其表单不允许访问者选择角色的站点,即便处于 受影响的版本,也很可能不会暴露。再直白地重复一遍,没有迹象表明存在活跃的利用行为:它不在 CISA 的已知被利用漏洞目录中,我也没有听说任何利用报告。
如果我的邮件引用了这个问题,那意味着您站点报告的版本落在受影响的范围之内。我并没有测试您的具体 站点是否可被利用,也无法看到您的注册表单是如何配置的;我所观察到的一切,只是该站点报告了一个 受影响的版本。
我是否受影响?
有两个问题可以决定这一点,按以下顺序。
第一:您是否发布一个允许访问者选择角色的 ProfilePress 注册表单? 这是起决定作用的问题,而且 只有您自己能回答。
- 如果您的站点 不 提供公开的自助注册,或者其注册表单 不 包含角色选择字段(
[reg-select-role]短代码,或表单构建器中的 “reg-select-role” 字段),那么即便处于受影响的版本,您也很可能 不会 暴露。作为普通的维护,仍然建议更新。 - 如果您的站点 发布 了一个带有角色选择字段的前端注册表单,那么这个问题适用于您,您应当尽快 更新。
- 检查方法:在 WordPress 后台,查看您的 ProfilePress 注册表单是否有角色字段;或者在隐私浏览窗口中 打开您的某个注册页面,看看一个未登录的访问者是否被提供了账户角色的选择。
第二:您运行的是哪个版本? 您不必仅凭我的说法来判断,而且对于这款插件,版本报告是可靠的。
从 WordPress 后台管理区域查看(权威来源):
- 登录您的 WordPress 仪表盘(通常位于
yourdomain.com/wp-admin)。 - 前往 Plugins 然后 Installed Plugins。
- 找到列为 “Paid Membership Plugin … ProfilePress” 的条目(其文件夹为
wp-user-avatar), 并记下其名称下方显示的版本。这就是真正安装的版本。
从公开清单查看(无需登录): 在浏览器中打开
yourdomain.com/wp-content/plugins/wp-user-avatar/readme.txt。顶部附近的 Stable tag: 这
一行是您的安装所报告的版本,而这正是我读取的那个公开文件。
如果您属于那种会从资源 URL 中读取版本号的人,这里有一个小提示:请依据插件 自身的
frontend.min.js 或 frontend.min.css 的 ?ver= 值来判断版本,那才是 ProfilePress 的版本。
不要 从一并打包的 select2/select2.min.css 上读取它,其 ?ver=(例如 7.0.2)是 select2
库自身的版本,与插件版本毫无关系。
然后按照以下规则判断,并注意版本号是 按数值比较,而不是按字母顺序比较:
- 3.0.0 至 4.16.17: 可能受影响(取决于上面关于注册表单的问题),请立即更新。
- 4.16.18 或更新版本: 已经修复。这包括当前的 4.16.19 发行版。
- 早于 3.0: 不受这个问题的影响。存在漏洞的注册处理程序是随 ProfilePress 3.0 更换品牌时首次 引入的;更早的、仅提供头像功能的 “WP User Avatar” 1.x 和 2.x 系列没有注册功能,也不带有它。 (实际上,几乎每一个当前的安装都是 4.16.x 系列的发行版。)
如何升级
最安全的做法是通过 WordPress 自身进行更新,并事先做好备份:
- 在做出更改之前 备份您的站点(文件和数据库)。大多数主机服务商都提供一键备份,或者使用 WordPress 备份插件。
- 在 WordPress 后台,前往 Dashboard 然后 Updates,或 Plugins 然后 Installed Plugins。如果列出了 ProfilePress 更新,就从这里安装它。
- 如果您更喜欢命令行,WP-CLI 可以完成同样的事情:
wp plugin update wp-user-avatar(该命令 使用文件夹名wp-user-avatar)。 - 如果没有出现更新,您可以直接从该插件在 WordPress.org 目录上的页面获取最新版本, ProfilePress,并通过 Plugins 然后 Add New Plugin 然后 Upload Plugin 进行更新。
- 更新后,按照上述步骤确认新的版本号(4.16.18 或更高;当前发行版为 4.16.19),并检查您的注册和 登录页面是否正常工作。
既然您已经在处理这些,不妨顺便确认 WordPress 核心 以及您的其他插件是否都是最新的,因为同样的 原则适用于所有这些组件。
更新之后
更新到 4.16.18 或更高版本即可堵上这个问题,对大多数站点来说,这就是全部要做的事。没有迹象表明这个 缺陷已在任何地方被利用,因此 本通知不意味着需要任何紧急响应:您不需要把站点视为已被入侵或将其 下线。
有一项后续工作值得考虑,它同样取决于前面那个关于注册的问题。如果您的站点在处于受影响版本期间, 一直发布着带有角色选择字段的 ProfilePress 注册表单,那么至少在理论上,曾有可能出现某位访问者以 高于预期的角色完成了注册,尽管没有证据表明有人这样做过。在这种情况下,有一项例行的预防措施是 合理的:
- 以您平常查看站点活动的普通方式,查看近期的用户注册中有没有以意外偏高的角色创建的账户(例如 一个您并不认识的编辑或作者),并对任何看起来不对劲的内容进行调整或删除。
请把这当作普通的安全日常维护,而不是事件响应。如果您不提供带有角色选择字段的公开自助注册,那么 仅仅更新就已足够。
我做了什么、没做什么
为了对我邮件背后的检查做到完全透明:我只读取了您的站点本来就向每一位访问者提供的公开文件,具体
来说是该插件的公开 readme.txt 文件和您的主页。我 没有 访问您的 WordPress 后台管理区域、您的
数据库,或站点的任何私密部分。特别是,我 没有 触碰那个存在漏洞的注册路径,也没有测试或利用
任何东西。
这是一项 基于版本号的观察:您的站点报告的版本落在受影响的范围之内。由于这个问题取决于具体 配置,处于该范围内的站点也可能根本不会暴露(如果它不提供公开自助注册,或其表单不含角色选择 字段),而且它也可能已经通过其他方式得到缓解,例如 Web 应用程序防火墙。本通知并不是断言在我检查 时您的站点确实可被利用。
我没有网站管理员 / 我遇到了困难
如果您不是维护站点的人,请将本页面转发给负责维护的人(您的网页开发者、代理机构或主机服务商)。 他们会很快认出上述步骤。
如果您自己维护站点却遇到了困难,我很乐意免费帮您指明正确的方向。请使用下方的联系方式与我联系。
联系方式
Evan Harris,安全研究员
- 电子邮件:security@mail.mcpsec.dev
- X:@Evan__Harris
- GitHub:eharris128
- LinkedIn:Evan Harris
我就此类问题主动联系,纯粹是为了帮助运营者保护他们的站点。如果您希望不再被联系,只需告诉我, 我会予以尊重。
参考资料
官方通告与追踪
厂商 / 插件