2016-01-15 1 views
1

В некоторых экспериментах кажется, что setresuid/setresgid работает по-разному в C по сравнению с Python, и я не совсем понимаю, почему. Если у меня есть следующая короткая программа C:Почему setresuid/setresgid работает в Python по сравнению с C

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    setresuid(999, 999, 999); 
    setresgid(999, 999, 999); 
    system("/some/program"); 
    return 0; 
} 

И двоичная имеет Setuid набор битов и двоичное в группе 999 и владелец 999, работает этот двоичный файл, как другой пользователь будет работать/некоторые/программы в качестве пользователя 999 это то, что вы ожидаете, поскольку я полагаю, что идея, стоящая за битом setuid, заключается в том, чтобы позволить программе запускаться с разрешениями для группы/владельца файла.

С другой стороны, если у меня есть следующий короткая программа на Python:

#!/usr/bin/python 
import os 
import subprocess 

os.setresuid(999,999,999) 
subprocess.check_output('/some/program', shell=True) 

и сценарий питона имеет Setuid набора бит, в группе 999 и принадлежит пользователю 999, запустив сценарий как другие пользователь дает ошибку:

Traceback (most recent call last): 
    File "/foo/bar/sample.py", line 5, in <module> 
    os.setresuid(999,999,999) 
OSError: [Errno 1] Operation not permitted 

Любая идея, почему это может быть?

+0

Да, в скрипте Python установлен бит setuid. Я обновил свое описание. – blischalk

+0

Моя догадка заключается в том, что среда выполнения Python жалуется на недопустимые операции, тогда как C syscalls только возвращает -1. Вы можете напечатать возвращаемое значение 'setresuid()'? – chqrlie

+1

Возможно, вы захотите спросить что-то вроде: «как я могу предоставить системные привилегии для программы python, аналогичной тому, как я« setuid »скомпилировал двоичный файл?» потому что теперь на ваш вопрос ответили, но у вас, вероятно, все еще есть проблема, которая должна быть решена. –

ответ

3

Выполнение интерпретируемого сценария отличается от выполнения скомпилированного двоичного файла. В случае интерпретируемого сценария то, что на самом деле выполняется, - это интерпретатор, а не сам сценарий. По этой причине setuid на скрипт не влияет. В этом случае у вас должен быть setuid переводчик, который в этом случае равен python. Это не рекомендуется.

+0

Возможности файловой системы, например, 'CAP_SETUID' могут работать с скриптами. – jordanm

+1

Это кажется правдоподобным, но интересно, что обычные пользовательские и групповые разрешения для фактического запуска скрипта будут соблюдены, но функциональность setuid - нет. Если setuid должен быть установлен на интерпретаторе, а не на сценарии, почему разрешения работают вообще на уровне скрипта? – blischalk

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