ARM Pointer Authentication(PAC)와 BTI로 ROP/JOP 공격 막기

스택 카나리·NX/DEP·ASLR로 오랫동안 막아온 리턴 주소 조작을, 공격자는 새 코드 주입 대신 기존 코드 조각을 이어붙이는 ROP/JOP로 우회해왔다. ARM은 ARMv8.3-A의 Pointer Authentication(PAC)과 ARMv8.5-A의 Branch Target Identification(BTI)으로 이를 하드웨어 레벨에서 막는다.…

Continue ReadingARM Pointer Authentication(PAC)와 BTI로 ROP/JOP 공격 막기

Bash trap과 시그널 처리로 안전한 스크립트 작성하기

배포 스크립트가 Ctrl+C나 SIGTERM으로 중간에 끊기면 임시 파일이 /tmp에 남고, lock 파일이 안 지워져 다음 실행이 죽고, 쓰다 만 결과 파일이 완료된 것처럼 남기도 한다. Bash의 trap은 시그널을 받거나 종료될…

Continue ReadingBash trap과 시그널 처리로 안전한 스크립트 작성하기

QEMU/KVM 라이브 마이그레이션 원리와 실습

하이퍼바이저 호스트를 재부팅해야 할 때, VM을 끄고 다른 호스트에서 다시 켜는 cold migration은 서비스가 몇 분씩 죽는다. QEMU/KVM의 live migration은 VM을 실행 상태 그대로 유지하며 메모리/디바이스 상태를 다른 호스트로 옮기고…

Continue ReadingQEMU/KVM 라이브 마이그레이션 원리와 실습

Python multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

numpy 배열을 multiprocessing.Queue/Pipe로 주고받으면 매번 pickle 직렬화·역직렬화가 일어나 배열이 클수록 병목이 된다. Python 3.8부터 표준 라이브러리에 들어온 multiprocessing.shared_memory는 pickle 없이 OS의 진짜 공유 메모리(POSIX /dev/shm)를 이름으로 attach해 여러 프로세스가 같은…

Continue ReadingPython multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

리눅스 커널 DAMON으로 메모리 접근 패턴 모니터링하기

메모리 회수는 LRU 리스트로 hot/cold 페이지를 구분해야 하는데, page table의 accessed bit를 주기적으로 스캔하는 전통적 방식은 메모리가 커질수록 오버헤드가 커진다. DAMON(Data Access MONitor)은 리눅스 5.15부터 커널에 들어온 범용 데이터 접근…

Continue Reading리눅스 커널 DAMON으로 메모리 접근 패턴 모니터링하기

Ubuntu에서 커널을 직접 빌드해 DAMON 활성화하기

Ubuntu 24.04 generic 커널은 CONFIG_DAMON이 꺼져 있어 /sys/kernel/mm/damon/admin/이 없다. 실제로 쓰려면 커널을 직접 빌드해야 한다. 현재 설정 기반으로 DAMON 옵션만 추가해 빌드·설치·재부팅하고 동작까지 확인한 기록이다. 준비 $ sudo apt-get install…

Continue ReadingUbuntu에서 커널을 직접 빌드해 DAMON 활성화하기

strace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

strace nginx나 strace sh script.sh로 걸어보면 부모 프로세스의 fork/execve까지만 잡히고, 실제 작업을 하는 워커/자식 프로세스 내부는 안 보인다. -f(--follow-forks)가 이 문제를 해결한다. 이 글에서는 -f/-ff/-e trace=로 멀티프로세스·멀티스레드 프로그램을 추적하는 방법을…

Continue Readingstrace -f로 멀티프로세스/스레드 시스템 콜 한 번에 추적하기

Ubuntu Netplan으로 네트워크 설정 관리하기

예전 /etc/network/interfaces는 배포판마다 문법이 다르고 cloud-init 같은 자동 구성 환경과 궁합이 안 좋았다. Ubuntu 17.10부터는 Netplan이 YAML로 원하는 상태만 선언하면 systemd-networkd/NetworkManager를 백엔드로 골라 실제 설정을 만들어준다. 이 글에서는 YAML 구조,…

Continue ReadingUbuntu Netplan으로 네트워크 설정 관리하기

리눅스 커널에서 scatter-gather DMA 이해하기

디바이스에 넘길 버퍼가 물리적으로 연속되어 있다는 보장은 없다. vmalloc으로 받은 큰 버퍼는 물리 페이지가 여기저기 흩어져 있고, 네트워크 패킷처럼 여러 조각(헤더+페이로드)을 한 번의 전송으로 묶어야 하는 경우도 흔하다. scatter-gather DMA는…

Continue Reading리눅스 커널에서 scatter-gather DMA 이해하기

라즈베리파이 부트로더 빌드 및 업데이트 방법

라즈베리파이 4/5 계열은 부트로더가 보드 위 EEPROM에 저장되어 있고, rpi-eeprom-update로 최신 버전으로 갱신할 수 있다. "부트로더를 빌드한다"는 말 때문에 소스를 내려받아 컴파일하는 과정을 떠올리기 쉬운데, 실제로는 다르다. rpi-eeprom 저장소에는 이미…

Continue Reading라즈베리파이 부트로더 빌드 및 업데이트 방법