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-history-zip-symlink — Apache Spark 4.2.0 - Alto - Remoto - Lettura di file - Lo zip della cronologia segue un symlink piantato | Kitploit
Strumenti/GitHubGitHub/abraxas/spark-history-zip-symlink
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniPenetration TestingPaper e Ricerca
GitHubabraxas/spark-history-zip-symlink

spark-history-zip-symlink

Apache Spark 4.2.0 - Alto - Remoto - Lettura di file - Lo zip della cronologia segue un symlink piantato

Vedi Repository
33 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-history-zip-symlink

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-history-zip-symlink

spark-history-zip-symlink

Classe: Lettura di file Portata: Remota

Apache Spark 4.2.0 (32f72996) - Apache Software Foundation

CVE-2025-54920 ha bloccato Jackson nell'History Server, così sparkEventFromJson costruisce solo sottoclassi di SparkListenerEvent. Il rolling zipEventLogFiles scarica comunque ogni figlio di listStatus tramite FileSystem.open. LocalFileSystem segue un symlink POSIX. Un figlio piantato in eventlog_v2_* viene impacchettato nella GET non autenticata /api/v1/applications/{id}/logs. Il corpo del membro dello zip è il target dello SHS-UID. Il nome della voce è il basename del symlink.

Questa non è una riproposizione della RCE di Jackson. Jackson resta chiuso. Questa non è una RCE sull'host. Integrità e disponibilità sono nulle.

IDnessuna CVE al momento
ClasseLettura di file (residuo dello zip rolling del modello di vittima CVE-2025-54920)
PortataRemota (scrittore della directory dei log della History più GET non autenticata dello zip)
CWECWE-59, CWE-22
CVSSAlto: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
ProdottoApache Spark
Affettotag 4.2.0 v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)
AuthPR:L = scrittura su spark.history.fs.logDirectory (stessa vittima di 54920). Le ACL della History UI sono disattivate di default.
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1:18980

Cosa può fare un attaccante

Chi può scrivere in spark.history.fs.logDirectory (default file:/tmp/spark-events) può piantare una directory rolling che l'History Server zipperà. I writer rolling sono attivi di default. Le ACL della History UI sono disattivate di default. L'UID del processo SHS è il confused deputy.

PrivilegioMetodo / sinkProvato in lab o dedotto
Riservatezza: leggere un file dell'host che l'UID SHS può aprirePiantare eventlog_v2_<id>/ con appstatus_* validi più JSON events_* (SparkListenerLogStart / SparkListenerApplicationStart) più un figlio symlink il cui target risiede fuori dalla log dir. Attendere la scansione. GET non autenticata GET /api/v1/applications/{id}/logs (OneApplicationResource.getEventLogs -> FsHistoryProvider.writeEventLogs -> RollingEventLogFilesFileReader.zipEventLogFiles -> FileSystem.open)Provato in lab. Il corpo del membro dello zip eventlog_v2_app-2026-0001/planted-secret è SPARK-HISTORY-ZIP-SYMLINK-WITNESS. Il membro events non ha witness. Il nome della voce resta il basename del symlink, non il percorso del target.
Riservatezza: event log di un tenant adiacente che l'attaccante non può open (660)Stesso zip, il target del symlink è il log di un'altra appDedotto. Stesso FileSystem.open. Non esercitato.
Riservatezza: keytab, spark-env.sh, /etc/passwd se SHS può leggerliStesso zipDedotto. L'oracolo è un /secret/host-secret dedicato, non quei file.
Integrità dei file di SHS o dell'hostlo zip viene letto nel corpo HTTPChiuso. Provato in lab: nessuno.
Disponibilità dei file di SHS o dell'hostlo zip non cancella né tronca il targetChiuso. Provato in lab: nessuno.
RCE sull'host / costruzione di gadget JacksonJsonProtocol.sparkEventFromJsonChiuso. Richiede SparkListenerEvent. Questo lab pianta solo Event JSON benigni.
Zip slip di ../ nel nome della vocePath.getName()Chiuso. Un filename POSIX non può contenere /. La voce è eventlog_v2_<id>/<basename>.
Fuga della stringa di percorso di resolveLogPathnew Path(logDir, attempt.logPath)Chiuso. L'oggetto Path resta sotto la log dir configurata. La fuga è l'inode.
Riscrittura di compaction / cancellazione del target da parte del cleanerspark.history.fs.eventLog.rolling.maxFilesToRetain default Integer.MAX_VALUE; cleaner disattivato di defaultChiuso. La fs.delete locale di un symlink scollega il link, non il target.
Invio di job non autenticato / caricamento di modelli MLFAQ di SECURITY.md / docs/ml-security.mdChiuso. Per design, non questo residuo.

Come l'ho trovato

Ho fissato apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) invece di master o di una RC 4.3. Ventotto ricerche. La RCE di Jackson nella History è chiusa su questa revisione (JsonProtocol.scala:965-972). L'History Server puntava comunque a una log dir scrivibile dall'attaccante, che è lo stesso modello di vittima di CVE-2025-54920.

zipEventLogFiles zippa tutti i files, non solo i file di eventi:

override def zipEventLogFiles(zipStream: ZipOutputStream): Unit = {
  val dirEntryName = rootPath.getName + "/"
  zipStream.putNextEntry(new ZipEntry(dirEntryName))
  files.foreach { file =>
    addFileAsZipEntry(zipStream, file.getPath, dirEntryName + file.getPath.getName)
  }
}

addFileAsZipEntry è fileSystem.open seguito da transferTo. LocalFileSystem segue i symlink POSIX. getLogDirInfo commenta "handles symbolic links properly" e poi percorre i parent Path non risolti per un nome visualizzato.

Vicoli ciechi già registrati: trattare SPARK-52381 come l'intera storia della History; piantare il witness in events_* (il lab fallisce in quel caso); aspettarsi che la voce dello zip porti il percorso del target; trattare il prefix-join di resolveLogPath come la fuga; provare una classe Event HiveConnection su questa revisione.

Lab

python3 spark-history-zip-symlink-Abraxas-Labs.py

oppure

cd lab
./run.sh

Gadget del dump dello zip rolling di EventLogFileReaders.scala, non un History Server completo e non l'immagine ufficiale spark:4.2.0. Non analizza Event JSON tramite Jackson. Loopback 127.0.0.1:18980. Progetto Compose spark-history-zip-symlink. La directory rolling contiene appstatus_* + events_* validi (senza witness) più planted-secret -> /secret/host-secret.

SUCCESS SPARK-HISTORY-ZIP-SYMLINK SPARK-HISTORY-ZIP-SYMLINK-WITNESS

La correzione

Impacchettare solo i figli events_* / appstatus_*, non ogni nome di listStatus. Aprire con no-follow (O_NOFOLLOW / opzioni no-symlink di Hadoop) e rifiutare un figlio il cui realpath è fuori da spark.history.fs.logDirectory. Un helper per il nome visualizzato non è un controllo di realpath.

Riferimenti

Scarica lo strumento