我有一个运行在C中的程序,这需要使用system执行一个"iptables“命令。
我试过了
setuid(0);
system("iptables .... ");setuid和系统不共存。从“系统手册”页面中
不要使用具有set-user-ID或set-group-ID权限的程序的system(),因为某些环境变量的奇怪值可能被用来破坏系统的完整性。改用exec(3)函数族,而不是execlp(3)或execvp(3)。实际上,system()在/bin/sh是bash 2的系统上使用set-user-ID或set- group-ID特权的程序不能正常工作,因为bash 2在启动时会丢弃特权。(Debian使用修改后的bash,它在作为sh调用时不会这样做。)
我怎样才能克服我的问题?
谢谢
发布于 2011-06-07 17:05:10
像这样的东西可能会有帮助。这是未经测试的,但应该有效。
char * const argv[] = {"/sbin/iptables", "-L", NULL};
pid = fork();
switch (pid) {
case -1:
/* handle error */
case 0:
execv("/sbin/iptables", argv);
/* handle error if you get here */
break;
default:
waitpid(pid, &status, 0);
/* check waitpid return code */
break;
}发布于 2011-06-07 16:56:40
system()将与setuid()一起工作,但这就是问题所在:主要的安全风险。问题是system()启动shell (bash、sh等)。使用任何适当的环境,当您打算让它运行" iptables“时,我的路径可以指向我自己版本的iptables,我可以很容易地说服您运行它作为根。您似乎可以通过使用指向iptable的完整路径来解决这个问题,但是其他环境变量(例如,LD_PRELOAD_PATH)可以用来说服工具加载流氓共享库--同样,以根用户的身份运行并非有意的对象。
为了安全起见,您必须使用一个exec()系列,并且必须控制它的操作环境。其他任何事情都是在要求滥用安全。http://pubs.opengroup.org/onlinepubs/009695399/functions/environ.html似乎是一个学习更多知识的好地方。
https://stackoverflow.com/questions/6268716
复制相似问题