繁体   English   中英

无法提升程序特权

Unable to elevate program privileges

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在从具有sudo访问权限的用户运行C ++程序。 二进制文件是使用./binName命令启动的。

从它我可以执行带有popen函数的sudo ls popen正常工作。 因此,尽管我可以使用open功能打开一些特权文件,但是它以errno = 13:Permission拒绝返回-1。

于是我虽然,我需要forcly设置我的EUID有seteuid但它的返回-1,并将errno = 13:权限被拒绝

当我使用sudo ./binName启动程序时,一切正常,我可以使用open函数打开任何文件。 我做错了什么?

#include <stdio.h>
#include <vector>
#include <cstdint>
#include <cstring>
#include <string>
#include <fcntl.h>
#include <unistd.h>

#define Log(fmt, ...) printf("%s | " fmt, __FUNCTION__, ##__VA_ARGS__)

bool OpenPath(const std::string& path) {
    if (path.empty()) return false;

    const int f = open(path.c_str(), O_RDWR);
    if (f == -1){
        Log("[!] Unable to open %s, errno= %d:%s\n", path.c_str(), errno, strerror(errno));
        return false;
    }

    close(f);
    return true;
}

bool ReadFromStream(const char *command, std::vector<uint8_t> &output)
{
    FILE *fp = popen(command, "r");
    if (!fp)
    {
        Log("[!] Error: Unable to popen\n");
        return false;
    }

    char str[512];
    while (!feof(fp))
    {
        if (fgets(str, sizeof(str), fp))
        {
            const int size = strlen(str);
            output.insert(output.end(), str, str + size);
        }
    }

    pclose(fp);
    return !output.empty();
}

bool HasRights() {
    const __uid_t uid = getuid();
    const __uid_t gid = geteuid();

    bool elevated = uid == 0 || uid != gid;

    Log("uid= %d, gid= %d, elevated= %d\n", uid, gid, elevated);

    if (elevated && OpenPath("/usr/bin/ls")) // it's just a test path
        return true;

    std::vector<uint8_t> buffer;
    if (ReadFromStream("sudo -n ls", buffer)) {
        const std::string str(buffer.begin(), buffer.end());
        if (str != "sudo: a password is required")
        {
            if (seteuid(0) == -1) {
                Log("[!] Unable seteuid, errno= %d:%s\n", errno, strerror(errno));
            }
            return OpenPath("/usr/bin/ls"); // it's just a test path
        }
    }
    return false;
}

int main(int argc, char **argv)
    const auto hasRights = HasRights();
    Log("hasRights= %d\n", hasRights);

    return 0;
}

没有sudo权限的输出= ./binName

HasRights | uid= 1000, gid= 1000, elevated= 0
HasRights | [!] Unable seteuid, errno= 1:Operation not permitted
OpenPath | [!] Unable to open /usr/bin/ls, errno= 13:Permission denied
test | hasRights= 0

输出具有sudo权限= sudo ./binName

HasRights | uid= 0, gid= 0, elevated= 1
test | hasRights= 1

sudo超时到期时输出= ./binName

HasRights | uid= 1000, gid= 1000, elevated= 0
sudo: a password is required
test | hasRights= 0
问题暂未有回复.您可以查看右边的相关问题.
2 运行ClickOnce安装程序时提升特权

我已经开发了一个依赖Crystal Reports运行时的应用程序。 问题是我们的公司域策略不允许从用户帐户安装此运行时。 如果我分别从管理员帐户安装运行时,然后从用户帐户运行ClickOnce安装程序,则一切正常。 是否可以在安装应用程序时强制安装程序要求管理员凭据? ...

3 配置应用程序以在提升特权和非提升特权中运行

前几天,我遇到了一个应用程序,当您运行该应用程序时,它带有UAC屏幕,并要求以管理员权限运行。 在UAC屏幕上单击“是”,将像往常一样运行该应用程序。 有趣的是,如果您单击“否”,该应用程序将继续运行,但会以受限的用户帐户运行(当然,功能较少),而不是退出。 我的问题是,如何配置C#应 ...

5 Wix安装程序在更新时会忽略特权提升

尽管第一次安装可以正常进行,但是当我尝试将应用程序更新为较新版本时,安装程​​序会显示以下消息: 取消更新安装时,该软件将被删除,如果再次安装,该过程将成功完成。 不必说安装和更新都需要特权提升。 有任何想法吗? 特权提升 服务配置: ...

2016-03-08 17:11:41 1 111   wix
7 具有特权提升的应用程序加载缓慢

我正在测试一个要求提升特权的C#WPF程序,如果以管理员身份登录,该加载将没有任何延迟,但是如果以标准用户身份(99%的时间)登录,则延迟约为30出现用户界面之前的几秒钟。 在C#控制台应用程序和ac#Winforms应用程序中使用相同的海拔代码,加载没有延迟,因此我知道该代码有效。 因 ...

2015-06-02 17:51:04 1 392   c#/ wpf
9 C#ClickOnce应用程序特权提升

我有一个ClickOnce应用程序,该程序在启动程序时会提升用户权限,但会将所有ClickOnce文件安装在本地用户的AppData文件夹中。 我遇到的问题是提升的用户在自己的AppData文件夹中没有这些配置文件。 基本上,我需要用户A(没有读写权限)来安装应用程序。 安装并打开该应用程 ...

10 如何查看我的应用程序是否需要提升的特权?

我正在用C ++开发一个应用程序,该应用程序需要尽可能地可移植,并且能够在没有提升特权的情况下运行,因此普通用户可以运行它。 但是我不确定如何检查它,因为它在我的系统中运行时没有任何弹出式窗口,例如UAC或要求特权。 有没有办法检查应用程序所需的特权? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM