
1. PinTheft 이란?
‘PinTheft’라는 새로운 리눅스 로컬 권한 상승 취약점이 발견되었습니다. 이 취약점은 커널 RDS(Reliable Datagram Sockets) 제로카피 전송 경로에 존재하는 참조 카운트(refcount) 버그와 io_uring을 연쇄적으로 악용하여 메모리 내의 SUID 루트 바이너리를 덮어씁니다. 그 결과, 권한이 없는 로컬 계정에서도 루트 셸을 획득할 수 있습니다.
2. 기술적 분석
1️⃣ RDS (Reliable Datagram Sockets) — 버그의 발원지
RDS zerocopy 전송 경로에 버그가 있습니다. rds_message_zcopy_from_user() 함수는 유저 페이지를 하나씩 pin(고정)하는데, 중간에 페이지 오류가 나면 이미 pin한 페이지들을 해제합니다. 그런데 이후 RDS 메시지 정리 단계에서 scatterlist 항목들이 살아있어서 같은 페이지를 또 해제해버립니다 (Double Free).
2️⃣ io_uring — 공격의 증폭기
실패한 zerocopy 전송마다 첫 번째 pin된 페이지에서 FOLL_PIN 참조를 하나씩 훔칩니다. 이 과정은 미묘하고 결정론적이라 레이스 컨디션 없이 안정적으로 동작합니다.
이걸 반복하면 → 페이지 캐시 조작 → SUID root 바이너리를 메모리에서 덮어쓰기 → root 셸 획득
3. 공격 시연
Step 1) 리눅스 커널 7.0.3 환경에서 주요 취약점 발생 지점인 'RDS 모듈'과 'io_uring' 기능이 활성화되어 있는지 확인

Step 2) mount 명령어로 임시 쓰기 공간을 2GB로 늘리고 df 명령어로 루트 파일 시스템 용량을 확인합니다.

Step 3) git과 커널 코드 컴파일을 위한 빌드 베이스(base-devel), 커널 헤더(linux-headers) 패키지를 설치합니다.

Step 4) 일반 사용자 계정 white를 생성합니다.

Step 5) [Ctrl + Alt + F2]를 눌러 생성한 사용자 계정 white로 로그인합니다.

Step 6) PoC 공격 코드를 다운로드합니다.

Step 7) pintheft 디렉터리로 이동 후 poc.c 코드를 컴파일을 합니다.

Step 8) 페이지 캐시 오염을 통해 권한 상승(LPE)에 완전히 성공하여 root 권한을 획득을 할 수 있습니다.

Step 9) 공격 시연 영상입니다.
4. 대응방안
✅ 방법 1: 커널 업데이트 (근본 해결책)
# Ubuntu/Debian
sudo apt update && sudo apt upgrade linux-image-generic
# Arch Linux
sudo pacman -Syu
✅ 방법 2: RDS 모듈 차단 (임시 조치)
# /etc/modprobe.d/blacklist-rds.conf 생성
echo "blacklist rds" | sudo tee /etc/modprobe.d/blacklist-rds.conf
echo "blacklist rds_tcp" | sudo tee -a /etc/modprobe.d/blacklist-rds.conf
sudo modprobe -r rds rds_tcp # 즉시 언로드
✅ 방법 3: io_uring 비활성화 (커널 6.6 이상)
sudo sysctl -w kernel.io_uring_disabled=2
# 영구 적용:
echo "kernel.io_uring_disabled=2" | sudo tee -a /etc/sysctl.conf
✅ 내 시스템이 취약한지 확인하는 방법
# RDS 모듈 로드 여부 확인
lsmod | grep rds
# io_uring 상태 확인
cat /proc/sys/kernel/io_uring_disabled
결과가 0이면 io_uring 활성화 상태 (위험할 수 있음)
'CVE 취약점' 카테고리의 다른 글
| NGINX-Rift (CVE-2026-42945) (0) | 2026.05.30 |
|---|---|
| Fragnesia (CVE-2026-46300) (0) | 2026.05.16 |
| ORM Injection (CVE-2026-30951) (0) | 2026.05.01 |
| Pack2TheRoot (CVE-2026-41651) (0) | 2026.04.26 |
| GNU Inetutils (CVE-2026-24061) (0) | 2026.01.31 |