漏洞描述
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文件中):
seesion通过序列化对键以及键值进行进行序列化,通过hmacsha1进行签名,最终生成一串如下字符串:
通过’.’隔开的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:
x02x01thisismyscretkeyx01x02eyyh,现在已经换成了YOUR_OWN_RANDOM_GENERATED_SECRET_KEY。
更多key:
收集了一下(有更多欢迎留言补充):