Alətdə , istifadəçilərin adından əmrlərin icrası üçün təşkil edilən açıklığı (), sistemdə öz hüquqlarını root istifadəçisinə qədər artırmağa imkan verir. Problem, yalnız "pwfeedback" seçimindən istifadə etməklə, sudo 1.7.1 versiyasından etibarən ortaya çıxır, bu seçim standart olaraq deaktivdir, lakin bəzi dağıtımlarda, məsələn, Linux Mint və Elementary OS-də aktivdir. Problem , bir neçə saat əvvəl dərc edilmişdir. Dağıtıcılarda zəiflik hələ də aradan qaldırılmayıb.
"pwfeedback" seçimi, şifrə daxil edilərkən hər bir simvoldan sonra "*" simvolunun göstərilməsini aktiv edir. Bunun səbəbi tgetpass.c faylında müəyyən edilmiş getln() funksiyasının icrasındadır; standart giriş (stdin) vasitəsilə göndərilən çox uzun bir şifrə, müəyyən şərtlər altında ayrılmış tamponda yerləşməyə bilər və yaddaşda digər məlumatları üst-üstə yaza bilər. Çəkmə, root hüquqları ilə sudo kodunun icrası zamanı meydana gəlir.
Problem odur ki, xüsusi simvoldan ^U (sıfırlama) istifadə edildikdə və yazma əməliyyatı uğursuz olduğunda, çıxarılmış "*" simvollarını təmizləməkdən məsul olan kod, tamponun mövcud ölçüsü haqqında məlumatları sıfırlayır, lakin tampondakı cari mövqe üçün göstəricini əvvəlki vəziyyətinə qaytarmır. İstifadəyə yarayan digər faktor isə, şifrə olan məlumatların terminaldan deyilsə, giriş axını vasitəsilə daxil olunduqda "pwfeedback" rejiminin avtomatik olaraq dayandırılmamasıdır; bu, yazma xətası meydana gətirmək üçün şərait yaradır, məsələn, bir tərəfli xətası oxumaq üçün kanaldan sonrakı yerə yazmağa çalışarkən meydana gəlir.
Hücum edən tamamilə yığmada məlumatların üst-üstə yazılmasına nəzarət edə bildiyindən, root istifadəçisinə qədər hüquqları artırmaq üçün exploiti yaratmaq çətin deyil. Problem, sudo istifadəsi üçün hüquqları olmayan və sudoers-də spesifik istifadəçi tənzimləmələri olan istənilən istifadəçi tərəfindən istismar edilə bilər. Problemi bloklamaq üçün, /etc/sudoers faylında "pwfeedback" seçiminin olmadığını təsdiq etmək və lazım gələrsə, onu deaktiv etmək lazımdır ("Defaults !pwfeedback"). Problemin mövcudluğunu yoxlamaq üçün aşağıdakı kodu icra edə bilərsiniz:
$ perl -e ‘print(("A" x 100 . "\x{00}") x 50)’ | sudo -S id
Şifrə: Seqmentasiya səhvi
Mənbə: opennet.ru
