
Proof-of-concept-лаборатория для уязвимости авторизации в Apache Superset 6.1.0, где редактор дашборда с ролью Gamma внедряет SQL в датасет через импорт дашборда в неверсионированном v0, который выполняется при обновлении графика.
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 на аналитическом подключении датасета.
SQL Gamma без sql_lab. REST PUT для Dataset остаётся 403. ZIP v1 остаётся пустым.
| 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 Latest GA на момент поиска |
| Аутентификация | стандартная Gamma (can_write Dashboard). Не без аутентификации. Не Admin (вне области). |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Требуется учётная запись Gamma (или любая с правом записи Dashboard) и датасет, который они позже смогут построить на графике: тот же table_name + schema на Database, чей database_name указан в JSON params. Дополнительное разрешение относится к объекту датасета, а не к каждой таблице, которую называет внедрённый SQL. raise_for_access для chart/data проверяет объект-источник данных (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 |
| Выполнение этого SQL на аналитическом URI набора данных | 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 |
| Отрицательный: перезапись через Dataset REST | PUT /api/v1/dataset/{id} с sql | н/д | Подтверждено в лаборатории. 403; sql остался пустым (родственный CVE-2026-23982) |
Отрицательный: v1 ZIP с metadata.yaml | тот же endpoint импорта, ZIP-пакет | н/д | Подтверждено в лаборатории. 200; sql остался пустым (класс CVE-2024-26016) |
Закрыто по этому остатку: неаутентифицированный импорт; регистрация нового URI базы данных (импорт набора данных v0 не создаёт соединение; отсутствие params.database_name даёт DatabaseNotFoundError); DML через chart/data (has_mutation()); построение графика Gamma для набора данных, который она не может читать (403); новый вставленный уникальный table_name (PVM создан, но не привязан к Gamma). Не RCE. Не Admin. Разделение продакшн-хранилища ограничивает SELECT пользователем этого URI. Аналитический URI в лаборатории был тем же Postgres, что и метаданные, поэтому межтабличный доступ, включая ab_user, выведен, а не подтверждён вторым оракулом.
Я зафиксировал Apache Superset 6.1.0. Admin эквивалентен ОС и вне области рассмотрения. Я искал остатки в соответствии с собственной матрицей ролей Apache: Gamma, Alpha, sql_lab, встроенный гость, Public.
Волна 6.0.0 уже закрыла sqlExpression в chart/data (CVE-2026-23980), SQL в Dataset REST (CVE-2026-23982) и DO $$ / EXPLAIN ANALYZE в SQL Lab (CVE-2026-23984). Авторизация импорта для версионированного ZIP — CVE-2024-26016. Неверсионированный v0 по-прежнему последний в command_versions, потому что «файлы не версионируются».
import_ в Dashboard сопоставляется с записью. Не-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); SQL Lab как Gamma (403); раздувание до любого объекта Database (v0 не регистрирует URI); обратная оболочка. Театр. Свидетель — виртуальный FROM.
python3 superset-g3-v0-import-sql-plant-Abraxas-Labs.py
или:
cd lab
./run.sh