【问题标题】:Executable with setuid does not find shared library带有 setuid 的可执行文件找不到共享库
【发布时间】:2018-07-19 15:02:25
【问题描述】:

伙计们。

这是我的问题:

我有一个可执行文件,需要在系统的特定位置创建一个文件夹。

我希望无论谁执行它都能够这样做。

我的想法是将父文件夹(可执行文件需要在其中创建文件夹的文件夹)提供给用户,并将可执行文件提供给同一用户。然后在可执行文件上设置 setuid 位。这样,可执行文件以该用户的权限执行,因此它拥有文件夹的权限。

事情是这样的:可执行文件使用旁边的共享库。

当我在没有 setuid 位的情况下启动它时,一切正常(当然,除了创建文件夹,但启动了可执行文件)。

但是,当我使用 setuid 位启动它时,系统告诉我它找不到共享库,显然它没有被移动,并且对每个人都有读取和执行权限。

发生了什么?我错过了什么?

谢谢。

【问题讨论】:

  • 这个问题你解决了吗?

标签: linux shared-libraries setuid


【解决方案1】:

需要在系统的特定位置创建一个文件夹。

UNIX 系统上没有文件夹,正确的名称是“目录”。

然后在可执行文件上设置setuid位

一般来说,这是一个非常糟糕的主意 (TM)。编写将作为 setuid 可执行文件的一部分正确运行的代码需要非常小心,而您提出这个问题的事实表明您可能还没有准备好执行此任务。

当我在没有 setuid 位的情况下启动它时,一切正常

二进制文件如何找到它所需的共享库?

您很可能将LD_LIBRARY_PATH 设置为包含共享库所在的目录。

但是,当我使用 setuid 位启动它时,系统告诉我它找不到共享库,

如果我的LD_LIBRARY_PATH 猜测是正确的,这是正常的:setuid 二进制文件忽略LD_LIBRARY_PATH(出于明显的安全原因)。

您可以通过在链接可执行文件并取消设置 LD_LIBRARY_PATH 时使用 -Wl,--rpath='$ORIGIN' 来解决此问题 -- 可执行文件现在应该可以使用或不使用 setuid 位。

【讨论】:

  • 您能否进一步澄清这句话“编写将作为 setuid 可执行文件的一部分正确运行的代码需要非常小心”。有什么有用的资源或教程吗?
猜你喜欢
  • 2012-08-13
  • 2011-12-14
  • 2017-06-18
  • 2020-06-06
  • 2021-07-17
  • 2017-02-20
  • 1970-01-01
  • 2023-03-15
  • 2018-10-10
相关资源
最近更新 更多