CVE-2026-74482 in Linux
요약
\~에 의해 VulDB • 2026. 08. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mm/huge_memory: 분할 후 생성된 folio들을 해제하기 전에 i_mmap_rwsem 잠금 해제
__folio_split()은 분할 이후에도 매핑을 계속 역참조합니다. 즉, folio들이 여전히 동결/잠겨 있는 동안 shmem_uncharge(mapping->host) 및 remap_page()를 호출하고, 매우 마지막 단계에서 분할 후 생성된 folio들의 잠금이 해제되고 메모리가 반납된 후에야 i_mmap_unlock_read(mapping)을 실행합니다.
이 과정에서 인노드(inode) 참조가 유지되지 않습니다. 이 분할 로직은 @folio가 잠겨 있고 페이지 캐시에 남아 있어 삭제(eviction)를 방지하도록 의존하는데, beyond-EOF 드롭 루프는 folio_next(folio)에서 시작하므로 해당 @folio를 제거하지 않습니다. 그러나 잠금 해제 루프는 i_mmap_unlock_read()가 실행되기 전에 먼저 @folio의 잠금을 해제합니다. 호출자의 @lock_at이 EOF 너머에 있는 꼬리(tail)인 경우(예: 메모리 고장(memory_failure()) 함수에서 절단(truncation) 중 i_size를 초과하는 공유 메모리 THP(shared memory Transparent Huge Page)의 오염된 꼬리를 분할할 때 전달되는 경우), 해당 folio도 페이지 캐시에서 사라집니다. 따라서 @folio의 잠금이 해제되면 잠겨 있고 캐시에 있는 folio가 인노드를 고정하지 않게 되며, 이로 인해 i_mmap_unlock_read()가 i_mmap_rwsem에 접근하기 전에 동시 실행되는 마지막 iput()이 해당 인노드를 삭제하고 RCU를 통해 메모리를 반납할 수 있습니다:
BUG: KASAN: slab-use-after-free in __up_read+0x634/0x790 i_mmap_unlock_read include/linux/fs.h:537 [inline]
__folio_split+0x732/0x1640 mm/huge_memory.c:4100 try_to_split_thp_page+0xab/0x390 mm/memory-failure.c:1675 memory_failure+0x1394/0x26e0 mm/memory-failure.c:2470
작업자(task) 4601에 의해 해제됨: shmem_free_in_core_inode+0x54/0xb0 mm/shmem.c:5177 evict+0x57f/0xac0 fs/inode.c:870
@folio가 인노드를 고정하고 있는 동안 모든 매핑 역참조를 수행합니다. 즉, 잠금 해제 및 분할 후 생성된 folio들의 메모리 반납을 위한 루프보다 먼저 remap_page() 직후에 i_mmap_rwsem의 잠금을 해제하고, @mapping을 클리어하여 종료 경로에서 이를 다시 잠금 해제하지 않도록 합니다. shmem_uncharge()와 remap_page()는 이미 이 시점 이전에 실행되므로, 이후에는 잠금 해제 루프를 지나 인노드나 매핑에 접근하는 코드가 없습니다.
이제 이는 분할 로직이 의존해야 하는 규칙 중 하나가 되었습니다(@folio가 페이지 캐시가 업데이트될 때까지 동결된 상태로 유지되는 것과 함께): 분할 후 생성된 folio들의 잠금이 해제되기 시작하면 더 이상 인노드 또는 매핑을 역참조해서는 안 됩니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.