使用setuid / setgid包装器执行Python命令

时间:2016-12-05 20:24:41

标签: python c setuid execve

我有以下Python脚本,我想用setuid / setgid位提供的权限执行:

#!/usr/bin/env python3
from mypackage.cli import main as cli_main
cli_main()

但是:我想在没有中间Python脚本文件的情况下直接从C包装器执行命令。

我尝试使用execve执行此操作,如下所示:

#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char *ENV = "/usr/bin/env";
const char *ENV_ARGS[] = { "python3", "-c", "from mypackage.cli import main as cli_main; cli_main()" };
const int NUM_ENV_ARGS = 3;

int main(int argc, char *argv[], char *envp[]) {
    int total_num_args = (argc - 1) + NUM_ENV_ARGS + 1;

    // Create an array of strings to hold the final arg list.
    // No need to free the malloc'ed memory as it will be freed if execve succeeds,
    // or when the program exits if execve fails.
    char **final_args = (char **)malloc(total_num_args * sizeof(char *));
    if (final_args == NULL) {
        return 1;
    }

    // Copy the invocation and the arguments to this program into the final arg list.
    memcpy(final_args, ENV_ARGS, NUM_ENV_ARGS * sizeof(char *));
    memcpy(final_args + NUM_ENV_ARGS, argv + 1, (argc - 1) * sizeof(char *));
    final_args[total_num_args - 1] = NULL;

    return execve(ENV, final_args, envp);
}

但是当我将编译后的程序作为./mycli foo bar运行时,我收到以下错误:

python3: illegal option -- c
usage: env [-iv] [-P utilpath] [-S string] [-u name]
           [name=value ...] [utility [argument ...]]

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您没有运行vm.submitForm = function(){ vm.competences.forEach(function(competence){ if(competence.selected) console.log(competence); // or POST the competences using the $http service ... }) } 命令。您正在运行python3命令。 env变量应包含ENV,或/usr/bin/python3的任何路径。

答案 1 :(得分:1)

您正在错误地构造参数数组。它应该与exec程序的argv数组完全对应,包括0 th 元素指定程序的名称,在这种情况下通常是&#34; ENV&#34;或&#34; / usr / bin / env&#34;。因为你跳过&#34; env&#34;,env正在解释&#34; python3&#34; as 自己的名称,如错误消息所示。该消息来自env,而不是来自Python。