我有一个二进制文件(名称是bmu),在调用statfs函数时需要根权限。
操作系统SuSE Linux 2.6.16.60-0.21-smp
用户是要运行bmu的测试,并且是非根用户
test@SuSE:~> id
uid=1056(test) gid=0(root) groups=0(root),16(dialout),33(video)
我测试了三种场景。
--->情景1
如果bmu未配置suid,则可以执行bmu,但调用将失败。
-rwxr-xr-x 1 test root 14389879 2012-04-10 10:38 bmu
--->情景2
如果配置了bmu suid,当bmu通过test运行时,它将失败,并提示“dbms api library'libclntsh.so'loading fails”
-rwsr-sr-x 1 root root 14389879 2012-04-10 10:38 bmu
--->情景3
如果bmu由根运行,它将成功执行。当然,无论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是由根执行的。只有场景2有问题,所以有人可以给出一些建议?谢谢!
最佳答案
当程序作为setuid运行时,环境中的LD_LIBRARY_PATH
变量将被忽略,因为它是一个潜在的安全漏洞。
应该使用相对rpath将二进制文件链接到依赖库,或者使用绝对rpath引用链接到库。有关$origin rpath的详细信息,请参见ld man page。
关于linux - Linux SUID配置导致二进制文件执行失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10084796/