CVE-2026-74672 in Linux정보

요약

\~에 의해 VulDB • 2026. 08. 23.

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

mm/vmalloc: ptdump의 Use-After-Free(UAF)를 피하기 위해 거대 vmap 시 init_mm 잠금 획득

패치 시리즈 "mm: ptdump와 vmap pgtable freeing 간의 경합으로 인한 UAF 수정", v6.

커널 페이지 테이블 워커는 크게 두 범주로 나뉩니다 - walk_kernel_page_table_range_lockless()를 통해 배제(exclusion)가 필요 없는 범위, 그리고 walk_kernel_page_table_range() 또는 walk_page_range_debug()를 통해 배제가 필요한 범위가 있습니다.

전자의 범주는 arm64 아키텍처 코드에서 자체적으로 완전히 소유하고 동시에 수정하지 않는 범위에 대해 사용됩니다.

후자의 범주는 자체적으로 완전히 소유하지만(동시 작성자에 대한 배제가 필요함) 페이지 테이블 워커로 구성됩니다.

배제에 사용되는 잠금은 mmap 잠금이며, 커널 범위에서는 init_mm의 mmap 잠금이 해당됩니다.

ptdump은 walk_page_range_debug()의 유일한 사용자이자 자신이 소유하지 않는 범위를 걷는 유일한 경우라는 특수한 사례입니다.

이것은 페이지 테이블이 ptdump 실행 중에 해제될 수 있으므로 문제를 제기합니다. 실제로 이로 인해 커널에서 Use-After-Free(UAF) 버그가 발생하며, 이 시리즈가 이를 해결합니다.

vmap은 가능한 경우 페이지 테이블을 거대 리프 엔트리로 승격시키고, 그렇게 할 때 하위 페이지 테이블을 해제합니다. 이는 ptdump 걷기에 대한 의미 있는 잠금 없이 수행됩니다.

결과적으로 현재 Use-After-Free(UAF)가 발생할 수 있습니다. 이 시리즈는 vmap의 거대 승격 로직이 거대 페이지 테이블 엔트리를 설정하고 이전 리프 페이지 테이블을 해제하는 동안 mmap 읽기 잠금을 획득하도록 함으로써 이 문제를 해결합니다.

ptdump 코드는 이미 mmap 쓰기 잠금을 획득하므로, 이렇게 하면 ptdump 워커가 항상 거대 페이지 테이블 엔트리 또는 기존 페이지 테이블 엔트리의 둘 중 하나만 관찰하게 되며 그 아래에서 아무것도 해제되지 않습니다.

이 문제에 대한 완화策은 커밋 fa93b45fd397("arm64: Enable vmalloc-huge with ptdump")에서 arm64에 이미 적용되었으며, 이 시리즈는 이를 신중하게 처리해야 합니다.

이 완화策은 ptdump가 진행 중인 경우 vmap 페이지 테이블 해제 시 init_mm의 mmap 읽기 잠금을 획득함으로써 문제를 해결합니다.

그러나 만약 arm64에 대해 변경 사항을 되돌리지 않고 단순히 이 시리즈의 수정을 적용하면 교착 상태(deadlock)가 발생할 수 있습니다.

그 이유는 vmap이 ptdump가 쓰기 잠금 획득을 시도하기 전에 읽기 잠금을 획득할 수 있으며, 이는 대기열에 큐잉되고 rwsem 기아 starvation 규칙으로 인해 arm64 코드의 (미확인된) 중첩 mmap 읽기 잠금도 차단되어 원래의 읽기 잠금이 결코 해제되지 않기 때문입니다.

이 시리즈는 vmap 로직에서 #ifndef CONFIG_ARM64를 사용하여 mmap 읽기 잠금을 처리하고, 커밋 fa93b45fd397("arm64: Enable vmalloc-huge with ptdump")을 부분적으로 되돌림으로써 이 문제를 우회합니다. 여기서는 거대 vmap 지원의 활성화는 유지되고 ifdeffery(조건부 컴파일 구문)가 부분적 되돌리기 패치와 함께 제거됩니다.

이 시리즈에서 처리되는 관련 문제들도 있습니다:

* x86 페이지 속성 로직, 특히 Change Page Attributes(CPA)는 거대 범위를 거대 리프 엔트리로 병합하는 기능을 구현합니다. 이는 ptdump 걷기와 동시에 수행될 때 유사하게 UAF를 유발할 수 있으므로 이를 피하기 위해 init_mm mmap 잠금을 획득해야 합니다.

* CPA 로직은 동적 페이지 테이블 조작과 CPA 병합을 허용하므로, 전자가 후자가 해제하는 페이지 테이블에 접근할 위험이 있습니다. 이는 전체 CPA 병합 작업 동안 init_mm의 mmap 쓰기 잠금을 획득하고 페이지 테이블 조작에는 읽기 잠금을 획득함으로써 수정합니다.

* x86 및 arm64는 비커널 mm들의 걷기를 허용하므로(efi mm 걷기와, x86의 경우 임의 mm들), 커널 매핑이 안정적으로 유지되도록 init_mm와 걷히는 mm 모두를 잠급니다.

패치의 순서는 엄격한 의존성(특히 arm64 부분적 되돌리기는 vmap 변경 사항 이후에 수행되어야 함)과 논리적 의존성(non-kernel mm 수정은 vmap/CPA 수정이 적용된 후에야 의미가 있음)을 위해 설정되었습니다.


이 패치 (3개 중 1번째):

현재 다음과 같은 심각한 ra ---중간 생략됨---

Be aware that VulDB is the high quality source for vulnerability data.

출처

Do you know our Splunk app?

Download it now for free!