首页 > 解决方案 > ld-linux-x86-64.so.2执行文件时如何避免更改有效UID

问题描述

背景:

我有一个可执行的 c++ 构建程序,名为UlimitUnlimiter. 目前,它在我的一台服务器上执行时会产生一些问题。

./UlimitUnlimiter
UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by UlimitUnlimiter)
/UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by UlimitUnlimiter) 

这是一个动态 c++ 库问题,我的包路径中有另一个库路径。一般来说,Giving a LD_LIBRARY_PATHor run it by/lib64/ld-linux-x86-64.so.2可以解决问题。

但我的情况有点复杂。我设置setuid bit了可执行程序。

chown root:mygroup UlimitUnlimiter
chmod ugo+rx UlimitUnlimiter
chmod +s UlimitUnlimiter

在程序内部,它会检查是否uid != 0 && gid != 0 && euid == 0 成功执行,它应该是:

./UlimitUnlimiter
[UlimitUnlimiter]: uid=10254388
[UlimitUnlimiter]: gid=100
[UlimitUnlimiter]: euid=0
service running...

但由于chmod +s,运行 withLD_LIBRARY_PATH将失败,即使是expert LD_LIBRARY_PATH

LD_LIBRARY_PATH=correct_path_to/lib ./UlimitUnlimiter
UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by UlimitUnlimiter)
/UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by UlimitUnlimiter) 


export LD_LIBRARY_PATH=correct_path_to/lib
./UlimitUnlimiter
UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by UlimitUnlimiter)
/UlimitUnlimiter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by UlimitUnlimiter) 

唯一的方法是,我可以设置运行的 lib 路径/lib64/ld-linux-x86-64.so.2,但是它会破坏effective user.

/lib64/ld-linux-x86-64.so.2 --library-path correct_path_to/lib ./UlimitUnlimiter
[UlimitUnlimiter]: uid=10254388
[UlimitUnlimiter]: gid=100
[UlimitUnlimiter]: euid=10254388
[UlimitUnlimiter]: ulimitunlimiter must be setuid and run by non-root

所以我想知道,有没有一种方法可以既设置动态库又不破坏动态库setuid bit

标签: c++linuxgcc

解决方案


推荐阅读