LINUX.ORG.RU

Не работает IFS suid exploit

 , ,


0

1
~ $ cat elevate.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[]) {
        uid_t r, e, s;
        char *ifs = getenv("IFS");
        printf("IFS = <%s>\n", ifs);
        char *path = getenv("PATH");
        printf("PATH = <%s>\n", path);
        if (setuid(0) == -1)
                perror("setuid");
        if (getresuid(&r, &e, &s) == -1)
                perror("getresuid");
        printf("real = %d, effective = %d, saved = %d\n", r, e, s);
        if (system("/bin/echo") == -1)
                perror("system");
        return 0;
}
~ $ gcc -o elevate elevate.c
~ $ mv elevate /usr/bin/elevate
~ $ sudo chown root /usr/bin/elevate
~ $ sudo chmod u+s /usr/bin/elevate
~ $ export PATH=/home/user/bin:$PATH
~ $ export IFS=/
~ $ cat bin/bin
#!/bin/bash
echo Starting shell...
/bin/sh
~ $ /usr/bin/elevate
IFS = </>
PATH = </home/user/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin>
real = 0, effective = 0, saved = 0
~ $

Проверено на двух шеллах - bash и dash. Почему оно не работает? Даже если после export IFS=/ ввести /bin/date - выведет просто время.

Обнови ядро, установи zsh. Systemd чай поди не стоит?

darkenshvein ★★★★★
()

Ну дак исходники bash'а то доступны. Посмотрите, как он парсит строку на команду и аргументы.

mky ★★★★★
()

http://en.wikipedia.org/wiki/Internal_field_separator

IFS was usable as an exploit in some versions of Unix. A program with root permissions could be fooled into executing user-supplied code if it ran (for instance) system(«/bin/mail») and was called with $IFS set to «/», in which case it would run the program «bin» (in the current directory and thus writable by the user) with root permissions.[1] This has been fixed by making the shells not inherit the IFS variable.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.