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 을 제어할 수 있는게 큰거 같다.