博客
关于我
system()函数的setuid程序得不到root的权限;system()函数的suid失效问题
阅读量:201 次
发布时间:2019-02-28

本文共 1561 字,大约阅读时间需要 5 分钟。

system()函数的setuid权限问题及解决方案

在实际编程中,setuid权限有时会因为系统内部机制的限制而无法生效。以下是关于如何解决system()函数在setuid环境下无法获取root权限的问题的详细分析及解决方案。

背景

在某些操作系统(如Ubuntu 16.04)中,/bin/sh实际指向/bin/dash。而dash在setuid进程中会删除特权,这意味着在调用system()时,当使用/bin/sh作为shell解析命令时,会导致权限被降低,无法正常执行。

问题描述

编写一个名为catall.c的程序,目标是在设置root权限后,通过system()调用/bin/cat来查看文件。然而,实际运行时会显示权限被拒绝。尽管ls -l显示文件属主为root,并且运行位为s(可执行),但setuid权限在system()调用时却无效。

原因分析

  • system()函数的工作原理system()函数通过fork()创建子进程,并调用execl("/bin/sh", "sh", "-c", command, (char *) NULL)来执行命令。/bin/sh在大多数系统中指向/bin/dash,而dash在setuid环境下会删除特权。

  • execve()函数的差异:使用execve()函数直接替换文件名可在setuid环境下正常执行。这是因为execve()不依赖/bin/shdash来解析命令。

  • 测试execl()函数:直接调用execl("/bin/id")可以成功获取root权限,因为execl不通过/bin/sh。这表明问题出在system()函数使用的/bin/sh上。

  • /bin/sh的特殊性:在setuid进程中,/bin/sh(即dash)会删除权限,这导致system()无法正确执行命令。

解决方案

为了避免dash的降权机制,可以将/bin/sh替换为另一个支持setuid权限的shell。以下是具体步骤:

  • 安装zsh:如果系统上没有安装zsh,首先需要安装这个强大的shell。安装完成后,可以通过以下命令验证安装情况:

    zsh --version
  • 修改/etc/shells文件:打开/etc/shells文件,将以下内容添加到文件末尾:

    /bin/zsh
  • 更新/bin/sh的符号链接:将/bin/sh指向/bin/zsh

    ln -sf /bin/zsh /bin/sh
  • 测试修改:重新启动终端或登录系统后,执行以下命令验证system()是否能正确获取root权限:

    #include 
    #include
    #include
    int main(int argc, char *argv) { char *cat = "/bin/cat"; char *command = malloc(strlen(cat) + strlen(argv[1]) + 2); sprintf(command, "%s %s", cat, argv[1]); system(command); return 0;}
  • 运行该程序时,应能成功查看文件而无权限被拒绝。

    注意事项

    • 系统兼容性:替换/bin/sh为zsh仅适用于支持zsh的系统。对于不支持zsh的系统,需要选择其他替代方案。

    • 安全性:虽然zsh绕过了dash的降权机制,但仍需确保脚本的安全性,避免被恶意利用。

    总结

    通过替换/bin/sh为zsh,可以解决system()函数在setuid环境下无法获取root权限的问题。这种方法不仅简化了命令执行流程,还提高了脚本的安全性和兼容性。

    转载地址:http://hfhc.baihongyu.com/

    你可能感兴趣的文章
    pta求阶乘序列前n项和_学霸整理——求数列的通项公式解法集锦,转化、归纳一文全懂...
    查看>>
    pthread_create导致的程序崩溃
    查看>>
    public private protected default小结
    查看>>
    pyautogui模拟鼠标拖动选中文字的基本知识(附Demo)
    查看>>
    PyGObject无论如何都会固定按钮大小。相应地拆分标签
    查看>>
    pyhacm 激活码
    查看>>
    Pyhon之常用操作符 - 零基础入门学习Python006
    查看>>
    pyhton验证码识别
    查看>>
    PyInstaller 中的 Kivy Garden - 试图跟踪导入
    查看>>
    Pyinstaller 和 PyQt5 macOS Mojave 兼容性问题
    查看>>
    pyinstaller 打包资源文件
    查看>>
    PyInstaller 构建的 Windows EXE 因多处理而失败
    查看>>
    Pyinstaller--Windowed或--noconsole.exe不允许打开chromedriver
    查看>>
    Pyinstaller依赖项的许可证
    查看>>
    PyInstaller可执行文件找不到包含的flASK-COMPRESS
    查看>>
    Pyinstaller:‘;Fiona‘;没有属性‘;_loading‘;(很可能是由于循环导入)
    查看>>
    pyinstaller:更改应用程序图标
    查看>>
    Pylint“未解决的导入“;Visual Studio 代码中的错误
    查看>>
    pyLoad远程代码执行漏洞复现(CVE-2023-0297)
    查看>>
    pymongo update_one(),upsert=True,不使用$运算符
    查看>>