🇰🇷 한글 설명
Linux 커널의 MPTCP 구현 중 IPv6 서브플로우 소켓 할당 과정에서 발생하는 Slab Use-After-Free 취약점입니다. 초기화 순서 문제로 인해 TCPv6 전용 슬랩 캐시 대신 일반 kmalloc 캐시가 사용되면서, RCU 읽기 섹션 중 해제된 메모리에 접근할 수 있게 됩니다.
💡 쉬운 설명
네트워크 연결을 관리하는 메모리 공간이 적절한 보호 장치 없이 해제되어, 이미 사라진 데이터를 다시 읽으려다 시스템 오류나 보안 문제가 발생하는 현상입니다. 이는 주로 IPv6를 사용하는 다중 경로 TCP 연결 환경에서 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
mptcp: fix slab-use-after-free in __inet_lookup_established
The ehash table lookups are lockless and rely on
SLAB_TYPESAFE_BY_RCU to guarantee socket memory stability
during RCU read-side critical sections. Both tcp_prot and
tcpv6_prot have their slab caches created with this flag
via proto_register().
However, MPTCP's mptcp_subflow_init() copies tcpv6_prot into
tcpv6_prot_override during inet_init() (fs_initcall, level 5),
before inet6_init() (module_init/device_initcall, level 6) has
called proto_register(&tcpv6_prot). At that point,
tcpv6_prot.slab is still NULL, so tcpv6_prot_override.slab
remains NULL permanently.
This causes MPTCP v6 subflow child sockets to be allocated via
kmalloc (falling into kmalloc-4k) instead of the TCPv6 slab
cache. The kmalloc-4k cache lacks SLAB_TYPESAFE_BY_RCU, so
when these sockets are freed without SOCK_RCU_FREE (which is
cleared for child sockets by design), the memory can be
immediately reused. Concurrent ehash lookups under
rcu_read_lock can then access freed memory, triggering a
slab-use-after-free in __inet_lookup_established.
Fix this by splitting the IPv6-specific initialization out of
mptcp_subflow_init() into a new mptcp_subflow_v6_init(), called
from mptcp_proto_v6_init() before protocol registration. This
ensures tcpv6_prot_override.slab correctly inherits the
SLAB_TYPESAFE_BY_RCU slab cache.
📍 영향받는 시스템
Linux Kernel (MPTCP 기능이 활성화된 버전)
⚔️ 공격 벡터
특수하게 조작된 IPv6 MPTCP 패킷을 전송하여 커널의 ehash 테이블 조회 과정에서 Use-After-Free 유도
🛡️ 대응 방법
커널 패치를 적용하여 MPTCP의 IPv6 초기화 순서를 프로토콜 등록 이후로 조정
🔧 검증 코드
커널 버전과 MPTCP 설정 활성화 여부를 확인하여 취약한 환경인지 판단합니다.
uname -r && grep CONFIG_MPTCP /boot/config-$(uname -r)