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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
spark-connect-copy-local — Apache Spark 4.2.0 - 높음 - 원격 - 파일 쓰기 - Connect 세션 SET copyFromLocalToFs.allowDestLocal | Kitploit
도구/GitHubGitHub/abraxas/spark-connect-copy-local
Vulnerability AnalysisExploitationWeb Application ExploitationConfiguration AuditingSecurity VirtualizationPenetration TestingCloud SecurityRed Teaming
GitHubabraxas/spark-connect-copy-local

spark-connect-copy-local

Apache Spark 4.2.0 - 높음 - 원격 - 파일 쓰기 - Connect 세션 SET copyFromLocalToFs.allowDestLocal

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - spark-connect-copy-local

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-connect-copy-local

spark-connect-copy-local

분류: 파일 쓰기 (SPARK-58531의 잔재; 4.3.0에서만 static) 도달 범위: 원격

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

spark.sql.artifact.copyFromLocalToFs.allowDestLocal은 이 핀에서 여전히 buildConf(세션에서 설정 가능)입니다. SPARK-58531은 4.3.0에서 이를 StaticSQLConf로 옮겼습니다. Connect 세션은 테스트 전용 로컬 대상 게이트를 SET한 뒤, copyFromLocalToFs / AddArtifacts forward_to_fs/<abs>로 드라이버 로컬 경로를 Spark UID 권한으로 덮어쓸 수 있습니다.

Connect 세션 SET 후 forward_to_fs가 드라이버 로컬 파일을 씁니다. 대상은 반드시 LocalFileSystem이어야 합니다. RCE는 아닙니다.

ID아직 CVE 없음 (SPARK-58531의 잔재)
분류파일 쓰기 (SPARK-58531의 잔재; 4.3.0에서만 static)
도달 범위원격 (Spark Connect Config + AddArtifacts)
CWECWE-22, CWE-732
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
제품Apache Spark (ASF)
영향받는 버전Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8). 4.3.0은 static.
인증ConfigRequest.SET과 AddArtifacts를 할 수 있는 Connect 클라이언트. 기본 Connect에는 PSK가 없음.
라이선스GNU Affero GPL v3.0
랩127.0.0.1:18920 전용

공격자가 할 수 있는 일

gRPC에 도달할 수 있는 Spark Connect 클라이언트(기본 바인드 포트 15002, 운영자가 spark.connect.authenticate.token을 설정하지 않는 한 PSK 없음)는 드라이버가 시작될 때 켜져 있던 테스트 전용 게이트를 끄고, 드라이버의 선택한 로컬 경로를 Spark UID 권한으로 덮어쓸 수 있습니다.

방법싱크권한
gRPC Config SET spark.sql.artifact.copyFromLocalToFs.allowDestLocal=true (또는 SQL SET)SparkConnectConfigHandler.handleSet -> RuntimeConfig.set -> SQLConf.setConfString무결성 (세션 conf, 랩 입증): 세션별 로컬 대상 게이트를 뒤집습니다. 그 자체로 파일을 쓰지는 않습니다. 다른 세션은 변경하지 않습니다. 랩: SET HTTP 200, modifiable=True.
gRPC AddArtifacts 이름 forward_to_fs + 절대 대상 경로, CRC 정상ArtifactManager.uploadArtifactToFs -> LocalFileSystem.copyFromLocalFile(delSrc=false, overwrite=true)무결성 (파일 덮어쓰기, 랩 입증): artifactRootDirectory/<sessionUUID>/ 밖의 드라이버 로컬 경로를 Spark UID 권한으로 쓰기/덮어쓰기. 랩: 대상 /oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS, uid 185, 내용 WITNESS.
동일한 AddArtifacts를 HDFS/S3/ABFS 대상으로문서화된 copyFromLocalToFs무결성 (클러스터 FS, 설계상): 이 잔재가 아님. LocalFileSystem이 아닌 대상은 테스트 플래그를 참조하지 않음.

랩 입증 vs 추론: buildConf 키의 세션 SET 후, 아티팩트 샌드박스 밖의 LocalFileSystem 대상에 uid 185로 쓰는 것은 랩 입증입니다. 프로세스가 쓸 수 있는 경로(드라이버 작업 디렉터리, 전 세계 쓰기 가능한 드롭 위치, 운영자가 나중에 실행하는 이미 실행 가능한 스크립트)를 Spark UID로 덮어쓰는 것은 추론입니다. RIP 제어는 없습니다. 파일 쓰기를 RCE로 부풀리지 마십시오.

요구 사항: Spark Connect가 수신 대기 중이어야 합니다. 세션 SQL conf를 SET하고 AddArtifacts를 할 수 있는 클라이언트. 대상은 반드시 Hadoop LocalFileSystem이어야 합니다. 기본 Connect에는 PSK가 없습니다. 운영자가 토큰을 설정한 경우, 이 잔재는 여전히 그 공유 Bearer를 필요로 합니다. 이는 로컬 대상 제어의 우회이며, PSK 우회가 아닙니다.

닫혀 있는 인접 표면

표면랩
SET 없는 복사400 _LEGACY_ERROR_TEMP_3161, 대상 없음
이전 static spark.connect.copyFromLocalToFs.allowDestLocal SET400 CANNOT_MODIFY_STATIC_CONFIG
아티팩트 이름 .. / 절대 스테이징 (ArtifactUtils.concatenatePaths)INVALID_ARTIFACT_PATH
forward_to_fs가 아닌 아티팩트artifactRootDirectory/<sessionUUID>/ 아래에 머무름
플래그 없는 HDFS/클라우드 대상문서화된 API, 이 잔재가 아님
개방된 Connect에서의 무인증 SQL / Python UDF / Scala UdfPacket벤더 FAQ 작업 제출; DROP
SPARK-52122 ML DefaultParamsReader이 핀에서 allowlist + safeMLClassLoader

셸 없음. 힙 덤프 없음. Connect PSK 건너뛰기 없음. 대상은 여전히 LocalFileSystem이어야 합니다. 쓰기는 root가 아닌 Spark UID 권한으로 이루어집니다.

발견 방법

uploadArtifactToFs는 테스트 플래그가 켜져 있지 않으면 LocalFileSystem 대상을 거부하며, 그렇지 않으면 사용자가 드라이버의 임의 파일을 덮어쓴다는 명시적 주석이 있습니다:

if (fs.isInstanceOf[LocalFileSystem]) {
  val allowDestLocalConf =
    session.sessionState.conf.getConf(SQLConf.ARTIFACT_COPY_FROM_LOCAL_TO_FS_ALLOW_DEST_LOCAL)
      .getOrElse(
        session.conf.get("spark.connect.copyFromLocalToFs.allowDestLocal").contains("true"))
  if (!allowDestLocalConf) {
    throw new SparkUnsupportedOperationException("_LEGACY_ERROR_TEMP_3161")
  }
}
fs.copyFromLocalFile(false, true, new FSPath(localPath.toString), destFSPath)

3.5 키는 static이고 기본값은 false입니다. 4.0 대체 키는 buildConf optional입니다:

val ARTIFACT_COPY_FROM_LOCAL_TO_FS_ALLOW_DEST_LOCAL =
  buildConf("spark.sql.artifact.copyFromLocalToFs.allowDestLocal")
    .internal()
    ...
    .booleanConf
    .createOptional

buildConf는 registerStaticConfigKey를 호출하지 않습니다. isModifiable은 containsConfigKey && !isStaticConfigKey입니다. RuntimeConfig.set은 static 키만 거부합니다. Internal은 여전히 설정 가능합니다. SET 후, getConf(ARTIFACT_...)는 Some(true)를 반환하고 static 이전 conf로의 getOrElse 폴백은 건너뜁니다.

SPARK-58531 / PR 57730 "Convert spark.sql.artifact.copyFromLocalToFs.allowDestLocal to a static conf"는 2026-08-05에 해결되었으며, Fix Version은 4.3.0입니다. JIRA: 이 conf는 "호출자가 드라이버의 로컬 파일시스템에서 임의 경로에 쓸 수 있는지 여부를 제어하므로, 드라이버를 시작하는 사람이 설정하도록 의도된 것입니다." 4.2.0이 Affects에 나열되어 있습니다. 이 핀에는 여전히 런타임 conf가 있습니다.

이미 기록된 잘못된 방향: Connect SQL을 발견으로 취급(FAQ); 이전 static 키의 SET(CANNOT_MODIFY_STATIC_CONFIG); Unix 절대 대상이 부모를 무시한다고 주장(루트 아래에 결합됨); 파일 쓰기를 RCE로 부풀림; JIRA가 해결되었다는 이유로 4.3.0 RC를 핀.

랩

cd lab
./run.sh

루프백 127.0.0.1:18920. 세션 conf 게이트와 LocalFileSystem 대상 복사의 가젯(핀 v4.2.0 32f72996). 서버 UID 185. SET 없는 대조군: 400 _LEGACY_ERROR_TEMP_3161, 대상 없음. 이전 static 키의 SET 대조군: CANNOT_MODIFY_STATIC_CONFIG. buildConf 키의 세션 SET 후 복사: 대상 /oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS가 /opt/spark/work/artifacts/<sessionUUID>/ 밖에 위치, uid 185, 내용 WITNESS.

health pin=v4.2.0 commit=32f7299601108917fb01920a54e084595b7b3bf8
server uid=185 artifact_root=/opt/spark/work/artifacts/<sessionUUID>
control-no-set status=400 condition=_LEGACY_ERROR_TEMP_3161
control-no-set dest-absent=yes
control-static-set status=400 error_class=CANNOT_MODIFY_STATIC_CONFIG
session-set status=200 modifiable=True
copy-after-set status=200 dest=/oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS
oracle dest=/oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS uid=185 outside-sandbox=yes content=SPARK-CONNECT-COPY-LOCAL-WITNESS
SUCCESS SPARK-CONNECT-COPY-LOCAL SPARK-CONNECT-COPY-LOCAL-WITNESS

수정 방법

spark.sql.artifact.copyFromLocalToFs.allowDestLocal을 StaticSQLConf로 옮겨 세션이 SET할 수 없도록 합니다. 이것이 4.3.0의 SPARK-58531 / PR 57730입니다. 운영자가 4.3.0을 실행할 수 있을 때까지: 토큰과 네트워크 ACL 없이 Connect를 노출하지 말고, 드라이버가 테스트 플래그를 설정하지 않고 시작되었다는 이유만으로 그 플래그가 꺼져 있다고 간주하지 마십시오.

참고 자료

도구 다운로드