🇰🇷 한글 설명
Linux 커널의 BPF sockmap 코드에서 tcp_bpf_send_verdict() 함수가 more_data 경로로 진입할 때 메시지 크기를 두 번 해제(uncharge)하여 소켓 메모리 accounting이 어긋나는 문제가 수정되었습니다. 이로 인해 소켓 종료 시 커널 경고(WARNING)와 콜 트레이스가 발생할 수 있습니다.
💡 쉬운 설명
리눅스 커널 안에서 네트워크 데이터 전송 시 메모리 사용량을 잘못 계산하는 버그입니다. 이 때문에 연결을 닫을 때 커널 경고가 발생하거나 시스템이 불안정해질 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf, sockmap: Fix more uncharged while msg has more_data
In tcp_bpf_send_verdict(), if msg has more data after
tcp_bpf_sendmsg_redir():
tcp_bpf_send_verdict()
tosend = msg->sg.size //msg->sg.size = 22220
case __SK_REDIRECT:
sk_msg_return() //uncharged msg->sg.size(22220) sk->sk_forward_alloc
tcp_bpf_sendmsg_redir() //after tcp_bpf_sendmsg_redir, msg->sg.size=11000
goto more_data;
tosend = msg->sg.size //msg->sg.size = 11000
case __SK_REDIRECT:
sk_msg_return() //uncharged msg->sg.size(11000) to sk->sk_forward_alloc
The msg->sg.size(11000) has been uncharged twice, to fix we can charge the
remaining msg->sg.size before goto more data.
This issue can cause the following info:
WARNING: CPU: 0 PID: 9860 at net/core/stream.c:208 sk_stream_kill_queues+0xd4/0x1a0
Call Trace:
<TASK>
inet_csk_destroy_sock+0x55/0x110
__tcp_close+0x279/0x470
tcp_close+0x1f/0x60
inet_release+0x3f/0x80
__sock_release+0x3d/0xb0
sock_close+0x11/0x20
__fput+0x92/0x250
task_work_run+0x6a/0xa0
do_exit+0x33b/0xb60
do_group_exit+0x2f/0xa0
get_signal+0xb6/0x950
arch_do_signal_or_restart+0xac/0x2a0
? vfs_write+0x237/0x290
exit_to_user_mode_prepare+0xa9/0x200
syscall_exit_to_user_mode+0x12/0x30
do_syscall_64+0x46/0x80
entry_SYSCALL_64_after_hwframe+0x44/0xae
</TASK>
WARNING: CPU: 0 PID: 2136 at net/ipv4/af_inet.c:155 inet_sock_destruct+0x13c/0x260
Call Trace:
<TASK>
__sk_destruct+0x24/0x1f0
sk_psock_destroy+0x19b/0x1c0
process_one_work+0x1b3/0x3c0
worker_thread+0x30/0x350
? process_one_work+0x3c0/0x3c0
kthread+0xe6/0x110
? kthread_complete_and_exit+0x20/0x20
ret_from_fork+0x22/0x30
</TASK>
📍 영향받는 시스템
BPF sockmap 기능을 포함한 Linux 커널 (수정 이전의 여러 안정 버전 및 LTS 커널)
⚔️ 공격 벡터
로컬 또는 네트워크를 통해 sockmap 리디렉션이 사용되는 대용량 TCP 전송을 유발하여 커널 메모리 accounting 불일치와 경고를 일으키는 방식이며, 주로 서비스 안정성(DoS) 영향이 보고되어 있습니다.
🛡️ 대응 방법
배포판 제공 보안 업데이트 또는 이 수정이 포함된 최신 Linux 커널 버전으로 업그레이드하고 재부팅합니다.
🔧 검증 코드
커널 버전을 확인해 수정된 패치 버전인지 배포판 보안 공지와 대조하고, 설정 출력으로 BPF sockmap 관련 옵션이 활성화되어 있는지 판단합니다 (옵션이 없거나 비활성화되어 있으면 영향이 제한적입니다).
uname -r; grep -i -E 'sockmap|BPF_STREAM_PARSER' /boot/config-$(uname -r) 2>/dev/null