seccomp-bpf로 리눅스 커널 시스템 콜 화이트리스트 필터링하기
컨테이너 런타임이나 브라우저 샌드박스가 "이 프로세스는 open, socket 같은 시스템 콜을 못 쓰게 막는다"고 할 때, 그 뒤에는 대부분 seccomp-bpf가 있다. Docker나 systemd의 SystemCallFilter=도 결국 libseccomp을 감싼 것일 뿐, 커널이…
컨테이너 런타임이나 브라우저 샌드박스가 "이 프로세스는 open, socket 같은 시스템 콜을 못 쓰게 막는다"고 할 때, 그 뒤에는 대부분 seccomp-bpf가 있다. Docker나 systemd의 SystemCallFilter=도 결국 libseccomp을 감싼 것일 뿐, 커널이…
파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…
ARM64 서버나 모바일 SoC에서 배열 연산이 많은 코드를 최적화할 때 "컴파일러가 알아서 벡터화해주겠지"라고 믿고 넘어가기 쉽다. 하지만 최적화 레벨이나 포인터 별칭(aliasing) 여부에 따라 auto-vectorization이 조용히 실패하고 스칼라 코드가 그대로 나오는…
서버에 서비스가 늘어날수록 로그도 /var/log/syslog, 각 서비스별 파일, 커널 dmesg로 흩어지고, 장애가 나면 여러 파일을 시간순으로 짜맞춰야 하는 상황이 생긴다. Ubuntu는 기본적으로 systemd-journald가 커널·서비스·유저 로그를 구조화된 바이너리 포맷 하나로 모아두고…
cron 배치가 예상보다 오래 걸려 다음 스케줄과 겹치면, 두 인스턴스가 같은 파일에 동시에 써서 데이터가 꼬이는 사고가 난다. PID 파일로 막는 방식은 프로세스가 비정상 종료되면 파일만 남아 다음 실행을 영영…
ARMv8.0의 원자적 연산은 LL/SC(Load-Linked/Store-Conditional) 방식이다 — ldxr로 값을 읽고 연산한 뒤 stxr로 조건부 저장하는데, 그사이 다른 코어가 같은 주소를 건드리면 저장이 실패해 처음부터 재시도한다. 코어 수가 많아질수록 이 재시도가 잦아져…
리눅스 6.6부터 CFS를 대체한 EEVDF 스케줄러의 vruntime/eligible time/deadline 같은 개념은 이 블로그의 이전 글에서 다뤘다. 이 글은 그 개념이 실제로 어떤 구조체와 함수로 구현되어 있는지, kernel/sched/fair.c(6.18 기준) 소스를 직접 따라가며…
systemd나 Docker, Kubernetes는 프로세스를 종료할 때 먼저 SIGTERM을 보내고, 일정 시간(기본 10초 안팎) 안에 종료하지 않으면 SIGKILL로 강제 종료한다. 이 시간 안에 진행 중인 요청을 마무리하거나 파일 핸들을 정리하지 못하면…
Ubuntu LTS의 표준 보안 패치는 Main/Restricted 저장소(커널, 핵심 시스템 패키지)에만 5년간 제공되고, 그 이후나 Universe/Multiverse 저장소(커뮤니티가 유지보수하는 패키지 대부분)는 애초에 Canonical의 공식 보안 패치 대상이 아니다. 실서비스에 쓰는 서버가 이…
Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…