🇰🇷 한글 설명
Linux 커널의 FOU(Forwarding UDP Encapsulation) 기능에서 FOU_ENCAP_DIRECT 모드 사용 시 프로토콜 속성(FOU_ATTR_IPPROTO)을 생략할 경우 발생하는 취약점입니다. 이 경우 프로토콜 값이 0으로 설정되어 UDP 수신 시 sk_buff를 적절히 해제하지 못하고 메모리 누수를 유발합니다.
💡 쉬운 설명
특정 네트워크 설정 기능을 사용할 때 프로토콜 정보를 빠뜨리면 시스템의 메모리가 계속 쌓여서 컴퓨터가 느려지거나 멈출 수 있는 문제입니다. 공격자가 이 기능을 이용해 메모리를 계속 소모하게 만들 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fou: reject omitted FOU_ATTR_IPPROTO on FOU_ENCAP_DIRECT
Commit 7a9bc9e3f423 ("fou: Don't allow 0 for FOU_ATTR_IPPROTO.") added
NLA_POLICY_MIN(NLA_U8, 1) to fou_nl_policy[FOU_ATTR_IPPROTO], which
rejects an explicitly supplied FOU_ATTR_IPPROTO == 0 attribute with
-ERANGE.
However, FOU_ATTR_IPPROTO is an optional netlink attribute. When a user
sends FOU_CMD_ADD with FOU_ATTR_TYPE set to FOU_ENCAP_DIRECT and omits
FOU_ATTR_IPPROTO entirely, nla_policy validation succeeds and
parse_nl_config() leaves cfg->protocol as 0 (from memset(cfg, 0,
sizeof(*cfg))). fou_create() then creates a FOU_ENCAP_DIRECT socket with
fou->protocol == 0.
In fou_udp_recv(), returning -fou->protocol to udp_queue_rcv_one_skb()
triggers IP protocol resubmission when fou->protocol > 0, whereas
returning 0 tells the UDP tunnel layer that the skb was consumed without
freeing it. When fou->protocol == 0, every packet received on the socket
returns 0 from fou_udp_recv() and leaks the sk_buff.
Reject FOU_ENCAP_DIRECT when !cfg->protocol in fou_create() so that
creating a direct encapsulation port without FOU_ATTR_IPPROTO fails with
-EINVAL while leaving FOU_CMD_DEL and FOU_CMD_GET (which share
parse_nl_config()) unaffected.
Tested in QEMU against Linux 7.3.0-rc3 by sending a FOU_CMD_ADD Generic
Netlink request with FOU_ATTR_PORT = 5555 and FOU_ATTR_TYPE =
FOU_ENCAP_DIRECT while omitting FOU_ATTR_IPPROTO. On the unfixed kernel,
FOU_CMD_ADD succeeds (err = 0), FOU_CMD_GET reports fou->type = 1 and
fou->protocol = 0, and sending 4000 UDP packets to 127.0.0.1:5555 leaks
all 4000 sk_buffs (SUnreclaim in /proc/meminfo grows from 41456 kB to
59008 kB, +17552 kB); with this patch applied, FOU_CMD_ADD is rejected
with -EINVAL (-22).
📍 영향받는 시스템
Linux kernel 7.3.0-rc3 및 해당 기능(FOU)이 포함된 이전 버전 커널
⚔️ 공격 벡터
FOU_ATTR_IPPROTO 속성을 생략한 채 FOU_CMD_ADD Netlink 요청을 보내 메모리 누수 유발
🛡️ 대응 방법
FOU_ENCAP_DIRECT 설정 시 프로토콜 값이 0인 경우를 거부하도록 커널 패치 적용
🔧 검증 코드
출력된 커널 버전이 패치가 적용된 최신 버전인지 확인하거나 커널 소스에서 해당 커밋(7a9bc9e3f423) 포함 여부를 확인합니다.