В утилитата , използван за организиране на изпълнението на команди от името на други потребители, уязвимост (), позволяваща на потребителите да повишат правата си в системата до потребител root. Проблемът се проявява от версия sudo 1.7.1 само при използване на опцията «pwfeedback» в файла /etc/sudoers, която е деактивирана по подразбиране, но е активирана в някои дистрибутиви, като Linux Mint и Elementary OS. Проблемът е решен в версия , публикувано преди няколко часа. В дистрибуциите уязвимостта все още остава непоправена.
Опцията «pwfeedback» активира показването на символа «*» след всеки въведен символ при въвеждане на парола. Поради в реализацията на функцията getln(), определена в файла tgetpass.c, предадена през стандартния вход (stdin) твърде дълга паролна стринга при определени условия може да не се вмести в заделения буфер и да презапише други данни в стека. Препълването възниква по време на изпълнението на кода sudo с root права.
Същността на проблема е, че при използване на специалния символ ^U (изтриване на реда) по време на грешка при запис, кодът, отговарящ за изчистването на показаните символи «*», нулира данните за наличния размер на буфера, но не възстановява указателя на текущата позиция в буфера до началното му състояние. Друг фактор, който допринася за експлояцията, е отсъствието на автоматично изключване на режима «pwfeedback» при получаване на данни не от терминал, а чрез входен поток (тази недостатъчност създава условия за възникване на грешка при запис, например в системи с еднопосочни грешката възниква при опит за запис след края на канала за четене).
Тъй като нападателят може напълно да контролира презаписването на данни в стека, не е трудно да се създаде експлойт, позволяващ повишаване на правата до потребител root. Проблемът може да бъде експлоатиран от всеки потребител, независимо от правата си за използване на sudo и наличие на специфични за потребителя настройки в sudoers. За блокиране на проблема трябва да се уверите, че в /etc/sudoers няма настройка «pwfeedback» и при необходимост да я деактивирате («Defaults !pwfeedback»). За проверка наличието на проблема може да се изпълни кода:
$ perl -e 'print((«A» x 100 . «\x{00}») x 50)' | sudo -S id
Парола: Сегментационна грешка
Източник: opennet.ru
