環境変数 LD_PRELOAD
や LD_LIBRARY_PATH
を設定した状態で gnome-shell を起動しても gnome-shell やその子供達には引き継がれないよという話。
はまったので雑にメモ。
https://github.com/lincheney/fzf-tab-completion を常に readline から使いたくて ~/pam_environment
に LD_PRELOAD を書いたのだけど以下の状態になった。
- 黒いコンソールでは使える
- Openbox では使える
- Gnome-Shell では LD_PRELOAD が消えている。
pam で無効化されてるのではとか思って以下も試してみたけれど全部だめだった
~/pam_environment
/etc/environment
~/.config/environment.d/*.conf
/etc/environment.d/*.conf
そしてググったら https://bugzilla.redhat.com/show_bug.cgi?id=1847314 が見つかった。
ArchLinux や Fedora では gnome-shell で rt_scheduler を有効とするために setcap されていて
- ArchLinux: https://github.com/archlinux/svntogit-packages/commit/f9e6a448ae85ed3a840d36940c554d46606da27e#diff-b9d4335a568ad4202b487edfaefa67c8c058b7db20912ec8d897a2e87945a16f
- Fedora: https://src.fedoraproject.org/rpms/gnome-shell/c/27577309e2f45734f897f0fadf85b4b8c8099b8a
どうやら setcap していると ld_*
が無視されるようになるって話っぽい。
- https://stackoverflow.com/questions/18058426/does-using-linux-capabilities-disables-ld-preload
- https://stackoverflow.com/questions/9843178/linux-capabilities-setcap-seems-to-disable-ld-library-path
https://man.archlinux.org/man/ld.so.8 にも以下のように書いてある。
For security reasons, if the dynamic linker determines that a binary should be run in secure-execution mode, the effects of some environment variables are voided or modified, and furthermore those environment variables are stripped from the environment, so that the program does not even see the definitions. Some of these environment variables affect the operation of the dynamic linker itself, and are described below. A binary is executed in secure-execution mode if the AT_SECURE entry in the auxiliary vector (see getauxval(3)) has a nonzero value. This entry may have a nonzero value for various reasons, including:
- A process with a non-root user ID executed a binary that conferred capabilities to the process.
setuid root したバイナリを使うか ld.so.conf
や ld.so.preload
を使えとの事。こわ。
environment.d
とか初めて知ったけどわりと便利そうというか、pam_environment
と比べると書式に自由度がありそうな感じがする。man environment.d
で man が引ける。ユーザーセッションが動くときに有効になるそうなので、/etc/environment
よりも安全そうに思える。