Создание программы, всегда запускаемой от имени root в OS X

Я пытаюсь сделать так, чтобы программа на C запускалась всегда как root, независимо от того, кто ее вызывает.
В принципе, я хочу, чтобы он вызывал "mkdir /test" в качестве примера.
Поэтому я создал программу на Си следующим образом:

#include <stdio.h>

int main()
{
system("mkdir /test");
printf("bye...n");
return 0;
}

теперь, я просто скомпилировал его:
тест ССЗ.c-o тест

и теперь я попытался установить разрешения:

chmod +s test

однако работает как обычный пользователь, я получаю разрешение отказано в ошибке. Таким образом, он выполняет файл, но не с правами root.
Я также попытался установить разрешения как:

chmod a+s test
chmod o+s test

но у меня всегда одна и та же проблема.

кто-нибудь может мне в этом помочь?
Кстати, файл test.c создается root, и он также компилируется как root.

bash-3.2# ls -al | grep test 
-rwxr-xr-x   1 root   staff       8796  5 Ago 19:07 test
bash-3.2# chmod +s test
bash-3.2# ls -al | grep test 
-rwsr-sr-x   1 root   staff       8796  5 Ago 19:07 test
bash-3.2# whoami
root
bash-3.2#

спасибо заранее!
Cheerz!

14
задан yaroze
29.11.2022 1:24 Количество просмотров материала 3298
Распечатать страницу

2 ответа

здесь есть две вещи, которые нужно знать:

  • Sticky бит, которое смогло быть использовано на файлах и директориях, но не сделает чего вы хотите. От sticky(8):липкий бит не влияет на исполняемые файлы.

  • setuid флаг, который позволит программе запускаться с разрешениями ее владельцев. Что, кажется, ограничение в OS X, и, видимо, не документировано, что бит setuid на исполняемом файле имеет эффект только в том случае, если исполняемый файл находится в каталоге, который принадлежит root (и не открыт для записи другими) и т. д. до корневого каталога. В противном случае он игнорируется по соображениям безопасности, хотя.

в любом случае, вы можете изменить файл sudoers таким образом, что он не будет требовать пароль для одной команды. Помните, что вы есть использовать visudo для редактирования. Если вам удастся получить неправильный синтаксис во время редактирования файла, вы не сможете запустить sudo вообще больше.

sudo visudo

затем нажмите I и внизу вставить:

username    ALL= NOPASSWD: /path/to/command

здесь, очевидно, нужно изменить username для пользователя, который должен выполнить команду без ввода пароля. Кроме того, измените путь к исполняемому файлу. Обратите внимание, что на этом этапе исполняемый файл может принадлежать root и разрешен только для root как ну.

пресс Esc, тогда пишите :wq, потом введите.

теперь пользователь username можно выполнить команду с sudo /path/to/command и для этого не нужно вводить пароль.

6
отвечен slhck 2022-11-30 09:12

Я работаю под Linux, но поскольку OSX-это просто BSD, я предполагаю, что он следует тем же (общим) правилам, что и любой другой Unix.

в вашей программе вам нужно вызвать setuid (UID), который возвращает 0 при успешном выполнении, чтобы он работал как этот UID, и вы хотите работать как root. UID корня является наверное 0, но если вы особенно параноик, используйте getpwnam (const char *szUserName), чтобы получить UID.

Так, что-то вроде этого:

#include <stdio.h> // needed for printf

#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>

void change_to_user (const char *szUserName)
{
  struct passwd *pw;

  pw = getpwnam(szUserName);
  if (pw != NULL)
  {
    uid_t uid = pw->pw_uid; // we now have the UID of the username

    printf ("UID of user %s is %d\n", szUserName, (int)uid);
    if (setuid (uid) != 0)
    {
      perror ("setuid");
    }
    else
    {
      // this will fail if you try to change to root without the SUID
      // bit set.  This executive needs to be owned by root (probably
      // group owned by root as well), and set the SUID bit with:
      //   suid a+s {executable}
      printf ("UID is now %d\n", (int)uid);
    }
  }
  else
  {
    perror ("getpwnam");
  }
}


int main (int argc, char **argv)
{
  int iIter;

  if (argc == 1)
  {
    printf ("Give me a user name\n");
    return 1;
  }

  for (iIter = 1 ; iIter < argc ; iIter++)
  {
    change_to_user (argv[iIter]);
  }
  return 0;
}

вы можно установить любое имя пользователя, так что, возможно, вы используете сценарий cgi, и вы хотите, чтобы запустить в качестве имени пользователя на свой счет вместо "www-данных" или что - то еще-вы можете использовать его там. Я делаю это, поэтому я могу подробно ответить на ваш вопрос.

0
отвечен Richard Wicks 2022-11-30 11:29

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх