夜雨聆风学习资料网

ARTICLE · 1061652

WordPress插件Authorizer存在权限提升漏洞(POC已公开)CVE-2026-81294

WordPress插件Authorizer存在权限提升漏洞(POC已公开)CVE-2026-81294

一、漏洞描述

Authorizer 是 WordPress 上做登录控制的插件。登录除密码外还能交给 Google、CAS、LDAP、OAuth2。

漏洞产生出在 OAuth2 这条路上。3.15.1 及更低版本处理外部服务返回的邮箱地址时,跳过了验证状态这一步。邮箱在对方那里确认过没有,不影响后面的比对。

CVE 编号
CVE-2026-81294
公告编号
GHSA-xppg-27gw-vxcj
漏洞类型
权限提升,CWE-266
影响组件
WordPress 插件 Authorizer 的 OAuth2 登录分支,github 与 generic 两种 provider
受影响版本
≤ 3.15.1
修复版本
3.15.2 及更高
触发前提
站点启用 OAuth2 外部登录,且外部服务返回的邮箱地址在站内已有对应账号
利用条件
无需登录凭证,无需站内用户交互,需要外部服务返回一个站内已存在的邮箱地址
危害面
取得同名邮箱账号的会话,该账号为管理员时即获得后台权限
CVSS
9.8,CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

二、漏洞原理

入口是 wp-login.php?external=oauth2,Authorizer 把自己的处理函数挂在 WordPress 的 authenticate 过滤器上。

请求带上这个参数,处理流程直接进到 custom_authenticate_oauth2。

OAuth2 部分按 provider 分成 github、azure、generic 三种走法,出问题的在 github 与 generic 两支。

GitHub 这支先取公开邮箱,取不到就调 /user/emails 把账号上挂的邮箱全拉回来。

接口返回的每一项里,email 之外还有 verified 与 primary。3.15.1 的映射只留 email,verified 被丢在一边,未验证的地址一样进数组。

// src/authorizer/class-authentication.php 3.15.1 github 分支
if ( empty( $email ) ) {
    $request              = $provider->getAuthenticatedRequest(
        'GET',
        $provider->getResourceOwnerDetailsUrl( $token ) . '/emails',
        $token
    );
    $attributes['emails'] = array_filter( array_map(
        function ( $entry ) {
            return empty( $entry['email'] ) ? '' : $entry['email'];
        },
        (array) $provider->getParsedResponse( $request )
    ) );
    $email                = $attributes['emails'];
}

数组往下传到公共部分,逐个用 get_user_by 按邮箱找站内账号。命中就把那个用户对象交回 WordPress,会话随之建立。

// src/authorizer/class-authentication.php 3.15.1 公共匹配
foreach ( $externally_authenticated_emails as $externally_authenticated_email ) {
    $user = get_user_by( 'email', Helper::lowercase( $externally_authenticated_email ) );

    // Stop trying email addresses once we have found a match.
    if ( false !== $user ) {
        break;
    }
}

generic 这支从资源接口里取 attributes['email']。

另外允许管理员配一个自定义属性名 oauth2_attr_email,取到什么用什么,往下直接进公共匹配,中间没有 email_verified 这一层。

// src/authorizer/class-authentication.php 3.15.1 generic 分支
$email    = empty( $attributes['email'] ) ? '' : $attributes['email'];
$username = empty( $attributes['preferred_username'] ) ? '' : $attributes['preferred_username'];

// 自定义邮箱属性名,取到什么用什么
if ( ! empty( $oauth2_attr_email ) && ! empty( $attributes[ $oauth2_attr_email ] ) ) {
    if ( is_string( $attributes[ $oauth2_attr_email ] ) ) {
        $email = trim( $attributes[ $oauth2_attr_email ] );
    } elseif ( is_array( $attributes[ $oauth2_attr_email ] ) ) {
        $email = $attributes[ $oauth2_attr_email ];
    }
}

// 后面跟一个 authorizer_oauth2_generic_authenticated_email 过滤器,接着进公共匹配

同一份文件里的 OIDC 分支倒是有 email_verified 的判断,由 oidc_require_verified_email 控制,OAuth2 这侧没有对应的开关。

3.15.2 补的就是这两处。

// src/authorizer/class-authentication.php 3.15.2 github 分支
$attributes['emails'] = array_filter( array_map(
    function ( $entry ) {
        // Filter out empty or unverified email addresses.
        if ( empty( $entry['email'] ) || empty( $entry['verified'] ) ) {
            return false;
        }

        return $entry['email'];
    },
    (array) $provider->getParsedResponse( $request )
) );

// 3.15.2 generic 分支新增
$oauth2_require_verified_email = $auth_settings[ 'oauth2_require_verified_email' . $suffix ] ?? '';

if ( '1' === $oauth2_require_verified_email ) {
    if ( empty( $attributes['email_verified'] ) || true !== $attributes['email_verified'] ) {
        return new \WP_Error( 'oauth2_email_not_verified', ... );
    }
}

GitHub 那支把未验证的项在映射阶段丢掉,无条件生效。

通用 provider 的判断挂在新增的 oauth2_require_verified_email 上,后台多出一个 Require verified email 勾选框,默认不勾。

三、修复建议

升到 3.15.2 或更高,插件目录当前提供 3.16.0。

近期值得重点关注的漏洞预警

【紧急漏洞预警】nacos爆出权限绕过漏洞,可以创建管理员账户,经过分析有点出处(已复现,exp脚本已编写)
WordPress插件MStoreAPI存在认证绕过漏洞(POC已公开)CVE-2026-13447
CakePHP爆出SQL注入漏洞(POC已公开)CVE-2026-77635
Node.js模块proxy-addr爆出严重漏洞CVE-2026-90711
Langflow爆出代码执行漏洞CVE-2026-17633  (POC已公开)
Apache CVE-2026-42536,补它只用一行,洞龄十四年
【紧急】搜狗输入法爆出远程代码执行漏洞CVE-2026-51990  ,已被在野利用
【紧急】无需登录就能获取 GitLab 的任意文件数据(附POC)
【紧急】JumpServer堡垒机被公布Access Key泄露漏洞,可以实现提权
Spring Cloud Azure公布严重漏洞 无需任何权限即可取得登录会话
【漏洞POC已公开】Linux RDS 爆出提权漏洞 一块内存放两次,root就到手了
Tenda光猫爆出严重漏洞,目前无补丁(POC已公布
13 行补丁,堵住Linux能拿 root 的内核洞(EXP已公开)
48 字节,换走一台 Windows 的 SYSTEM(CVE-2026-62735漏洞POC已公开)
【漏洞预警】linux删个网桥就能提权root?目前没有补丁(POC已公开)
【漏洞预警】Linux三年前补上的洞,又一次被挖开了
【情报】支付宝8.2亿数据泄露?给同事说一声,别自己吓自己
【漏洞预警】自己注册个号,就能搬空别人的 Magento 订单和支付卡(POC已公开)
【漏洞预警】Next.js 爆出新漏洞,不用登录实现命令执行(POC已公开)
【漏洞补丁绕过预警】Redis CVE-2026-23479变种高危漏洞,EXP已公开
【漏洞补丁绕过】超 30 万 WordPress 站点受影响,Forminator 文件上传漏洞(附POC)
【漏洞预警】Exchange爆出RCE漏洞,利用Exchange 帮另一台 Exchange 开门(POC已公开)
【漏洞预警】不用登录,一个请求就能让 GeoServer 乖乖执行命令(POC已公开)
【漏洞预警】Keycloak不登录就能接管任意账户,双重验证也拦不住
【漏洞预警】 8月WebLogic公布了9个漏洞,有一个需要重点关注
【漏洞预警】近期MongoDB 公布了5个漏洞,最严重的一个可以不认证、远程就能拿下你电脑
【0DAY漏洞】 全球5G手机芯片厂商之一‌的紫光展锐SOC存在RCE漏洞,影响数十家手机厂商,还未发布补丁
【漏洞告警】安卓 14 到 16 全中招,通讯录 SQL 注入漏洞正在抄家(POC已公开)
【漏洞预警】紧急排查,SMB服务再曝新漏洞,利用脚本已公开
【漏洞预警】不用输密码,对方已经接管你的Mac:官方补丁公布macOS存在未鉴权RCE漏洞
【0day漏洞预警】MariaDB 13 爆 9.8 分 RCE 链:最低 USAGE 权限就能远程执行命令
VMware 爆 5 个洞,两个 9.8 不用密码就能打穿 vCente

相关学习资料