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.

출처

Want to know what is going to be exploited?

We predict KEV entries!