» »

Nice summer reading

Nice summer reading

denial ::

It's Spender vs. LKT:
http://users.volja.net/database/exploit...

Is Linus member of Anti-sec movement?
SELECT finger FROM hand WHERE id=3;

jype ::

Cool workaround.

fiction ::

exploit.c? Bolj comment.txt :) V bistvu je to, da je bila dejanska koda cenzurirana security-through-obscurity. Ista zadeva je prosto dostopna samo nekaj klikov stran. V kontekstu obtozevanja skrivanja napak, se mi zdi ironicno, da se tukaj skriva dejanski exploit. Je pa jasno za razumevanje vsega skupaj komentar veliko bolj uporaben in kaj vec kdo, ki ni script-kiddie, najbrz niti ne bi potreboval, ampak vseeno. Ce ne drugega je skoda teksta iz Sartrove knjige in lepe kode ;)

Da se da na naslov 0x0 z dolocenimi triki mmap()-ati pomnilnik ni novo. S tem se da izkoristiti tudi dereferenciranje NULL pointerja. Za to napako velja splosno prepricanje, da povzroci le sesutje programa. Podobno kot so vcasih mislili, da tudi dvakratno klicanje free() ne skoduje, pa se da tudi to pod dolocenimi pogoji exploitati. Sporocilo tega je jasno: kakrsenkoli bug je potencialno lahko tudi varnostna ranljivost, ceprav dolgo ne izgleda kot da bi se tisto res lahko izkoristilo. Da je nekaj "DoS-only" ponavadi ni pametno govoriti. Navsezadnje je vsaka napaka odstopanje od dejanskega delovanja in je zelo tezko napovedati dolgorocne posledice. Ni nujno samo skrivanje, lahko gre tudi za neznanje ali podcenjevanje. Zasmehovanje ni nujno najbolj efektivno pri resevanju tega.

Bolj zanimiva tema se mi zdi optimizacija gcc-ja. Po poskusu derefenciranja ptr (*ptr) se vsak blok
kode, ki preverja, ce je ptr enak NULL enostavno "zbrise". Po logiki, ce je *ptr uspel potem ptr sigurno ni enak NULL. V primeru exploita to pomeni lazje delo - sicer bi bilo zelo zelo tezko (nemogoce ni najbolj pametno reci) izkoristiti napako. Ce pa zavesto delas s pomnilniskim naslovom 0 (malo verjetno), to lahko celo pomeni, da se preveden program ne bo obnasal tako kot bi se moral. Torej gre za bug v gcc-ju (ne le optimizacijo).

Ce lahko tako rec gcc ugotovi v casu prevajanja, bi bilo bolj smiselno izpisati zraven se warning.
Tako kot pri neuporabljeni spremenljivki naprimer. Ta ne zaseda prostora v pomnilniku ali registrih (optimizacija), ampak se vedno se programerju to pove kot opozorilo, tako da le ta lahko popravi tudi izvorno kodo programa za kasneje oz. za drug prevajalnik. V tem primeru bi bil mogoce bolj smiseln samo warning, ker je optimizacija dvomljiva (druga varianta je ekspliciten vklop te optimizacije).

Zgodovina sprememb…

  • spremenil: fiction ()

denial ::

V kontekstu obtozevanja skrivanja napak, se mi zdi ironicno, da se tukaj skriva dejanski exploit.


Moj namen je bil prikazati fantastičen Spenderjev diatribe. Kdor želi najti exploit ga bo v vsakem primeru našel.

"cheddar_bay" vsebuje več fajlov, torej sam explot.c ni dovolj.

Obstaja velika verjetnost, da bi ST moderatorji v primeru objave exploita post izbrisali/moderirali.

In za konec, če želim brati Sartrejev "Zid" stopim do knjižnice.
SELECT finger FROM hand WHERE id=3;

denial ::

@fiction:
gcc optimizacija NULL pointerja je pričakovana:
KLIK

Mislim, da si zadevo napačno razumel. Bug ni v gcc optimizaciji, ki resda omogoča dereferenciranje NULL ptr, vendar mmap_min_addr restrikcija zadevo dokaj "omili" (crash only). Bug je v SELinux-u, ki dopušča bypass (override) LSM restrikcij in s tem mmap()-iranje 0x0. V primeru, ko SELinux ni nameščen moraš za uspešen bypass LSM restrikcij uporabiti SUID program npr. PulseAudio ;) saj SUID programi dopuščajo mmap()-iranje 0x0 ne glede na mmap_min_addr.
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

fiction ::

Since 2.6.23, it has been possible to prevent applications from mapping low pages (to prevent null pointer dereferencing in the kernel) via the /proc/sys/vm/mmap_min_addr sysctl, which sets the minimum address allowed for such mappings.
Aha ok, mmap_min_addr je neka dokaj nova stvar plain kernela in SELinux zgleda unici ta koncept. Sem imel obcutek, da to itak ni nic omejeno.


$ cat /proc/sys/vm/mmap_min_addr
0
Hm, na Ubuntu 9.04 je tole itak po defaultu 0 zgleda.

V primeru, ko SELinux ni nameščen moraš za uspešen bypass LSM restrikcij uporabiti SUID program npr. PulseAudio ;) saj SUID programi dopuščajo mmap()-iranje 0x0 ne glede na mmap_min_addr.
To je afaik odvisno od CAP_SYS_RAWIO capabilitija. Ampak suid root program itak lahko pocne vse. V bistvu je zanimivo kako abusas suid root program, pa vseeno ne dobis s pomocjo tega administratorskih privilegijev. Kolikor gledam exploit zgleda najprej nastavis SVR4 personality (v tem nacinu se pricakuje mapiran naslov 0) potem pa izkoristis modularnost pulseaudio zato da spravis svoje stvari na ta naslov.

"cheddar_bay" vsebuje več fajlov, torej sam explot.c ni dovolj.
Exploit.c je cisto dovolj. Na starem kernelu (ki ima samo ta backportan bug) - RHEL vse skupaj deluje (ker ni mmap_min_addr) na novem kernelu pa, ce imas SELinux oz. mmap_min_addr = 0, tudi ne rabis nicesar drugega. Tiste druge stvari (in vsa telovadba) je potrebna samo v primeru da temu ni tako in moras zlorabiti pulseaudio kot odskocno desko (pri cemer ta v bistvu ni ranljiv). Celotno izkoriscanje luknje v jedru je se vedno stvar exploit.c, samo da je tokrat preveden v dinamicno knjiznico.

gcc optimizacija NULL pointerja je pričakovana
Uh Cygnus je vse skupaj "podaril". Ocitno so si gcc razvijalci rekli podarjenemu konju se ne gleda v zobe. :) Meni se vse skupaj namrec se vedno zdi precej butasto. Prevajalnik se nima kaj ukvarjati s tem da se "program itak sesuje", ampak mora skrbeti za cim bolj optimalen "prevod". Kot bi rekel, da v primeru da imas deklariran buffer vecji od x bytov, prevajalnik to ignorira, ker "itak ne obstaja racunalnik s tako veliko pomnilnika". :)

Kaj se zgodi ko derefenciras NULL pointer najbrz res ni definirano v standardu, ampak naceloma lahko delas tudi s cisto navadnim (in veljavnim) naslovom 0. V C-ju itak null ni neka rezervirana vrednost, ampak obstaja "#define NULL (void*)0" ali nekaj podobnega. Tako da prevajalnik (po koraku preprocesiranja) vidi vedno 0.

In za konec, če želim brati Sartrejev "Zid" stopim do knjižnice.
Ja. Ampak vseeno zanimivo, kako da je ravno ta quote na koncu.

fiction ::

Obstaja velika verjetnost, da bi ST moderatorji v primeru objave exploita post izbrisali/moderirali.
Sej kako pa je sploh trenutno z legalnostjo objave / posedovanja exploitov v Sloveniji? Vem, da so bili enkrat protesti, ker naj bi se to kriminaliziralo, ampak pojma nimam kaksno je trenutno stanje. Sem ze kriminalec samo zato ker vem za tun ranljvost v jedru ali zaradi tega ker sem videl kako zna spender tisto izkoristiti? Je uporaba mozganov ze prepovedana (ker gre za hackersko orodje)? ;)

denial ::

Sej kako pa je sploh trenutno z legalnostjo objave / posedovanja exploitov v Sloveniji?

Glede legalnosti exploitov bi lahko Matthai kaj več povedal. Ja, tudi mene zelo zanima kakšno je trenutno stanje glede posedovanja exploitov v deželici. I'm not guility anyway :)

Hm, na Ubuntu 9.04 je tole itak po defaultu 0 zgleda.

Na "Jaunty Jackalope" je /proc/sys/vm/mmap_min_addr default 65536. Če imaš 0 potem je zadeva editirana.

To je afaik odvisno od CAP_SYS_RAWIO capabilitija.

Odvisno je od PER_CLEAR_ON_SETID personality-ja, ki ne preverja MMAP_PAGE_ZERO alokacij. Mimogrede, najdeš povezavo med ADDR_COMPAT_LAYOUT in ASLR-jem :)

... in moras zlorabiti pulseaudio kot odskocno desko (pri cemer ta v bistvu ni ranljiv).

V bistvje je PulseAudio tudi ranljiv (race condition) vendar je to že neka čisto druga zgodba :)

Exploit.c je cisto dovolj

Se strinjam :)
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

fiction ::

Na "Jaunty Jackalope" je /proc/sys/vm/mmap_min_addr default 65536. Če imaš 0 potem je zadeva editirana.
Zanimivo, ker sem gledal na dveh razlicnih masinah. Sej kako pa so to spremembo pushali - najbrz s pomocjo /etc/sysctl.conf? Ce tistega settinga ni je default 0? Verjetno je potem administrator po dist-upgrade ohranil svoje spremembe sysctl.conf in se ni zmenil za mmap_min_addr setting iz nove distribucije. Je tisto sploh dovolj jasno oznaceno? Od kdaj se to uporablja?

Hm ne dojamem cisto PER_CLEAR_ON_SETID - to je v bistu bitmask kaj naj se vse po setuid() / setgid() .. scleara?

Uporaba pulseaudio je bila trenutno taka:
- kot navaden uporabnik pozenes proces
- nastavis personality v stilu jaz pa rabim to in to zaradi kompatibilnosti
- naredis execve() tako da v tem procesu naprej tece pulseaudio
---
- pulseuadio je setuid root in "podeduje" tisti peronality samo da zdaj dejansko
lahko naredi mmap na 0, ker ima tudi ustrezne privilegije

Torej ce bi PER_CLEAR_ON_SETID vseboval MMAP_PAGE_ZERO bi bilo pri --- konec. Pulseaudio bi moral sam povedati "hocem tak compatibility mode". Precej tezko predstavljivo, da obstaja se kaksen tak program in ce bo pulseaudio preverjal kateri del pomnilnika je dobil alociran bi se ze tam vse skupaj nehalo (seveda pa to ni njegova stvar).

Sicer pa a MMAP_PAGE_ZERO sploh pomeni "dovoli mmap na naslov 0"? Kolikor sem bral je to bolj v stilu "zaradi kompatibilnosti se pricakuje mapiran naslov 0". A je to potem pomenilo, da je pulseaudio hotel alocirati nek kos pomnilnika pa je prvic dobil po defaultu 0? Se pravi tudi ce ne bi imel MMAP_PAGE_ZERO bi lahko zaradi tega ker je setuid root mapiral naslov manjsi od mmap_min_addr?

Cel napad na ta nacin je vrsta srecnih nakljucij. Poleg tun napake ima bug se SELinux, PER_CLEAR_ON_SETID v jedru ni bil varen pa se pulseaudio je bil dovolj "prijazen". Da ne govorimo o tem, da je optimizacija gcc-ja sploh omogocila da je vse skupaj exploitable. Dejansko je namrec bil check za NULL, samo malo prepozno (ampak tisto se potem zaradi prejsnjega derefenciranja ni upostevalo).

Kar se tice tistega drugega. A lahko sploh reces, da hoces ADDR_COMPAT_LAYOUT? Verjetno je to v binaryu (za podporo starim programom) in ti ne mores tega izrabiti tako, da bi nek setuid program ki bi ga pognal tekel prakticno brez ASLR in bi ga tako lazje exploital.

Edit: ADDR_COMPAT_LAYOUT -> ADDR_NO_RANDOMIZE

Zgodovina sprememb…

  • spremenil: fiction ()

fiction ::

Sem nasel:
if ((addr < mmap_min_addr)
&& !capable(CAP_SYS_RAWIO))
return -EACCES;
return 0;
Torej ce imas CAP_SYS_RAWIO capability lahko mmap()-as naslov manjsi od mmap_min_addr. In ce si root imas ta capability nastavljen. Se pravi za suid root program mmap_min_addr ne predstavlja omejitve.

To potrjuje mojo hipotezo.

Se pravi zaradi tega je pulseaudio LAHKO naredil mmap() 0. Ampak seveda tega sam od sebe ni hotel (ti pa nanj tudi nisi mogel vplivati, sicer bi lahko direktno dobil root shell). Zato sklepam, da je tisti "podedovan" personality vplival na to, da je po prvi alokaciji dobil pomnilnik z zacetkom na naslovu 0, ceprav tega ni eksplictno zahteval. Tja je potem dal podatke, ki so bili pod napadalcevo kontrolo. In v koncni fazi je to pomenilo, da je lahko napadalec pisal na naslov 0. S tem je lahko izkoristil tisto da je kernel dostopal do NULL pointerja in v bistvu bral z naslova 0. Jedro je potem tam prebralo neko cudno (od napadalca pripravljeno vrednost) in to je bilo dovolj.

denial ::

Sej kako pa so to spremembo pushali - najbrz s pomocjo /etc/sysctl.conf? ... Od kdaj se to uporablja?

Change was in 2.6.23 kernel update, lines 18-21 of /etc/sysctl.conf. May break some userland apps: KLIK

Hm ne dojamem cisto PER_CLEAR_ON_SETID - to je v bistu bitmask kaj naj se vse po setuid() / setgid() .. scleara?

Točno. S kernelom 2.6.31-rc3 PER_CLEAR_ON_SETID vsebuje tudi MMAP_PAGE_ZERO in ADDR_COMPAT_LAYOUT.

Cel napad na ta nacin je vrsta srecnih nakljucij.

Mogoče. Vendar so "srečna naključja" v Linux-u zadnje čase kar pogost pojav :) Poleg tega zadeva postaja vse bolj kaotična - security mehanizmi se medsebojno izničujejo. Cool :)

EDIT:
Spender, save us from Linus :)
SELECT finger FROM hand WHERE id=3;

Zgodovina sprememb…

  • spremenil: denial ()

fiction ::

Change was in 2.6.23 kernel update, lines 18-21 of /etc/sysctl.conf. May break some userland apps: KLIK
Ja, to da je bilo v 2.6.23 sem ze jaz odkril (glej zgoraj). In breaka predvsem Dosemu. Mene je zanimalo od kdaj Ubuntu ta "feature" uporablja. In zgleda da je bilo ze v Hardyu to.

To fix it permanently:
As root ("sudo -s"), add this line to /etc/sysctl.d/90-low-memory-access.conf (Intrepid) or /etc/sysctl.conf (Hardy):
vm.mmap_min_addr=0
and then run: invoke-rc.d procps start
Kar se meni zdi cudno je, kako da sem lahko naletel na masino z Ubuntu 9.04 in mmap_min_addr = 0. Da je slo za konflikt pri sysctl.conf zdaj odpove, ker je ocitno tole svoja datoteka v sysctl.d. Torej se je admin moral prav potruditi, da je spremenil mmap_min_addr.

Točno. S kernelom 2.6.31-rc3 PER_CLEAR_ON_SETID vsebuje tudi MMAP_PAGE_ZERO in ADDR_COMPAT_LAYOUT.
Aha, torej so popravili tudi ta minor issue.

Čeprav so te pomanjkljivosti odkrili ljudje s katermimi je Linus na bojni nogi so svoja odkritja vseeno posredovali kernel team-u. For free!!!
Tudi tisti, ki hocejo z objavo ranljivosti sluziti, ponavadi posljejo opis napake vendorju zato, da jo le-ta odpravi. Razen ce nimajo nobene "etike" (samo potem itak najbrz le izkoriscajo ranljivost za svoj profit). Tista podjetja, ki se ukvarjajo s "kupovanjem bugov" v bistvu kupujejo to, da so prej obvescena in lahko prej ponudijo neko resitev kot bi jo uporabnik dobil od uradnega razvijalca (kar pa je malo dvorezen mec). Teoreticno bi lahko tako tudi nekdo hitreje zacel izkoriscati ranljivost.

No ja, waiting for Matthai, da nam razlozi glede legalnosti posedovanja exploitov. Ampak itak so trenutni vsi geeki najbrz na morju. :)

poweroff ::

Izdelovanje in pridobivanje orožja in pripomočkov, namenjenih za kaznivo dejanje - 306. člen

(1) Kdor orožje, razstrelilne snovi ali pripomočke, s katerimi se lahko napravijo, ali strupe, za katere ve, da so namenjeni za kaznivo dejanje, izdela ali si jih pridobi ali jih hrani ali komu omogoči, da pride do njih, se kaznuje z zaporom do treh let.
(2) Kdor napravi ali komu odstopi ponarejen ključ, odpirač ali kakšen drug pripomoček za vlom, čeprav ve, da je namenjen za kaznivo dejanje, se kaznuje z zaporom do enega leta.
(3) Enako kot v prejšnjem odstavku se kaznuje, kdor z namenom storitve kaznivega dejanja poseduje, izdeluje, prodaja, daje v uporabo, uvaža, izvaža ali kako drugače zagotavlja pripomočke za vdor ali neupravičen vstop v informacijski sistem.

To v bistvu pomeni tole:
- zavedati se moraš, da lahko nastanejo prepovedane posledice
- želeti si moraš teh prepovedanih posledic.

Težava je v tem, da ti tega drugega nihče ne more dokazati, razen če si seveda tako neumen, da napišeš exploit in zraven napišeš nekaj v stilu "S temle exploitom boste lahko vdrli v poljuben Apache server, pozivam vas, da vdrete na čim več serverjev in naredite čim več škode".

Je pa res, da ko so pripravljali spremembo KZ-1 je bila notri drugačna dikcija - taka, ki je kriminalizirala kakršnokoli posedovanje (z namenom ali brez) pripomočkov za vdor v informacijski sistem.

Takrat sem zagnal paniko in preko par poznanstev dosegel, da je tisti, ki je napisal to traparijo v zakon dobil informacijo kaj to pomeni. In je potem tista dikcija letela ven.
sudo poweroff

denial ::

Je pa res, da ko so pripravljali spremembo KZ-1 je bila notri drugačna dikcija - taka, ki je kriminalizirala kakršnokoli posedovanje (z namenom ali brez) pripomočkov za vdor v informacijski sistem.


Use ping and go to jail :))
SELECT finger FROM hand WHERE id=3;

terryww ::

jah rusi so estonske banke pingali do smrti, one recognize the power must of ping yoda said
It is the night. My body's weak.
I'm on the run. No time to sleep.

poweroff ::

Denial - ali pa spletni brskalnik. Hudo nevarno orodje,, ki omogoča SQL injection. V keho z vsemi uporabniki! :D
sudo poweroff

fiction ::

Huh, ta clen je se vedno precej neumen. Kako pa ti dokazejo namen? Pogledajo v tvojo glavo? :) Ampak vsaj ni vec ilegalno uporabljati browserja.

Težava je v tem, da ti tega drugega nihče ne more dokazati, razen če si seveda tako neumen, da napišeš exploit in zraven napišeš nekaj v stilu "S temle exploitom boste lahko vdrli v poljuben Apache server, pozivam vas, da vdrete na čim več serverjev in naredite čim več škode".
Ja, ce si ti avtor exploita, potem bi recimo lahko pogojno uporabili ta clen proti tebi. Ampak kaj pa ce samo posedujes tako kodo? Ni nujno, da imas ti enake namene kot avtor. Ali bi moral v takem primeru izbrisati tisti komentar, da bi bil "safe"? :)

poweroff ::

Ja, člen je trapast, ker tim. obarvanega naklepa ni ravno lahko dokazati. Dejansko po tem členu (prejšnja verzija je bila enaka) niso še nikogar obravnavali.
sudo poweroff


Vredno ogleda ...

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

Še ena ranljivost v Linux jedru

Oddelek: Novice / Varnost
284221 (3162) fiction
»

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

Oddelek: Novice / Varnost
7310047 (7445) karafeka
»

Linux varnost (strani: 1 2 )

Oddelek: Informacijska varnost
556712 (5252) fiction
»

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

Oddelek: Novice / Varnost
73173 (2243) denial

Več podobnih tem