安全执行模式

安全执行模式

我手动将带有调试符号的libpcre2编译到/usr/local/lib中,然后删除了/lib64中安装的版本。虽然我仍然可以通过首次运行以用户身份运行命令export LD_LIBRARY_PATH=/usr/local/lib,但运行sudo仍然失败并显示消息

sudo:加载共享库时出错:libpcre2-8.so.0:无法打开共享对象文件:没有这样的文件或目录

即使我使用-E-H选项运行它,也会发生这种情况。sudo - root给我“su:身份验证失败”。有任何想法吗?

答案1

为什么图书馆没有被使用

为了安全起见,动态链接器将忽略LD_LIBRARY_PATH要加载的程序是否设置了 setuid 或 setgid 位。否则,就会出现使用LD_LIBRARY_PATHLD_PRELOAD覆盖无害的系统/​​库调用来执行其他操作的老技巧,而不是或除了它应该执行的操作之外。

如果对未针对此技巧进行保护的 setuid root 程序执行此操作,您将能够在拥有 root 权限的情况下控制该程序的操作……到那时,您可以执行的操作将完全不受限制。

您将在手册页中找到此安全机制的描述ld.so(8)

安全执行模式

出于安全原因,如果动态链接器确定二进制文件应在安全执行模式下运行,则某些环境变量的影响将无效或被修改。 (有关详细信息,请参阅下面对各个环境变量的讨论。)如果辅助向量中的 AT_SECURE 条目(请参阅 getauxval(3))具有非零值,则二进制文件将以安全执行模式执行。由于各种原因,此条目可能具有非零值,包括:

  • 进程真实有效的用户ID不同,或者真实有效的组ID不同。这通常是由于执行设置用户 ID 或设置组 ID 程序而发生的。
  • 具有非 root 用户 ID 的进程执行了向该进程授予功能的二进制文件。
  • Linux 安全模块可能已设置非零值。

...随后是环境变量的详细描述LD_*以及每个环境变量如何受到安全执行模式的影响。

如何解决您的问题

您可以为其添加或创建自己的文件,然后以 root 身份运行/usr/local/lib/etc/ld.so.conf确保选择新的库路径...如果您仍然有一种可行的方法来成为独立于 的 root ,那就是!/etc/ld.so.conf.d/*.confldconfigsudo

否则,您可能需要启动到单用户/恢复模式,并获得对系统的访问权限,就像丢失 root 密码一样。但您无需重置 root 密码,而是/etc/ld.so.conf[.d]按上述方式进行修改。

为什么-E选项sudo在这里没有帮助

手册sudoers(5)页说:

请注意,大多数操作系统上的动态链接器将从 setuid 可执行文件的环境中删除可以控制动态链接的变量,包括 sudo。根据操作系统的不同,这可能包括_RLD*DYLD_*LD_*LDR_*LIBPATHSHLIB_PATH等。这些类型的变量在 sudo 开始执行之前就已从环境中删除,因此 sudo 无法保留它们。


你说sudo - root给你su: Authentication failure。命令和错误消息不太匹配。你真的跑了su - root吗?那么你可能正在运行 Ubuntu 或其他一些 Linux 发行版,默认情况下 root 帐户的密码是锁定的;这些发行版通常严重依赖sudo管理员访问权限。如果您的发行版就是这种情况,您现在就会发现为什么删除位于的标准系统库/lib64不是一个好主意。

相关内容