2017-01-30 8 views
3

Итак, я получил этот код ниже от here. Однако, когда я следую команды:Почему эффективный UID еще не 0?

sudo chown root:root a.out 
sudo chmod u+s a.out 

Он по-прежнему не будет работать с эффективным UID 0.

Это код:

#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux). 
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

void report (uid_t real) { 
    printf ("Real UID: %d Effective UID: %d\n", real, geteuid()); 
} 

int main (void) { 
    uid_t real = getuid(); 
    report(real); 
    seteuid(real); 
    report(real); 
    return 0; 
} 

Выход:

Real UID: 1000 Effective UID: 1000 
Real UID: 1000 Effective UID: 1000 

Где я предположил, что это должно было быть:

Real UID: 1000 Effective UID: 0 
Real UID: 1000 Effective UID: 1000 
+0

Показать выходные данные программы. –

+0

@ JonathonReinhart только что отредактировал его. Также показал, что я ожидаю! –

+0

Не повторяется с Ubuntu EGLIBC 2.19-0ubuntu6.9 – deamentiaemundi

ответ

0

Очевидно, как @MarkPlotnick сказал.

cd к каталогу, в котором этот a.out. Запустите df. чтобы получить гору пункт. Run mount | grep и посмотрите, что тип файловой системы и варианты монтирования.

Если есть что-то, говорящее nosuid, то вам необходимо перемонтировать эту часть файловой системы без флага nosuid.

Этот сайт here дает хорошее объяснение о том, как сделать это.

1

Функция getuid возвращает только действительный идентификатор пользователя. Идентификатор пользователя в пользовательском процессе все еще 1000. 1000 хранится в реальной переменной.

Таким образом, при вызове из seteuid функции вы снова устанавливаете 1000 в качестве эффективного пользователя id.But на самом деле вы должны установить 0 в этом месте. Таким образом, только эффективный идентификатор пользователя не изменяется.

Попробуйте ниже, он будет работать нормально.

#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux). 
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

void report (uid_t real) { 
    printf ("Real UID: %d Effective UID: %d\n", real, geteuid()); 
} 

int main (void) { 
    uid_t real = getuid(); 
    report(real); 
    seteuid(0); 
    report(real); 
    return 0; 
} 
+0

хорошо что его euid должно быть 0, сначала мне не нужно устанавливать его 0, а если оно не равно 0, оно не может стать 0. Иначе это будет уязвимость эскалации привилегий ,Кстати, я тоже запускал вашу программу и то же самое. Im работает Ubuntu 16.10 ядро ​​версии 4.8 –