Setuid с GTK + - PullRequest
       10

Setuid с GTK +

2 голосов
/ 16 января 2011

Я пытаюсь написать программу и интегрировать ее с графическим интерфейсом, созданным с помощью Gtk +. Однако исполняемый файл, который должен вызывать графический интерфейс, имеет установленный бит setuid. Однако gtk не позволяет запускать этот exe-файл, как указано сообществом gtk. Они, однако, говорят, что мы должны написать отдельные вспомогательные программы и все. Я действительно не понимаю, что это значит. Может кто-нибудь, пожалуйста, пролить свет на то, как преодолеть эту проблему? Мне действительно нужно немедленное решение.

Ответы [ 3 ]

4 голосов
/ 16 января 2011

Первый вопрос: почему ваша программа настроена? Написание программ setuid - это не игра, в которую должны играть новички в Linux. Они опасны. Они полезны - не поймите меня неправильно. Но они опасны и их трудно писать безопасно.

Проект GTK + очень прямо заявляет о своем взгляде на программы setuid на « GTK + - Использование setuid ». Они приводят свои причины - хорошие. Они указывают, как избежать проблем:

По мнению команды GTK +, единственный правильный способ написать программу setuid с графическим пользовательским интерфейсом - это иметь backund setuid, который взаимодействует с графическим пользовательским интерфейсом без setuid через такой механизм, как конвейер, и что считает полученные данные ненадежными.

Поскольку вы должны писать вспомогательную программу, вы искали примеры? Вполне вероятно, что они даны. Является ли ваша программа приложением с графическим интерфейсом?


Мне нужны права суперпользователя [...], чтобы открывать некоторые периферийные устройства, читать данные, имеющиеся в их памяти, а затем закрывать их ... это невозможно сделать без привилегий root ... также считанные данные обрабатываются и отображается одновременно с использованием GTK.

Итак, это именно тот сценарий, который описывает команда GTK +. Вам нужна небольшая корневая программа setuid, которая запускается вашим графическим интерфейсом и подключается к ней с помощью каналов, сокета домена Unix или какого-либо подобного метода.

Когда вам нужны данные от периферийного устройства, ваше основное приложение записывает запрос в демон / помощник, а затем ожидает ответ, содержащий данные.

В общих чертах, в вашем графическом интерфейсе будет код:

  • LaunchDaemon (): это создаст сантехнику (каналы или сокет), ответвление, и дочерний процесс разберет дескрипторы файлов (закрывая то, что ему не нужно) перед запуском процесса демона.
  • RequestDaemon (): это упакует запрос к демону / помощнику, записывает информацию в демон и считывает ответ.
  • TerminateDaemon (): это закроет соединения с демоном / помощником; он будет знать, что ему больше нечего делать, и выйдет.

Тем временем ваша программа-демон / помощник будет:

  • Создайте красивый удобный цикл, который:
    • читает запрос со стандартного ввода
    • проверяет его на действительность
    • выполняет запрос
    • форматирует ответ (ошибочный или нормальный)
    • пишет, что обратно в основной графический интерфейс
    • повторяет
  • Когда он получает EOF от входа, он завершается.
  • Если это вообще возможно, он откроет устройство один раз, а затем отбросит привилегии root.
    • Это минимизирует воздействие атаки.
    • Если программа больше не работает от имени пользователя root, ее нельзя использовать для выполнения действий, которые может выполнять только root.
    • Как только файл открыт, разрешения не проверяются снова (поэтому демон, работающий от имени root, может открыть файл, а затем выбросить свои привилегии root, если он не откроет файл).

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

3 голосов
/ 22 февраля 2014

Я думаю, что сердце команды GTK + находится в нужном месте, когда они предупреждают здесь против использования GTK + в программах setuid.Но у меня есть два замечания и обходной путь.

Во-первых, одно предостеречь от такой практики, и совсем другое - сделать такую ​​практику на первый взгляд невозможной.Меня раздражает мысль о дизайнерах, которые говорят: «У пользователей нет веской причины делать XXX», а затем стараются изо всех сил сделать XXX невозможным.Предупредите о риске и позвольте пользователю рискнуть.

Во-вторых, команда GTK + путает «setuid» с «setuid root».Вот пример того, где различие важно.В этом примере я хочу не расширять привилегии программы, использующей GTK +, а уменьшать их.При определенных обстоятельствах я хочу иметь возможность запускать Firefox (ну, в общем, iceweasel, но в основном то же самое), чтобы он мог просматривать только локальные файлы без возможности работы в сети.Поэтому я настроил iptables в своей системе Linux, чтобы определенный (искусственно созданный) пользователь не имел доступа к внешнему миру.Я хочу иметь возможность запускать Firefox как этот пользователь, независимо от того, каким пользователем я на самом деле являюсь.Предполагая, что uid и gid ограниченного пользователя равны 1234, сработает следующая общая идея.Постройте это как корень setuid.Надеюсь, это поможет.

РЕДАКТИРОВАТЬ 2014-02-22 15:13 UTC

Я не упомянул, что вы можете заменить 0 на каждые 1234, и у вас естькорень.Можно утверждать, что это была бы абсолютно плохая идея, и, думаю, я могу понять этот момент.

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int    ar_argc,
     char **ar_argv
    )
{
  setenv("HOME","/u/wally",1);

  /* Set other environment variables as appropriate. */

  if(setgid(1234))
  {
    fprintf(stderr,"setgid() fail\n");
    exit(1);
  };
  if(setuid(1234))
  {
    fprintf(stderr,"setuid() fail\n");
    exit(1);
  };

  /* Use execl() and friends, or system(), to do what you want here. */

  return 0;
}
0 голосов
/ 26 февраля 2011

Часто лучше настроить систему таким образом, чтобы файлы устройств могли открываться пользователем без полномочий root, а затем разрешать нормальным процессам без полномочий root общаться с ними.

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