Caricatore dinamico
L'essenza del problema: durante il funzionamento, ld.so estrae prima il valore della variabile LD_LIBRARY_PATH dall'ambiente e, utilizzando la funzione _dl_split_path(), lo trasforma in un array di stringhe - percorsi di directory. Se in seguito si scopre che il processo corrente è stato avviato da un'applicazione SUID/SGID, l'array creato e, di fatto, la variabile LD_LIBRARY_PATH vengono cancellati. Allo stesso tempo, se _dl_split_path() esaurisce la memoria (cosa difficile a causa del limite esplicito di 256 kB sulla dimensione delle variabili d'ambiente, ma teoricamente possibile), allora la variabile _dl_libpath riceverà il valore NULL, e i successivi controlli di il valore di questa variabile forzerà il salto della chiamata a _dl_unsetenv("LD_LIBRARY_PATH").
Vulnerabilità rilevata dagli esperti
Aggiunta: al problema è stato assegnato un numero
amd64 e i386 (l'exploit può essere adattato per altre architetture).
Il problema è sfruttabile nell'installazione predefinita e consente a un utente locale non privilegiato di eseguire codice come root tramite la sostituzione della libreria durante l'esecuzione delle utilità suid chpass o passwd. Per creare le condizioni di memoria insufficiente necessarie per il funzionamento, impostare il limite RLIMIT_DATA tramite setrlimit.
Fonte: opennet.ru