не могу заставить бит setuid работать на Ubuntu 14.04

У меня есть очень простая программа:

#define _GNU_SOURCE
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

void error(char *msg) {
  printf(msg);
  exit(-1);
}

int main(int argc, char **argv) {
    uid_t ruid, euid, suid;

    if (getresuid(&ruid, &euid, &suid) < 0)
        error("Error getting process uids");

    printf("%d %d %d\n", ruid, euid, suid);
}

Составляется следующим образом:

gcc -o печать print.c

Он принадлежит root и имеет установленный бит setuid:

-rwsrwxr-x 1 root root 8648 8 октября 20:10 ./print*

Однако, когда я запускаю его, я получаю следующие разрешения:

1000 1000 1000

Таким образом, как настоящие, действующие, так и сохраненные разрешения set-uid принадлежат мне (1000), а не root. Кто-нибудь столкнулся с этим? любой совет?


person dimo    schedule 09.10.2014    source источник


Ответы (2)


Ок, разобрался. Проблема заключалась в том, что двоичный файл находился в зашифрованной файловой системе. (перемещение его в /tmp, например, исправляет это). Стоит отметить, что при монтировании зашифрованная файловая система не показывает nosuid.

person dimo    schedule 09.10.2014

Вы выполняете код как root?

В вашем описании вы сказали, что запускали его (а не рут запускал). Если это так, ожидается, что getresuid() вернет «ваш» UID, например, UID вызывающего процесса.

Я запустил программу на своем компьютере с Ubuntu (но на самом деле расстояние не имеет значения, так как это системный вызов) и получил ожидаемые результаты. Когда я выполнял как root, я получил "0 0 0", а когда я выполнял как "себя", я получил "1000 1000 1000"

person Tianyin Xu    schedule 09.10.2014
comment
Я бы ожидал, что последнее число должно быть 0, а не 1000. То есть сохраненный suid должен быть 0. - person dimo; 09.10.2014
comment
Ты прав. Как вы убедились, что у вас установлен бит setuid? Я меняю режим на u+s и получаю результаты 1000, 0, 0 - person Tianyin Xu; 09.10.2014