Сбой popen при вызове после seteuid (0) - PullRequest
0 голосов
/ 16 февраля 2012

Мой код C делает

 seteuid (euid);
 popen("/root/bin/iptables ....", "r");

и он не работает, даже если я звоню с помощью seteuid (0). (Для исполняемых файлов установлен setuid).

Кажется, что seteuid и popen не работают вместе.

При вызове popen он печатает в stderr следующее сообщение

iptables v1.4.6: can't initialize iptables table : Permission denied (you must be root)

Другими словами, popen "успешно", но поскольку создается новая оболочка, разрешения не поддерживаются, и сценарий использования завершается неудачно.

Как я могу решить проблему?

1 Ответ

0 голосов
/ 16 февраля 2012

Вы вызываете скрипт setuid, вызывая popen. Например, во многих дистрибутивах Linux есть проверки при вызове оболочки, чтобы предотвратить запуск сценария setuid или seteuid. Проблема не в popen, а в / bin / sh, используемой оболочкой по умолчанию. В Linux / bin / sh обычно это bash.

Я полагаю, что он вызывает getresuid () и проверяет сохраненный uid, который должен быть root.

Вы можете обойти эту проблему, вызвав функцию exec для оболочки, которая не выполняет эти проверки, или записав весь свой код на C (без вызовов оболочки) - что является истинным намерением проверки безопасности.

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