what is prctl

문제를 풀다가 prctl() 이라는 생소한 함수를 만났다. 이 함수가 뭘까?

prctl은 process ctl 이라는 리눅스에서만 사용하는 함수이다. 프로세스별로 다양한 속성을 설정하고 특정 설정값을 볼수 도 있다.

C

int prctl(int option, unsigned long arg2, unsigned long arg3,
          unsigned long arg4, unsigned long arg5);

기본적인 함수 원형은 다음과 같다. 옵션에 따라 기능이 정해지는데 정말 많은 것을 함수 있는 함수다.

프로세스 이름 설정, 조회

C
prctl(PR_SET_NAME, "myprocess", 0, 0, 0);
char name[16];
prctl(PR_GET_NAME, name, 0, 0, 0);

자식종료시 시그널 설정

C
prctl(PR_SET_PDEATHSIG, SIGHUP);

권한이 상승 제어

C
prctl(38, 1LL, 0LL, 0LL, 0LL)
  • 의미: prctl(PR_SET_NO_NEW_PRIVS, 1) 와 같습니다.
  • 효과(no_new_privs = 1): 이후 execve를 하더라도 권한이 상승하지 않도록 고정합니다. 즉, setuid/setgid 바이너리나 파일 capabilities, 일부 LSM 메커니즘을 통해 새로운 권한을 얻을 수 없게 됩니다.

seccomp 제어

C
 prctl(22, seccomp_mode, &prog)
  • 의미: prctl(PR_SET_SECCOMP, seccomp_mode, &prog) 와 같습니다.
  • 여기서 seccomp_mode 와 &prog의 의미는 다음과 같습니다.

seccomp 모드

  • SECCOMP_MODE_STRICT(값 1):
    • 레거시 엄격 모드. 시스템콜을 극소수(전통적으로 read, write, exit, sigreturn)만 허용하고, 나머지는 즉시 SIGKILL 됩니다.
    • 이 모드에서는 세 번째 인자(&prog)는 무시됩니다.
  • SECCOMP_MODE_FILTER(값 2):
    • BPF 기반 필터 모드. 세 번째 인자에 BPF 필터 프로그램을 넘겨서 시스템콜을 세밀히 허용/차단할 수 있습니다.
    • &prog는 보통 struct sock_fprog 포인터로, 내부에 BPF 인스트럭션 배열(struct sock_filter *filter)과 길이(unsigned short len)를 담습니다.
    • BPF가 반환하는 액션 예시:
      • SECCOMP_RET_ALLOW: 시스템콜 허용
      • SECCOMP_RET_KILL_*: 즉시 종료
      • SECCOMP_RET_ERRNO: 지정한 errno로 실패 시키기
      • SECCOMP_RET_TRAP: SIGSYS 트랩 발생
      • SECCOMP_RET_TRACE/LOG/USER_NOTIF: 트레이싱/로그/유저노티피 등 고급 동작

특히 seccomp 을 제어할 수 있는게 큰거 같다.