
Write-up educativo e PoC in modalità test per CVE-2026-92162, un path traversal nel parametro arch di DeployAppstream di Flatpak che consente la creazione di directory root.
Write up educativo e proof of concept in modalità test per un path traversal
nell'helper di sistema di Flatpak (flatpak-system-helper). Il metodo D-Bus
DeployAppstream accetta una stringa arch che viene inserita in un percorso
del filesystem e creata come root, senza alcuna validazione. Un utente locale
attivo può fornire componenti ../ e causare la creazione di directory al di
fuori dell'albero appstream previsto da parte del servizio con privilegi root.
Questo repository accompagna l'analisi tecnica completa e il post-mortem della ricerca. Esiste per scopi educativi, per i difensori che vogliono comprendere il meccanismo, e per test autorizzati su sistemi di tua proprietà o per i quali hai un permesso scritto di valutazione.
Questo materiale è pubblicato dopo la divulgazione coordinata e dopo che una versione corretta di Flatpak è stata resa disponibile. Esegui il proof of concept solo contro una macchina di laboratorio di tua proprietà o che sei esplicitamente autorizzato a testare. Non eseguirlo contro sistemi che non controlli. Sei responsabile di rimanere entro i limiti della legge e nell'ambito di qualsiasi autorizzazione di cui disponi.
handle_deploy_appstream() nell'helper di sistema valida l'argomento origin
ma non l'argomento arch. Per un remote OCI, arch confluisce in
flatpak_build_file e poi in g_mkdir_with_parents, che viene eseguito come
root e risolve ../ lessicalmente. L'azione polkit per il metodo è
org.freedesktop.Flatpak.appstream-update, che è allow_active=yes, quindi
una sessione locale attiva raggiunge il codice senza richiesta di password. Su
un sistema che ha già un remote OCI, come un Fedora Workstation predefinito con
il suo remote fedora, un utente con privilegi ridotti può creare directory di
proprietà di root in un percorso arbitrario. Il payload in questo repository
prende di mira /root/.ssh stesso.
Questa vulnerabilità, Finding A, è stata dimostrata come parte di una catena di
due vulnerabilità utilizzata per escalare da un utente locale non autenticato a
root sulla macchina, in un laboratorio controllato e autorizzato. La catena
funziona come segue: Finding A crea /root/.ssh come root. Finding B, una
primitiva di scrittura secondaria, può quindi scrivere contenuto controllato
dall'attaccante in quella directory. Insieme forniscono a un attaccante un file
di proprietà di root in un percorso scelto dall'attaccante. Ogni bug da solo è
limitato: Finding A crea solo directory, e Finding B può scrivere solo dove
esiste già una directory padre. Finding A fornisce la directory padre di cui
Finding B ha bisogno, e la coppia diventa scrittura di file come root.
Finding B è stato identificato in modo indipendente da questa ricerca, ma non è
un nuovo finding: è la debolezza nota e ancora non corretta nel percorso di
scrittura dei dati extra di Deploy documentata nel post-mortem della ricerca.
Questo write up quindi copre e viene accreditato per Finding A, e utilizza
Finding B solo come il componente noto e non corretto su cui la catena si basa.
Questo repository dimostra solo Finding A. La metodologia di concatenazione e le lezioni difensive sono documentate nel post-mortem della ricerca.
Il progetto fornisce già flatpak_is_valid_arch, che limita un nome di
architettura a [A-Za-z0-9_]. La remediation consiste nel chiamarlo
sull'argomento arch al confine dell'handler e all'interno degli helper di
costruzione dei percorsi. Un valore ../ non può superare quel predicato.
Aggiorna alla versione corretta di Flatpak.
.
├── README.md Questo file.
├── requirements.txt Prerequisiti dei pacchetti di sistema per il PoC.
└── poc_arch_traversal.sh PoC per il parametro arch non validato.
Modalità test sandboxed per impostazione predefinita,
la modalità produzione prende di mira /root/.ssh.
Solo per uso educativo.
requirements.txt presenti.allow_active=yes. Verifica con:
loginctl list-sessions e conferma che la tua sessione mostri un seat./usr/libexec/flatpak-system-helper; lo script cerca prima un helper
appena compilato in builddir/ o _build/ dell'albero sorgente di Flatpak,
e FLATPAK_SYSTEM_HELPER ha la precedenza su tutto. Vedi requirements.txt
per i pacchetti di sistema necessari.La modalità produzione rileva automaticamente un remote OCI esistente nell'installazione di sistema e lo utilizza. Qualsiasi remote OCI funziona, anche uno falso o irraggiungibile, perché la mkdir avviene prima che il registry venga mai contattato. Se non esiste alcun remote OCI, lo script annulla con un messaggio "No OCI remote found" e non invia nulla.
Fedora Workstation fornisce già il remote OCI fedora, quindi non serve fare
nulla lì. Verifica cosa esiste con flatpak remotes --system (un remote OCI
mostra oci nella sua colonna delle opzioni).
Questo è l'unico comando dell'intero flusso che richiede sudo, e lo script non lo esegue mai per te. Aggiungine uno con:
sudo flatpak remote-add --system --no-gpg-verify oci-poc oci+http://127.0.0.1:19876
(flatpak non ha un flag --oci, almeno fino alla 1.19.0, la versione su cui si
basa questo lavoro; il prefisso URL oci+ è ciò che rende il remote un
registry OCI.) Un messaggio "Warning: Could not update extra metadata" è
previsto quando non è in esecuzione alcun registry; il remote viene comunque
aggiunto.
bash poc_arch_traversal.sh
Lo script avvia un bus D-Bus privato e un helper in modalità --session,
tutto sotto una directory temporanea. Chiama DeployAppstream con il payload
../../../../../root/.ssh e verifica che la directory evasa sia stata creata
in <workdir>/root/.ssh, rispecchiando il target reale. Aspettati un errore
D-Bus nel mezzo dell'output: è il recupero dell'indice OCI che fallisce dopo
che la directory è già stata creata, ed è il comportamento previsto.
bash poc_arch_traversal.sh prod
Lo script non chiede mai una password. Rileva automaticamente un remote OCI,
attiva DeployAppstream senza autenticazione con il payload di traversal, e
stampa la risposta dell'helper. L'helper root crea /root/.ssh e poi fallisce
sul registry irraggiungibile, il che stampa l'errore D-Bus previsto. Se la
risposta è invece un errore di autenticazione, non sei in una sessione locale
attiva; eseguilo dalla console della macchina. Un remote specifico può essere
forzato con bash poc_arch_traversal.sh prod <remote>.
Il trigger stesso viene eseguito senza privilegi, ma confermare il risultato richiede root, quindi lo script lascia questo compito a te. Dopo l'esecuzione, sulla stessa macchina:
sudo ls -laR /root/.ssh
sudo stat -c '%U:%G' /root/.ssh
La directory deve esistere ed essere di proprietà di root:root. L'errore
D-Bus nell'output dello script non è un fallimento: prova che la mkdir è stata
eseguita prima del recupero, poiché la directory evasa esiste anche se la
chiamata al metodo è fallita.
Se /root/.ssh esisteva già prima dell'esecuzione (ad esempio su un host con
un sshd in esecuzione), l'esecuzione è un no-op su quel percorso e non lascia
nulla dietro: il file lock dell'helper è transitorio e viene rimosso quando
il metodo ritorna, e icons viene scritto solo dopo un recupero dell'indice
riuscito. Per una verifica pulita, esegui contro un percorso che non esiste
ancora.
sudo rm -rf /root/.ssh # solo se non esisteva prima dell'esecuzione
sudo flatpak remote-delete --system oci-poc
Ricerca e write up di Yehia Ali Mohamed Ezzat.
La documentazione e il codice in questo repository sono forniti per scopi educativi. Usali a tuo rischio e solo dove sei autorizzato.