Unix suid бит проблема - PullRequest
5 голосов
/ 05 января 2010

Я написал программу на c, которая выполняет некоторые вычисления, а затем создает папку. Владелец этой папки - пользователь root. С другим пользователем я пытаюсь запустить это приложение c. У меня есть эта ошибка:

mkdir: lol: Permission denied

Хорошо, я знаю, что эта ошибка в порядке, потому что у меня нет прав на нее, но я прочитал в интернете, что если я установлю бит suid для файла, то этот файл будет работать с правами владельца , Я использовал эту команду:

chmod +s filename

Но это не работает ... :( Есть идеи?

EDIT:
Итак, во-первых, мой дистрибутив Unix - это Mac OS X 10.5.8. И мое имя файла a.out, так как я скомпилировал его из ic.c с помощью команды: gcc ic.c И я запускаю команду chmod с пользователем root.

Ответы [ 6 ]

4 голосов
/ 05 января 2010

Я думаю, вам также понадобится setuid(0); в вашей программе, чтобы стать пользователем root. Недостаточно только установить s-бит.

Я согласен со всеми остальными, что делать все это очень рискованно ...

Редактировать

Джонатан Леффлер прав в комментариях. setuid(0);, вероятно, не должно быть необходимым в этом случае. Необходимые шаги для создания файла под /etc

create_file_under_etc.c

#include <stdio.h>
int main() {
  FILE *fp = fopen("/etc/so-su-test.txt", "wt");
  if (fp) {
    fprintf(fp, "I'll be back\n");
    fclose(fp);
    printf("File created.\n");
  } else {
    printf("File not created.\n");
  }
  return 0;
}

... и для тестирования и компиляции

cc create_file_under_etc.c
sudo chmod +s a.out
sudo chown root:staff a.out
./a.out

... тебе лучше тоже почистить

sudo rm a.out
sudo rm /etc/so-su-test.txt
2 голосов
/ 05 января 2010

Ну, вы не говорите, что такое «имя файла». Вы можете только suid на исполняемый файл. В частности, вы не можете установить его в сценарии оболочки - это должен быть исполняемый код реального машинного кода. А в современных UNIX, например, в некоторых ужасных дистрибутивах Linux, вы вообще не сможете установить его, не перепрыгнув через большее количество обручей, чем хотелось бы.

1 голос
/ 25 июля 2014

Неверный синтаксис. Команда должна быть заблокирована как chmod u + s имя файла Мастер для chmod http://en.clihelper.com/chmod/ может помочь с синтаксисом chmod

1 голос
/ 05 января 2010

Попробуйте запустить chmod от имени пользователя root.

В прошлом я был немного об этом: (

0 голосов
/ 05 января 2010

Вы использовали команду

chmod +s filename

Синтаксис, использованный вами для ввода этой команды, неверен. Правильный синтаксис будет

chmod [ugoa]+s filename

, где вы можете использовать любую комбинацию букв u, g, o и a.

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

При вводе команды chmod необходимо указать, для какого набора пользователей вы изменяете права доступа. Сделайте это, используя комбинацию букв u, g, o и a. «u» изменяет разрешения для владельца файла, «g» для всех пользователей в группе владельца, «o» для всех остальных пользователей, не входящих в группу владельца, и «a» для всех трех групп пользователей.

Примеры:

chmod ga-r confidential.txt сделает так, чтобы только владелец файла мог прочитать 'confidential.txt'. Все остальные пользователи, включая пользователей из группы владельцев, не смогут прочитать «confidential.txt»

chmod ga-rwx really_confidential.txt сделает так, чтобы кто-либо, кроме владельца этого файла, не мог читать, записывать или исполнять файл действительно_confidential.txt. Другими словами, вы удаляете возможность читать, писать или исполнять файл действительно_confidential.txt у всех пользователей, кроме владельца.

chmod u+s filename добавляет бит привязки к имени файла, только для владельца этого файла.

РЕДАКТИРОВАТЬ: О да, и так как файл принадлежит root, убедитесь, что перед командой вы вводите 'sudo'. Но, похоже, ты это уже знаешь.

0 голосов
/ 05 января 2010

Из вашего вопроса непонятно, что именно означает «имя файла» - исполняемый файл, или каталог, в котором вы хотите создать файлы? Чтобы делать то, что вы хотите, вам нужно использовать chmod +s команда на исполняемый файл, поэтому он будет запускаться с правами root. chmod +s в целевом каталоге ничего не сделает, чтобы открыть права на создание файла для пользователей без полномочий root.

Вся эта концепция кажется мне угрозой безопасности - разве не лучше? Для root создать каталог где-то только для этого приложения, а затем chmod 775 или 777, чтобы предоставить разрешение на запись для «группы» или «мира» соответственно?

Редактировать : Я вижу, что вы действительно пытаетесь изменить исполняемый файл, и что вы работаете команда chmod от имени root. Но владеет ли root исполняемым файлом? Вам может понадобиться «чоун» команда (как root) в дополнение к команде chmod + s, чтобы убедиться, что она запускает setuid root вместо setuid, кто бы ни создавал исполняемый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...