Назад | Перейти на главную страницу

SETUID / SETGID двоичного исполняемого файла перестали работать после обновления Fedora Core

У меня есть программа на C, которой нужен доступ к защищенному каталогу, в котором много чего.сильный текст По идее, доступ есть только у программы или администратора.

В прошлом на платформах Linux Я довольно успешно использовал биты SETUID и SETGID файловой системы. Программа работает нормально, поскольку UID и GID, указанные файловой системой, являются владельцем исполняемого файла, независимо от того, кто его запускает.

Вернее, раньше он работал успешно.

Я не знаю точно, когда произошло это изменение, потому что я стараюсь обновлять ОС только при сбое оборудования, поэтому я получаю оба обновления одновременно ... Итак, учитывая, что многие версии пропускаются, я, только это по праву теперь система разработки Fedora Core 17 больше не поддерживает эти биты. Поскольку FC 19 является текущим выпуском, я полагаю, что с последним выпуском дела обстоят только хуже, а не лучше.

Вот результат 'ls -l':

-rwsrwsr-x 1 cu cu 26403 Aug 28  2012 comp

Исследуя решение, я обнаружил, что на странице руководства по chmod говорится следующее:

Дополнительные ограничения могут привести к игнорированию битов set-user-ID и set-group-ID MODE или RFILE. Это поведение зависит от политики и функциональности базового системного вызова chmod. В случае сомнений проверьте поведение основной системы.

Хорошо, но у меня НЕТ ИДЕИ, как проверить эту политику и функциональность, как это предлагается! Они не предложили никакой помощи, кроме как использовать команду info, но я не нашел там ничего полезного, только данные о пользователях и группах по умолчанию для создания нового файла.

SELINUX выключен.

Вопросы:

  1. Каков «правильный» способ делать такие вещи в современную эпоху?

  2. Как мне проверить правила - и изменить их?

Спасибо за любой вклад.

БОЛЬШЕ ДАННЫХ:

Программа на C просто имеет эту строку, которая разветвляется для вывода ошибки - отрывка:

  line=malloc(large);
  if (!line) printf("virtual memory exhausted\n");
  if (line && FileExists(filename))
  {
     if (access(filename,R_OK)==0)
     {
        cfile=fopen(filename, "r");

Проблема в вашем случае - использование access().

В man 2 access страница говорит:

  The check is done using the calling process's real UID and GID,  rather
  than the effective IDs as is done when actually attempting an operation
  (e.g., open(2)) on the file.  This allows set-user-ID programs to  eas‐
  ily determine the invoking user's authority.

Когда вы запускаете двоичные файлы setuid, вы меняете только свой эффективный UID не твой настоящий. Так что access() звонок всегда будет неудачным.

Вам следует удалить access(). В этом случае это излишне, так как вы все равно используете команду fopen для открытия файла, также необходимо выполнить такую ​​проверку доступа, а затем выполнить чтение по нему.