【问题标题】:How to set LD_PRELOAD for su or sudo?如何为 su 或 sudo 设置 LD_PRELOAD?
【发布时间】:2017-05-13 16:56:04
【问题描述】:

我正在开发 CentOS 6.5。我的 glibc 的版本是 2.14,我不小心将 /lib64/libc.so.6 链接到以前的 glibc(libc-2.12.so)。

然后我运行export LD_PRELOAD=/lib64/libc-2.14.so,除了susudo之外,大多数命令都可以执行。当运行su 时,它给出“Segmentation fault”。当运行 sudo 时,它给出 "su: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /lib64/libcrypt.so.1)"

如何为susudo设置LD_PRELOAD,或者我该怎么做才能恢复glibc?

【问题讨论】:

  • LD_PRELOAD=/lib64/libc-2.14.so sudo -i 应该可以解决问题,对吧?
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?
  • 我对这个问题感到困惑。您是在问如何将 libc.so.6 符号链接更改回 2.14 glibc?这可以用 ln 轻松完成。您可能想要做的是重新安装软件包。我也不遵循 su/sudo 位 - 这些程序是 setuid,如果由非特权用户执行,加载程序将忽略 env var,即您确实需要解决实际问题。
  • @employeeofthemonth 要使用ln 或包管理器,受害者必须运行susudo。回到第一格。
  • 从恢复拇指驱动器启动并恢复损坏的文件。

标签: linux centos glibc su


【解决方案1】:

按照设计,没有办法。设置 LD_PRELOAD 允许在可执行文件中执行任意代码。在运行敏感的特权 SUID 程序时允许这样做是相当不明智的。

【讨论】:

  • 正确 -- glibc 内部(在其 ldso 中)将清除 LD_PRELOAD 和类似的环境变量,只要专门执行 set*id 程序(如 su 或 sudo)以防止安全问题。应该将此标记为答案;)。
【解决方案2】:

我可以做些什么来恢复 glibc?

这是一个系统管理员问题,更适合于 serverfault,但一种恢复方法是:

  1. 从救援 CD 引导
  2. 将根分区挂载到 /mnt
  3. 修复符号链接
  4. 重启

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2014-01-02
    相关资源
    最近更新 更多