CVE-2026-80787 in Linux
요약
\~에 의해 VulDB • 2026. 09. 04.
리눅스 커널에서 다음 취약점이 해결되었습니다:
nvmet: pci-epf: nvmet_pci_epf_exec_iod_work()에서의 use-after-free 수정
nvmet_pci_epf_exec_iod_work()는 req->execute()를 사용하여 I/O 명령을 제출한 후, 해당 명령이 완료될 때까지 대기하고 데이터를 호스트로 전송합니다. 그러나 장치에서 호스트로의 데이터 전송이 없는 명령의 경우 이러한 대기는 필요하지 않습니다. 이 대기가 필요한지 여부를 결정하기 위해 함수는 req->execute() 호출 후에 iod->data_len과 iod->dma_dir을 읽습니다.
하지만 req->execute()가 호출되면, 다른 CPU에서 비동기적으로 명령이 완료될 수 있습니다. 장치-호스트 데이터 전송이 필요 없는 명령의 경우 nvmet_pci_epf_queue_response()는 nvmet_pci_epf_complete_iod()를 직접 호출하여 iod->data_len과 iod->dma_dir을 읽기 전에 iod를 해제할 수 있으며, 이로 인해 KFENCE use-after-free가 발생합니다:
BUG: KFENCE: nvmet_pci_epf_exec_iod_work+0x288/0x798 [nvmet_pci_epf]에서 read use-after-free 발생
0x00000000fdfa6d03 (kfence-#63 내)에서의 use-after-free 읽기: nvmet_pci_epf_exec_iod_work+0x288/0x798 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
kfence-#63: 0x00000000e3de0e71-0x00000000c938ad62, 크기=712, 캐시=kmalloc-1k
작업자 10이 CPU 0에서 73.995480초(0.005122초 전)에 할당: mempool_kmalloc+0x1c/0x28 mempool_alloc_noprof+0x40/0x9c nvmet_pci_epf_poll_sqs_work+0xd4/0x344 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
작업자 131이 CPU 3에서 73.995521초(0.008385초 전)에 해제: mempool_kfree+0x10/0x20 mempool_free+0x44/0x64 nvmet_pci_epf_free_iod+0x88/0x98 [nvmet_pci_epf]
nvmet_pci_epf_cq_work+0xfc/0x280 [nvmet_pci_epf]
process_one_work+0x15c/0x4f0 worker_thread+0x18c/0x30c kthread+0x130/0x140 ret_from_fork+0x10/0x20
req->execute()를 호출하기 전에 iod->data_len과 iod->dma_dir을 참조함으로써 이 문제를 수정합니다. iod->status와 같은 나머지 iod 접근은 장치-호스트 읽기 경로에서만 발생합니다. 이 경우 nvmet_pci_epf_queue_response()는 iod를 해제하는 대신 iod->done에 신호를 보내므로, iod는 유효한 상태를 유지합니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.