объект libgtk3-nocsd.so.0 из LD_PRELOAD не может быть предварительно загружен при запуске хрома
Описание проблемы
Когда я запускаю оболочку bash, я получаю это сообщение:ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded (failed to map segment from shared object): ignored.Однако когда я запускаю обычный исполняемый файл, например программу, скомпилированную gcc, сообщение об ошибке не генерируется.
Платформа
Мое исследование
я используюlddнайти, и оказывается, что обаhelloworldи может правильно найти абсолютный путь к этому общему объекту.
$ ldd helloworld | grep -F libgtk3-nocsd.so.0
libgtk3-nocsd.so.0 => /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0 (0x0000ffffa9a73000)
$ ldd /snap/bin/chromium | grep -F libgtk3-nocsd.so.0
libgtk3-nocsd.so.0 => /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0 (0x0000ffff7e370000)
$ ldd /snap/chromium/current/usr/lib/chromium-browser/chrome | grep -F libgtk3-nocsd.so.0
libgtk3-nocsd.so.0 => /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0 (0x0000ffff7a299000)
Некоторая информация об общем объекте приведена ниже. Обратите внимание, что естьsetuidбит в своих правах доступа.
$ ls -l /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0
-rwSr--r-- 1 root root 26464 Mar 3 2018 /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0
Переменная среды устанавливается здесь:
$ sudo grep -2r LD_PRELOAD /etc/
...
/etc/X11/Xsession.d/51gtk3-nocsd-detect- if [ x"$GTK_CSD"x = x"0"x ] ; then
/etc/X11/Xsession.d/51gtk3-nocsd-detect: export LD_PRELOAD="libgtk3-nocsd.so.0${LD_PRELOAD:+:$LD_PRELOAD}"
/etc/X11/Xsession.d/51gtk3-nocsd-detect- fi
...
Следующий документ может объяснить эту проблему?
$ sudo grep -2r LD_PRELOAD /etc/
...
/etc/apparmor.d/abstractions/ubuntu-helpers- # While the chromium and chrome sandboxes are setuid root, they only link
/etc/apparmor.d/abstractions/ubuntu-helpers- # in limited libraries so glibc's secure execution should be enough to not
/etc/apparmor.d/abstractions/ubuntu-helpers: # require the santized_helper (ie, LD_PRELOAD will only use standard system
/etc/apparmor.d/abstractions/ubuntu-helpers- # paths (man ld.so)).
...
$ man ld.so
...
In secure-execution mode, preload pathnames containing slashes are ignored. Furthermore, shared objects are preloaded only from the stan‐
dard search directories and only if they have set-user-ID mode bit enabled (which is not typical).
...
Мои решения
Согласно приведенному выше документу, я разработал два решения.
- установлен абсолютный путь. В
документе предполагается, чтоLD_PRELOAD will only use standard system pathsв случае . Поэтому можно заменитьexport LD_PRELOAD="libgtk3-nocsd.so.0${LD_PRELOAD:+:$LD_PRELOAD}"сexport LD_PRELOAD="/lib/aarch64-linux-gnu/libgtk3-nocsd.so.0${LD_PRELOAD:+:$LD_PRELOAD}"в/etc/X11/Xsession.d/51gtk3-nocsd-detectа затем перезапустите среду рабочего стола. Обратите внимание, что абсолютный путь варьируется на разных платформах. - запускать от имени пользователя root без использования песочниц.
Проблема, похоже, связана с использованиемthe chromium and chrome sandboxesкоторыеsetuid root, как указано в документе. Бегchromiumот имени пользователя root без использования песочниц (например,sudo chromium --no-sandbox), кажется, подавляет сообщение об ошибке. К сожалению, такое поведение может привести к предупреждению браузера (You are using an unsupported command-line flag:--no-sandbox. Stability and security will suffer.).
Мои вопросы
- Что означает так называемый
standard system paths/standard search directoriesв документе имеется в виду? Есть запись оlibgtk3-nocsd.so.0в/etc/ld.so.cache, и входит в/etc/ld.so.conf.d/aarch64-linux-gnu.conf. Разве это не/lib/aarch64-linux-gnuаstandard system path/standard search directory?$ grep -aoP '(?<=\x00)[^\x00]*?libgtk3-nocsd\.so\.0' /etc/ld.so.cache libgtk3-nocsd.so.0 /lib/aarch64-linux-gnu/libgtk3-nocsd.so.0 $ cat /etc/ld.so.conf.d/aarch64-linux-gnu.conf # Multiarch support /usr/local/lib/aarch64-linux-gnu /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu - Как показано в документе,
in secure-execution mode, preload pathnames containing slashes are ignored. Означает ли это$LD_PRELOADбудет игнорироваться, если это абсолютный путь, например/lib/aarch64-linux-gnu/libgtk3-nocsd.so.0? - Какое решение безопаснее и разумнее? Есть ли лучшие решения? Есть ли что-то еще, что я неправильно понял?