I verktÞyet , som brukes til Ä organisere utfÞrelse av kommandoer pÄ vegne av andre brukere, sÄrbarhet (), som gir mulighet til Ä heve sine privilegier til root-bruker. Problemet oppstÄr med versjon 1.7.1 av sudo nÄr alternativet «pwfeedback» i filen /etc/sudoers benyttes, noe som er deaktivert som standard, men aktivert i noen distribusjoner som Linux Mint og Elementary OS. Problemet er lÞst i versjon , som ble publisert for noen timer siden. I distribusjoner er sÄrbarheten fortsatt uopprettet.
Alternativet «pwfeedback» viser tegn «*» etter hvert tegn som tastes inn ved passordinnfÞring. PÄ grunn av implementeringen i funksjonen getln(), definert i filen tgetpass.c, kan en for stor streng med passord sendt via standard inndata (stdin) under visse forhold ikke passe inn i den tildelte bufferen og overskrive andre data pÄ stakken. OverlÞpet skjer under utfÞrelsen av sudo-kode med root-rettigheter.
Kjernen av problemet er at nÄr spesialtegnet ^U (sletting av linje) benyttes under inntasting, og innspillingsoperasjonen feiler, blir koden ansvarlig for Ä slette de viste tegnene «*» tilbakestilt til tilgjengelig bufferstÞrrelse, men peker ikke tilbake til den opprinnelige posisjonen i bufferen. En annen faktor som bidrar til utnyttelse, er fravÊret av automatisk deaktivering av «pwfeedback»-modus nÄr data mottas ikke fra terminalen, men via inndata (denne mangelen skaper forhold for Ä forÄrsake skrivefeil, for eksempel pÄ systemer med ensrettede feilen oppstÄr nÄr det forsÞkes Ä skrive utover slutten av kanalen for lesing).
Siden angriperen kan kontrollere overskrivingen av data pÄ stakken, er det ikke vanskelig Ä lage en utnyttelse som gjÞr det mulig Ä heve sine privilegier til root-bruker. Problemet kan utnyttes av enhver bruker, uavhengig av rettigheter til Ä bruke sudo og spesifikke brukerinnstillinger i sudoers. For Ä blokkere problemet bÞr det sÞrges for at alternativet «pwfeedback» ikke finnes i /etc/sudoers, og om nÞdvendig deaktiveres («Defaults !pwfeedback»). For Ä sjekke for problemet kan koden utfÞres:
$ perl -e 'print(("A" x 100 . "\x{00}") x 50)' | sudo -S id
Passord: Segmenteringsfeil
Kilde: opennet.ru
