Linux
setuid 二進製文件的 LD_PRELOAD
我正在嘗試覆蓋程序的 malloc/free 函式,這需要 setuid/setgid 權限。為此,我使用 LD_PRELOAD 變數。根據ld 文件,我需要將我的庫放入標準搜尋目錄之一(我選擇 /usr/lib)並為其授予 setuid/setgid 權限。我已經做到了。但是,我仍然無法連結到我的 .so 文件,出現錯誤:
object 'liballoc.so' from LD_PRELOAD cannot be preloaded: ignored
可能的原因是什麼?在沒有 setuid/setgid 權限的程序上測試了這個 .so 文件,一切正常。作業系統:紅帽 7.0
根據 ld 文件,我需要將我的庫放入標準搜尋目錄之一(我選擇了
/usr/lib
)那是錯誤。你應該把它放進去
/usr/lib64
(假設你的機器是 x86_64)。我剛剛在 Centos 7 VM(應該與 RHEL 7 相同)上嘗試了手冊頁中的配方,它可以工作:
作為根:
cynt# cc -shared -fPIC -xc - <<<'char *setlocale(int c, const char *l){ errx(1, "not today"); }' -o /usr/lib64/liblo.so cynt# chmod 4755 /usr/lib64/liblo.so
作為使用 setuid 程序的普通使用者:
cynt$ LD_PRELOAD=liblo.so su - su: not today
使用該功能是否是一個好主意是完全不同的事情(恕我直言,不是)。