🇰🇷 한글 설명
Linux 커널 MPTCP 구현에서 메모리 압박 상황 시 skb의 tcp_tsorted_anchor 초기화 순서 문제로 인해 kfree_skb가 이미 해제된 dst를 해제하려 하여 커널 크래시가 발생합니다. 이 문제는 _skb_refdst와 tcp_tsorted_anchor가 같은 메모리를 공유하는 데서 비롯됩니다.
💡 쉬운 설명
메모리가 부족할 때 네트워크 패킷 처리 과정에서 잘못된 메모리 정리가 일어나 리눅스 커널이 멈출 수 있습니다. 이는 시스템 안정성 문제로, 패치된 커널로 업데이트하면 해결됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
mptcp: Fix crash due to tcp_tsorted_anchor was initialized before release skb
Got crash when doing pressure test of mptcp:
===========================================================================
dst_release: dst:ffffa06ce6e5c058 refcnt:-1
kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
BUG: unable to handle kernel paging request at ffffa06ce6e5c058
PGD 190a01067 P4D 190a01067 PUD 43fffb067 PMD 22e403063 PTE 8000000226e5c063
Oops: 0011 [#1] SMP PTI
CPU: 7 PID: 7823 Comm: kworker/7:0 Kdump: loaded Tainted: G E
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.2.1 04/01/2014
Call Trace:
? skb_release_head_state+0x68/0x100
? skb_release_all+0xe/0x30
? kfree_skb+0x32/0xa0
? mptcp_sendmsg_frag+0x57e/0x750
? __mptcp_retrans+0x21b/0x3c0
? __switch_to_asm+0x35/0x70
? mptcp_worker+0x25e/0x320
? process_one_work+0x1a7/0x360
? worker_thread+0x30/0x390
? create_worker+0x1a0/0x1a0
? kthread+0x112/0x130
? kthread_flush_work_fn+0x10/0x10
? ret_from_fork+0x35/0x40
===========================================================================
In __mptcp_alloc_tx_skb skb was allocated and skb->tcp_tsorted_anchor will
be initialized, in under memory pressure situation sk_wmem_schedule will
return false and then kfree_skb. In this case skb->_skb_refdst is not null
because_skb_refdst and tcp_tsorted_anchor are stored in the same mem, and
kfree_skb will try to release dst and cause crash.
📍 영향받는 시스템
MPTCP가 활성화된 Linux 커널 (패치 이전 5.x~6.x 계열 일부 버전)
⚔️ 공격 벡터
원격 공격 경로가 명확히 알려져 있지 않으며, 주로 메모리 압박 상황에서 발생하는 서비스 거부(크래시) 문제입니다.
🛡️ 대응 방법
배포판 제공 보안 업데이트 또는 CVE 수정이 포함된 최신 커널로 업그레이드하고, 필요 없으면 MPTCP 기능을 비활성화합니다.
🔧 검증 코드
첫 번째 출력은 현재 커널 버전이며 배포판 보안 공지에서 수정된 버전인지 확인하고, 두 번째 값이 1이면 MPTCP가 활성화된 상태이므로 패치 적용이 필요합니다.
uname -r; sysctl net.mptcp.enabled 2>/dev/null