漏洞描述
Apache Superset是一个开源数据可视化和探索工具。Apache Superset 版本(包括 2.0.1)中的会话验证攻击。没有根据安装说明更改默认配置的SECRET_KEY的安装允许攻击者验证和访问未经授权的资源。这不会影响更改了SECRET_KEY配置默认值的Superset管理员。
漏洞影响
受影响版本
Apache Superset <= 2.0.1
不受影响版本
Apache Superset >= 2.1.0
CVSS 评分
漏洞复现
在网络应用中session被称为“会话控制”,Session对象存储特定用户会话所需的属性及配置信息。简单来说session就是浏览器与服务器交互的门禁,通过session可以验证访问者的身份信息,大多数的session是保存在服务器端的,但是也有少部分保存在客户端的session,比如下面要说的flask框架。
Apache Superset是基于python中的flask web框架编写的,flask是一个python轻量级web框架,它的session存储在客户端的cookie字段中。为了防止session篡改,flask进行了如下的处理(代码存放在flask模块中sessions.py文件中):
"""The default session interface that stores sessions in signed cookies
through the :mod:`itsdangerous` module.
"""
#: the salt that should be applied on top of the secret key for the
#: signing of cookie based sessions.
salt = "cookie-session"
#: the hash function to use for the signature. The default is sha1
digest_method = staticmethod(hashlib.sha1)
#: the name of the itsdangerous supported key derivation. The default
#: is hmac.
key_derivation = "hmac"
#: A python serializer for the payload. The default is a compact
#: JSON derived serializer with support for some extra Python types
#: such as datetime objects or tuples.
serializer = session_json_serializer
session_class = SecureCookieSession
def get_signing_serializer(self, app):
if not app.secret_key:
return None
signer_kwargs = dict(
key_derivation=self.key_derivation, digest_method=self.digest_method
)
return URLSafeTimedSerializer(
app.secret_key,
salt=self.salt,
serializer=self.serializer,
signer_kwargs=signer_kwargs,
)
……
……
seesion通过序列化对键以及键值进行进行序列化,通过hmacsha1进行签名,最终生成一串如下字符串:
eyJjc3JmX3Rva2VuIjoiNzY2ZGY1ZDJlNDAyYjg2NWY1ZmM4NjBlYTBkMjUzY2Y3YzE2YjIwNiIsImxvY2FsZSI6ImVuIn0.ZFXM4g.t0nkAofl_yo0bvR2ObbFVWpW5FE
通过’.'隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将sessiondata,时间戳,和flask的secretkey通过sha1运算的结果。服务端每次收到cookie后,会将cookie中前两段取出和secretkey做sha1运算,若结果与cookie第三段不一致则视为无效。
Session生成的具体流程为:json->zlib->base64后的源字符串.时间戳.hmac签名信息。
该漏洞的本质是SECRET_KEY的泄露。Flask-unsign工具可以爆破会话中的session是否是由弱签名SECRET_KEY加密生成的。
该漏洞作者在2021年就在Superset配置指南
(https://superset.apache.org/docs/installation/configuring-superset/)中发现了默认的SECRET_KEY:
\x02\x01thisismyscretkey\x01\x02\e\y\y\h,现在已经换成了YOUR_OWN_RANDOM_GENERATED_SECRET_KEY。
更多key:
收集了一下(有更多欢迎留言补充):
\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h(version < 1.4.1)
CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET(version >= 1.4.1)
thisISaSECRET_1234(deployment template)
YOUR_OWN_RANDOM_GENERATED_SECRET_KEY(documentation)
TEST_NON_DEV_SECRET(docker compose)
CHANGE_ME_SECRET_KEY
可以将上述key添加到flask-unsign字典中进行爆破使用,位置(执行flask-unsign-wordlist.exe命令可查看):
D:\python39\lib\site-packages\flask_unsign_wordlist\wordlists\all.txt
攻击者可以利用爆破出来的key伪造一个user_id值设置为1的会话cookie,以管理员身份登录。在浏览器的本地存储中设置伪造的会话 cookie 并刷新页面允许攻击者以管理员身份访问应用程序。SQL Lab接口允许攻击者对连接的数据库运行任意SQL语句。根据数据库用户权限,攻击者可以查询、修改和删除数据库中的任何数据,以及在数据库服务器上执行远程代码。
也可以使用生成的session访问/api/v1/database/1来验证漏洞是否存在。
漏洞修复
官方升级
目前官方已发布安全版本修复此漏洞,建议受影响的用户及时升级防护:
https://downloads.apache.org/superset/
其他防护措施
若用户无法对产品进行升级,可参考以下链接,通过修改SECRET_KEY的默认值来规避该漏洞:
https://superset.apache.org/docs/installation/configuring-superset/#secret_key-rotation
文中所涉及到的检测工具关注vx公众号401SecNote后台回复 CVE-2023-27524 获取。
注:文章所涉及的技术内容仅供参考,利用本文所提供的信息造成的直接或间接后果和损失,均由使用者自行承担。本文所提供的工具仅用于学习,禁止用于其他非法用途!使用该工具造成的一切后果均由使用者自行承担。如涉及侵权请联系后台进行删除。
参考链接:
https://blog.csdn.net/weixin_44140395/article/details/120602953
https://blog.csdn.net/weixin_41790086/article/details/107554397
https://www.horizon3.ai/cve-2023-27524-insecure-default-configuration-in-apache-superset-leads-to-remote-code-execution/
https://github.com/projectdiscovery/nuclei-templates/pull/7125/commits/9e38e8cffb068786bb87d5629cb468960968ff81
http://blog.nsfocus.net/apache-supersetcve-2023-27524/