V utilitě , používané na organizování vykonávání příkazů jménem jiných uživatelů, zraniteľnosť (), ktorá umožňuje zvýšiť svoje privilegium v systéme na užívateľa root. Problém sa prejavuje od verzie sudo 1.7.1 iba pri použití v súbore /etc/sudoers možnosti „pwfeedback“, ktorá je predvolene vypnutá, ale je aktivovaná v niektorých distribúciách, ako sú Linux Mint a Elementary OS. Problém bol opravený vo verzii , uverejnenej pred niekoľkými hodinami. V distribúciách zraniteľnosť zatiaľ zostáva neopravena.
Možnosť „pwfeedback“ umožňuje zobrazenie symbolu „*“ po každom zadanom znaku pri zadávaní hesla. Z dôvodu v implementácii funkcie getln(), definovanej v súbore tgetpass.c, prenesený cez štandardný vstup (stdin) príliš dlhý reťazec s heslom za určitých podmienok nemusí vojsť do prideleného bufra a prepíše iné dáta na zásobníku. Preplnenie sa vyskytuje pri vykonávaní kódu sudo s právami root.
Podstata problému spočíva v tom, že pri použití špeciálneho znaku ^U (vyčistenie riadku) a pri zlyhaní operácie zápisu, kód zodpovedný za vyčistenie zobrazených symbolov „*“ resetuje údaje o dostupnej veľkosti bufra, ale nevráti do počiatočného stavu ukazovateľ na aktuálnu pozíciu v buffri. Ďalším faktorom, ktorý prispieva k zneužitiu, je absencia automatického vypnutia režimu „pwfeedback“ pri príchode údajov nie z terminálu, ale cez vstupný tok (táto nedostatočnosť umožňuje vytvoriť podmienky pre výskyt chyby zápisu, napríklad na systémoch s jednosmernými chyba sa vyskytuje pri pokuse o zápis za koniec kanála na čítanie).
Keďže útočník môže úplne kontrolovať prepísanie údajov na zásobníku, nie je ťažké vytvoriť exploit, ktorý umožňuje zvýšiť svoje privilegium na užívateľa root. Problém môže byť zneužitý akýmkoľvek používateľom, bez ohľadu na práva na používanie sudo a prítomnosť špecifických používateľských nastavení v sudoers. Na zablokovanie problému by sa malo zabezpečiť, že v /etc/sudoers nie je nastavenie „pwfeedback“ a v prípade potreby ho vypnúť („Defaults !pwfeedback“). Na kontrolu prítomnosti problému môžete spustiť kód:
$ perl -e ‘print((„A“ x 100 . „\x{00}“) x 50)’ | sudo -S id
Heslo: Segmentačná chyba
Zdroj: opennet.ru
