Ответ 1
От man system
:
Не используйте
system()
из программы с привилегиями set-user-ID или set-group-ID, потому что странные значения для некоторых переменных среды могут использоваться для разрушения целостности системы. Вместо этого используйте семейство функцийexec(3)
, но неexeclp(3)
илиexecvp(3)
.system()
, по сути, не будет корректно работать с программами с привилегиями set-user-ID или set-group-ID в системах, на которых/bin/sh
есть bash версия 2, так как bash 2 падает привилегии при запуске.
И от man bash
:
Если оболочка запускается с эффективным идентификатором пользователя (группы), не равным идентификатору реального пользователя (группы), а параметр
-p
не предоставляется, файлы запуска не читаются, функции оболочки не унаследованы от среда, переменнаяSHELLOPTS
, если она появляется в среде, игнорируется, а эффективный идентификатор пользователя устанавливается на реальный идентификатор пользователя.
Кажется, ваш вызов setuid(0)
обошел эту защиту.