setuid(0) не успява да се изпълни за програма, притежавана от root

Трябва да напиша някакъв код, който може да получи root права и да изпълнява операции на системно ниво. Ето какво съм написал (това не е действителният код, само за да тествам дали правя нещата правилно или не):

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
    int current_uid = getuid();
    printf("My UID is: %d. My GID is: %d\n", current_uid, getgid());
    system("/usr/bin/id");
    if (setuid(0))
    {
        perror("setuid");
        return 1;
    }
    //I am now root!
    printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
    system("/usr/bin/id");
    //Time to drop back to regular user privileges
    setuid(current_uid);
    printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
    system("/usr/bin/id");
    return 0;
}

След като направих gcc -o setuid setuid.c, стартирам ls -al върху това, за да получа следните резултати:

tarun@staging:~$ ls -al setuid
-rwxr-xr-x 1 tarun tarun 9792 2009-10-03 18:09 setuid
adam@staging:~$

Опитът да стартирате приложението води до:

tarun@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted

Променям собственика на root и съответно настройвам лепкавите битове:

tarun@staging:~$ su - root
Password:
staging:~# cd /home/tarun
staging:/home/tarun# chown root.root setuid
staging:/home/tarun# chmod +s setuid
staging:/home/tarun# ls -al setuid
-rwsr-sr-x 1 root root 9792 2009-10-03 18:09 setuid
staging:/home/tarun# exit
logout
tarun@staging:~$

Изпълнението на програмата сега дава:

adam@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted

Докато в идеалния случай трябваше да се изпълни напълно и да промени моето uid на 0. Какво правя погрешно?


person Tarun Verma    schedule 08.02.2015    source източник
comment
Струва ми се странно, че вашият файл е от 2009 г., така или иначе стъпките, които сте следвали, трябва да работят и наистина са работили на моята машина.   -  person Rafael Almeida    schedule 08.02.2015
comment
@Rafael Предполагам, че тогава това трябва да е проблем с моята система. Ще видя дали мога да разбера какво не е наред с това.   -  person Tarun Verma    schedule 08.02.2015
comment
Проверете изхода на mount, за да видите дали suid е активиран. Може би дялът е монтиран с nosuid.   -  person Rafael Almeida    schedule 08.02.2015
comment
Благодаря, оказа се, че файловата система, която използвам, е тип ecryptfs, която налага nosuid и nodev, за да избегне атаки за ескалация на привилегии. Не мисля, че мога да го изключа. Има ли начин да се заобиколи това?   -  person Tarun Verma    schedule 08.02.2015
comment
Добавена е връзка, която трябва да ви помогне да опитомите eCryptFS.   -  person Roman Nikitchenko    schedule 08.02.2015


Отговори (3)


Няма проблем с вашия код, просто проверете правилната последователност setuid / 'sgid':

sudo chmod 6775 setuid
sudo chown root:root setuid

Трябва да зададете поне SUID, SGID и разрешения за изпълнение (маска 6555). Също така е обичайно за този случай да се зададе запис на потребител/група (маска 6775). Разбира се, за сигурност можете да ограничите това до потребителска маска за писане (6755).

И моля, уверете се, че не изпускате разрешения по време на повторно компилиране:

$ ls -al
-rwsrwsr-x 1 root  root  8772 Feb  8 17:52 setuid

Само в случай, че вие ​​(или бъдещи читатели) имате нужда от такова ръководство: Какво е SUID и как да задаване на SUID в Linux/Unix?

Относно проблемите с eCryptfs: ето статия, която трябва да ви помогне: https://wiki.archlinux.org/index.php/ECryptfs

person Roman Nikitchenko    schedule 08.02.2015
comment
Оценявам отговора ви, но пак не работи. ls -al дава желания резултат, но ./setuid все още не ми дава root права :-/ - person Tarun Verma; 08.02.2015
comment
Моля, проверете UID и SGID. Не си в група 0. - person Roman Nikitchenko; 08.02.2015

Залепващият бит има съвсем различна функция. За файл това е до голяма степен недефинирано в наши дни, докато за директория не позволява на не-собственици (различни от root) да премахват файлове в директорията, независимо от разрешенията на директорията.

Търсите зададения UID бит:

  chown root setuid
  chmod +s setuid

Очевидно трябва да сте root, за да зададете SUID разрешение за файл, притежаван от root. Тъй като битът setUID съществува обаче, подозирам, че може да полагате усилия, които не са необходими.

person David Hoelzer    schedule 08.02.2015

промяна

chown root.root setuid

to

chown root setuid

or

chown root.tarun setuid
person alk    schedule 08.02.2015
comment
Забележка: някои файлови системи изискват опцията за позволено setuid да бъде зададена при монтиране. За да разрешите операции с setuid. Проверете вашата точка на монтиране. - person jim mcnamara; 08.02.2015