🇰🇷 한글 설명
리눅스 커널의 TCP 수신 제로카피(rx zerocopy) 기능에서 페이지 매핑에 대한 검증이 누락되어 발생하는 취약점입니다. sendfile()을 통해 파일 시스템 소유의 페이지가 TCP 수신 제로카피에 매핑될 경우 커널 패닉이 발생할 수 있습니다.
💡 쉬운 설명
데이터를 복사하지 않고 빠르게 전달하는 기능에서 잘못된 메모리 영역을 참조하여 컴퓨터 시스템이 갑자기 멈추거나 꺼질 수 있는 문제입니다. 공격자가 특수하게 조작된 네트워크 패킷을 보내 시스템을 마비시킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tcp: add sanity checks to rx zerocopy
TCP rx zerocopy intent is to map pages initially allocated
from NIC drivers, not pages owned by a fs.
This patch adds to can_map_frag() these additional checks:
- Page must not be a compound one.
- page->mapping must be NULL.
This fixes the panic reported by ZhangPeng.
syzbot was able to loopback packets built with sendfile(),
mapping pages owned by an ext4 file to TCP rx zerocopy.
r3 = socket$inet_tcp(0x2, 0x1, 0x0)
mmap(&(0x7f0000ff9000/0x4000)=nil, 0x4000, 0x0, 0x12, r3, 0x0)
r4 = socket$inet_tcp(0x2, 0x1, 0x0)
bind$inet(r4, &(0x7f0000000000)={0x2, 0x4e24, @multicast1}, 0x10)
connect$inet(r4, &(0x7f00000006c0)={0x2, 0x4e24, @empty}, 0x10)
r5 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)
fallocate(r5, 0x0, 0x0, 0x85b8)
sendfile(r4, r5, 0x0, 0x8ba0)
getsockopt$inet_tcp_TCP_ZEROCOPY_RECEIVE(r4, 0x6, 0x23,
&(0x7f00000001c0)={&(0x7f0000ffb000/0x3000)=nil, 0x3000, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, &(0x7f0000000440)=0x40)
r6 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)
📍 영향받는 시스템
Linux Kernel (TCP rx zerocopy 기능이 활성화된 버전)
⚔️ 공격 벡터
조작된 loopback 패킷을 전송하여 파일 시스템 소유의 페이지를 TCP 수신 제로카피에 매핑 유도
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 can_map_frag()의 검증 로직을 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인합니다.