Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
spark-python-ds-static — Apache Spark 4.2.0 - Alto - Remoto - Privilegio residuo - mappa globale del processo Python Data Source | Kitploit
Strumenti/GitHubGitHub/abraxas/spark-python-ds-static
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitPost-ExploitPaper e RicercaRed TeamingSviluppo PayloadLab e Pratica
GitHubabraxas/spark-python-ds-static

spark-python-ds-static

Apache Spark 4.2.0 - Alto - Remoto - Privilegio residuo - mappa globale del processo Python Data Source

Vedi Repository
2 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Abraxas Labs - spark-python-ds-static

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

spark-python-ds-static

Classe: Privilegio residuo Portata: Remota

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

DataSourceManager.dataSourceBuilders è una mappa JVM-globale first-wins. SPARK-45917 registra automaticamente le Python Data Source pyspark_* dal sys.path del worker di lookup. L'isolamento delle sessioni Connect mantiene gli artefatti sotto SparkFiles/<sessionUUID>/, e registerPython per sessione resta su runtimeDataSourceBuilders. Il primo lookup mette comunque la directory SparkFiles della sessione che lo attiva su sys.path, serializza (pickle) ogni DefaultSource e memorizza quelle classi nella companion object. Le successive query SQL Connect (o Hive Thrift SQL) read.format(name) / USING name eseguono quella classe come Spark UID senza inviare il proto Python.

Chi pianta è un tenant Python Connect a cui è già consentito Python. La vittima è un tenant solo-SQL sullo stesso driver Connect. Gli alias Java (parquet, csv, json, orc, jdbc) restano sul percorso Java ServiceLoader. I piantaggi successivi, dopo che la mappa è stata riempita, non si aggiornano. AC:H è il primo lookup più un nome che non è un alias Java.

IDnessuna CVE al momento
ClassePrivilegio residuo (Python Data Source cross-sessione come Spark UID; non invio di job non autenticato)
PortataRemota (driver Spark Connect condiviso)
CWECWE-269, CWE-502
CVSSAlto: 8.8 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
ProdottoApache Spark
Affetto4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) registro statico delle Python Data Source
AuthTenant Python Connect (chi pianta) più un successivo utente Connect solo-SQL / Hive Thrift SQL (vittima)
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1:18970. File testimone. Gadget della mappa companion.

Cosa può fare un attaccante

Mantenere una sessione Python Spark Connect su un driver condiviso. Pianta pyfiles/pyspark_<name>.py il cui DefaultSource.name() è un nome breve di connettore assente (delta, iceberg, hudi, ...). Attiva il primo lookup di Python Data Source su quella sessione. Ogni sessione successiva nella stessa JVM che esegue read.format(name) o SQL USING name istanzia la classe serializzata come Spark UID sul worker del planner del driver e sugli executor.

Questo è l'intero insieme di privilegi. Chi pianta esegue già Python. Il residuo è che un tenant solo-SQL, che non ha mai inviato il proto REGISTER_DATA_SOURCE / Python UDF, esegue comunque quella classe.

Integrità (dimostrata in lab)

MetodoSinkPrivilegio
Chi pianta: AddArtifacts nome pyfiles/pyspark_<name>.py poi primo format(name) / lookupcompanion DataSourceManager.dataSourceBuilders (object DataSourceManager.scala) più lookup_data_sources.py iter_modules di pyspark_*Memorizza il DefaultSource serializzato della sessione che lo attiva a livello JVM. Lab: layer='static' trigger='attacker' first-wins=yes.
Vittima: SQL USING <name> / spark.read.format(name) su una sessione che non ha mai piantatoPythonDataSourceV2 createDataSourceInPythonEsegue quella classe come Spark UID. Lab: planted_by='attacker' witness_written=True static-cross-session=yes. Il file oracle contiene SPARK-PYTHON-DS-STATIC-WITNESS.

Chiuso in questa analisi (dimostrato in lab)

MetodoSinkRisultato
Piantaggio successivo di un secondo nome dopo che la mappa è stata riempitastessa mappa staticaChiuso. First-wins. Lab: later-lookup found=False, la companion contiene ancora solo delta.
registerPython("alpha") per sessioneruntimeDataSourceBuildersIsolato. Il clone copia solo il runtime. Lab: runtime-isolated=yes. La lettura di alpha da parte della vittima è found=False.
Alias Java parquetJava DataSourceRegister ServiceLoaderChiuso. Lab: java-alias-closed=yes layer='java'. Idem per csv/json/orc/jdbc.

Dedotto (stessi sink, non l'oracle)

MetodoSinkPrivilegio
USING della vittima dopo il piantaggioworker Python del driver + executorCodice a livello di cluster come Spark UID. Il lab scrive un file testimone invece di un payload.
Stesso percorsocrash / spin del workerDisponibilità come Spark UID. Non è l'Alto. L'Alto è l'esecuzione di codice.
Hive Thrift SQL USING su una SparkSession condivisastessa mappa staticaStesso residuo se Thrift e Connect condividono la JVM del driver. Non esercitato.

Cosa non concede questo residuo

  • Invio di job non autenticato su un cluster aperto. FAQ di SECURITY.md. By design.
  • Hijack di parquet / csv / json / orc / jdbc Java. Vince il ServiceLoader.
  • Fuga dal percorso degli artefatti (concatenatePaths rifiuta .. e nomi assoluti).
  • pythonExec fornito dal client. Il planner Connect usa PYSPARK_PYTHON / python3 del server.
  • Perdita cross-sessione di registerPython. La mappa runtime è per istanza di DataSourceManager.
  • pyspark locale mono-utente con una sola sessione. Non c'è altro tenant.
  • Un lookup miss-first che riempie una mappa vuota. I piantaggi successivi non si aggiornano (AC:H).

Come l'ho trovato

Ho fissato apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8). Ventotto ricerche nel sorgente. L'invio di job che esegue codice utente è by design. History Jackson, la shell UI, l'impersonificazione locale di PySpark e il percorso di ricezione RPC standalone sono chiusi in questa analisi. Gli artefatti Connect isolano i pyfiles sotto un UUID di sessione. registerPython a runtime è per sessione. La companion object no.

SPARK-45917 registra automaticamente i pacchetti pyspark_* da PYTHONPATH. È previsto per i connettori installati dall'operatore. Il residuo è che il worker di lookup fa anche sys.path.insert della directory SparkFiles della sessione che lo attiva (worker_util.setup_spark_files), poi serializza qualunque DefaultSource pyspark_* trovi in una mappa globale di processo che non si aggiorna mai.

Falsa pista: considerare l'isolamento di registerPython come l'intera barriera tra tenant. Il runtime è isolato. Lo statico no.

Lab

cd lab
./run.sh

Loopback 127.0.0.1:18970. Progetto compose spark-python-ds-static. Testimone SPARK-PYTHON-DS-STATIC-WITNESS. Gadget Python di object DataSourceManager più mappe runtime per sessione. Pianta pyspark_delta.py solo negli SparkFiles dell'attaccante. Il lookup dell'attaccante riempie la companion. Il piantaggio successivo di iceberg non si aggiorna. La read di delta da parte della vittima scrive l'oracle. registerPython("alpha") non perde. Il parquet Java resta Java.

Ultima riga:

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

La correzione

Scarica lo strumento