» »

Nova resna ranljivost v Linux jedrih 2.4 in 2.6

Nova resna ranljivost v Linux jedrih 2.4 in 2.6

Eskalacija privilegijev

Slo-Tech - Julien Tinnes in Tavis Ormandy sta pred kratkim odkrila resno ranljivost vseh Linux jeder različic 2.4 in 2.6 (gre za vsa jedra od leta 2001 dalje), ki omogoča dvig privilegijev na najvišjo stopnjo (pridobitev tim. jedrnih privilegijev).

Na voljo je že tudi programska koda, ki demonstrira ranljivost (tim. exploit) ter popravek.



Težava je v neustrezni obravnavi ničelnih kazalcev (tim. NULL pointer dereference), za uspešno izvedbo napada pa morata biti na sistemu nameščen SELinux ali pa PulseAudio in mmap_min_addr nastavljen na 0 (to je mogoče preveriti z ukazom "cat /proc/sys/vm/mmap_min_addr").

Kot poročajo na forumu, naj nekatere različice Ubuntu 9.04 ne bi bile ranljive, saj mmap_min_addr ni nastavljen na 0 (zaradi česar so se nekateri uporabniki Ubuntuja sicer pritoževali), moji testi pa kažejo, da je zlonamerno kodo mogoče uspešno pognati tudi na tej različici Ubuntu operacijskega sistema.

Morda pa je končno napočil čas, da Linux skupnost začne nekoliko bolj resno delati na področju varnosti in ustanovi skupni varnostni center, ki se bo še bolj sistematično ukvarjal z varnostjo...

73 komentarjev

«
1
2

F2_Silberpfeil ::

Tukaj Ubuntu 9.04 exploit dela brez problema.

Sedaj pa da vidimo, v kakšnem času se bo popravek pojavili v repozitorijih. Če se sploh bo ?

3p ::

Eh. To pa res ni nek problem. Vsak linux user lahko sam popravi source zadevo in skompajla jedro etc... Pustimo zaj***. Predvidevam, da exploit lahko izvede samo obstoječi uporabnik?

T-h-o-r ::

"Vsak linux user lahko sam popravi source zadevo in skompajla jedro etc."

kaj pa, če ne zna? :D
Why have a civilization anymore
if we no longer are interested in being civilized?

OmegaBlue ::

Ja, zadeva je pač local exploit. Ni prvi ni zadnji.
Never attribute to malice that which can be adequately explained by stupidity.

Zgodovina sprememb…

Brane2 ::

./wunderbar_emporium.sh
[+] Personality set to: PER_SVR4
E: alsa-sink.c: Unable to set switch: Operation not permitted
UNABLE TO MAP ZERO PAGE!


Potem še nekaj razmišlja v nedogled, brez vidnih rezultatov. A vendar sem ga pustil, mogoče bo še kaj, poročam.

Sem pa tisti min_mmap postavil na en page- 4096 že ko sem compilal kernel:

cat /proc/sys/vm/mmap_min_addr
4096
On the journey of life, I chose the psycho path.

BigWhale ::

bigwhale@thefish:~/1/wunderbar_emporium$ ./wunderbar_emporium.sh
[+] Personality set to: PER_SVR4
I: caps.c: Limited capabilities successfully to CAP_SYS_NICE.
I: caps.c: Dropping root privileges.
I: caps.c: Limited capabilities successfully to CAP_SYS_NICE.
UNABLE TO MAP ZERO PAGE!

Ubuntu 9.04.

Jean-Paul ::

NULL pointer deference
^^^^^^^^^
dereference

Zgodovina sprememb…

denial ::

@Matthai:
Imaš nameščen SELinux?

@Brane2:
Ne bo delovalo. Ne uporabljaš SELinux in mmap_min_addr != 0.

BigWhale uporablja default Ubuntu 9.04 which is *not* vulnerable.

Tole v novici ne drži: "za uspešno izvedbo napada pa morata biti na sistemu nameščen PulseAudio ali SELinux, hkrati pa mora biti mmap_min_addr nastavljen na 0". SELinux will by default let anyone mmap at NULL. V tem primeru je mmap_min_addr lahko karkoli.
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

christooss ::

Hm nimam nameščenga SElinux in mmap_min_addr = 0 imam pa nameščen mplayer in pulseaudio. Pa res potem začne špilat en zvok ene francoze potem pa pride not v root :)
Zakaj je nebo modro? Da imamo lahko sladoled Modro Nebo

denial ::

PulseAudio + mmap_min_addr 0 = root
SELinux + mmap_min_addr karkoli = root

V teh primerih exploit deluje. Če komu explot deluje pod drugačnimi pogoji .... please report :D
SELECT finger FROM hand WHERE id=3;

Matthai ::

@Matthai:
Imaš nameščen SELinux?

Ne. Imam pa mmap_min_addr = 0 in PulseAudio.

Tole v novici ne drži: "za uspešno izvedbo napada pa morata biti na sistemu nameščen PulseAudio ali SELinux, hkrati pa mora biti mmap_min_addr nastavljen na 0". SELinux will by default let anyone mmap at NULL. V tem primeru je mmap_min_addr lahko karkoli.

Hvala, sem popravil. Je sedaj OK?
All those moments will be lost in time, like tears in rain...
Time to die.

Matthai ::

Aja, je pa res, da moj sistem ni default, pač pa precej sklamfan skupaj. :D
All those moments will be lost in time, like tears in rain...
Time to die.

techfreak :) ::

Aja, je pa res, da moj sistem ni default, pač pa precej sklamfan skupaj. :D

Joj joj ... vse pokvariš.:D

SasoS ::

Zakaj bi aplikacija sploh hotela kaj početi na pagu 0? A niso ravno zato dali na 0x0 razne interrupt tabele zato da sigurno res vsak ki dostopa na 0x0 konča s segmentation fault oz. general protection fault... int * p = malloc(sizeof(int); if(p == NULL) ... aja ne, malloc mi je res alociral 0x0 :P

|SNap| ::

Skratka ranljivi so tisti ki *imajo* SELinux :))

Bistri007 ::

A ni "SELinux" Security-Enhanced Linux?

Ali je to SDLinux, tj. Security-Diminished Linux? :8)
Največja napaka desetletja je bila narejena 4. novembra 2008
Oni so goljufali in Alah je goljufal, Alah je najboljši prevarant. (Koran 3:54)
Citiraj svetega očeta Benedikta XVI. in postani "persona rudis"...

smihael ::

SELinux je ameriško sranje

Brezvezna panika.

In MMG kaj pa pomeni, če v demontraciji dobim No bind found for key 'M'.?

Zgodovina sprememb…

  • spremenil: smihael ()

Bistri007 ::

Ja, NSA si je pustila backdoor. Na internih distribucijah imajo ziher pravilno nastavljen mmap_min_addr.
Največja napaka desetletja je bila narejena 4. novembra 2008
Oni so goljufali in Alah je goljufal, Alah je najboljši prevarant. (Koran 3:54)
Citiraj svetega očeta Benedikta XVI. in postani "persona rudis"...

denial ::

Hvala, sem popravil. Je sedaj OK?

Da.
SELECT finger FROM hand WHERE id=3;

terryww ::

a ni to oni štos, kjer je source ok, ranljivost pa se pokaže šele po compilanju ali je to neka nova stvar?
It is the night. My body's weak.
I'm on the run. No time to sleep.

WhiteAngel ::

Default KUbuntu 9.04 z vsemi popravki exploit deluje :8)

noraguta ::

ma bojo že popravl
Pust' ot pobyedy k pobyedye vyedyot!

BigWhale ::

Default KUbuntu 9.04 z vsemi popravki exploit deluje :8)


Meni ne. :(

Matthai ::

BigWhale - to je pa zato, ker uporabljaš Linux. To je tako sranje, da še exploiti ne delujejo... :D
All those moments will be lost in time, like tears in rain...
Time to die.

fiction ::

Izkoriscanje "NULL pointer dereference" napak v Linux jedru je ocitno zadnji krik mode :)

Zakaj bi aplikacija sploh hotela kaj početi na pagu 0?
Ponavadi je aplikaciji vseeno kje dobi zeljen kos pomnilnika, samo da ga dobi. Obstajajo pa tudi primeri, ko se program zanasa na to, da so podatki na tocno dolocenem naslovu ali pa da je naslov 0 mapiran. Taki grdi programi pisani v casih, ko je bil nek cuden pogoj vedno izpolnjen, na Linuxu ne bi delovali, zato obstaja vec "osebnosti" Linuxa. To v bistvu pomeni neke vrste compatibility mode, ki enabla vse obskurnosti nekega starejsega UNIX-a. S SVR4 personality se med drugim mapira naslov 0. Sej ce odmislimo varnostne probleme (katerih vzrok itak tici drugje): zakaj pa ni bi imel neke kompatibilnosti za nazaj. Najbolj znan problematicen program je dosemu, ki pa je problematicen ravno zato ker emulira DOS.

int * p = malloc(sizeof(int); if(p == NULL) ... aja ne, malloc mi je res alociral 0x0
Malloc() je samo en high-level wrapper, ki sploh ne alocira nujno novega pomnilnika, ampak samo dodeljuje delcke vecjega alociranega kosa. Uporabiti bi moral mmap(). Da ne govorimo o tem, da NULL pri tej funkciji lahko pomeni tudi napako.

Default KUbuntu 9.04 z vsemi popravki exploit deluje :8)
Glede tega je precej nejasnosti: sam sem odkril, da na vseh masinah, kjer je bila instalirana neka starejsa verzija Ubunta in so bile nadgrajene na Ubuntu 9.04 mmap_min_addr ostane 0, kar pomeni da se da ranljivost tam izkoristiti. Nove instalacije Ubuntu 9.04 pa imajo mmap_min_addr nastavljen (po defaultu) na 65536. No razen, ce je kaksen paket kriv za to, da je mmap_min_addr postal spet 0 (ne, dosemu ni instaliran). Seveda pa lahko admin kadarkoli spremeni to vrednost.

PulseAudio + mmap_min_addr 0 = root
SELinux + mmap_min_addr karkoli = root
V bistvu je afaik tako: exploitable = PulseAudio || mmap_min_addr == 0 || SELinux, medtem ko vulnerable je pa nekje 99% Linux userjev.

Zgodovina sprememb…

  • spremenil: fiction ()

denial ::

V bistvu je afaik tako: exploitable = PulseAudio || mmap_min_addr == 0 || SELinux


Bo kar tako kot sem jaz napisal. Kar poskusi :)

Zanimivo odkritje da mmap_min_addr ne spremeni vrednosti po upgrejdu distribucije...
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

fiction ::

Zanimivo odkritje da mmap_min_addr ne spremeni vrednosti po upgejdu distribucije...
Sej ne vem, ce je to res. Tako sem samo sklepal po tem ko sem videl n Ubuntu 9.04 masin z mmap_min_addr = 0, zadnjic sem pa opazil se eno reinstalirano masino z istim OS, kjer to ni bilo res. Sem se ze pri Cheddar Bay spraseval o tem, ker se mi je zdelo cudno. Mogoce lahko kdo drug kaj vec pove o tem namesto da se kregate samo v stilu "tukaj dela, tukaj ne dela".

Bo kar tako kot sem jaz napisal. Kar poskusi :)
No mogoce se samo nisva razumela. PulseAudio rabis zato, da spravis podatke na naslov 0. Ce je mmap_min_addr 0 tega ne rabis, ker kdorkoli lahko mmapa() naslov 0. SELinux je pa tudi nekako v stilu PulseAudio - se pravi karkoli od tega pa si zmagal. Nisem pa (se) pogledal kako tocno exploit deluje, tako da mogoce ni edina fora samo v tem.

denial ::

Mah, nihče se nič ne krega. Bilo bi pa super, če bi vsi ki so exploit poskusili (ne glede na končni rezultat) vsaj prilimali output ukazov uname -a && cat /proc/sys/vm/mmap_min_addr ter navedli ali uporabljajo SELinux oz. PulseAudio. Simple as that...

Če imaš mmap_min_add = 0, res ne potrebuješ PulseAudio, vendar če imaš PulseAudio in mmap_min_addr > 0 zadeva ne deluje. Je pa to delovalo pri Cheddar Bay-u kjer PER_CLEAR_ON_SETID mask ni spucal MMAP_PAGE_ZERO.

Zabavno postane pri uporabi SELinux-a kjer je mmap_min_addr lahko karkoli. SELinux will override the LSM restriction :)

Imam tri kište z nameščenim Ubuntu 9.04 (fresh install) ... mmap_min_addr = 65536.
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

hamax ::

Ubuntu 9.04 updatan iz 8.10, exploit deluje. mmap_min_addr = 0.

denial ::

@hamax
Thanx. Vse bolj se mi dozdeva da pri upgrejdu Ubuntu distribucije mmap_min_addr ne spremeni vrednosti. Še kdo?

Matthai, si ti upgrejdal ali fresh install?
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

zee ::

Je rekel, da ima "domacica" verzijo.
zee
Linux: Be Root, Windows: Re Boot
Giant Amazon and Google Compute Cloud in the Sky.

Matthai ::

Upgrade. Zato ostane 0.
All those moments will be lost in time, like tears in rain...
Time to die.

Matthai ::

zee - v bistvu imam več računalnikov. "Domačica verzija" pa je zato, ker si jaz pogosto instaliram vse živo, tudi kakšne patche in custom zadeve in precej spreminjam default nastavitve...
All those moments will be lost in time, like tears in rain...
Time to die.

zee ::

Aaaaaaaa. Se pardoniram. Se mi zdi sicer, da nas ima precej Linuxasev vec razlicnih distribucij instaliranih...pri meni sta trenutno Gentoo (totalna domacica) in Ubuntu.
zee
Linux: Be Root, Windows: Re Boot
Giant Amazon and Google Compute Cloud in the Sky.

der_Alte ::

$ ./wunderbar_emporium.sh
UNABLE TO MAP ZERO PAGE!
runcon: invalid context: unconfined_u:unconfined_r:initrc_t:s0-s0:c0.c1023: Invalid argument
$ uname -a && cat /proc/sys/vm/mmap_min_addr
Linux tvplay 2.6.29.6-217.2.3.fc11.i686.PAE #1 SMP Wed Jul 29 16:05:22 EDT 2009 i686 athlon i386 GNU/Linux
32768
$ getenforce
Enforcing

Fedora 11 :P
Umri mlad! Bodi lepo trupelce!

WhiteAngel ::

Jaz imam tudi upgradan KUbuntu z 8.10. mmap_min_addr=0
Če pa dam echo 65536 > /proc/sys/vm/mmap_min_addr,
pa exploit ne deluje več.

SELinux nimam. PulseAudio imam.

BigWhale ::

bigwhale@thefish:~/Documents$ uname -a && cat /proc/sys/vm/mmap_min_addr
Linux thefish 2.6.28-14-generic #47-Ubuntu SMP Sat Jul 25 00:28:35 UTC 2009 i686 GNU/Linux
65536


Fresh Ubuntu 9.04.

Zgleda, da bo res nekaj na upgrade-u.

Pyr0Beast ::

65536
Netbook edition, PulseAudio
2.6.28-15-generic
Some nanoparticles are more equal than others

Good work: Any notion of sanity and critical thought is off-topic in this place

denial ::

@der_Alte:
Možno, da je v tvojem primeru "krivec" PAE. Zadeva naj bi delovala na Fedora 11 (2.6.16/2.6.18/2.6.27/2.6.29).

Sicer pa Brad Spender pravi takole: "Maybe they fix it in Fedora. RedHat is more interesting target and they won't fix it due to compatibility issues."

Lahko še kdo testira na Fedori 11. Zanimivo bi bilo videti rezultate.
SELECT finger FROM hand WHERE id=3;

Pithlit ::

Men ni nič več jasno:

SELinux: nimam
PulseAudio: nimam
$ cat /proc/sys/vm/mmap_min_addr
cat: /proc/sys/vm/mmap_min_addr: No such file or directory

rezultat: [+] Got root!

Beat that!
Life is as complicated as we make it...

fiction ::

Men ni nič več jasno:
$ cat /proc/sys/vm/mmap_min_addr
cat: /proc/sys/vm/mmap_min_addr: No such file or directory
rezultat: [+] Got root!
Pri tebi je zgleda kernel tako star da niti nima /proc/sys/vm/mmap_min_addr, kar je ekvivalentno kot ce bi bil mmap_min_addr 0. Torej vsak lahko mmap()-a naslov 0 in tako tudi exploita napako.

Če imaš mmap_min_add = 0, res ne potrebuješ PulseAudio, vendar če imaš PulseAudio in mmap_min_addr > 0 zadeva ne deluje. Je pa to delovalo pri Cheddar Bay-u kjer PER_CLEAR_ON_SETID mask ni spucal MMAP_PAGE_ZERO.
Mas prav ja. Na to niti nisem pomislil. Ta PER_CLEAR_ON_SETID fix je bil ocitno backportan tudi na starejse Ubuntu kernele. Se pravi PulseAudio "pride prav" samo na nekem majhnem intervalu jeder - tam kjer mmap_min_addr > 0 in PER_CLEAR_ON_SET se ne vsebuje MMAP_PAGE_ZERO. Za SELinux pa ni nic drugace kot takrat.

Če pa dam echo 65536 > /proc/sys/vm/mmap_min_addr, pa exploit ne deluje več.
Jasno. Vsakdo, ki ima mmap_min_addr, bi ga naceloma moral nastaviti na 65536, razen ce ima kaksen eksoticen program, ki zaradi tega mogoce ne bi vec dobro delal.

void extract_and_play_video(void) in tzameti.avi
Ugh.
Zadeva vsebuje 4 MB .avi file, ki ga potem z mplayer predvaja kot ASCII art.

Nimam pa pojma kako lahko:
file = fopen("/proc/self/exe", "r");
fseek(file, -VIDEO_SIZE, SEEK_END);
fread(buf, VIDEO_SIZE, 1, file);
dela. To v bistvu v programu, ki ga pozenes seeka za VIDEO_SIZE nazaj od konca ali sem na kaj pozabil?

snprintf(syspath, sizeof(syspath)-1, "CACA_DRIVER=ncurses mplayer -ao oss -vo caca %s", template);
system(syspath);
Da pozenes mplayer brez poti tudi ni najbolj secure. Ampak oh well - drugace pa ne ves kje tocno je.

Pithlit ::

Čist možno... se bolj malo jajcam s to kišto.

To je pa ubuntu 8.10 (kjer se pa sploh ne zajebavam z nastavitvami... razen un update knof stisnem vsake tolko):

uname -a && cat /proc/sys/vm/mmap_min_addr
Linux 2.6.27-14-generic #1 SMP Fri Jul 24 23:49:25 UTC 2009 x86_64 GNU/Linux
65536

tko da... očitno je kul tud sam updejtan 8.10. Sem prelen za 9.04
Life is as complicated as we make it...

zee ::

Ubuntu 9.04 (upgrade iz 8.10):
cat /proc/sys/vm/mmap_min_addr/
65536

uname -a
Linux stripy 2.6.28-14-generic

Gentoo (nekateri deli iz 2007, nekatere deli izpred dobrega tedna):
cat /proc/sys/vm/mmap_min_addr/
_ne_obstaja_

uname -a
Linux erwin 2.6.27-gentoo-r7
zee
Linux: Be Root, Windows: Re Boot
Giant Amazon and Google Compute Cloud in the Sky.

denial ::

@zee:
A na Gentoo-ju exploit deuje?

@fiction:
Tudi jaz fseek(file, -VIDEO_SIZE, SEEK_END); tako razumem, čeprav ne bi vedel zakaj je uporabljen ta pristop.

Nič več jasno glede mmap_min_addr na Ubuntu. Zmeda totalna 8-O

Fedora 11 pa nihče ne uporablja...
SELECT finger FROM hand WHERE id=3;

stuff ::

A ni linux full dober, varen, najboljši? Me zanima kdaj bojo popravl tole napako?

OmegaBlue ::

Je že.. če bi celo prebral novico.
Never attribute to malice that which can be adequately explained by stupidity.

stuff ::

Sploh ni štos v tem al je al ni. Sem mogu neki napisat kot večina linux fan boyov po drugih temah. Osebno pa mi je vseeno kdo kaj uporablja. Za sebe osebno vem da linux NE ;)

OmegaBlue ::

Well dobrodošel v klub forum trollov.
Never attribute to malice that which can be adequately explained by stupidity.

stuff ::

Hvala :P
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Še ena ranljivost v Linux jedru

Oddelek: Novice / Varnost
283482 (2423) fiction
»

Nova resna ranljivost v Linux jedrih 2.4 in 2.6 (strani: 1 2 )

Oddelek: Novice / Varnost
738082 (5480) karafeka
»

Linux varnost (strani: 1 2 )

Oddelek: Informacijska varnost
554968 (3508) fiction
»

Na BlackHatu prikazano kako zaobiti Microsoftovo 'killbit' zaščito

Oddelek: Novice / Varnost
72638 (1708) denial
»

Nice summer reading

Oddelek: Informacijska varnost
171784 (1221) Matthai

Več podobnih tem