从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行

2024-01-12

我需要以 root 身份运行 bash 脚本(无密码 sudo 或 su 不可行),并且由于您无法在 Linux 中设置脚本,所以我考虑从可执行文件调用它并制作it setuid:

$ cat wrapper.c
int main(void)
{
        system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$

这有效 - 就像正确运行脚本一样 - 但脚本以执行“./wrapper”的用户身份运行。

为什么?以及如何正确实施这一点?

Thanks!


自从suid可执行文件上的位仅更改可执行文件将运行的有效 UID (EUID),而不是实际 UID (RUID)getuid()回报,并且除了限制suid解释脚本(任何以“开头的可执行文件#!“),一些贝壳像bash作为额外的安全措施,在这种情况下会将 EUID 设置回 RUID,您将需要使用以下调用setuid(0)在执行脚本之前在 C 代码中。

See the man的页面setuid, seteuid, getuid, and geteuid了解真实有效的 UID 的确切语义。

(WARNING)当然,这是一个适当的提点,即对suid许多 Unix 系统、shell 和解释器中的脚本存在是有原因的,即如果脚本在执行时没有非常小心地清理其输入和环境状态,那么它们是危险的,可以被利用来进行安全升级。因此,执行此操作时要非常小心。尽可能严格地设置对脚本和包装器的访问权限,仅允许执行您打算执行的非常特定的脚本,并在启动脚本之前清除 C 程序中的环境,设置环境变量,例如PATH以正确的顺序准确包含必需的内容,并且没有可供其他人写入的目录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行 的相关文章

随机推荐

  • 从 JavaScript 调用 ASP.NET 代码隐藏方法

    有人可以告诉我如何从客户端 JavaScript 调用 ASP NET 代码隐藏方法吗 Thanks 这是一篇关于如何对代码隐藏方法进行 Ajax 调用的非常好的文章 使用jQuery直接调用ASP NET AJAX页面方法 http en
  • C# Visual Studio asp.net 将项目添加到列表属性

    我目前正在开展一个自行车店建模项目 在我的 订单 对象中 我有一个用于订单上自行车商品的 lis 对象 我如何将自行车添加到此列表中 即我想在 创建 视图中显示可用自行车的列表 并将其中一辆或多辆添加到订单中 我的控制器 public Ac
  • 注释 CXF (wsdl2java) 生成的包

    我需要添加包级别注释 XmlJavaTypeAdapters 类型适配器 问题是 当我运行 wsdl2java 时 它会为该包生成 package info java 文件 当我尝试添加自己的 package info java 时 出现错
  • 简化/清理 DOCX Word 文档的 XML

    我有一个 Microsoft Word 文档 docx 我使用Open XML SDK 2 0 生产力工具 http www microsoft com download en details aspx id 5124从中生成 C 代码 我
  • 无法让 Python IDLE 识别 OGR/GDAL 模块

    Folks 刚刚开始使用 OGR 和 Python 来执行各种地理空间任务 我在 OSGEO4w 之外工作 并在我的计算机上安装了带有 Python 绑定的 GDAL 以及 Python v 2 7 8 也就是说 我可以运行 python
  • 从尾部的 qnorm 获取高精度值

    问题 我正在寻找尾部正态分布的高精度值 1e 10 and 1 1e 10 因为我使用的 R 包将任何超出此范围的数字设置为这些值 然后调用qnorm and qt功能 我注意到的是qnorm从尾部来看 R 中的实现并不对称 这对我来说非常
  • 当操作标记内定义命名空间时,如何处理 SOAP 消息的 Castor 解组?

    我正在开发一个基于 Spring WS 的契约优先 Web 服务 我依赖 Castor 封送 并且遇到了以下问题 当 Envelope 标记中定义了 xmlns 命名空间时 请求将被接受 例如
  • TSVN DNS 错误:请求的名称有效,但未找到请求类型的数据

    我已经更新了我的 TortoiseSVN 客户端 现在在尝试更新或提交到不同的存储库时收到错误 请求的名称有效 但没有请求类型的数据 成立 关于如何解决这个问题有什么想法吗 Internet Explorer 可以很好地显示适当的 URL
  • 在高图表上绘制自定义线

    我最近一直在使用 highchart api 在网站上绘制一些数据 并且我需要能够添加自定义垂直 线 来象征正在发生的事情 例如新闻稿 我曾考虑过将列元素作为单独的系列添加到图表中 但这不太理想 如果有人有任何想法那就太好了 thanks
  • Symfony2/JmsDIExtraBundle 使用注释将存储库注入到服务中

    在我的项目中 我使用 JMSDIExtraBundle 注释 我的问题是 我如何告诉我的应用程序存储库应该是服务 这样我就可以使用注释将其注入到另一个服务中 我知道的唯一方法是使用 XML 文件将存储库定义为服务 但这是一个非常缓慢的过程
  • 如何操作facet_grid图的条带文本?

    我想知道如何操纵分面图中条带文本的大小 我的问题 类似于关于剧情标题的问题 https stackoverflow com questions 2631780 r ggplot2 can i set the plot title to wr
  • npm 安装错误 - 未检测到 Xcode 或 CLT 版本?

    在 处找不到 com apple pkg cltools executables 的收据 在 MacOS Catalina 的 VS Code bash 终端中为 Angular 9 项目运行 npm install 时引发上述错误 Pac
  • 列出与 Java 中的模式匹配的目录中的文件[重复]

    这个问题在这里已经有答案了 我正在寻找一种方法来获取与给定目录中的模式 首选正则表达式 匹配的文件列表 我在网上找到了一个使用apache的commons io包的教程 代码如下 Collection getAllFilesThatMatc
  • 在 C/C++ 中高效地在十六进制、二进制和十进制之间转换

    我有 3 种正整数的基本表示形式 十进制 无符号长变量 例如无符号长整型 NumDec 200 十六进制 字符串变量 例如字符串 NumHex C8 二进制 字符串变量 例如字符串 NumBin 11001000 我希望能够以最有效的方式在
  • 在开玩笑中模拟 window.sessionStorage 的最佳方法是什么

    下面是一个非常简单的笑话单元测试 运行它时 你会得到类似的错误 无法监视原始值 未定义给定 类型错误 无法读取未定义的属性 getItem 但根据最后两条评论这个帖子 https github com facebook jest issue
  • php echo 如果两个条件都成立

    实际的代码如下所示 if file exists filename echo player else echo something 但即使没有从 url 调用 id 它也会显示播放器 我需要这样的东西 check if filename e
  • UTF8 编码的字符串“Jalape\xc3\xb1o”(“Jalapeño”)是否包含 8 个或 9 个字符?

    根据作者 大卫 比兹利 直接写入原始 UTF 8 编码字符串 例如 Jalape xc3 xb1o 简单地生成一个九个字符的字符串 U 004A U 0061 U 006C U 0061 U 0070 U 0065 U 00C3 U 00B
  • 如何将最近打开的文档添加到 WPF 中的 OpenRecent 菜单项

    我开发了一个 Wpf 应用程序 它打开 doc 文件并执行一些操作 现在我想在菜单项中添加打开最近的功能 该功能显示最近打开的文档列表 现在有一个名为跳转列表的 wpf 类 但我不明白如何在我的应用程序中使用跳转列表 您可以使用显示最近类别
  • VB.NET 在数组中查找字符串[重复]

    这个问题在这里已经有答案了 我是 VB net 的新手 通常是 Python 或 Matlab 程序员 我已经开始使用 VB Net 进行编程 我正在努力引用数组中字符串的索引 而不通过 for 循环进行循环 如何在一行中找到数组中的条目
  • 从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行

    我需要以 root 身份运行 bash 脚本 无密码 sudo 或 su 不可行 并且由于您无法在 Linux 中设置脚本 所以我考虑从可执行文件调用它并制作it setuid cat wrapper c int main void sys