2015-04-14 13 views
2

Я наткнулся на проблему с доступом к системным файлам с помощью suid исполняемых файлов./etc/shadow и suid dilemma

Я написал эти короткие ДОУ:

#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    if (access("/etc/shadow", W_OK) == 0) 
     printf("shadow writable!\n"); 
    else 
     printf("shadow not writable\n"); 

    return 0; 
} 

тогда я скомпилирован и дал ему SUID с chown root:root и chmod u+s (пробежал корень)

это полученное исполняемого

-rwsrwxr-x 1 root root  4847 Apr 14 08:40 a.out 

целевой файл имеет следующие права:

-rw------- 1 root root 1836 Oct 8 2014 /etc/shadow 

Когда я запускал программу, он дал этот выход:

[[email protected] ~]$ ./a.out 
shadow not writable 

Почему это происходит? Я имею в виду ... Я обращаюсь к файлу как root и rootCAN пиши в этом файле!

Примечание: selinux отключен

идеи?

+0

Вы должны попробовать использовать 'vipw -s' [Лучший способ редактирования теневого файла] (http://www.cyberciti.biz/tips/what -is-The-лучший способ-на-редактировать-etcpasswd-тен-и-групповые файлы.html) –

ответ

3

От access:

Проверка осуществляется с помощью реального UID вызывающего процесса и GID, а не эффективные идентификаторы, как это делается, когда на самом деле пытается выполнить операцию (например, открытые (2)) на файл. Это позволяет программам set-user-ID легко определять полномочия вызывающего пользователя.

Таким образом, вы можете успешно открыть этот файл для записи, потому что ваш эффективный UID и UID файловой системы теперь 0, но доступ все равно будет возвращать ошибку.

Как @nos отметил, что вы забыли изменить исполняемый владельца root:

$ sudo chown root:root ./a.out 

Но даже если вы сделаете это, вы Виль до сих пор получить «не записываемый» из-за access поведение:

$ ls -l ./a.out 
-rwsr-xr-x 1 root root 12651 Apr 14 09:53 ./a.out 
$ ./a.out 
shadow not writable 
3

Вы устанавливаете бит suid, что означает, что исполняемый файл будет запущен как пользователь, владеющий исполняемым файлом. Исполняемый файл будет работать как d.berra, который не может записать /etc/shadow.

Если вы хотите, чтобы исполняемый файл выполнялся от имени пользователя root, независимо от пользователя, который его запускает, исполняемый файл должен принадлежать root в дополнение к установке бита suid.

+0

Он по-прежнему будет печатать «shadow not writeable!», даже если вы измените пользователя на root. – myaut

+0

Целью suid bit является запуск исполняемого файла как пользователя root как эффективного пользователя. В противном случае нет никакой разницы с исполняемым файлом без установленного бита suid –

+1

@DavideBerra: целью suid является замена эффективного ID с помощью _owner_ исполняемого файла - он может быть не root. – myaut

1

Попробуйте это:

#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    setuid(0); 

    if (access("/etc/shadow", W_OK) == 0) 
     printf("shadow writable!\n"); 
    else 
     printf("shadow not writable\n"); 

    return 0; 
} 

Он устанавливает идентификатор пользователя с корнем, чтобы иметь возможность получить доступ к файлу. setuid (0) работает только в том случае, если эффективный идентификатор пользователя также равен 0.