
CVE-2025-31133 PoC
Questo documento spiega il funzionamento dello script Proof-of-Concept (PoC) fornito per la vulnerabilità CVE-2025-31133 in runc.
maskedPaths in runc.maskedPaths, permettendogli di scrivere su file sensibili del sistema host. Ciò costituisce una fuga dal container (container escape)./proc/sys/kernel/core_pattern dell'host dall'interno di un container."pwned" nel file target e non esegue codice arbitrario sull'host. Fornisce inoltre istruzioni per ripristinare il valore originale.La funzionalità maskedPaths nelle specifiche OCI di un container (config.json) è un meccanismo di sicurezza progettato per impedire ai container di accedere a file di sistema sensibili. Funziona montando (bind-mount) /dev/null (un file dispositivo vuoto) sopra questi percorsi sensibili all'interno del container, rendendoli di fatto illeggibili e non scrivibili.
La vulnerabilità (CVE-2025-31133) è una condizione di gara Time-of-Check to Time-of-Use (TOCTOU). L'exploit funziona come segue:
runc configura il container, si prepara a utilizzare il file dev/null dal rootfs del container come sorgente per il bind mount che maschererà il percorso sensibile (ad es. /proc/sys/kernel/core_pattern).runc risolve il percorso verso rootfs/dev/null e quando esegue effettivamente l'operazione di mount.rootfs/dev/null tra un nodo dispositivo legittimo e un link simbolico che punta al file target sull'host (/proc/sys/kernel/core_pattern).runc eseguirà la sua operazione di mount nell'esatto momento in cui rootfs/dev/null è un symlink. Questo fa sì che il kernel segua il symlink e l'operazione di mascheramento fallisca per /proc/sys/kernel/core_pattern.Questo PoC utilizza questa tecnica per scrivere su /proc/sys/kernel/core_pattern, un target comune per tali exploit perché la sua modifica può portare all'esecuzione di codice arbitrario sull'host quando un processo va in crash. Tuttavia, questo PoC scrive solo una stringa innocua per dimostrare l'esistenza della primitiva di scrittura.
Lo script poc.sh automatizza l'intero processo descritto sopra.
Setup & Pulizia:
runc, il nome del container e il percorso rootfs.cleanup robusta che assicura la rimozione di eventuali container o file creati dallo script. Questa funzione viene chiamata automaticamente all'uscita, all'interruzione o alla terminazione.Preparazione:
/proc/sys/kernel/core_pattern dell'host in un file temporaneo. Questo viene usato successivamente per verificare se l'exploit ha avuto successo e per aiutare l'utente a ripristinare il sistema../rootfs) e un file config.json.config.json elenca esplicitamente /proc/sys/kernel/core_pattern in maskedPaths — proprio la funzionalità che l'exploit mira a bypassare.La Funzione di Gara (symlink_race)
Prerequisiti:
runc.busybox-static installato (per la shell del container).sudo) per eseguire runc e modificare /proc.Passi:
poc.sh.chmod +x poc.sh.sudo ./poc.sh.[+] EXPLOIT RIUSCITO!, significa che la condizione di gara è stata vinta. Il file /proc/sys/kernel/core_pattern dell'host è stato modificato con successo dall'interno del container, confermando la vulnerabilità.[-] Exploit non riuscito., la gara non è stata vinta in questo tentativo. Le condizioni di gara sono probabilistiche e dipendono fortemente dal timing e dal carico del sistema. Prova a eseguire lo script ancora qualche volta.Il PoC modifica un file di sistema. Per ripristinarlo allo stato originale, esegui il comando suggerito dallo script:
# 'ORIGINAL_PATTERN' sarà il valore effettivo del tuo sistema
echo 'valore_originale_core_pattern' | sudo tee /proc/sys/kernel/core_pattern
/proc/sys/kernel/core_patternrootfs/dev/null.rootfs/dev/null al file host target (/proc/sys/kernel/core_pattern).rootfs/dev/null come un dispositivo a caratteri appropriato (mknod).Esecuzione:
symlink_race viene avviata come processo in background.runc run ... per creare e avviare il container. Questo è il momento in cui runc tenterà di applicare i maskedPaths.runc exec per eseguire un comando all'interno del container: echo 'pwned' > /proc/sys/kernel/core_pattern.Verifica:
/proc/sys/kernel/core_pattern dell'host."pwned" e con il valore originale.[+] EXPLOIT RIUSCITO! oppure [-] Exploit non riuscito.