使用 setuid/setgid 包装器执行 Python 命令
Executing a Python command with a setuid/setgid wrapper
我有以下 Python 脚本,我想使用 setuid/setgid 位提供的权限执行它:
#!/usr/bin/env python3
from mypackage.cli import main as cli_main
cli_main()
但是: 我想直接从 C 包装器执行命令,而不需要中间 Python 脚本文件。
我尝试使用 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 ...]]
我怎样才能做到这一点?
你不是 运行 python3
命令。您是 运行 env
命令。 ENV
变量应该包含 /usr/bin/python3
,或者任何你指向 python3
的路径。
您构建的参数数组不正确。它应该与执行程序的 argv
数组完全对应,包括第 0th 元素指定程序的名称,在这种情况下通常是 "env" 或“/usr/bin/env”。因为您跳过 "env",env
将 "python3" 解释为 它自己的 名称,如错误消息所示。该消息来自 env
,而不是来自 Python。
我有以下 Python 脚本,我想使用 setuid/setgid 位提供的权限执行它:
#!/usr/bin/env python3
from mypackage.cli import main as cli_main
cli_main()
但是: 我想直接从 C 包装器执行命令,而不需要中间 Python 脚本文件。
我尝试使用 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 ...]]
我怎样才能做到这一点?
你不是 运行 python3
命令。您是 运行 env
命令。 ENV
变量应该包含 /usr/bin/python3
,或者任何你指向 python3
的路径。
您构建的参数数组不正确。它应该与执行程序的 argv
数组完全对应,包括第 0th 元素指定程序的名称,在这种情况下通常是 "env" 或“/usr/bin/env”。因为您跳过 "env",env
将 "python3" 解释为 它自己的 名称,如错误消息所示。该消息来自 env
,而不是来自 Python。