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

Címkék

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ások

Exploit meg itt.

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

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!


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.

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?

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.

Tragikomédia, kezd már unalmas lenni.

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

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.

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

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.