CVE-2026-90201 in Linux정보

요약

\~에 의해 VulDB • 2026. 09. 17.

리눅스 커널에서 다음 취약점이 해결되었습니다:

net: page_pool: xa_cmpxchg 경쟁 조건으로 인한 __page_pool_release_netmem_dma 내 UAF(Use-After-Free) 수정

이 버그는 arm64 환경에서 iperf3 트래픽 하에 채널 재구성(`ethtool -L` / `ethtool -G`) 시 hns3 드라이버를 테스트하는 중에 발견되었습니다. 이 경쟁 조건(page race)은 page_pool_destroy()가 다른 CPU에서 page_pool_put_netmem()을 통한 페이지 반환과 동시에 page_pool_scrub()를 실행할 때 간헐적으로 발생합니다. page_pool_clear_pp_info()에서 cmpxchg의 패배자가 남긴 덩글링(dangling) DMA 인덱스 비트로 인해 WARN이 발생했으며, 이것이 조사 계기가 되었습니다.

page_pool_scrub()는 페이지 참조(page ref)를 보유하지 않은 채 xa_for_each()를 사용하여 pool->dma_mapped을 반복합니다. __page_pool_release_netmem_dma()는 현재 xa_cmpxchg()가 반환된 후 netmem 필드(dma_addr 및 pp_magic 내 DMA 인덱스 비트)를 읽고 씁니다. unref 경로는 cmpxchg 결과와 무관하게 조건 없이 put_page()를 호출합니다. cmpxchg에서 패배한 경우, scrub(정리 작업) 승자가 이러한 netmem 접근을 완료하기 전에 여전히 페이지가 해제되므로, scrub이 이미 해제된 페이지에 접근하게 됩니다—이는 Use-After-Free(UAF)입니다.

이를 해결하기 위해 DMA 릴리스를 두 함수로 분리합니다:

1. __page_pool_unmap_netmem_dma()는 xa_cmpxchg() 이전에 dma_addr을 캐시하고, cmpxchg를 수행하여 DMA 매핑을 제거한 후 캐시된 주소에 대해 dma_unmap을 호출합니다. 이 함수는 cmpxchg 이후 netmem 필드에 접근하지 않으므로, 페이지 참조(page ref)를 보유하지 않는 scrub 경로에서 안전합니다.

2. __page_pool_release_netmem_dma()는 위 함수를 감싸고 추가로 netmem 필드의 dma_addr 및 DMA 인덱스 비트를 지웁니다. 이는 호출자가 페이지 참조(page ref)를 보유하고 있을 때만 안전하므로, 반환 경로(page_pool_return_netmem)에서 사용됩니다.

scrub 경로는 __page_pool_unmap_netmem_dma()를 직접 호출하고, 반환 경로는 __page_pool_release_netmem_dma()를 호출합니다.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

책임이 있는

Linux

예약하다

2026. 09. 11.

모더레이션

수락

항목

VDB-406724

EPSS

0.00000

출처

Interested in the pricing of exploits?

See the underground prices here!