🇰🇷 한글 설명
Linux 커널의 qdisc_pkt_len_init() 함수에서 GSO 패킷 처리 시 충분한 검증이 부족하여 발생하는 취약점입니다. virtio_net_hdr_to_skb() 함수가 TCP 헤더를 완전히 검증하지 않아, 악의적인 사용자가 작은 gso_size를 가진 패킷을 제공하여 패킷 길이 계산에서 언더플로우를 유발할 수 있습니다.
💡 쉬운 설명
Linux 커널의 네트워크 패킷 처리에서 특정 유형의 패킷이 올바르게 검증되지 않는 문제입니다. 공격자가 조작된 네트워크 패킷을 보내 시스템의 메모리 손상 또는 서비스 거부를 유발할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: add more sanity checks to qdisc_pkt_len_init()
One path takes care of SKB_GSO_DODGY, assuming
skb->len is bigger than hdr_len.
virtio_net_hdr_to_skb() does not fully dissect TCP headers,
it only make sure it is at least 20 bytes.
It is possible for an user to provide a malicious 'GSO' packet,
total length of 80 bytes.
- 20 bytes of IPv4 header
- 60 bytes TCP header
- a small gso_size like 8
virtio_net_hdr_to_skb() would declare this packet as a normal
GSO packet, because it would see 40 bytes of payload,
bigger than gso_size.
We need to make detect this case to not underflow
qdisc_skb_cb(skb)->pkt_len.
📍 영향받는 시스템
virtio_net 드라이버를 사용하는 모든 Linux 커널 버전 (가상화 환경, KVM, QEMU 등)
⚔️ 공격 벡터
로컬 사용자가 악의적으로 조작된 GSO 패킷을 전송하여 커널 패킷 길이 계산에서 언더플로우 유발
🛡️ 대응 방법
Linux 커널을 최신 버전으로 업데이트하여 qdisc_pkt_len_init() 함수의 추가 sanity check 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 보안 패치가 포함된 최신 버전인지 확인하고, 필요시 커널 업그레이드 수행
uname -a | grep -i linux && cat /proc/version | awk '{print $3}'