#c #linux #guid #setuid #suid
Вопрос:
Я пытаюсь написать программу, которая запускает /bin/bash с правами пользователя smith,
smith:x:1000:1000:Basket:/home/smith:/bin/bash
Я попробовал это:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
setgid(1000);
setuid(1000);
char command[50];
strcpy( command, "/bin/bash" );
system(command);
return(0);
}
и я использовал эту команду, чтобы установить владельца, группу и разрешения
chown smith command
chgrp smith command
chmod x command
chmod u s command
разрешения после команд:
-rwsr-xr-x 1 smith smith 16840 Jun 6 17:11 command
и не сработало, я попробовал с root в качестве следующего:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
setgid(0);
setuid(0);
char command[50];
strcpy( command, "/bin/bash" );
system(command);
return(0);
}
и я использовал те же команды для разрешений и так далее, Но вместо смита я написал root, и я работал, и когда я запускаю его, я получаю оболочку как root.
Итак, как я могу сделать это с пользователем smith?
Комментарии:
1. Программы-оболочки Setuid/setgid на языке C, использующие сценарии оболочки и
system()
вызовы для выполнения других команд, практически невозможно выполнить без возникновения проблем с безопасностью, которые могут быть использованы…2. Вам нужно установить gid вашей программы:
chmod g s program
так, чтобы это была программа setgid (я думаю , что команда верна). Затем в программе сделайтеsetgid(getegid()); setuid(geteuid());
Ответ №1:
Linux Просто Так Работает ™
Если бы любой пользователь волей-неволей мог стать другим пользователем, то у Linux вообще не было бы прав доступа.
Только процесс, запущенный с правами суперпользователя, может изменить свои действующие учетные данные.
Тем не менее, Linux предоставляет подробные учетные данные. Видеть:
$ man 7 capabilities
за подробностями.
Лучшее решение синдрома «Я хочу быть корнем» — проверить sudo(8). Использование sudo(8) лучше, потому что:
- Вы можете контролировать, у кого есть власть.
- Вы можете контролировать, какие приложения может запускать этот пользователь.
- Вы даже можете назначить первые несколько действий командной строки, которые они должны выполнить.
- Запись вносится в журнал аудита, так что вы знаете, кого винить, когда они разбивают машину.
Ответ №2:
Я использовал эту команду, чтобы задать владельца, группу и разрешения
chown smith command chgrp smith command chmod x command chmod u s command
Если вы используете бит SUID и / или SGID в режиме программы, то программе не нужно вызывать соответствующую функцию изменения идентификатора. Система автоматически запустит программу с идентификатором владельца (SUID) и / или группы (SGID). Из этого следует, что если вы используете этот подход для запуска под uid, отличным от root, то программа не должна пытаться вызывать функции изменения личности, так как это может сделать только программа, работающая с достаточными правами.
Таким образом, вашими основными (взаимоисключающими) вариантами являются следующие:
- Используйте права собственности и режим (биты SUID / SGID) исполняемого файла, чтобы выбрать непривилегированное удостоверение для запуска программы от имени и избежать вызова
setuid()
илиsetgid()
. Любой пользователь, у которого есть разрешение на выполнение программы, затем выполнит ее как назначенный пользователь / группа. - Используйте функцию
setuid()
и / илиsetgid()
во время выполнения, чтобы установить идентификатор, под которым выполняется программа. Эти функции не будут работать, если программа запущена непривилегированным пользователем. - В Linux используйте подсистему возможностей, чтобы предоставить исполняемому файлу привилегию изменять свою личность пользователя. (Детали были бы больше, чем еще один полный ответ.)
- Не делай этого вообще. Это может быть вашим лучшим вариантом. Программы Setuid рискованны, сценарии оболочки setuid гораздо более опасны, и ни один известный мне специалист по безопасности не примет такую программу, как ваша, которая позволяет произвольным пользователям запускать произвольные команды оболочки под другим именем.