Я думаю, что сердце команды 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;
}