🇰🇷 한글 설명
Linux 커널의 BPF sockmap 서브시스템에서, BPF stream_verdict 프로그램이 skb를 같은 소켓으로 자기 리다이렉트(BPF_F_INGRESS)할 때 tcp_sk의 copied_seq가 실제 데이터 길이의 2배만큼 중복 증가하는 문제가 수정되었습니다. 이로 인해 TCP recvmsg에서 커널 WARNING이 발생할 수 있었습니다. 수정은 자기 리다이렉트 판정을 __SK_PASS로 변환하여 copied_seq가 한 번만 증가하도록 합니다.
💡 쉬운 설명
특정 네트워크 필터링 프로그램이 데이터를 자기 자신에게 되돌려 보낼 때, 커널이 수신 위치를 두 번 계산해 오류 경고가 발생하던 문제입니다. 이번 패치로 위치가 한 번만 계산되도록 고쳐졌습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf, sockmap: Fix self-redirect copied_seq double-counting
When a BPF stream_verdict program redirects an skb back to the same
socket (self-redirect with BPF_F_INGRESS), sk_psock_verdict_apply()
calls tcp_eat_skb() which advances tcp_sk->copied_seq. However, the
skb is then delivered to the socket's psock ingress queue and later
read by tcp_bpf_recvmsg_parser(), which also advances copied_seq via
the copied_from_self accounting path. This double-counting causes
copied_seq to advance by 2x the actual data length, triggering:
TCP recvmsg seq # bug 2: copied BF2E806, seq BF2E7FD, \
rcvnxt BF2E806, fl 0
WARNING: net/ipv4/tcp.c:2745 at tcp_recvmsg_locked+0x72b/0x2640
Call Trace:
tcp_recvmsg+0x10a/0x500
sock_recvmsg+0x168/0x1d0
__sys_recvfrom+0x19a/0x2a0
__x64_sys_recvfrom+0xe4/0x1f0
do_syscall_64+0xf7/0x530
entry_SYSCALL_64_after_hwframe+0x77/0x7f
cleanup rbuf bug: copied BF2E806 seq BF2E806 rcvnxt BF2E806
WARNING: net/ipv4/tcp.c:1609 at tcp_cleanup_rbuf+0xf2/0x1c0
Call Trace:
tcp_recvmsg_locked+0x8d1/0x2640
tcp_recvmsg+0x10a/0x500
sock_recvmsg+0x168/0x1d0
__sys_recvfrom+0x19a/0x2a0
__x64_sys_recvfrom+0xe4/0x1f0
do_syscall_64+0xf7/0x530
entry_SYSCALL_64_after_hwframe+0x77/0x7f
Fix this by converting self-redirect verdict to __SK_PASS at the
beginning of sk_psock_verdict_apply(). This bypasses the
__SK_REDIRECT case entirely (which calls sk_psock_eat_skb), letting
the __SK_PASS path queue the skb to the psock ingress queue. The
data is then read via tcp_bpf_recvmsg_parser(), which advances
copied_seq exactly once through copied_from_self. Cross-socket
redirects continue through __SK_REDIRECT with sk_psock_eat_skb()
unchanged.
📍 영향받는 시스템
BPF sockmap(stream_verdict)을 사용하는 수정 전 Linux 커널 버전 전반
⚔️ 공격 벡터
로컬 또는 BPF 프로그램 권한을 가진 주체가 자기 리다이렉트를 유발해 커널 WARNING과 TCP 상태 불일치를 일으키는 방식(서비스 거부 가능성)
🛡️ 대응 방법
패치가 포함된 최신 Linux 커널 버전으로 업데이트하거나 배포판 보안 업데이트를 적용하세요.
🔧 검증 코드
출력된 커널 버전을 배포판의 보안 권고문에서 이 CVE 패치가 포함된 버전과 비교하여, 같거나 높으면 패치가 적용된 것입니다.