Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-41490 — Dagster 데이터베이스 I/O 관리자의 동적 파티션 키를 통한 인증되지 않은 SQL 인젝션을 PoC로 입증하는 CVE-2026-41490 상세 공개로, DuckDB, Snowflake, BigQuery, DeltaLake 통합에 영향을 미칩니다. | Kitploit
도구/GitHubGitHub/romain-deperne/cve-2026-41490
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationDatabase Security
GitHubromain-deperne/cve-2026-41490

CVE-2026-41490

Dagster 데이터베이스 I/O 관리자의 동적 파티션 키를 통한 인증되지 않은 SQL 인젝션을 PoC로 입증하는 CVE-2026-41490 상세 공개로, DuckDB, Snowflake, BigQuery, DeltaLake 통합에 영향을 미칩니다.

저장소 보기
231개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-41490 — 동적 파티션 키를 통한 Dagster 데이터베이스 I/O 관리자의 SQL 인젝션

심각도: 높음 (CVSS 8.3) CWE: CWE-89 — SQL 인젝션 영향받는 버전: Dagster core <= 1.13.0 및 통합 패키지 <= 0.29.0 수정된 버전: Dagster core 1.13.1 및 통합 패키지 0.29.1 보안 권고: GHSA-mjw2-v2hm-wj34 NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-41490 공로: Romain Deperne

요약

모든 Dagster 데이터베이스 I/O 관리자는 파티션 키 값을 SQL에 직접 f-string으로 보간하여 WHERE 절을 구성합니다. 에셋이 DynamicPartitionsDefinition을 사용할 때, 파티션 키는 런타임에 GraphQL API(addDynamicPartition)를 통해 설정될 수 있으며 — 이는 기본 웹서버 배포에서 인증이 필요하지 않습니다. 악의적인 파티션 키는 이스케이프되지 않은 채로 SELECT(로드) 및 DELETE(정리) 쿼리 모두에 흘러들어가, 백엔드 웨어하우스(Snowflake, BigQuery, DuckDB, DeltaLake, …)에 대한 SQL 인젝션을 초래합니다.

분석

동일한 헬퍼인 _static_where_clause가 다섯 개의 I/O 관리자 패키지에 복사-붙여넣기되어 있습니다. 각각은 다음을 수행합니다:

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이 공격자의 제어를 받을 수 있는지 여부였습니다. 정적(static) 파티션의 경우 개발자가 정의하므로 흥미롭지 않습니다. DynamicPartitionsDefinition 의 경우 키가 Dagster의 메타데이터 DB에 저장되며 런타임에 addDynamicPartition GraphQL 뮤테이션을 통해 추가됩니다. 기본 dagster-webserver 배포에서 GraphQL은 인증이 없으므로, 네트워크상의 공격자가 파티션 키를 엔드투엔드로 공급할 수 있습니다.

체인의 양쪽 끝을 모두 확인했습니다: GraphQL 뮤테이션은 검증 없이 임의의 키 문자열을 허용하며, 키는 context.asset_partition_keys를 통해 그대로 _static_where_clause에 도달합니다.

공격 체인

  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

로드 경로와 정리(cleanup) 경로 모두 이를 사용합니다:

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-string 보간이 동적 키에 대해서는 인젝션이 된다. 수정: f-string 대신 매개변수화된 쿼리 / 적절한 식별자+리터럴 인용을 사용한다.

개념 증명

poc/poc_partition_sqli.py — 정상 키와 악성 키에 대한 취약한 _static_where_clause 출력을 보여주고, 시드된 데이터베이스에 대해 실제 DuckDB UNION 기반 유출 + DROP TABLE을 실행하며, 공격자가 전송하는 정확한 addDynamicPartition / launchRun GraphQL 페이로드를 출력한다.

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

영향

Dagster가 오케스트레이션하는 데이터 웨어하우스에 대한 인증되지 않은(기본 설정) SQL 인젝션 — 다른 테이블의 임의 읽기 및 파괴적 쓰기. Dagster는 데이터 플랫폼의 중심에 위치하므로, 이는 스택에서 가장 민감한 저장소에까지 도달한다.


GitHub Security Advisory를 통해 책임 있게 공개됨. PoC는 수정 이후 게시됨.

도구 다운로드