SUID为root的程序中$ORIGIN被忽略致共享库找不到的解决办法
问题:SUID为root的程序无法通过$ORIGIN加载共享库
环境与现象
在树莓派Raspbian系统中,存在一个SUID设为root的程序my_app,权限信息如下:
-rwsr-xr-x 1 root user 508K May 11 13:55 my_app
程序配套的共享库libMyLib.so位于非标准部署目录/opt/my_project/libs/下,目录结构:
├── my_app ├── libs │ └── libMyLib.so
通过chrpath -l my_app检查,二进制文件已正确配置RUNPATH:
my_app: RUNPATH=/usr/local/qt6/lib/:$ORIGIN/libs
但运行程序时提示找不到共享库:
./my_app: error while loading shared libraries: libMyLib.so: cannot open shared object file: No such file or directory
测试得到以下结论:
- 移除SUID位后,库能被正常找到,但程序因权限不足无法正常运行
- 用
ldd my_app检查时,库路径显示正确:
libMyLib.so => /opt/my_project/./libs/libMyLib.so (0x76e84000)
- 将RUNPATH中的
$ORIGIN替换为绝对路径(通过chrpath -r命令)后,程序可正常运行,推测SUID为root时,含$ORIGIN的RUNPATH路径被系统忽略。
疑问
查阅ld.so手册可知,安全执行模式下LD_LIBRARY_PATH会被忽略,但未找到关于$ORIGIN的相关安全限制说明。希望了解除使用chrpath -r设置绝对路径之外的其他可行解决方法。
内容的提问来源于stack exchange,提问作者vazlsky
相关产品推荐
相关产品推荐

