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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
spark-python-ds-static — Apache Spark 4.2.0 - 높음 - 원격 - 권한 잔여 - 프로세스 전역 Python 데이터 소스 맵 | Kitploit
도구/GitHubGitHub/abraxas/spark-python-ds-static
Privilege EscalationVulnerability AnalysisExploitationPost-ExploitationPapers & ResearchRed TeamingPayload DevelopmentLabs & Practice
GitHubabraxas/spark-python-ds-static

spark-python-ds-static

Apache Spark 4.2.0 - 높음 - 원격 - 권한 잔여 - 프로세스 전역 Python 데이터 소스 맵

저장소 보기
178일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - spark-python-ds-static

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-python-ds-static

분석 문서: https://abraxaslabs.tech/research/spark-python-ds-static

spark-python-ds-static

분류: 권한 잔존(Privilege leftover) 도달 범위: 원격(Remote)

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

DataSourceManager.dataSourceBuilders는 JVM 전역에서 먼저 등록된 것이 이기는(first-wins) 맵입니다. SPARK-45917은 조회를 수행하는 워커의 sys.path에서 pyspark_* Python Data Source를 자동 등록합니다. Connect 세션 격리는 아티팩트를 SparkFiles/<sessionUUID>/ 아래에 유지하며, 세션별 registerPython은 runtimeDataSourceBuilders에 남습니다. 하지만 최초 조회 시에는 여전히 트리거한 세션의 SparkFiles 디렉터리가 sys.path에 추가되고, 모든 DefaultSource가 피클링되어 컴패니언 오브젝트에 클래스로 캐시됩니다. 이후 Connect SQL(또는 Hive Thrift SQL)의 read.format(name) / USING name은 Python proto를 전송하지 않고도 해당 클래스를 Spark UID로 실행합니다.

심는 쪽(planter)은 이미 Python 실행이 허용된 Connect Python 테넌트입니다. 피해자는 동일한 Connect 드라이버에 있는 SQL 전용 테넌트입니다. Java 별칭(parquet, csv, json, orc, jdbc)은 Java ServiceLoader 경로에 그대로 남습니다. 맵이 채워진 뒤에 이루어지는 추가 심기는 갱신되지 않습니다. AC:H는 최초 조회와 Java 별칭이 아닌 이름이라는 조건에서 비롯됩니다.

ID아직 CVE 없음
분류권한 잔존 (교차 세션 Python Data Source가 Spark UID로 실행됨, 인증 없는 작업 제출은 아님)
도달 범위원격 (공유 Spark Connect 드라이버)
CWECWE-269, CWE-502
CVSSHigh: 8.8 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
제품Apache Spark
영향 받는 버전4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) Python Data Source 정적 레지스트리
인증Connect Python 테넌트(심는 쪽) 및 이후의 SQL 전용 Connect / Hive Thrift SQL 사용자(피해자)
라이선스GNU Affero GPL v3.0
실습 환경127.0.0.1:18970 전용. 증거 파일(witness file). 컴패니언 맵의 가젯.

공격자가 할 수 있는 일

공유 드라이버에서 Spark Connect Python 세션을 유지합니다. DefaultSource.name()이 존재하지 않는 커넥터 단축 이름(delta, iceberg, hudi, ...)인 pyfiles/pyspark_<name>.py를 심습니다. 해당 세션에서 최초 Python Data Source 조회를 트리거합니다. 그러면 같은 JVM의 이후 모든 세션이 read.format(name) 또는 SQL USING name을 실행할 때, 피클링된 해당 클래스를 드라이버 플래너 워커와 익스큐터에서 Spark UID로 인스턴스화합니다.

이것이 전체 권한 집합입니다. 심는 쪽은 이미 Python을 실행합니다. 남는 문제는 REGISTER_DATA_SOURCE / Python UDF proto를 한 번도 전송하지 않은 SQL 전용 테넌트가 여전히 해당 클래스를 실행한다는 점입니다.

무결성 (실습으로 입증)

방법싱크권한
심는 쪽: AddArtifacts 이름 pyfiles/pyspark_<name>.py 후 최초 format(name) / 조회컴패니언 DataSourceManager.dataSourceBuilders (DataSourceManager.scala 오브젝트) 및 lookup_data_sources.py의 pyspark_* iter_modules트리거한 세션의 피클링된 DefaultSource를 JVM 전역에 캐시. 실습: layer='static' trigger='attacker' first-wins=yes.
피해자: 아무것도 심지 않은 세션에서 SQL USING <name> / spark.read.format(name) 실행PythonDataSourceV2 createDataSourceInPython해당 클래스를 Spark UID로 실행. 실습: planted_by='attacker' witness_written=True static-cross-session=yes. 오라클 파일에 SPARK-PYTHON-DS-STATIC-WITNESS가 기록됨.

이번 검증에서 확인된 종결 항목 (실습으로 입증)

방법싱크결과
맵이 채워진 후 두 번째 이름의 나중 plant동일한 정적 맵차단됨. 선착순. 실습: later-lookup found=False, 컴패니언은 여전히 delta만 존재.
세션별 registerPython("alpha")runtimeDataSourceBuilders격리됨. 클론은 런타임만 복사. 실습: runtime-isolated=yes. 피해자의 alpha 읽기는 found=False.
Java 별칭 parquetJava DataSourceRegister ServiceLoader차단됨. 실습: java-alias-closed=yes layer='java'. csv/json/orc/jdbc도 동일.

추론됨 (동일한 싱크, 오라클 아님)

방법싱크권한
plant 이후 피해자의 USING드라이버 + 실행기 Python 워커Spark UID로서의 클러스터 전체 코드. 실습에서는 페이로드 대신 증거 파일을 기록함.
동일 경로워커 크래시 / 스핀Spark UID로서의 가용성. High는 아님. High는 코드 실행임.
공유 SparkSession에서의 Hive Thrift SQL USING동일한 정적 맵Thrift와 Connect가 드라이버 JVM을 공유할 경우 동일한 잔여물. 검증되지 않음.

이 잔여물이 부여하지 않는 것

  • 개방형 클러스터에서의 인증 없는 작업 제출. SECURITY.md FAQ. 설계상 그럼.
  • Java parquet / csv / json / orc / jdbc 하이재킹. ServiceLoader가 우선함.
  • 아티팩트 경로 이탈 (concatenatePaths는 ..와 절대 이름을 거부함).
  • 클라이언트 제공 pythonExec. Connect 플래너는 서버의 PYSPARK_PYTHON / python3을 사용함.
  • registerPython의 세션 간 누출. 런타임 맵은 DataSourceManager 인스턴스별임.
  • 단일 세션의 단일 사용자 로컬 pyspark. 다른 테넌트가 없음.
  • 빈 맵을 채우는 미스 우선 조회. 나중 plant는 갱신하지 않음 (AC:H).

발견 방법

apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)을 고정했다. 스물여덟 번의 소스 탐색. 사용자 코드를 실행하는 작업 제출은 설계상 그럼. History Jackson, UI 셸, PySpark 로컬 가장, 그리고 독립 실행형 RPC 수신 경로는 이번 검토에서 차단됨. Connect 아티팩트는 pyfiles를 세션 UUID 아래에 격리함. 런타임 registerPython은 세션별임. 컴패니언 객체는 아님.

SPARK-45917은 PYTHONPATH에서 pyspark_* 패키지를 자동 등록함. 이는 운영자가 설치한 커넥터를 위한 의도된 동작임. 잔여물은 조회 워커가 트리거하는 세션의 SparkFiles 디렉터리도 sys.path.insert한 다음(worker_util.setup_spark_files), 발견한 pyspark_* DefaultSource를 절대 갱신되지 않는 프로세스 전역 맵에 피클링한다는 점임.

잘못된 방향: registerPython 격리를 전체 테넌트 장벽으로 간주한 것. 런타임은 격리됨. 정적은 아님.

실습

cd lab
./run.sh

루프백 127.0.0.1:18970. Compose 프로젝트 spark-python-ds-static. Witness SPARK-PYTHON-DS-STATIC-WITNESS. object DataSourceManager의 Python gadget과 세션별 런타임 맵. pyspark_delta.py는 공격자 SparkFiles에만 심는다. 공격자 조회가 companion을 채운다. 이후 iceberg를 심어도 새로고침되지 않는다. 피해자의 delta read가 oracle을 기록한다. registerPython("alpha")는 유출되지 않는다. Java parquet은 Java로 유지된다.

마지막 줄:

SUCCESS SPARK-PYTHON-DS-STATIC static-cross-session=yes runtime-isolated=yes first-wins=yes java-alias-closed=yes SPARK-PYTHON-DS-STATIC-WITNESS

수정 방안

정적 맵을 채울 때 세션 SparkFiles를 조회 워커의 sys.path에 넣지 마세요. 운영자 PYTHONPATH 패키지만 로드하세요(설계대로 SPARK-45917). 또는 아티팩트가 이미 그러하듯이 정적 맵을 세션 / JobArtifactSet UUID로 키잉하세요. 선착순 빈 채우기는 드라이버의 수명 동안 다른 테넌트의 클래스를 고정해서는 안 됩니다.

그때까지는, 이미 드라이버 Python을 신뢰하지 않는 한 Python 테넌트와 SQL 전용 테넌트 사이에 Connect 드라이버를 공유하지 마세요.

참고 자료

  • github.com/apache/spark 태그 v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)
  • DataSourceManager.scala 컴패니언 dataSourceBuilders / initialStaticDataSourceBuilders
  • lookup_data_sources.py pyspark_* DefaultSource
  • worker_util.py setup_spark_files
  • PythonDataSourceV2.scala
  • SPARK-45917 자동 등록(운영자 PYTHONPATH용으로 의도됨)

연락처

Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]

도구 다운로드