1

私はseccompレコード「ping」を使用してsyscallを使用しています。実行すると、常に通知されます

socket: 操作は許可されていません。

bashでpingをうまく実行できますが、プログラムでseccompフィルターをロードした後は機能しません。

しかし、ルートで同じプログラムを実行すると、非常にうまく動作します。

これは、4.15.0-54-generic カーネルを使用して Ubuntu 18.04 で実行されています。

ルートユーザーを使用してプログラムを実行しようとしましたが、子の進行状況で setuid(1000) を使用して通常のユーザーに設定しましたが、まだ機能しません。

フォークを使用しない場合でも、許可されていないことに気づきます。

seccomp のデフォルト アクションを SCMP_ACT_ALLOW に変更しても、まだ機能しません。

これはCによる簡単なコードです。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <signal.h>
#include <seccomp.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/wait.h>

void child() {
        setuid(1000);
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_LOG);

        if (seccomp_load(ctx) != 0) {
                printf("SCMP LAOD ERR!");
        } else {
                seccomp_release(ctx);
        }
        execl("/bin/ping", "ping", "-c", "1", "172.16.1.1", NULL);
        printf("EXEC FAIL");
}
int main(){

        int p = fork();
        if (p < 0) {
                printf("Frok ERROR!");
                exit(1);
        }
        if ( p == 0 ) {
                child();
        } else {
                struct rusage usage;
                int status;
                if (wait4(p, &status, WSTOPPED, &usage) == -1) {
                        kill(p, SIGKILL);
                }
        }
}

私はgcc main.c -o main.out -lseccompそれをコンパイルするために使用します。

英語は私の最初の言語ではありません。文法について申し訳ありません。

4

1 に答える 1