私は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
それをコンパイルするために使用します。
英語は私の最初の言語ではありません。文法について申し訳ありません。