2012-04-10 156 views
1

我有一个二进制文件(名称是bmu),它在调用statfs函数时需要root权限。
Linux SUID配置导致二进制文件无法执行

操作系统是SuSE Linux 2.6.16.60-0.21-smp
用户被测试,其是运行BMU和是一个非超级用户

[email protected]:~> id 
uid=1056(test) gid=0(root) groups=0(root),16(dialout),33(video) 

我已经测试3种场景。

--->场景1
如果bmu未配置SUID,则可以执行bmu,但调用将失败。

-rwxr-xr-x 1 test root 14389879 2012-04-10 10:38 bmu

--->情景2
如果BMU配置SUID,当BMU通过试运行,它会失败,并提示 “DBMS API库 'libclntsh.so' 加载失败”

-rwsr-sr-x 1 root root 14389879 2012-04-10 10:38 bmu

--->场景3
如果bmu按root运行,它将被成功执行。当然,不管是否配置了SUID。

-rwxr-xr-x 1 root root 14389879 2012-04-10 10:38 bmu
-rwsr-sr-x 1 root root 14389879 2012-04-10 10:38 bmu

从方案2,它看起来像LD_LIBRARY_PATH配置的问题,但是从方案1中,我们可以发现,这不应该LD_LIBRARY_PATH配置的问题。从场景3中,我们可以发现bmu可以由root执行。

只有情况2有问题,所以有人可以提出一些建议?谢谢!

回答

2

当程序作为setuid运行时,环境中的LD_LIBRARY_PATH变量将被忽略,因为它是一个潜在的安全漏洞。

您应该使用$ORIGIN相对路径将二进制文件链接到相关库或对库的绝对路径引用。有关$ ORIGIN rpath的详细信息,请参见ld man page

+0

非常准确和有用的答案!谢谢Petesh!我将所需的lib路径添加到ld.so.conf,程序运行良好。我对操作做了简单的描述:1.通过root登录系统; 2.将所需的lib路径添加到/etc/ld.so.conf; 3.运行ldconfig命令; su - 测试; 5.运行二进制文件配置的SUID来检查结果:OK! – siikee 2012-04-10 10:31:17

+0

将库路径添加到/etc/ld.so.conf也是有效的替代方法 – Petesh 2012-04-10 16:06:23

相关问题