특정 시스템 콜의 작동 막는 기능 추가

EEEFFEE·2023년 12월 3일
0

kdt system-project note

목록 보기
14/15


23.12.03 최초 작성

  • /Makefile.inc : seccomp.h를 사용하기 위해 옵션 추가

CPPLIBS = -lpthread -lm -lrt -lseccomp

  • /ui/input.c : mincore시스템 콜의 실행을 막는 코드 추가

#include <seccomp.h>
#include <sys/mman.h>

int toy_mincore(char **args);

char *builtin_str[] = {
    "send",
    "mu",
    "sh",
    "mq",
    "elf",
    "dump",
    "mincore",
    "exit"
};


int (*builtin_func[]) (char **) = {
    &toy_send,
    &toy_mutex,
    &toy_shell,
    &toy_message_queue,
    &toy_read_elf_header,
    &toy_dump_state,
    &toy_mincore,
    &toy_exit
};

...

//	filter를 초기화하고 mincore 사용 시 EPERM 에러를 출력하게 한다.
//	변경사항이 적용된 ctx를 seccomp_load를 통해 실제 seccomp에 적용시킨다.
int input()
{
	...
    
    scmp_filter_ctx ctx;
    
    ctx = seccomp_init(SCMP_ACT_ALLOW);
    if (ctx == NULL) {
        perror("seccompinit failed");
        return -1;
    }

    int rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(mincore), 0);
    if (rc < 0) {
        perror("seccomp rule_add failed");
        return -1;
    }

    seccomp_export_pfc(ctx, 5);
    seccomp_export_bpf(ctx, 6);

    rc = seccomp_load(ctx);
    if (rc < 0) {
        perror("seccomp load failed");
        return -1;
    }
    seccomp_release(ctx);
}

...

//	mincore를 호출하는 임의의 함수
int toy_mincore(char **args)
{
    unsigned char vec[20];
    int res;
    size_t page = sysconf(_SC_PAGESIZE);
    void *addr = mmap(NULL, 20 * page, PROT_READ | PROT_WRITE,
                    MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
    res = mincore(addr, 10 * page, vec);
    assert(res == 0);

    return 1;
}

0개의 댓글

관련 채용 정보