Chargeur dynamique
L'essence du problème : pendant le fonctionnement, ld.so extrait d'abord la valeur de la variable LD_LIBRARY_PATH de l'environnement et, à l'aide de la fonction _dl_split_path(), la transforme en un tableau de chaînes - chemins vers les répertoires. S'il s'avère plus tard que le processus en cours est démarré par une application SUID/SGID, alors le tableau créé et, en fait, la variable LD_LIBRARY_PATH sont effacés. Dans le même temps, si _dl_split_path() manque de mémoire (ce qui est difficile en raison de la limite explicite de 256 Ko sur la taille des variables d'environnement, mais est théoriquement possible), alors la variable _dl_libpath recevra la valeur NULL, et une vérification ultérieure de la valeur de cette variable fera sauter l'appel à _dl_unsetenv("LD_LIBRARY_PATH").
Vulnérabilité trouvée par des experts
Ajout : Le problème a reçu un numéro
amd64 et i386 (l'exploit peut être adapté pour d'autres architectures).
Le problème est exploitable dans l'installation par défaut et permet à un utilisateur local non privilégié d'exécuter du code en tant que root via la substitution de bibliothèque lors de l'exécution des utilitaires chpass ou passwd suid. Pour créer les conditions de mémoire faible nécessaires au fonctionnement, définissez la limite RLIMIT_DATA via setrlimit.
Source: opennet.ru