Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
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
Outils/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.

Voir le dépôt
1il y a 2 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-41490 — Injection SQL dans les gestionnaires d'E/S de base de données Dagster via les clés de partition dynamiques

Sévérité : Élevée (CVSS 8.x — AV:N/AC:L/PR:L/UI:N + C:H/I:H/A:H) CWE : CWE-89 — Injection SQL Affecté : intégrations du gestionnaire d'E/S de base de données dagster — dagster-duckdb, dagster-snowflake, dagster-gcp (BigQuery), dagster-deltalake, dagster-snowflake-polars (≤ 1.12.20) Avis : GHSA-mjw2-v2hm-wj34 NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-41490 Crédit : Romain Deperne

TL;DR

Chaque gestionnaire d'E/S de base de données Dagster construit sa clause WHERE en interpolant par f-string les valeurs des clés de partition directement dans le SQL. Lorsqu'un asset utilise DynamicPartitionsDefinition, les clés de partition peuvent être définies à l'exécution via l'API GraphQL (addDynamicPartition) — qui n'est pas authentifiée dans le déploiement par défaut du serveur Web. Une clé de partition malveillante transite sans échappement dans les requêtes SELECT (lecture) et DELETE (nettoyage), entraînant une injection SQL contre l'entrepôt sous-jacent (Snowflake, BigQuery, DuckDB, DeltaLake, …).

Comment j'ai découvert cela

Le même helper, _static_where_clause, est copié-collé dans cinq packages de gestionnaires d'E/S. Chacun fait :

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 est entourée de guillemets simples sans échappement. La question était de savoir si partition est jamais contrôlée par l'attaquant. Pour les partitions statiques, elle est définie par le développeur — pas intéressant. Pour DynamicPartitionsDefinition, les clés sont stockées dans la base de données de métadonnées de Dagster et ajoutées à l'exécution via la mutation GraphQL addDynamicPartition. Dans le déploiement par défaut de dagster-webserver, GraphQL n'est pas authentifié, donc un attaquant sur le réseau fournit la clé de partition de bout en bout.

J'ai confirmé les deux extrémités de la chaîne : la mutation GraphQL accepte des chaînes de clés arbitraires sans validation, et la clé arrive textuellement dans _static_where_clause via context.asset_partition_keys.

Chaîne d'attaque

  1. Accès réseau au serveur Web Dagster (pas d'authentification par défaut)
  2. addDynamicPartition(... partitionKey: "') UNION SELECT username, password_hash FROM secret_table; --")
  3. launchRun(...) ciblant cette partition
  4. Le gestionnaire d'E/S construit SELECT/DELETE ... WHERE col in ('') UNION SELECT ... ; --')
  5. L'injection SQL s'exécute contre la base de données sous-jacente

Code affecté (motif identique, 5 emplacements)

PackageFile
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

Les chemins de lecture et de nettoyage l'utilisent tous deux :

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

Cause racine

Les clés de partition étaient traitées comme des constantes de développeur fiables, mais DynamicPartitionsDefinition les transforme en entrées définissables de l'extérieur à l'exécution. L'interpolation par f-string qui était « sûre » pour les clés statiques devient une injection pour les clés dynamiques. Correctif : requêtes paramétrées / citation appropriée des identifiants et littéraux au lieu des f-strings.

Preuve de concept

poc/poc_partition_sqli.py — montre la sortie vulnérable de _static_where_clause pour des clés bénignes vs. malveillantes, exécute une exfiltration basée sur UNION live DuckDB + DROP TABLE contre une base de données préremplie, et imprime les charges utiles exactes GraphQL addDynamicPartition / launchRun qu'un attaquant envoie.

root@kitploit:~
pip install duckdb        # minimal; full chain: dagster dagster-duckdb pandas
python3 poc/poc_partition_sqli.py

Impact

Injection SQL non authentifiée (configuration par défaut) contre l'entrepôt de données que Dagster orchestre — lecture arbitraire d'autres tables et écritures destructrices. Dagster se trouve au centre des plateformes de données, donc cela atteint le magasin le plus sensible de la pile.


Divulgué de manière responsable via GitHub Security Advisory. PoC publié après le correctif.

Télécharger l’outil