Linux

setuid 二進製文件的 LD_PRELOAD

  • November 26, 2021

我正在嘗試覆蓋程序的 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

使用該功能是否是一個好主意是完全不同的事情(恕我直言,不是)。

引用自:https://unix.stackexchange.com/questions/679064