🇰🇷 한글 설명
Linux 커널의 io_uring 네트워크 수신 경로에서, 부분 전송 후 재시도되는 요청이 아직 커밋되지 않은 provided buffer를 다시 사용하는 문제가 해결되었습니다. 이로 인해 같은 버퍼 그룹을 사용하는 다른 요청과 버퍼 메모리가 겹쳐 데이터가 덮어쓰일 수 있었습니다. 수정으로 증분 버퍼 및 번들 수신은 재시도 대신 현재까지 받은 데이터로 완료되며, MSG_WAITALL은 해당 경우 적용되지 않습니다.
💡 쉬운 설명
여러 작업이 같은 메모리 영역을 동시에 쓰면서 서로의 데이터를 덮어쓸 수 있는 취약점입니다. 커널이 이미 사용 중인 메모리를 다시 할당해 버리는 문제를 바로잡은 패치입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
io_uring/net: don't retry recv on uncommitted buffers
Commit 41b70df5b38b ("io_uring/net: commit partial buffers on retry")
commits ring provided buffers when a receive is going to be retried after
a partial transfer, so that another request using the same buffer group
can't be handed the memory the first one keeps receiving into. It commits
the number of bytes received so far. That does the job for a single
buffer which is consumed as a whole, but the request hangs on to all it
has mapped:
- For a buffer ring with IOU_PBUF_RING_INC only these bytes are consumed.
The rest of the buffer stays at the head of the ring.
- For a bundle only the buffers which hold these bytes are consumed, the
others that were peeked stay in the ring.
In both cases the next receive with that buffer group gets memory that
the retried request is still going to write to, and whoever comes last
overwrites the data of the other. What the retry fills isn't committed at
all, as the buffer list isn't known any more at that point. So the kernel
hands it out again later on, while the CQE tells the application that it
was used, and for an incremental buffer that it is done with.
The remainder can't be committed in advance: if the request ends up
receiving less, there is no way to tell the application that more was
consumed than the CQE accounts for. Complete the request with what it has
got instead of retrying it. MSG_WAITALL is no longer honoured for
receives into incremental buffers or multi buffer bundles, they can
return a short count, with the request marked as failed like for other
short MSG_WAITALL transfers.
📍 영향받는 시스템
io_uring 네트워크 수신 기능을 사용하는 패치 이전 Linux 커널 버전 (정확한 범위는 해당 커널 배포판 보안 공지 확인 필요)
⚔️ 공격 벡터
로컬 또는 네트워크 연결을 통해 부분 수신을 유도하여 같은 provided buffer 그룹을 사용하는 요청 간 메모리 충돌을 일으키고 데이터 무결성을 훼손
🛡️ 대응 방법
배포판의 최신 커널 업데이트를 적용하고 재부팅하거나, io_uring 사용을 제한하는 sysctl 설정(kernel.io_uring_disabled)을 적용
🔧 검증 코드
출력된 커널 버전이 배포판의 CVE-2026-99264 수정 버전 이상인지 확인하고, io_uring 심볼이 존재하면 해당 기능이 활성화되어 있으므로 패치 적용 여부를 우선 점검해야 합니다.
uname -r && grep -i io_uring /proc/kallsyms 2>/dev/null | head -n 1