Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-41490 — Divulgation détaillée de CVE-2026-41490 avec PoC démontrant une injection SQL non authentifiée dans les gestionnaires d'E/S de base de données de Dagster via des clés de partition dynamiques, affectant les intégrations DuckDB, Snowflake, BigQuery et DeltaLake. | Kitploit
Outils/GitHubGitHub/romain-deperne/cve-2026-41490
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationSécurité des Bases de Données
GitHubromain-deperne/cve-2026-41490

CVE-2026-41490

Divulgation détaillée de CVE-2026-41490 avec PoC démontrant une injection SQL non authentifiée dans les gestionnaires d'E/S de base de données de Dagster via des clés de partition dynamiques, affectant les intégrations DuckDB, Snowflake, BigQuery et DeltaLake.

Voir le dépôt
23il y a 1 moisPas 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 de Dagster via des clés de partition dynamiques

Gravité : Élevée (CVSS 8.3) CWE : CWE-89 — Injection SQL Affecté : Dagster core <= 1.13.0 et packages d'intégration <= 0.29.0 Corrigé dans : Dagster core 1.13.1 et packages d'intégration 0.29.1 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 de Dagster construit sa clause WHERE en interpolant directement les valeurs de clés de partition dans le SQL via des f-strings. 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 webserver par défaut. Une clé de partition malveillante s'écoule sans échappement dans les requêtes SELECT (chargement) et DELETE (nettoyage), produisant une injection SQL contre l'entrepôt de données sous-jacent (Snowflake, BigQuery, DuckDB, DeltaLake, …).

Analyse

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

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é de guillemets simples sans échappement. La question était de savoir si partition est un jour contrôlé par un attaquant. Pour les partitions statiques, il est défini par le développeur — sans intérêt. Pour DynamicPartitionsDefinition, les clés sont stockées dans la base de métadonnées de Dagster et ajoutées à l'exécution via la mutation GraphQL addDynamicPartition. Dans le déploiement dagster-webserver par défaut, 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é arbitraires sans aucune validation, et la clé atteint _static_where_clause telle quelle via context.asset_partition_keys.

Chaîne d'attaque

  1. Accès réseau au serveur web Dagster (aucune 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)

PackageFichier
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 chargement et de nettoyage le consomment tous les deux :

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 dignes de confiance, mais DynamicPartitionsDefinition les transforme en entrées d'exécution définissables de l'extérieur. L'interpolation 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 correcte des identifiants et des 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 sur un DuckDB en direct + DROP TABLE contre une base de données préremplie, et affiche les charges utiles GraphQL exactes addDynamicPartition / launchRun qu'un attaquant envoie.

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 orchestré par Dagster — lecture arbitraire d'autres tables et écritures destructrices. Dagster se situe au centre des plateformes de données, ce qui permet d'atteindre le stockage 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