linux - 带有 setuid 的可执行文件找不到共享库
问题描述
伙计们。
这是我的问题:
我有一个可执行文件,需要在系统的特定位置创建一个文件夹。
无论谁执行它,我都希望它能够这样做。
我的想法是将父文件夹(可执行文件需要在其中创建文件夹的文件夹)提供给用户,并将可执行文件提供给同一用户。然后在可执行文件上设置 setuid 位。这样,可执行文件以该用户的权限执行,因此它具有文件夹的权限。
事情是这样的:可执行文件使用旁边的共享库。
当我在没有 setuid 位的情况下启动它时,一切正常(当然,除了文件夹的创建,但启动了可执行文件)。
但是,当我使用 setuid 位启动它时,系统告诉我它找不到共享库,显然它没有被移动,并且对每个人都有读取和执行权限。
发生了什么 ?我错过了什么?
谢谢你。
解决方案
需要在系统的特定位置创建一个文件夹。
UNIX 系统上没有文件夹,正确的名称是“目录”。
然后在可执行文件上设置 setuid 位
一般来说,这是一个非常糟糕的主意 (TM)。编写将作为 setuid 可执行文件的一部分正确运行的代码需要非常小心,而您提出这个问题的事实表明您可能还没有准备好执行此任务。
当我在没有 setuid 位的情况下启动它时,一切正常
二进制文件如何找到它所需的共享库?
您很可能设置LD_LIBRARY_PATH
为包含共享库所在的目录。
但是,当我使用 setuid 位启动它时,系统告诉我它找不到共享库,
如果我的LD_LIBRARY_PATH
猜测是正确的,这是意料之中的:setuid 二进制文件忽略LD_LIBRARY_PATH
(出于明显的安全原因)。
您可以通过-Wl,--rpath='$ORIGIN'
在链接可执行文件和取消设置时使用来解决此问题LD_LIBRARY_PATH
——可执行文件现在应该可以使用或不使用 setuid 位。
推荐阅读
- spring-mvc - 在 Spring Boot 中添加服务器端动态验证
- r - R:使用 agrep 和 data.table 进行模糊合并
- angular - Angular 6 zip 已弃用:不再支持 resultSelector,改为使用管道映射
- codeship - Codeship Pro on_fail 跨步
- javascript - 当单击列表中的 li 项目时,如何使用 jquery 将单击的项目附加到单独的 div 中,并将剩余的列表项目附加到不同的 div 标签中
- sql-server - 从最小最大纬度经纬度经度创建圆
- python - 带有莳萝的模块中的泡菜类定义
- mysql - LEFT JOIN 与两个表
- python - 我如何将表单“文本”输入传递到 views.py 中的另一个变量中
- python - 元类的类 __repr__,而不是类