问题描述
当我chromium
在 bash shell 中运行时,收到此消息:ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded (failed to map segment from shared object): ignored.
但是,当我运行常规可执行文件(例如helloworld
由 gcc 编译的程序)时,不会生成错误消息。
平台
财产 | 价值 |
---|---|
操作系统 | Linux的 |
建筑学 | 一个arch64 |
发布 | Ubuntu 20.04.5 LTS |
我的研究
我使用ldd
来定位libgtk3-nocsd.so.0
,结果发现helloworld
和chromium
都可以正确找到该共享对象的绝对路径。
$ 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)
下面列出了共享对象的一些信息。请注意,其访问权限中libgtk3-nocsd.so.0
有一位。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
环境$LD_PRELOAD
变量在这里设置:
$ 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
为 的绝对路径libgtk3-nocsd.so.0
文档建议LD_PRELOAD will only use standard system paths
在 的情况下the chromium and chrome sandboxes
。因此,可以将 替换为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
libgtk3-nocsd.so.0
- 以 root 身份运行
chromium
而不使用沙箱问题似乎与使用
有关,如文档中所示。以 root 身份运行而不使用沙箱(例如)似乎可以抑制错误消息。不幸的是,这种行为可能会导致浏览器发出警告()。the chromium and chrome sandboxes
setuid root
chromium
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
/lib/aarch64-linux-gnu
/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
? - 哪种解决方案更安全、更合理?还有更好的解决方案吗?我还有什么误解吗?