问题描述

问题描述

问题描述

当我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,结果发现helloworldchromium都可以正确找到该共享对象的绝对路径。

$ 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-detectlibgtk3-nocsd.so.0
  • 以 root 身份运行chromium而不使用沙箱问题似乎与使用
    有关,如文档中所示。以 root 身份运行而不使用沙箱(例如)似乎可以抑制错误消息。不幸的是,这种行为可能会导致浏览器发出警告()。the chromium and chrome sandboxessetuid rootchromiumsudo chromium --no-sandboxYou 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-gnustandard system pathstandard 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
  • 哪种解决方案更安全、更合理?还有更好的解决方案吗?我还有什么误解吗?

相关内容