Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-41490 — Detailed CVE-2026-41490 disclosure with PoC demonstrating unauthenticated SQL injection in Dagster database I/O managers via dynamic partition keys, affecting DuckDB, Snowflake, BigQuery, and DeltaLake integrations. | Kitploit
Инструменты/GitHubGitHub/romain-deperne/cve-2026-41490
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationDatabase Security
GitHubromain-deperne/cve-2026-41490

CVE-2026-41490

Detailed CVE-2026-41490 disclosure with PoC demonstrating unauthenticated SQL injection in Dagster database I/O managers via dynamic partition keys, affecting DuckDB, Snowflake, BigQuery, and DeltaLake integrations.

Репозиторий
12 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-41490 — SQL-инъекция в I/O-менеджерах баз данных Dagster через динамические ключи разделов

Серьёзность: Высокая (CVSS 8.x — AV:N/AC:L/PR:L/UI:N + C:H/I:H/A:H) CWE: CWE-89 — SQL-инъекция Затронутые версии: интеграции I/O-менеджеров баз данных dagster — dagster-duckdb, dagster-snowflake, dagster-gcp (BigQuery), dagster-deltalake, dagster-snowflake-polars (≤ 1.12.20) Консультация: GHSA-mjw2-v2hm-wj34 NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-41490 Автор: Romain Deperne

TL;DR

Каждый I/O-менеджер базы данных Dagster строит своё выражение WHERE, интерполируя значения ключей разделов напрямую в SQL через f-строки. Когда актив использует DynamicPartitionsDefinition, ключи разделов могут быть установлены во время выполнения через GraphQL API (addDynamicPartition) — который в стандартной развёртке веб-сервера не требует аутентификации. Вредоносный ключ раздела попадает без экранирования как в запросы SELECT (загрузка), так и в DELETE (очистка), что приводит к SQL-инъекции в поддерживаемое хранилище (Snowflake, BigQuery, DuckDB, DeltaLake, …).

Как я это нашёл

Одна и та же вспомогательная функция _static_where_clause скопирована в пять пакетов I/O-менеджеров. В каждом из них она делает:

root@kitploit:~
def _static_where_clause(table_partition):
    partitions = ", ".join(f"'{partition}'" for partition in table_partition.partitions)
    return f"""{table_partition.partition_expr} in ({partitions})"""

partition обёрнут в одинарные кавычки без экранирования. Вопрос заключался в том, может ли partition когда-либо контролироваться атакующим. Для статических разделов он определяется разработчиком — неинтересно. Для DynamicPartitionsDefinition ключи хранятся в мета-БД Dagster и добавляются во время выполнения через GraphQL-мутацию addDynamicPartition. В стандартном развёртывании dagster-webserver GraphQL не требует аутентификации, поэтому атакующий в сети может полностью контролировать ключ раздела.

Я подтвердил оба звена цепи: GraphQL-мутация принимает произвольные строки ключей без проверки, и ключ достигает _static_where_clause без изменений через context.asset_partition_keys.

Цепочка атаки

  1. Сетевой доступ к веб-серверу Dagster (по умолчанию без аутентификации)
  2. addDynamicPartition(... partitionKey: "') UNION SELECT username, password_hash FROM secret_table; --")
  3. launchRun(...), нацеленный на этот раздел
  4. I/O-менеджер строит SELECT/DELETE ... WHERE col in ('') UNION SELECT ... ; --')
  5. SQL-инъекция выполняется против целевой базы данных

Затронутый код (идентичный шаблон, 5 мест)

ПакетФайл
dagster-duckdbio_manager.py:340-342
dagster-snowflakesnowflake_io_manager.py:434-436
dagster-gcp (BigQuery)bigquery/io_manager.py:472-474
dagster-deltalakeio_manager.py:265-267
dagster-snowflake-polarssnowflake_polars_type_handler.py:74

Как путь загрузки, так и путь очистки используют его:

root@kitploit:~
query = f"SELECT {col_str} FROM {schema}.{table} WHERE\n" + _partition_where_clause(...)  # read
query = f"DELETE FROM {schema}.{table} WHERE\n"          + _partition_where_clause(...)  # write

Корневая причина

Ключи разделов считались доверенными константами разработчика, но DynamicPartitionsDefinition превращает их в данные, устанавливаемые извне во время выполнения. Интерполяция f-строк, которая была «безопасной» для статических ключей, становится инъекцией для динамических. Исправление: параметризованные запросы / правильное цитирование идентификаторов и литералов вместо f-строк.

Доказательство концепции

poc/poc_partition_sqli.py — показывает вывод уязвимой функции _static_where_clause для безобидных и вредоносных ключей, выполняет живую DuckDB UNION-основанную эксфильтрацию + DROP TABLE против заполненной базы данных и выводит точные полезные нагрузки GraphQL addDynamicPartition / launchRun, которые отправил бы атакующий.

root@kitploit:~
pip install duckdb        # минимально; полная цепь: dagster dagster-duckdb pandas
python3 poc/poc_partition_sqli.py

Воздействие

Неаутентифицированная (стандартная конфигурация) SQL-инъекция против хранилища данных, которым управляет Dagster — произвольное чтение других таблиц и деструктивные записи. Dagster находится в центре платформ данных, поэтому уязвимость затрагивает наиболее чувствительное хранилище в стеке.


Раскрыто ответственно через GitHub Security Advisory. PoC опубликовано после исправления.

Скачать инструмент