Kdokoliv (lokalni) rootem

Dan Lukes dan at obluda.cz
Tue Dec 1 11:14:02 CET 2009


Nemivam ve zvyku jsem preposilat upozorneni na bezpecnosni chyby (a uz 
vubec ne reprodukovat je vlastnimi slovy), nakonec, vazni zajemci jsou 
jiste prihlaseni v listu pro takove zpravy vyhrazenem, ale tentokrat 
udelam vyjimku, protoze jde o velmi nebezpecnou chybu a oficialni 
security advisory se stale jeste pripravuje.

Tyka se pouze stroju, na kterych jsou neprivilegovani uzivatele (ti, 
kteri nemaji, a co je podstatne - ani nadale nemaji mit - opravneni 
superuzivatele). Druhou podminkou je, ze taci uzivatele musi mit k 
dispozici alespon jeden dynamicky linkovany root-suid program (na 
beznych instalacich splneno bez problemu - treba ping).

Uz davno se vi, ze moznost premluvit systemovy dynamicky linker aby k 
suid programu prilinkoval jinou knihovnu nez autor puvodne zamyslel je 
bezpecnostni chyba. Proto se system chova tak, ze kdyz zjisti, ze js 
spousten suid program a soucasne jsou nastaveny environmentove promenne 
pozadujici zmenu linkovacich pravidel pak environmentove promenne zrusi 
(program se tak spousti podle defaultnich pravidel).

Kvuli netestovani navratovych hodnot systemovych funkci (coz zpusobi, ze 
se nepozna, ze se pozadovana akce ve skutecnosti nepovedla) se ale da 
dosahnout stavu, ze linker environmentove promenne nezrusi (on se 
pokusi, ale nepovede se mu to) a program spusti. Tim se uzivatelsky kod 
snadno dostane k rootovskym opravnenim.

Zajistit, aby se volani unsetenv() nepovedlo je pomerne snadne - staci 
program spustit s poskozenym environmentem.

Chyba je nebezpecna tim, ze je velmi snadno pochoptelna a vyuzitelna i 
lidmi, kteri maji minimum "prunikarskych" zkusenosti - staci trocha 
zkusenosti programatorskych.

Pokdu si k tomu budete hledat dalsi informace muzete narazit na dohady, 
ktere verze jsou napadnutelne. Podle meho nazoru jsou napadnutelne v 
teto chvili naprosto vsechny 7.x a novejsi a ze starsich take 6.3 a 6.4.

Na ohrozenych systemech je treba vymenit ld-elf.so.1 (u AMT64 systemu 
take ld-elf32.so.1). Patch pro 8.x/HEAD je zde:

http://www.freebsd.org/cgi/cvsweb.cgi/src/libexec/rtld-elf/rtld.c.diff?r1=1.144;r2=1.145

pro 7.x:

http://www.freebsd.org/cgi/cvsweb.cgi/src/libexec/rtld-elf/rtld.c.diff?r1=1.124.2.6;r2=1.124.2.7

Nanestesti, pro 6.3/6.4 neni trivialni oprava mozna (protoze unsetenv() 
zde nevraci navratovou hodnotu). Mozna to je ta posledni kapka, ktera by 
mela zacit spravce od zastaravajici 6.4 vyhanet.

Jeste jednou - stroju, kde nejsou lokalni neprivilegovani uzivatele se 
problem netyka.


						Dan


More information about the Users-l mailing list