Как отмечалось в комментарии выше, вы видите, как system()
целенаправленно сбрасывает setuid (косвенно через bash).
Мои примечания к экземпляру Amazon Linux для system(3)
:
Не используйте system () из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для нарушения целостности системы. Вместо этого используйте семейство функций exe c (3), но не execlp (3) или execvp (3). На самом деле system () не будет работать должным образом из программ с привилегиями set-user-ID или set-group-ID в системах, в которых / bin / sh имеет значение bash версия 2, так как bash 2 отбрасывает привилегии при запуске. (Debian использует модифицированный bash, который не делает этого, когда вызывается как sh.)
Запуск system()
из программы setuid супер опасен , потому что это Намного проще подорвать ваши намерения, чем вы думаете (для начала нужно взломать $IFS
).
Использование хотя бы одной из exec
функций, по крайней мере, удаляет оболочку, но есть часто другой снаряд в будущем.
Если вам абсолютно необходимо это сделать, вы можете позвонить setuid(geteuid());
до system()
, что, по сути, отбрасывает тот факт, что вы находитесь в среде setuid - где реально и эффективные пользователи разные - говорят, что оба являются повышенными правами. Аналогично с группой. Вероятно, это ужасная идея.
Я мог бы предложить, чтобы, если вам нужно спросить SO, как сделать setuid, вы, возможно, не в лучшем положении, чтобы сделать это безопасно.