2016-10-18 9 views
2

execvpを使用してサブプロセスを作成し、それをseccompしたい(openなしで、読み取りと書き込みの権限のみを与えたい)。 これを達成するには、の前にexecvp(これもまたopenを呼び出します)を呼び出す必要があります。したがって、自分にexecvpopenの許可を与える必要があります。しかし、これはまた、execvpによって開かれた子プロセスにそのようなパーミッションを与えることを意味します。サブプロセスがopenを呼び出すのを防ぐ方法がありますか(たとえば、seccompを呼び出す前にメモリにロードするなど)?サブプロセスをseccompする方法は?

#include <iostream> 
#include <vector> 
#include <seccomp.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

using namespace std; 

int main() 
{ 
    cerr << "Starting..." << endl; 

    scmp_filter_ctx ctx; 
    ctx = seccomp_init(SCMP_ACT_KILL); // default action: kill 

    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(munmap), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(gettid), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(tgkill), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); 

    // Don't want to give these 3 to child process but execvp requires them 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(execve), 0); 
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(access), 0); 

    seccomp_load(ctx); 

    char * noargv[] = {NULL}; 

    execvp("./app", noargv); 
} 

答えて

1

あなたはこれだけのためにexecvpを使用しないでください特定のパスとフラグ

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; 
} 
0

を許可することができます。絶対パスにパス(例:"./app")を解決し、execveを使用してパスを実行します。

関連する問題