2012-02-15 2 views
0

Мой C код делаетPOPEN терпит неудачу, когда вызывается после seteuid (0)

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

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

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

Когда POPEN называется она печатает в поток ошибок следующий Сообщ

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

Другими словами POPEN «успешно», а потому, что новая оболочка создается разрешения не поддерживается и использование дело развалится.

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

+1

Какая ошибка? Как это происходит? –

+0

@BasileStarynkevitch редактировал вопрос. – cateof

+1

Вы не проверяете код возврата seteuid, так что дает ** popen («/ usr/bin/who am i», «r»); ** вы? –

ответ

0

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

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

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

Смежные вопросы