Unix suid укусил проблему

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

mkdir: lol: Permission denied

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

chmod +s filename

Но это не работает... :( Какие-либо идеи?

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

5
задан Infinite Possibilities 4 January 2010 в 23:57
поделиться

5 ответов

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

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

Edit

Jonathan Leffler прав в комментариях. 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
4
ответ дан 14 December 2019 в 04:39
поделиться

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

.
2
ответ дан 14 December 2019 в 04:39
поделиться

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

Я был немногословен этим в прошлом:(

1
ответ дан 14 December 2019 в 04:39
поделиться

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

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 сделает так, что любой, кроме владельца этого файла, не сможет читать, писать или выполнять 'really_confidential.txt'. Другими словами, вы удаляете возможность читать, писать или выполнять 'really_confidential.txt' у всех пользователей, кроме владельца.

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

EDIT: О да, и так как файл принадлежит root, убедитесь, что предисловие к команде, которую вы выпускаете, содержит 'sudo'. Но, похоже, вы уже знаете это.

0
ответ дан 14 December 2019 в 04:39
поделиться

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

Вся эта концепция кажется мне немного рискованной, хотя... не было бы лучше. чтобы root создал каталог где-нибудь специально для этого приложения, а затем chmod it 775 или 777 предоставил разрешение на запись для "group" или "world" соответственно?

Edit: Я вижу, что вы действительно пытаетесь схмодировать исполняемый файл, и что вы выполняете команда кхмода как корень. Но принадлежит ли root исполняемому файлу? Вам может понадобиться "chown" команда (как root) в дополнение к команде chmod +s, чтобы убедиться, что она запускает setuid root вместо setuid who-built-the-executable.

0
ответ дан 14 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

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