CVE-2026-64114 in Linux
요약
\~에 의해 VulDB • 2026. 07. 20.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ipv4: raw: ihl < 5인 IP_HDRINCL 패킷 거부
raw_send_hdrinc()는 호출자가 제공한 IPv4 헤더가 메시지 길이 내에 맞는지 검증합니다:
iphlen = iph->ihl * 4; err = -EINVAL; if (iphlen > length) goto error_free;
if (iphlen >= sizeof(*iph)) {
/* saddr, tot_len, id, csum, transport_header 수정 */ }
그러나 이 코드는 ihl < 5인 경우를 거부하지 않습니다. 이러한 패킷의 경우 "if (iphlen >= sizeof(*iph))" 분기가 건너뛰어져 조작된 iphdr가 그대로 유지되지만, 패킷은 여전히 __ip_local_out()으로 전달되어 이후 단계로 진행됩니다. downstream에서 iph->ihl을 읽는 구성 요소들은 정상적인 값을 가정합니다: 특히 net/ipv4/ah4.c의 ah_output() 함수에서는 top_iph->ihl * 4에서 sizeof(struct iphdr)를 빼고, 그 결과(부호 있는 정수 음수 값이 size_t로 캐스팅됨)를 memcpy()에 전달하여 SIZE_MAX에 가까운 길이의 OOB(out-of-bounds) 접근과 호스트 커널 패닉을 유발합니다.
ihl < 5인 IPv4 헤더는 정의상 잘못되었습니다(RFC 791: "인터넷 헤더 길이(internet header length)는 인터넷 헤더의 길이를 32비트 단위로 나타낸 값입니다... 올바른 헤더에 대한 최소값은 5임" 참고). 커널은 이러한 패킷을 자체 출력 경로(output path)로 주입해서는 안 됩니다.
기존 "iphlen > length" 검사 alongside "iphlen < sizeof(*iph)" 검사를 추가하여 거부합니다. 이는 로컬에서 생성된 패킷이 IP 스택으로 다시 진입할 때 외부 패킷에 적용되는 것과 동일한 기본 무결성 테스트(sanity tests)를 통과해야 한다는 원칙과 일치합니다.
이 수정 사항이 반영되면, fixup 분기를 감싸고 있는 "if (iphlen >= sizeof(*iph))" 래퍼는 불필요해집니다. 패치를 최소화하고 백포트(backport) 호환성을 유지하기 위해 해당 코드는 그대로 남겨두었습니다. 추후 별도 작업을 통해 이를 제거할 수 있습니다.
커밋 86f4c90a1c5c("ipv4, ipv6: raw 소켓 메시지가 IP 헤더를 담을 만큼 충분히 큰지 확인")는 메시지 버퍼가 iphdr를 담을 만큼 충분한 크기를 갖도록 보장하지만, self-reported인 iph->ihl 값에는 제약을 두지 않습니다.
접근 가능성(reachability): 잘못된 패킷의 출처는 CAP_NET_RAW 권한이 있는 모든 호출자이며, 여기서는 CONFIG_USER_NS=y 설정이 적용된 커널에서 user+net 네임스페이스 내 비특권 프로세스도 포함됩니다. 재현된 AH 충돌은 추가로 송신 라우트에 일치하는 xfrm AH 정책이 필요합니다. CAP_NET_ADMIN 권한을 부여받은 컨테이너는 해당 상태와 정책을 자신의 netns에 설치할 수 있습니다. 루프백 인터페이스는 xfrm_output를 우회하므로, 트리거(trigger)에는 실제 네트워크 디바이스(netdev)가 사용됩니다.
UML + KASAN 환경에서 재현됨: addr 0x0 주소에서 커널 모드 오류 발생, 충돌 지점에서 memcpy_orig 호출. 동일한 형태의 취약점이 --cap-add NET_ADMIN 옵션을 사용하여 루트리스(rootless) Docker 컨테이너 내에서 기본 배포판 커널에서도 재현됩니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.