我想使用execvp
创建一个子进程并对其进行修改(仅授予其读写权限,不使用open
)。
为了实现这一点,我必须在 execvp
之前调用seccomp函数(它也调用open
),因此我应该给自己execvp
和{{1权限。但这也意味着我通过open
这样的权限给孩子进程打开了。有没有办法阻止子进程调用execvp
(例如在调用seccomp之前将其加载到内存中)?
open
答案 0 :(得分:2)
您只能允许特定路径和标记
char *path = "./app";
// add extra rule for execve
if (seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 1, SCMP_A0(SCMP_CMP_NE, (scmp_datum_t)(path))) != 0) {
return LOAD_SECCOMP_FAILED;
}
// do not allow "w" and "rw"
if (seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(open), 1, SCMP_CMP(1, SCMP_CMP_MASKED_EQ, O_WRONLY, O_WRONLY)) != 0) {
return LOAD_SECCOMP_FAILED;
}
if (seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(open), 1, SCMP_CMP(1, SCMP_CMP_MASKED_EQ, O_RDWR, O_RDWR)) != 0) {
return LOAD_SECCOMP_FAILED;
}
答案 1 :(得分:0)
请勿使用execvp
。将路径(例如,"./app"
)解析为绝对路径,然后使用execve
执行它。
答案 2 :(得分:0)
您可能需要在未使用的syscall参数中传递一个秘密随机数。