Null pointer dereference sebezhetőség a Linux kernelben (pipe.c)

 ( trey | 2009. november 4., szerda - 21:31 )

Null pointer dereference hibát találtak a Linux kernel pipe.c fájljában. A hiba sikeres kihasználása a helyi támadó számára DoS-t, vagy privilégium-szint emelést tehet lehetővé. A H Security szerint azon a disztribúciók, amelyeken a mmap_min_addr értéke alapértelmezetten nagyobb 0-nál (pl. Ubuntu), nem sebezhetőek. Ahol 0 (pl. Red Hat, Debian), ott workaround-ként be lehet állítani ezt a sysctl változót nagyobbra. A hibát a 2.6.32-rc6 pre kernelben javították. A javítást október 21-én commit-olta Linus. A VUPEN hibajegye itt. További részletek itt. A Debian segítsége a sysctl knob megváltoztatásához itt.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Exploit meg itt.

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

BLACKHAT! :P

CRACKER a megfelelő szó

kezdődik...

Tényleg tök mind1, hogy cracker, vagy hacker. Már akinek mindegy az is, hogy megbütyköli az asszonyt, vagy megtöri...
--
unix -- több, mint kód. filozófia.
Life is feudal

Először megtöröd, hogy utána megbütykölhesd :D

Csak aki használja.

op@peonia ~> ./exploit
::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
Unable to obtain symbol listing!

:(
___
info

Oscon te vagy az? :P

nem :P

PS.:

op@peonia ~> uname -a
FreeBSD peonia 7.2-RELEASE-p4 FreeBSD 7.2-RELEASE-p4 #0: Fri Oct 2 12:21:39 UTC 2009

:/usr/obj/usr/src/sys/GENERIC i386
___
info

nem volt annyira vicces, mint Oscon reakciója, de azért értékelem... :D

Varj, ez nem az az OS, aminek csak a 8.0-s verziojaban lesz barmifele nullptr deref vedelem? :)

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

ooooooooo...

nem :P

bar ezen gyari van, de amugy nem vagyis de, de megsem
___
info

;)

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

eax, ha neked azt mondják, hogy építs egy nagyon biztonságos servert -> Software oldalról, Nem pedig social engineeringet, vagy fizikai biztosítást nézve, "általános célokra" - mail, www, sql, ftp, akkor milyen oprendszert raknál a szolgáltatások alá?

Korulmenyektol fugg, valoszinuleg openbsd/win2008 core/hardened linux kozul valamelyiket, de egyik sem eletbiztositas.

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

értem, köszi

Minek, ha láthatóan a nélkül is védett ;-)

2.6.23.16 SMP, es nem mux:
[+] Searching for kernel symbols
[-] failed :(

megneztem es /proc/kallsyms-be nincsenek benne a keresett symbolok. szoval megse minden 2.6.x erintett? vagy mitol fugg?

A'rpi

Nem, az a 2 symbol csak ahhoz kell, hogy ha mar megvan a ring0, akkor krealjon nekunk 0-s uid-eket. Ezt egyreszt enelkul is meg lehet csinalni (pl. szepen megkeresgeli a task_struct-ot, es atirja direktben, csak en ehhez most lusta voltam), masreszt meg az sem torvenyszeru, hogy ezt akarja az ember ring0 payload-nak. :)

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

2.6.29-től van prepare meg commit cred ...

hron@merlin ~/download $ ./akkountgyokeresito 
::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
 [+] Resolved commit_creds to 0xffffffff81051ad7
 [+] Resolved prepare_kernel_cred to 0xffffffff810519c6
[+] trying to mmap NULL
[-] failed :(

Linux merlin 2.6.30-gentoo-r5 #1 SMP Sat Oct 10 21:07:00 CEST 2009 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 5200+ AuthenticAMD GNU/Linux

--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Fedora 11-en nem megy:

[ortutay@finnm2pc108 1]$ uname -a
Linux finnm2pc108 2.6.30.9-90.fc11.i586 #1 SMP Sat Oct 17 11:09:52 EDT 2009 i686 i686 i386 GNU/Linux
[ortutay@finnm2pc108 1]$ ./exe
::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
 [+] Resolved commit_creds to 0xc0444f65
 [+] Resolved prepare_kernel_cred to 0xc0444dc6
[+] trying to mmap NULL
[-] failed :(

Csaba


zazoi@debian:~/work$ gcc acc.c
acc.c: In function ‘main’:
acc.c:134: warning: passing argument 1 of ‘mmap’ makes pointer from integer without cast
acc.c:147: warning: assignment from incompatible pointer type
zazoi@debian:~/work$ ./a.out
::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
[-] failed :(
zazoi@debian:~$ uname -a
Linux debian 2.6.18-5-686 #1 SMP Fri Jun 1 00:47:00 UTC 2007 i686 GNU/Linux

Na, valami kicsit megkavarja a code tag-et de a lényeg látszik.

>> a lényeg látszik.

tudniillik hogy nem sok mindent sikerült megérteni itt

Akkor segíts, plz! :)
- Pld. kihagytam ezt., Ez azt akarná jelenteni, hogy az én ősi kernelverzióm nem játszik?
- Életemben most használtam másodjára a bármi féle c fordítót linuxon, és rosszul fordítottam? (paraméterezés stb.) Egyébként csak azért raktam be azt a részt is, mert jöttek a warningok... másnál nem volt? - A gcc-m sem a legfrissebb, és a c-vel is a fősulin foglalkoztam komolyabban utoljára, az meg nem most volt.
- A warningok miatt ki sem kellett volna próbálnom? (Bevallom, számomra csak "warning"-ok voltak, nem error-ok, a lefordított file is létrejött, így gondoltam miért ne.)
- Vagy az exploitot totál nem így kellett volna kipróbálni?

Vagy mit néztem, értelmeztem félre?

ezt

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

Többször írtam, hogy nem vagyok guru :) Elolvastam amit írtál, értem is a szavakat egymás után, csak az egész képez homályt számomra (Értem, hogy gőzgép, de mi hajcsa?) :D - illetve azért nem fut, mert kell a te megoldásodhoz az említett két symbol ami nálam nincs, de más úton is meg lehet oldani?

Arra lettem volna kíváncsi, hogy érintett vagyok-e a kérdésben. Egyszerű igen - nem is elég, bár ha van mellé ok is azt megköszönném és megpróbálom megérteni.

Egyáltalán hogyan tudom ellenőrízni, hogy mi van beállítva? Nálam nincs /etc/sysctl.d, a sysctl -n vm.mmap_min_addr azt mondja, hogy nincs ilyen kulcs, egy mezei etc/sysctl.conf-om van, amiben nincs aktív sor, a sysctl -a kimenete között sem látok semmiféle mmap_min_addr-hez hasonlót. (A cikk megjelenéséig azt sem tudtam, hogy van olyan, hogy sysctl, mmap_min_addr meg általában... kocalinuxos vagyok, nem tagadom)

Valószínűleg érintett vagy (még a 2.4-es kernelek is érintettek), max az 'eax' által készitett exploit nalad nem fut le. Ezt az exploitot nyilvan sajat szorakozasara irta "proof of concept" jelleggel, es gondolom azert tette elerhetove, hogy masok tanulhassanak belole. Készíthető nemi modositassal olyan exploit is ami nálad is menne, ahogy ezt ő már írta feljebb.

Az exploit a fenti ket symbolt hasznalva szerez maganak root jogot. 2.6.29-től fogva azert egyszerű ezt a módszert hasznalni, mert így architektura-függetlenül tudod ezt megtenni. Előtte másképp kellett megoldani, ami erősen architekturafüggő volt (keresgelni kellett a memóriában és egy bizonyos helyet felülírni). Például egy x86 vagy egy x86_64 intel gepen egészen máshol találod meg ezt a bizonyos helyet, de még a kernel verziójától is függ. De ha univerzális exploitot akar valaki készíteni, akkor nyilván ezeket is beleteszi ...

Köszi a választ! Pár dolog megvilágosodott, meg most már komolyabban utána olvastam. Szóval akkor erről lenne szó (józan paraszti nyelven:) )?

A sebezhetőség elég régóta megvan (illetve eleinte nem volt, a Linux 2.0 még nem érintett, csak aztán belekerült), a 2.6.18 utáni kernelekbe került be az, hogy elérhető az mmap_min_addr és módosítható. A korábbiakban "ott van láthatatlanul és elérhetetlenül", 0 az értéke, így az erre épülő exploit sikeres lehet, azaz "beleesek a pixisbe" :), viszont kernelfrissítés nélkül nem tudok ellene tenni semmit?

Ez segített a talán a legtöbbet, bár felét sem értem :)

Működő exploitra meg még vadászok :), a fenti linken is van egy, de kell neki valami exp_framework.h, ennek még nem néztem utána, hogy mi is lenne.

> Arra lettem volna kíváncsi, hogy érintett vagyok-e a kérdésben.

erre biztos negativ valaszt egy exploit nem fog adni, de esetleg probald ki spender-et.

Köszi, kipróbálom.

Azt mondja, hogy nem vagyok sebezhető, de ennek nem kellene min. 2.6.31-s kernel? Szóval megint kaptam egy nem biztos negatív választ :)

A Debian 6.0-ban már át van állítva !0-ra? Mert azt láttam, hogy a Debian 5.0.4-tól felfelé már 4096 lesz az alapértelmezett értéke, de ez a jelenlegi testingre is érvényes?

SKL - leírásgyűjtemény és informatikai portál

miota van 6.0?
___
info

Tragikomédia, kezd már unalmas lenni.

--
Wir sind erfaßt, sind infiziert,
Jedes Gespräch wird kontrolliert.

A Null pointer dereference egy módszer, mint anno a printf volt, sok ilyen várható még...

Hát igen, a sok magasan szakképzett programozó lassan megtaulhatná szakmája *alapvető* szabályait, amik programozással kapcsolatba hozhatók. És ebbe bizony beletartozik az is, hogy *mindent* ellenőrzünk. (Meg persze egy csomó más is.)

Ha legalabbis valamennyire szakkepzett programozok csinalnak a Linux kernelt, egy csomo olyan szopasba nem szaladnank bele, amibe most igen, es kevesbe lenne elvezetes a munkank.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Ezek szerint ez csak Linux kernel probléma. Akkor azonban nem értem, hogy miért mutatkozott be az OpenBSD-ben is és a FreeBSD-ben is olyan mechanizmus, amivel meg lehet akadályozni a 0-ra mappelést. Ja, várj. Azért mert ez nem Linux probléma.

--
trey @ gépház

Hogy is mondják errefelé? "Hígul a szakma."

Meg Knuth is hibazik neha: http://en.wikipedia.org/wiki/TeX#Development

Milyen kepzeshez kotned a Kernel fejlesztest ?


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Talán olyan programnyelven kellene oprendszert feljelszteni, ami nagyon alapvető hibáktól véd.

Mint például milyenen?
--
ahan nem

pl. PHP :). Otta kornyezet megved tul sok CPU es memoria hasznalttol is, es minden PHP fuggetlen ilyen szempontbol egymastol.
Nincsenek Gonosz pointerek :)


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Jogos... :) Gondolom azért nem abban írják, mert amikor kezdték, akkor még a PHP nem létezett. Lehet szólni kéne nekik, hogy megérett az idő a váltásra. Nem kéne legalább ilyen hülye pointeres hibákkal szívni :)
--
ahan nem

Nem nyert.

Szerk: helyesbítek! 2.6.31 alatt a processz szépen eszi a CPU-t 100%-on :)

- Linux 2.6.31-gentoo-r4 #1 SMP Fri Oct 30 08:35:10 CET 2009 (Gentoo)

::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
[+] Resolved commit_creds to 0xffffffff8104afe8
[+] Resolved prepare_kernel_cred to 0xffffffff8104adf5
[+] trying to mmap NULL
[-] failed :(

- Linux 2.6.31-ARCH #1 SMP PREEMPT Fri Oct 23 10:03:24 CEST 2009 (Archlinux)

::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
[+] Resolved commit_creds to 0xffffffff81081ee0
[+] Resolved prepare_kernel_cred to 0xffffffff81081c40
[+] trying to mmap NULL
[-] failed :(

- Linux 2.6.24-24-xen #1 SMP Fri Sep 18 18:14:17 UTC 2009 (Ubuntu 8.04.3 LTS)

::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
[-] failed :(

--
\\-- blog --//

Akinek gentoo-ja van vagy mas okbol sajat maga forgatja a kernelet:

A CONFIG_DEFAULT_MMAP_MIN_ADDR beallitasrol van szo, amirol a help-ben azt irjak, hogy x86-on az ajanlott beallitas 65536, igy en is annyira allitottam.

Nem rémlik soha, hogy ezen állítottam volna, de a két gentoos gépemen CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 a (default?) beállítás.

+1
A gentoo-sources default ezzel jon.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

+1

Frugalware 1.1 x86_64

$ sysctl -n vm.mmap_min_addr
4096

oh noes /o\

Ubuntu Karmic Koala amd64 2.6.31-14-generic:
::: AkkountGyokeresito, at your service :::
::: by eax
::: greetings to: #hohh

[+] Searching for kernel symbols
[+] Resolved commit_creds to 0xffffffff8107f270
[+] Resolved prepare_kernel_cred to 0xffffffff8107f480
[+] trying to mmap NULL
[+] got it
[+] now, RACE!!
[+] here's your root akkount:
#

Szerk: a wine állítatja be 0-ra a mmap_min_addr-t, lásd: /etc/sysctl.d/30-wine.conf

sudo rm -f /etc/sysctl.d/30-wine.conf

Most.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

megoldottam másként, de feljebb vettem az értéket

Miért kell ez neki?

Hogy ne felejtsd, hogy meg gondolnod se szabad Windows-ra!! ;-)

Ez fájt (én meg gondolkozhatok, hogy átálljak 64-bitre, amin FreeBSD alatt szopás van a wine-nal, vagy feleslegben van 3G ramom)

A hír debianos linkjében írják, hogy a Win16 binárisok csak így futnak wine-en. A Win32 binárisokkal elvileg nincs gond. Szerintem ezért alapból 0-ra állították, hogy az embernek ne kelljen még a wine belövése után azzal is küzdenie, hogy miért nem a pacman :). (De hogy konkrétan miért van így azt nem tudom, ahhoz kicsi vagyok)

Engem csak a dosemu érint a kérdésben, mert azt sűrűn használom.

Na most aki a win16-os binarisoknak nem kepes felhuzni egy vbox-os gepet, az meg is erdemli. Tobb okbol is.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.