2015-02-08 5 views
1

Мне нужно написать код, который может получить корневые привилегии и выполнить операции на системном уровне. Вот что я написал (это не фактический код, просто чтобы проверить, если я делаю вещи правильно или нет):setuid (0) не выполняется для корневой программы

#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 на это, чтобы получить следующие результаты :

[email protected]:~$ ls -al setuid 
-rwxr-xr-x 1 tarun tarun 9792 2009-10-03 18:09 setuid 
[email protected]:~$ 

Попытка запустить приложение приводит:

[email protected]:~$ ./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 

я изменить владельца к корню и установите липкие биты соответственно:

[email protected]:~$ 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 
[email protected]:~$ 

Выполнение программы теперь дает:

[email protected]:~$ ./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. Что я делаю неправильно?

+1

Мне показалось странным, что ваш файл с 2009 года, так или иначе, шаги, которые вы следовали, должны работать и, действительно, они работали на моей машине. –

+0

@ Rafael Я предполагаю, что это, должно быть, проблема с моей системой. Вил, если я смогу понять, что с этим не так. –

+0

Проверьте вывод mount, чтобы узнать, включено ли suid. Возможно, раздел монтируется с помощью nosuid. –

ответ

2

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

sudo chmod 6775 setuid 
sudo chown root:root setuid 

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

И пожалуйста beassure не уронить разрешения при повторной компиляции:

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

Только в случае, если вы (или будущие читателям) нужен такой гид: What is SUID and how to set SUID in Linux/Unix?

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

+0

Я ценю ваш ответ, но он все равно не работает. 'ls -al' дает желаемый результат, но'./setuid' до сих пор не получает права root: -/ –

+0

Пожалуйста, проверьте как UID, так и SGID. Вы не в группе 0. –

0

Изменить

chown root.root setuid 

в

chown root setuid 

или

chown root.tarun setuid 
+1

Примечание: для некоторых файловых систем необходимо установить параметр setuid, разрешенный при установке. Чтобы разрешить операции setuid. Проверьте свою точку монтирования. –

0

Липкий бит имеет совершенно другую функцию. В настоящее время файл не является неопределенным, а в каталоге он запрещает не владельцам (кроме root) удалять файлы в каталоге независимо от разрешений каталога.

Вы ищете битый набор UID:

chown root setuid 
    chmod +s setuid 

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

 Смежные вопросы

  • Нет связанных вопросов^_^