2012-02-15 5 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 다음 MSG를 인쇄 전화했을 때 "성공"하지만, 새로운 쉘이 만들어지기 때문에 권한이 유지되지 않고 유스 케이스가 실패합니다.

어떻게 문제를 해결할 수 있습니까?

+1

무엇이 오류입니까? 어떻게 실패합니까? –

+0

@BasileStarynkevitch가 질문을 편집했습니다. – cateof

+1

seteuid의 리턴 코드를 확인하지 않으므로 ** popen ("/ usr/bin/who am i", "r"); **은 무엇입니까? –

답변

0

당신은 popen을 호출하여 setuid 스크립트를 호출합니다. 예를 들어 Linux의 많은 변형은 쉘 호출에서 스크립트가 setuid 또는 seteuid 실행을 시작하지 못하도록 점검합니다. 문제는 popen이 아니며,/bin/sh는 기본 쉘인 popen 사용법입니다. 리눅스에서는/bin/sh는 보통 bash입니다.

getresuid()를 호출하고 저장된 UID를 확인합니다. 루트가되어야합니다.

이 검사를 수행하지 않는 셸에 exec 함수를 호출하거나 보안 검사의 진정한 의도 인 모든 코드를 C (셸 호출 없음)로 작성하여이 문제를 해결할 수 있습니다.

관련 문제