бит set-UID не работает должным образом

StackOverflow https://stackoverflow.com//questions/21060640

  •  26-12-2019
  •  | 
  •  

Вопрос

Я использую Raspberry Pi и хотел бы создать исполняемый файл, который просто должен перезагрузить его через несколько секунд.(Я планирую запустить его через ssh и выйти из системы до того, как произойдет фактическая перезагрузка)

Я создал исполняемый файл на C++ с содержимым:

#include <cstdlib>

int main () {
    system("sleep 5");
    system("reboot");
    return 0;
}

ls -l полученного исполняемого файла:

---s--x--x 1 root ben 6191 Jan 10 15:42 reboot

Мой план заключался в том, чтобы использовать бит setuid в сочетании с root в качестве владельца двоичного файла, чтобы команду перезагрузки мог выполнить любой пользователь.

К сожалению, это не работает, и при запуске программы выдает:

Failed to issue method call: Access denied
Must be root.

Любое объяснение, почему это не работает?

Я знаю, что могут быть более простые способы сделать это.Этот вопрос действительно направлен на то, чтобы понять, почему этот способ не работает.

Заранее спасибо и с уважением

Это было полезно?

Решение

У меня была похожая проблема с битом setuid и некоторыми версиями bash.В моем случае решение было написать такую программу:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  system("do something....");
  return 0;
}
.

Я надеюсь, что это тоже поможет вам.

Другие советы

Пока не напрямую отвечайте на ваш вопрос, как насчет разрешения пользователей запускать shutdown с sudo?Вы даже можете указать, какие параметры им разрешено использовать (см. Страницу MAN sudoers(5)).Или создайте скрипт обертки с соответствующими аргументами и позвольте пользователям запускать это.Это может даже проверить, имеет ли он соответствующие права и попытаться повторно выполнить себя через sudo при необходимости:

#!/bin/sh
if test `id -u` -eq 0; then
    # do your stuff - shutdown, poweroff, whatever
else
    exec sudo $0 "$@"
fi
.

В соответствии с этот документ, system() на самом деле звонит /bin/sh, который в некоторых дистрибутивах игнорирует параметр Set-UID bit.

Вы можете попробовать использовать exec() скорее, чем system() и напрямую вызывать /sbin/shutdown?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top