我手动将带有调试符号的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_PATH
或LD_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/*.conf
ldconfig
sudo
否则,您可能需要启动到单用户/恢复模式,并获得对系统的访问权限,就像丢失 root 密码一样。但您无需重置 root 密码,而是/etc/ld.so.conf[.d]
按上述方式进行修改。
为什么-E
选项sudo
在这里没有帮助
手册sudoers(5)
页说:
请注意,大多数操作系统上的动态链接器将从 setuid 可执行文件的环境中删除可以控制动态链接的变量,包括 sudo。根据操作系统的不同,这可能包括
_RLD*
、DYLD_*
、LD_*
、LDR_*
、LIBPATH
、SHLIB_PATH
等。这些类型的变量在 sudo 开始执行之前就已从环境中删除,因此 sudo 无法保留它们。
你说sudo - root
给你su: Authentication failure
。命令和错误消息不太匹配。你真的跑了su - root
吗?那么你可能正在运行 Ubuntu 或其他一些 Linux 发行版,默认情况下 root 帐户的密码是锁定的;这些发行版通常严重依赖sudo
管理员访问权限。如果您的发行版就是这种情况,您现在就会发现为什么删除位于的标准系统库/lib64
不是一个好主意。