» »

Odkrita ranljivost v Flashu omogoča pridobitev sistemskih privilegijev

Odkrita ranljivost v Flashu omogoča pridobitev sistemskih privilegijev

Slo-Tech - Mark Dowd, raziskovalec pri IBM Internet Security Systems, je odkril, kako je mogoče s pridobivanjem vrednosti kamor kaže NULL kazalec (tim. NULL pointer dereference) v Adobe Flash predvajalniku izkoristiti za pridobitev sistemskih privilegijev v Windows Vista SP 1. Ranljivi so seveda tudi drugi sistemi.

Poletje bo še vroče.

Za informacijo o novici se zahvaljujemo uporabniku InExtremis.

35 komentarjev

JeBelaCesta ::

a Linux je safe ?
lep pozdrav iz višav ;-)

keworkian ::

Ce so ranljivi se drugi sistemi, ocitno ne.
Obscenities in B-Flat

In Extremis ::

Gre za izjemno odkritje, ki lahko postavi nove mejnike v razvoju exploitov. V bistvju je dokument primerljiv z legendarnim Smashing the stack for fun and profit ali odkritjem Heap Spraying metode. Potrebna so bila leta, da so ljudje dojeli globino teh odkritij.

OK, NULL ptr deref... not a big deal. Ring 0 NULL pointerji se kar veliko uporabljajo za local kernel exploite. Ampak tole je userland NULL ptr deref! Ti so do sedaj veljali za useless. Kaj to pomeni? Le to, da bi mogoče vsak userland NULL ptr crash lahko uporabili za pwnanje mašine. OK, pretiravam, ampak you got the point...

Naslednja pomembna zadeva... zopet je imel pomembno vlogo eden izmed high-level skriptnih jezikov - tokrat za spremembo ActionScript.

Zaključek: Mark Dowd je definitivno ET!!

Zgodovina sprememb…

Pyr0Beast ::

Mnjah, se že tresem...
Some nanoparticles are more equal than others

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

netanyahu ::

Poljudna razlaga exploita:

http://www.matasano.com/log/1032/this-n...

christooss ::

Kdaj se bo pa zvedlo kakšni exploiti so spravl dol Visto na tekmovanju Pwn to own? A niso lih prek flasha vdrli not?
Zakaj je nebo modro? Da imamo lahko sladoled Modro Nebo

destroyer2k ::

christooss

Da tudi prek flasha so heknali visto, če pa gre za isti način ko tu opisuje pa nebi vedel.

In Extremis ::

@christooss

Gre za dve povsem različni zadevi, le da je v obeh primerih entry point Adobe Flash ter, da je za exception obakrat kriv integer(?) overflow. Nadaljna exploatacija pa je nedvomno povsem različna. O pwn2own se sicer ne ve ravno veliko, vendar so *pwnarji* priznali, da so uporabili Heap Feng-shui.

Zgodovina sprememb…

hook ::

Bolj relevantno vprašanje je ali sta tudi Gnash in SwfDec ranljiva.

hook ::

Bolj relevantno vprašanje je ali sta tudi Gnash in SwfDec ranljiva.

Po vsej logiki bi morala biti imuna iz dveh razlogov:

  • ker gre za Flash 9 exploit, in ga Gnash in SwfDec še ne podpirata

  • ker gre za exploit, ki izhaja iz playerja



Heh, po dolgo časa sem ker vesel, da sta Macromedia in Adobe tako lena, da nista naredila Linux porta za 64bitne sistem in zato primarno uporabljam Gnash :D

BigWhale ::

Glavni hec je v tem, da bodo taki exploiti mogoce komu uspeli dopovedati, da ti nic ne pomaga, ce za razvoj uporabljas nek high-level jezik in razvojno orodje. Na koncu je tisti spodnje layer prav tako obcutljiv na napade...

driver_x ::

BigWhale: ko bodo vsi delali v t.i. high-level jezikih in razvojnih orodjih, taki exploiti ne bodo več mogoči, saj nihče več ne bo vedel, ka je to pointer ...

G2 ::

Razen enih parih majstrov, ki bojo ziveli v unix konzoli in drzali svet za jajca.
LP
G2

Looooooka ::

kdo je pa reku da je flash v high tech razvojnem okolju narjen...

kriko1 ::

BigWhale: ko bodo vsi delali v t.i. high-level jezikih in razvojnih orodjih, taki exploiti ne bodo več mogoči, saj nihče več ne bo vedel, ka je to pointer ...


Kar pozabi na to. Če bo ravno to aktualno, se bo ravno to zlorabljalo za napade, manualy bodo še vedno dostopni, tako da se vsakdo lahko nauči - itak že "programirat" danes zna vsak.

BigWhale ::

sammy, hehe good one. Ampak to ze dans noben vec ne ve... ;> Prasi une k Javo razturajo :P

poweroff ::

Razen enih parih majstrov, ki bojo ziveli v unix konzoli in drzali svet za jajca.

Jaja, total world domination is proceeding as planned. ;)
sudo poweroff

In Extremis ::

@hook

Če bi se Gnash sesul z NULL pointerjem potem bi teoretično bil vulnerable. Vendar ne gre posploševati. Vprašanje je, kaj lahko s tem pridobiš? Cilj je seveda eskalacija privilegijev. Če ta ni izvedljiva potem je zadeva neuporabna (no, mogoče tudi ne, mnogi še vedno surfajo z admin privilegiji).

Če bi bil Flash preveden z ASLR podporo bi bil exploit precej nezanesljv in praktično neuporaben. Vendar ogromno Win32 programov ne podpira ASLR, vključno z zadnjo verzijo Flasha. Nekateri se očitno zelo počasi učijo...

MrStein ::

klemenmo:
a Linux je safe ?


Adobe - Security Advisories : APSB08-11: Flash Player update available to address security vulnerabilities:

Platform: All platforms

Affected software versions: Adobe Flash Player 9.0.115.0 and earlier, and 8.0.39.0 and earlier.

ISS X-Force Database: multimedia-file-integer-overflow(37277): Adobe Flash Player invalid pointer integer overflow:

Platforms Affected:

* Adobe, AIR 1.0
* Adobe, Flash Player 8.0.39.0 and prior
* Adobe, Flash Player 9.0.115.0 and prior
* Adobe, Flex 3.0
* Novell, Linux Desktop 9
* Novell, openSUSE 10.2
* Novell, openSUSE 10.3
* RedHat, RHEL Desktop Supplementary 5 Client
* RedHat, RHEL Extras 3
* RedHat, RHEL Extras 4
* RedHat, RHEL Supplementary 5 Server
* SuSE, SUSE Linux 9.0
* SuSE, SUSE Linux Enterprise Desktop 10 SP1
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

MrStein ::

PS: na Poljudna razlaga exploita: je link na en res zanimiv level Super Mario Bros-a :))
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

MeMarko ::

No končno so posledice površno napisanga flasha.

fiction ::

Sam bug niti ni tako zelo revolucionaren. Bolj cool je exploitanje.
Tista primerjava s Super Mario Bros badass verzijo je zato, ker je napako tako tezko izkoristiti. Ko ze mislis opa, sem ze zmagal, se ti prikaze neka nova ovira in te ubije.

Prvi problem v Flashu je, da za to koliko pomnilnika naj alocira uporablja predznaceno stevilo. Kasneje, ko dejansko alociras prostor se tista spremenljivka smatra kot nepredznacena vrednost - kar pomeni, da alociras zelo veliko pomnilnika (-1 int je
0xffffffff unsigned int).

V takem primeru:

int copy_something(char *buf, int len){
char kbuf[800];

if(len > sizeof(kbuf)){
return -1;
}
return memcpy(kbuf, buf, len);
}
bi signedness bug lahko enostavno zlorabil in s tem onemogocil preverjanje.
Kot posledico bi dobil klasicen buffer overflow. Taki bugi ter integer overflowi so lahko
zelo problematicni.

Ampak v Flash primeru kaj takega ni mogoce. Edini nacin je, da alociras toliko pomnilnika, da malloc() vrne NULL.
Tukaj je drug problem v Flashu: Ne preverja ce pomnilnika ni bilo mogoce alocirati, ampak kar lepo naprej uporablja tak pointer. Problem je v tem, da so kontrolni podatki in dejanski podatki enaki - na vecini sistemov je NULL kar (void*)0x00000000 - kazalec na naslov 0.
Stvar potem lepo naprej racuna s tem in pointer uporablja, kar omogoca da prepises doloceno vrednost v pomnilniku.
Tudi to bi se teoreticno ze dalo izkoristiti. Ampak, se ne ker si zelo omejen s tem kam lahko kaj napises. Kot resitev bi bilo treba samo vstaviti en dodaten if!

V novici narobe pise, da se izkorisca NULL pointer dereference.
Obstajajo sicer metode za to: Large Large memory management vulnerabilities, ampak v tem primeru gre samo za to, da se s tem pointerjem naprej racuna. Nikoli ne dereferenciras NULL pointerja ampak popravljen pointer, ki kaze nekam drugam.

Avtor exploita je s pomocjo tega prepisal neko ActionScript strukturo, ki mu je omogocala, da podtakne zloben bytecode s katerim potem (po se parih ovinkih) koncno uspe prepisati EIP s poljubno vrednostjo in tako izvesti poljubno kodo. Pri tem mu pride v pomoc tudi dejstvo,
da interpreter dela v dveh fazah, najprej preveri bytecode potem pa ga v celoti izvede. Kar pa dejansko ni bug, bolj optimizacija. Ampak brez tega, exploit tudi ne bi bil mogoc.

d3xt0r ::

Ta zadeva je že bila odkrita pred več kot pol leta,

http://www.iss.net/threats/289.html

Brez nepotrebne panike. :)

fiction ::

Gre za izjemno odkritje, ki lahko postavi nove mejnike v razvoju exploitov. V bistvju je dokument primerljiv z legendarnim Smashing the stack for fun and profit ali odkritjem Heap Spraying metode.

Clanek od Aleph1 je legendaren, medtem ko je Heap Spraying samo nacin kako izkoristis overflow. Tudi to, da das pred shell kodo zaporedje NOP-ov in si s tem olajsas trud je uporabno, ampak ne ravno revolucionarno odkritje. Prej bi stel med revolucionarne zadeve odkritje format string bugov, signedness bugov in interger overflowov.

OK, NULL ptr deref... not a big deal. Ring 0 NULL pointerji se kar veliko uporabljajo za local kernel exploite. Ampak tole je userland NULL ptr deref! Ti so do sedaj veljali za useless. Kaj to pomeni? Le to, da bi mogoče vsak userland NULL ptr crash lahko uporabili za pwnanje mašine. OK, pretiravam, ampak you got the point...

I don't get the point. Prosim, ce mi razjasnis - kaksni ring 0 NULL pointerji in kako se jih je dalo izkoristiti. Lahko postrezes s kaksno referenco na to temo? Vse skupaj se da izkoristiti, ce se na naslovu 0 nahaja kar pomembnega.

Naslednja pomembna zadeva... zopet je imel pomembno vlogo eden izmed high-level skriptnih jezikov - tokrat za spremembo ActionScript.

Fora je samo v tem, da je lahko prepis katerega koli naslova kriticen, ce se s tem spremeni neko interno stanje programa. Ni treba da ti ze to direktno omogoca izvajanje zlobne kode.

fiction ::

Glavni hec je v tem, da bodo taki exploiti mogoce komu uspeli dopovedati, da ti nic ne pomaga, ce za razvoj uporabljas nek high-level jezik in razvojno orodje. Na koncu je tisti spodnje layer prav tako obcutljiv na napade...

Ja, v spodnjem layerju so se vedno lahko napake. Ampak fora je, da bo tiste kode veliko manj kot kode napisane v high-level jeziku (dejansko rabis samo nek "interpreter"). Kar pomeni, da
bo veliko lazje poskrebeti za "varnost".
Vsak programer, ki hoce delati low-level stvari, bi se najprej moral pouciti malo o varnosti. Ne pa, da samo zaradi hitrosti uporablja "low-level" jezike, ceprav to mogoce sploh ne bi bilo potrebno pri njegovem problemu.

fiction ::

Tako kot pravi Tavis Ormandy. Vse je fora tega koliko kode je dosegljive. Vec kot je kode, vecja je moznost za napako.

Zato je recimo firewall dober za varnost: namesto da bi se dalo doseci kodo nekega daemona, ki ima lahko veliko ranljivosti, se izvede samo koda pozarnega zidu, ki je manj kompleksna. Vse kar naredi je, da prepreci dostop.

IDS/IPS sistem recimo ni dober. Poleg tega, da je "dosegljiv" dejanski daemon, je dosegljiva se IDS koda, kar pomeni, da se da izkoristiti mogoce tudi samo napako v tem sistemu.
Enako velja tudi za antivirusni program. Kompleksna koda, ki na podlagi blacklista preverja vsebino programov. Oba nudita varnost samo pred nekimi genericnimi v naprej znanimi vzorci, v splosnem pa sta lahko tudi sama vir nevarnosti.

Pri intepretiranem programskem jeziku je interpreter tisti, ki mora biti "varen".
"Dosegljiva" je samo njegova koda medtem ko je tisti high-level jezik zanj samo podatek. Ce intepreter dela s katerimkoli podatkom brez problemov, je s tem zagotovljena varnost.
Poleg tega, da razni buffer overflowi in podobno niso mogoci, se da enostavno uvesti za "high-level" program tudi nek sandbox (kaj lahko pocne, do katerih datotek lahko dostopa itd.) in tako na podlagi least-privilege principa zagotoviti, da bo tudi v primeru hude napake v "high-level" jeziku zloraba se vedno nemogoca oz. vsaj zelo tezka.

In Extremis ::

@fiction

IMHO, pa je bug precj revolucionaren: poznaš mogoče še kakšen primer userland NULL ptr dereference, preko katerega bi pridobil sistemske privilegije? AFAIK, eden sicer res obstaja, vendar s tem ni primerljiv.

Najprej je tu integer overflow, nato dereferenciranje NULL + offset ki ne sesuje aplikacije kakor bi pričakoval, nato pa še Mark Dowdov ninjitsu :)

OK, bom kar nadaljeval...

Heap spraying je res preprost (no, izpeljanka heap feng shui niti ni tako preprosta), vendar tudi učinkoviti. Čeprav Vista zelo oteži celotno zadevo. Do tega odkritja je bilo izkoriščanje heap spraying exploitov nadvse zapleteno in sploh ne zanesljivo. Heap spraying je zadevo poenostavil in konsolidiral. Nekako tako kot Aleph1 z stack overflowi. Ti seveda niso njegovo odkritje. Znani so bili že veliko prej... Vendar se strinjam, tudi metode, ki si jih omenil so revolucionarne.

Ring 0 NULL pointerji... recimo kernel panic, ki deferencira 0x0. Veljali so za useless, nato se je odkrilo, da jih je mogoče velikokrat izkoristit za eskalacijo privilegijev ali kernel memory dump.

Reference:
LINK
LINK

Vendar, to lahko še razumem. To je v jedru. Tisti Flash exploit pa je čisto v nekem drugem območju.

Glede ActionScripta... želel sem le povedati kako se razvijalci exploitov vse bolj poslužujejo skriptin jezikov (JavaScript/ActionScript/VBScript...), kar je tudi povsem razulmjivo: browsers are primary targets. No, originalni snovalci tega verjetno niti v sanjah niso predvideli :)

fiction ::

@In Extremis

Strogo gledano tale exploit ne uporablja niti NULL pointer dereferenca niti
integer overflowa!
Integer overflow bi bil takrat, ce bi se stevilka obrnila pa se ne - problem je
samo v tem, da se predznaceno stevilo preverja, uporablja pa se potem nepredznaceno.
NULL pointer se nikoli ne dereferencira, ampak se z njim le naprej racuna kot bi bil 0.

Sem prebral tisti Phrack clanek (BTW: par dni nazaj je izsla nova stevilka!).
Ocitno je fora samo to, da v nekem procesu mmapas navidezni naslov 0 (oz. nekaj
okrog tega, ker 0 pomeni naj se naslov avtomaticno doloci). Kernel lahko bere vse in potem po nesreci uporabi to kar ti lahko nastavis v programu, namesto neke veljavne vrednosti. Zanimiva ideja. Ampak userland proces, nikoli ne bi mogel tako izkoristiti. Fora je v tem, da en proces ne more brati pomnilnika drugega procesa, tisti ranljiv proces pa tudi sam od sebe ne alocira pomnilnika na naslovu 0.

In Extremis ::

Fora je v tem, da en proces ne more brati pomnilnika drugega procesa, tisti ranljiv proces pa tudi sam od sebe ne alocira pomnilnika na naslovu 0.


Correct, zato bi se moral Flash sesuti. Pa se ne.

Še vedno sem mnenja, da gre za NULL ptr. Mogoče nam nagaja semantika:

NULL pointer dereference = accessing the information at the memory address contained by the pointer, in this case 0x0.

NULL + offset je torej še vedno različica NULL pointerja.

Na primer:
mov esi, dword ptr [ecx+0×4] ; ecx = 0x0

Holy shit, pravkar sem odkril tole vendar mi nikakor ne uspe zbrskati PoC.

Technically speaking, this proof of concept exploits a NULL pointer dereference to gain arbitrary code execution.

Še eden explotable userland NULL ptr. Gre za IE, vendar izgleda kakor, da ni prišlo do eskalacije privilegijev.

PS: če se ne motim signedness bugi spadajo v kategorijo integer overflow-ov?

Zgodovina sprememb…

Vlady ::

BigWhale: ko bodo vsi delali v t.i. high-level jezikih in razvojnih orodjih, taki exploiti ne bodo več mogoči, saj nihče več ne bo vedel, ka je to pointer ...

Dokler bo kernel in driverji napisani v low-level jeziku bodo možni exploiti. Ampak da bi se to zgodilo bo potrebne še veliko vode...
"Lotereya - naibolee točnyj sposob učeta količestva optimistov"

Vlady ::

Razen enih parih majstrov, ki bojo ziveli v unix konzoli in drzali svet za jajca.

Taki bodo pa vedno mislili, da so "pametnejši" kot računalnik pri upravljanju s pomnilnikom :)
"Lotereya - naibolee točnyj sposob učeta količestva optimistov"

MrStein ::

Če updatate flash, upoštevajte, da Adobe sploh ne ponuja "update", ampak install.
To pomeni, da ko instalirate novo verzijo flash-a, se stara ne briše ampak ostane.

Sicer se potem ponavadi uporablja nova verzija, ampak za vsak slučaj bi bilo pametno izbrisati staro.

Off : "update" je ja taki revolucionaren koncept, ki ga eni še 50 let ne bodo kužili
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

fiction ::

PS: če se ne motim signedness bugi spadajo v kategorijo integer overflow-ov?

V Phracku 60 je sicer res naslov clanka "Basic Integer Overflows", ampak jaz bi rekel, da integer overflow lahko povzroci signedness bug, ni pa nujno. Nobena stvar ni nadpomenka od druge, je pa oboje skupaj opisano ker gre za podobna problema, ki povzrocita da kljub preverjanjem pride do buffer overflowa.

Derefenciranje kazalca je, da dostopas do vrednosti v pomnilniku kamor kaze pointer. Se pravi NULL pointer dereference je zame samo dostop do naslova 0 (oz. ker NULL ni nujno enako 0 - dostop do najmanjsega pomnilniskega naslova). Ce delas s tem neko aritmetiko oz. uporabis nek offset pa to potem IMHO ni vec to.

In Extremis ::

V Flash exploitu malloc() vrne NULL, torej gre za dereferenciranje po vseh pravilih. Offset pa itak moraš imeti sicer je stvar neuporabna.

Zgodovina sprememb…

fiction ::

No ja, se popravljam:
v programskem jeziku imas lahko ptr->sth (kar je enako *ptr.sth).
Dejansko v primeru da je ptr NULL to pomeni dostop do drugega naslova kot 0, pa bi
vseeno rekli da gre za "NULL pointer dereference".


Vredno ogleda ...

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

Registrska označba NULL lastniku povzroča težave in stroške

Oddelek: Novice / Ostale najave
215939 (2838) MrStein
»

MySQL podatki iz več tabel

Oddelek: Programiranje
5807 (597) smacker
»

SQL težava

Oddelek: Programiranje
364515 (3797) joseti
»

mysql vnos

Oddelek: Izdelava spletišč
51465 (1430) asgard2.0
»

portal ostal, baza sla

Oddelek: Izdelava spletišč
61721 (1606) bombacina

Več podobnih tem