Существует ли различие между использованием setuid ()/setgid () в рамках программы и вызовом его с sudo-u xxx-g xxx?

Рассмотрите этот сценарий Python, который вызывает HandBrakeCLI, программа, которая пытается читать из DVD-привода:

invoke.py

#!/usr/bin/python

import sys
import os
import subprocess as subp
import pprint

#immediately switch users
os.setgid(1002) #gid of "media"
os.setuid(1005) #uid of "jack"

#verify the switch worked
print os.getuid(), os.geteuid()
print os.getgid(), os.getegid()

#clear up any possible env var diffs
os.environ['USER'] = 'jack'
os.environ['USERNAME'] = 'jack'
os.environ['LOGNAME'] = 'jack'

#output env variables to see if there's anything different:
ff = open('env_%s.log' % sys.argv[1], 'w')
ff.write(pprint.pformat(dict(os.environ)))
ff.write("\n")
ff.close()

#call the program
p = subp.Popen(["HandBrakeCLI", "-i", "/dev/sr0", "-t", "0"])
p.communicate()

sys.exit(p.returncode)

Следующий ("A") успешно выполняется:

sudo -u jack -g media HandBrakeCLI -i /dev/sr0 -t 0

как делает этот ("B"):

sudo -u jack -g media ./invoke.py jack

но этот ("C") сбои:

sudo ./invoke.py root

и ошибки печати, предполагающие, что HandBrakeCLI не мог получить доступ к CD-приводу. Операторы печати подтверждают, что UID/GID был успешно изменен на jack:media, как бы то ни было. Если я удаляю setuid/setgid и называю HandBrakeCLI от invoke.py как корень, он работает еще раз.

Разность показывает, что среды являются по существу тем же:

$ diff env_root.log env_jack.log
8c8
<  'SUDO_COMMAND': './invoke.py root',
---
>  'SUDO_COMMAND': './invoke.py jack',

После вызова setuid и setgid, там "память" исходного пользователя вызова? В противном случае, что HandBrake мог возможно видеть по-другому между "B" и "C"?

Я работаю 10.04 на бездисплейном сервере, к которому я получаю доступ через ssh.

3
задан 2 January 2012 в 06:08

1 ответ

Это действительно имеет значение, так как можно определить, были ли повышены привилегии (случай suid), что отличается от работы через sudo. Это потому, что весь процесс выполняется как 'jack' в случае sudo (и никогда не отменяет uid: процесс просто завершается), тогда как случай suid "запоминает" исходный uid, и изменяется только эффективный uid.

Ваша ситуация немного отличается, но вот тестовый скрипт, который обнаруживает каждую комбинацию sudo / suid: test_privs.sh Подобный код теперь используется на сервере X11 для обнаружения повышенных привилегий: xorg -уровневое обсуждение

Я не рассмотрел ваши конкретные потребности устройства / ручного тормоза, но это должно поставить вас на правильный путь.

0
ответ дан 2 January 2012 в 06:08

Другие вопросы по тегам:

Похожие вопросы: