针对 Apache Superset 6.1.0 授权缺陷的概念验证实验环境:Gamma 仪表板编辑者通过未版本化的 v0 仪表板导入植入数据集 SQL,并在图表刷新时执行。
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · superset-g3-v0-import-sql-plant
拥有普通仪表盘编辑器账户的同事可以将自己的数据库查询隐藏在其他用户已经信任的图表中。下次任何人打开该图表时,该查询就会针对公司的数据连接运行。他们可以读取从未被授予访问权限的表。他们不需要本应作为此操作门槛的额外“运行我自己的 SQL”权限。他们无法注册新的仓库登录凭据,也无法通过此图表路径执行 INSERT 或 DELETE。
类别: 权限残留 可达性: 远程
Apache Superset 6.1.0 (c83fb2bb) - Apache Software Foundation
默认 Gamma 拥有 can_write Dashboard 权限,因此 POST /api/v1/dashboard/import/ 在权限矩阵内。非 ZIP 的 JSON 没有 metadata.yaml,因此调度器先尝试 v1,然后回退到无版本号的 v0。decode_dashboards 重建 SqlaTable。import_dataset 通过 table_name + schema + database_id(来自 params.database_name)查找,并且 datasource.override(i_datasource) 复制 export_fields,包括 sql,且没有 raise_for_access,也没有 Dataset 写入。随后 POST /api/v1/chart/data 将该 SQL 编译为数据集分析连接上的虚拟 FROM。
Gamma SQL 无需 sql_lab。Dataset REST PUT 仍返回 403。v1 ZIP 仍为空。
| ID | 暂无 CVE |
| 类别 | 权限残留(CVE-2026-23982 / CVE-2024-26016 的残留) |
| 可达性 | 远程(已认证 HTTP;默认 Gamma) |
| CWE | CWE-863、CWE-284 |
| CVSS | 高危:7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L |
| 产品 | Apache Superset |
| 受影响版本 | 6.1.0(c83fb2bb1dcfac41ac51bcebd82471f4a7180d18);狩猎时为 GitHub 最新 GA 版本 |
| 认证 | 默认 Gamma(can_write Dashboard)。非未认证。非 Admin(超出范围)。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
需要一个 Gamma(或任何具有 Dashboard 写权限)账户,以及一个他们之后可以制图的 dataset:在某个 Database 上具有相同的 table_name + schema,且该 Database 的 database_name 出现在 JSON 的 params 中。互补授权作用于 dataset 对象,而不是植入的 SQL 所命名的每一张表。Chart/data 的 raise_for_access 针对的是 datasource 对象(datasource_access / schema / owner)。get_from_clause 仅拒绝 has_mutation()。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验室验证或推断 |
|---|---|---|---|
| 覆盖名称匹配数据集的虚拟 SQL | Gamma POST /api/v1/dashboard/import/ 非 ZIP JSON;v0 import_dataset 的 datasource.override 复制 export_fields,包括 sql | 完整性(dataset.sql) | 实验室验证。导入返回 200;dataset.sql = SELECT 'SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS' AS witness |
| 在该数据集的分析 URI 上运行该 SQL | 植入后 POST /api/v1/chart/data;get_from_clause 将存储的 sql 包装为 TextAsFrom | 侦察(SELECT 该 URI 用户可读取的任何表) | 实验室验证。返回 200;编译后 FROM (SELECT 'SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS' AS witness) AS virtual_table |
| 将查询隐藏在已授予权限的其他用户已打开的图表中 | 同一植入;所有者 / 其他 datasource_access 主体在刷新时执行 | 完整性 + 侦察(其他人运行植入内容) | 推断。实验室 Gamma 已有授权,因此自行执行 |
| 破坏使用旧 SQL 的仪表板 | 将物理表 sql 替换为攻击者 SELECT | 可用性 | 推断 |
| 否定项:SQL Lab 执行 | POST /api/v1/sqllab/execute/ | 不适用 | 实验室验证。403 |
| 否定项:数据集 REST 覆盖 | 使用 sql 的 PUT /api/v1/dataset/{id} | 不适用 | 实验室验证。403;sql 保持为空(CVE-2026-23982 同类) |
否定项:带 metadata.yaml 的 v1 ZIP | 同一导入端点,ZIP 包 | 不适用 | 实验室验证。200;sql 保持为空(CVE-2024-26016 类) |
已排除的遗留问题:未认证导入;注册新的数据库 URI(v0 数据集导入不会创建连接;缺少 params.database_name 会报 DatabaseNotFoundError);通过 chart/data 执行 DML(has_mutation());Gamma 绘制其无法读取的数据集(403);新插入的唯一 table_name(PVM 已创建,但未附加到 Gamma)。不是 RCE。不是管理员。生产仓库拆分将 SELECT 限制为该 URI 用户。实验室分析 URI 与元数据是同一个 Postgres,因此跨表包括 ab_user 是推断的,而非二次验证。
我固定使用 Apache Superset 6.1.0。管理员等同于操作系统权限,不在范围内。我对照 Apache 自己的角色矩阵寻找遗留问题:Gamma、Alpha、sql_lab、嵌入式访客、Public。
6.0.0 浪潮已经关闭了 chart/data sqlExpression(CVE-2026-23980)、Dataset REST SQL(CVE-2026-23982)以及 SQL Lab DO $$ / EXPLAIN ANALYZE(CVE-2026-23984)。版本化 ZIP 的导入授权是 CVE-2024-26016。未版本化的 v0 仍然在 command_versions 中排在最后,因为“文件未版本化”。
Dashboard 上的 import_ 映射到写入。非 ZIP JSON 是 {filename: bytes},没有 metadata.yaml。调度器先尝试 v1,捕获 IncorrectVersionError,然后运行 v0。decode_dashboards 将 __SqlaTable__ 转换为实时模型。import_dataset 查找并覆盖。export_fields 包含 sql。查询时将存储的 SQL 视为可信:get_from_clause 在 has_mutation() 之后。
已记录的弯路:将 v1 ZIP 视为遗留问题(sql 保持为空);Dataset REST PUT(403);以 Gamma 身份使用 SQL Lab(403);膨胀为任意 Database 对象(v0 不注册 URI);反向 shell。都是表演。见证者是虚拟 FROM。
python3 superset-g3-v0-import-sql-plant-Abraxas-Labs.py
或:
cd lab
./run.sh
仅针对 http://127.0.0.1:19710。镜像 apache/superset:6.1.0。Compose 项目 superset-g3-v0-import。种子:Admin、仅 Gamma 用户、位于 Lab Analytics 上的物理数据集 lab_items、Gamma datasource_access。Oracle 是植入 SQL 以及图表/数据中的见证字符串。
SUCCESS superset-g3-v0-import-sql-plant gamma-import-ok plant-sql-ok chart-data-witness-ok sqllab-403 dataset-put-403 v1-zip-no-overwrite SUPERSET-G3-V0-IMPORT-SQL-PLANT-WITNESS
v0 的 import_dataset 必须在 override 复制 sql 之前要求 Dataset 写权限并调用 raise_for_access。从 command_versions 中移除未版本化的 v0,或拒绝缺少 metadata.yaml 的导入。在查询时,继续将存储的虚拟 SQL 视为需要 Dataset 写权限的能力。
dashboards/api.py · dispatcher.py · dashboard importers/v0.py · dataset importers/v0.py · helpers.py · sqla/models.pyGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。