使用 C++ 替换 su -c

su -c replacement using c++

本文关键字:su 替换 C++ 使用      更新时间:2023-10-16

我们想运行一个命令,而不是以root用户的身份运行,我们不想使用su -c,但想用c ++编码。

#include <unistd.h>
#include <stdio.h>
int main(void)
{
    char *argv[] = { "/bin/sh",  "abc.sh", 0 };
    char *envp[] =
    {
        "HOME=/",
        "PATH=/bin:/usr/bin",
        "TZ=UTC0",
        "USER=trishul",
        "LOGNAME=tarzan",
        0
    };
    execve(argv[0], &argv[0], envp);
    fprintf(stderr, "Oops!n");
    return -1;
}
#abc.sh
pwd
date

我使用 chmod 700 abc.sh,不允许用户执行我的示例程序。当使用 root 用户执行上述代码时,我仍然可以看到 pwd 和日期的输出。上述行为正在发生,因为我认为它仍然以 root 身份执行。我需要如何使用execve使示例与"trishul"一起执行。

我的全部意图是拒绝除root之外的普通用户的权限,因为我编写的脚本也将重新启动。用户"trishul"应该被拒绝权限

你能在这方面帮助我们吗?

只是删除执行权限不会这样做:命令/bin/sh abc.sh不会"执行"abc.sh,它会执行/bin/sh,这将读取abc.sh并执行其中写入的内容(换句话说,/bin/sh被执行并运行它在abc.sh读取的命令,abc.sh本身不被执行)。因此,使abc.sh不可执行不会阻止任何人使用它(它只会禁止通过执行例如./abc直接执行它)。

如果您希望该文件abc.sh只能由 root 使用(这在评论中建议,但在您的问题中确实不清楚),只需将其所有者更改为 root,然后禁止其他用户读取和执行(也可能写入):

chown root abc.sh # Make root the owner of the file
chmod 700 abc.sh  # Give the owner (root) every rights on the file and give none to others

进一步了解您的问题,您希望将用户 ID 更改为trishulexecve 之前。使用 setuid() 从 unistd.h 更改您的用户 ID。

如果我理解你的问题,你有一个 *nix 应用程序,如果它没有以 root 身份运行,你想退出它。

如果以 root 身份运行,unistd.h 中的getuid函数将返回 0:

#include <unistd.h>
#include <iostream>
int main()
{
        if (getuid())
        {
                std::cout << "Not root" << std::endl;
        }
        else
        {
                std::cout << "Running as root!" << std::endl;
        }
}

所以一个简单的检查是

if (getuid())
  std::cout << "You but run this as root" << std::endl;

这适用于linux(在Ubuntu下测试)。 它看起来像标准的POSIX,但我无法确认可移植性。

您可能希望将编译的可执行文件设置为setuid可执行文件(使用chmod u+s)。要非常小心(所以先阅读高级 Linux 编程,并适当地使用 seteuid(2) 和/或 setreuid(2)...)。

不要犯错误,否则你可以打开一个非常大的安全漏洞!参见 super(1) 命令。

另请阅读有关 bash 中的受限外壳,您可能需要使用它。请注意,外壳需要读取其脚本!