🇰🇷 한글 설명
Linux 커널 gve 드라이버의 DQ-QPL 모드에서 gve_tx_clean_pending_packets() 함수가 잘못된 RDA 버퍼 정리 경로를 사용하여 DMA 배열 범위를 벗어난 접근(out-of-bounds)이 발생합니다. 수정은 QPL 모드를 올바르게 확인하고 gve_free_tx_qpl_bufs()로 버퍼를 회수하도록 변경하는 것입니다.
💡 쉬운 설명
Google 가상 네트워크 드라이버가 네트워크 전송 버퍼를 잘못된 방식으로 정리하여 메모리 범위를 벗어난 접근이 일어날 수 있는 문제입니다. 커널 업데이트로 올바른 정리 방식을 사용하도록 고쳐집니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
gve: fix incorrect buffer cleanup in gve_tx_clean_pending_packets for QPL
In DQ-QPL mode, gve_tx_clean_pending_packets() incorrectly uses the RDA
buffer cleanup path. It iterates num_bufs times and attempts to unmap
entries in the dma array.
This leads to two issues:
1. The dma array shares storage with tx_qpl_buf_ids (union).
Interpreting buffer IDs as DMA addresses results in attempting to
unmap incorrect memory locations.
2. num_bufs in QPL mode (counting 2K chunks) can significantly exceed
the size of the dma array, causing out-of-bounds access warnings
(trace below is how we noticed this issue).
UBSAN: array-index-out-of-bounds in
drivers/net/ethernet/drivers/net/ethernet/google/gve/gve_tx_dqo.c:178:5 index 18 is out of
range for type 'dma_addr_t[18]' (aka 'unsigned long long[18]')
Workqueue: gve gve_service_task [gve]
Call Trace:
<TASK>
dump_stack_lvl+0x33/0xa0
__ubsan_handle_out_of_bounds+0xdc/0x110
gve_tx_stop_ring_dqo+0x182/0x200 [gve]
gve_close+0x1be/0x450 [gve]
gve_reset+0x99/0x120 [gve]
gve_service_task+0x61/0x100 [gve]
process_scheduled_works+0x1e9/0x380
Fix this by properly checking for QPL mode and delegating to
gve_free_tx_qpl_bufs() to reclaim the buffers.
📍 영향받는 시스템
Linux 커널 gve 드라이버(Google Compute Engine 가상 NIC)를 사용하는 수정 전 커널 버전
⚔️ 공격 벡터
로컬 권한이 있는 사용자 또는 드라이버 재설정 상황에서 발생하는 메모리 접근 오류로, 원격 공격 경로는 명확하지 않음
🛡️ 대응 방법
배포판 제공 최신 Linux 커널 보안 업데이트를 적용하고 재부팅
🔧 검증 코드
출력된 커널 버전이 배포판의 패치된 버전(또는 해당 수정 커밋이 포함된 버전)보다 최신인지 배포판 보안 공지와 대조하여 확인하며, 패치 적용 여부는 changelog(예: apt changelog linux-image-$(uname -r))로도 확인할 수 있습니다.