🇰🇷 한글 설명
Linux 커널의 pppol2tp 모듈에서 발생하는 Use-After-Free(UAF) 취약점입니다. 특정 조건에서 채널 해제 시 RCU grace period를 기다리지 않고 kfree()를 호출하여, 다른 CPU에서 실행 중인 ppp_input() 함수가 이미 해제된 메모리에 접근할 수 있습니다.
💡 쉬운 설명
컴퓨터가 사용 중인 데이터를 삭제할 때, 다른 작업이 끝나기를 기다리지 않고 바로 지워버려서 발생하는 오류입니다. 이로 인해 시스템이 충돌하거나 보안 공격에 노출될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF
pppol2tp_recv() runs in the L2TP UDP-encap softirq RX path:
l2tp_udp_encap_recv() -> l2tp_recv_common() -> pppol2tp_recv()
-> ppp_input(&po->chan)
It runs under rcu_read_lock() holding only an l2tp_session reference and
takes NO reference on the internal PPP channel (struct channel,
chan->ppp) that ppp_input() dereferences.
The pppox socket is SOCK_RCU_FREE, so 'po' and the embedded ppp_channel
are RCU-safe. But the internal struct channel is a separate allocation
that ppp_release_channel() frees with a plain kfree():
close(data socket) -> pppol2tp_release() -> pppox_unbind_sock()
-> ppp_unregister_channel() -> ppp_release_channel() -> kfree(pch)
For a channel that is bound (PPPIOCGCHAN) but not attached to a ppp unit
(no PPPIOCCONNECT, pch->ppp == NULL) and not bridged, teardown skips
both ppp_disconnect_channel()'s synchronize_net() and
ppp_unbridge_channels()'s synchronize_rcu(), so the kfree() has no grace
period. rcu_read_lock() in pppol2tp_recv() does not protect against a
plain kfree(), so an in-flight ppp_input() on one CPU can dereference
the channel just freed by close() on another CPU.
The bug is reachable by an unprivileged user.
Defer the channel free to an RCU callback via call_rcu() so the grace
period fences any in-flight ppp_input(). The disconnect and unbridge
teardown paths already fence with synchronize_net()/synchronize_rcu();
call_rcu() does the same here without stalling the close() path.
📍 영향받는 시스템
Linux kernel (ppp/pppol2tp 관련 모듈 사용 시스템)
⚔️ 공격 벡터
권한이 없는 로컬 사용자가 특정 네트워크 소켓 조작을 통해 메모리 해제 시점을 제어하여 발생
🛡️ 대응 방법
커널 패치를 적용하여 채널 해제 시 call_rcu()를 통해 RCU grace period를 보장하도록 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 수정된 최신 패치 버전인지 확인
📊 CVSS Vector String
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
💻 영향받는 소프트웨어
NVIDIA vGPU Guest Driver for Linux