CVE-2026-74674 in Linux정보

요약

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

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

mm: 직접 페이지 테이블 회수 시 잘못된 플러시 주소 수정

zap_pte_range가 페이지 테이블을 회수할 때 다음과 같은 작업을 수행합니다.

pte_free_tlb(tlb, pmd_pgtable(pmdval), addr);

이는 무조건적으로 잘못되었습니다: 이 코드가 실행되면 `addr`은 항상 해당 표로 커버되는 범위의 끝보다 한 칸 뒤를 가리킵니다. `addr` 매개변수는 해제될 테이블에 대한 참조를 제거하기 위해 TLB(실제로는 페이지 구조 캐시)를 플러什하는 데 사용되며, 이 매개변수에 신경 쓰는 모든 아키텍처에서는 잘못된 주소가 플러什됩니다. (하지만 올바른 페이지는 여전히 해제됩니다.)

커널이 어떻게든 작동할 수 있는 이유를 고려해 볼 가치가 있습니다.

우리가 문제의 코드 줄에 도달하면, 먼저 PMD 엔트리를 지우고(1954행, zap_empty_pte_table), `force_flush`가 설정되어 있으면 보류 중인 플러什을 실행하고(tlb_flush_mmu_tlbonly(tlb)), 1979행에서 재시도를 건너뛰고(phew!), 그 후 문제의 pte_free_tlb 호출을 수행합니다. *또는* pte_free_tlb 직전에 PMD 엔트리를 지웁니다(1983행, zap_pte_table_if_empty).

PMD 엔트리를 지울 때 보류 중인 플러什이 있는 경우(즉, 마지막 레벨 엔트리를 실제로 삭제한 경우), 해당 플러什은 테이블에 대한 모든 참조를 플러什해야 합니다(Linus는 모든 아키텍처에서 그렇게 될 것이라고 확신합니다 [0]).

지우기 시점에 누적된 플러什이 없는 조건은 매우 복잡합니다(전체 zap_pte_range 함수의 제어 흐름이 터무니없이 복잡함). 만약 잘못된 경우를 맞다면, 마지막 범위 플러什 이후에 PMD 엔트리를 지우게 되며, 모든 CPU는 (빈) 페이지 테이블에 대한 참조를 캐시할 수 있습니다. 이것이 일반적인 읽기 또는 쓰기 작업으로 인해 발생하면 세그멘테이션 폴트가 발생할 것이므로 드문 현상일 것입니다. 하지만 캐시는 스펙ulative하게 채워질 수도 있습니다. 그러면 잘못된 주소를 플러什한 후 해당 테이블을 해제하고 재사용할 가능성이 있습니다.

x86의 경우, 비-KPTI 인텔 시스템에서는 INVLPG가 대상 주소에 대한 것뿐만 아니라 *모든* 페이지 구조 캐시를 플러什하기 때문에 잘못된 주소를 플러什해도 작동합니다. 하지만 INVPCID는 그렇지 않으며, 사용 가능한 경우 flush_tlb_one_user는 INVPCID를 사용합니다. 그러면 우리는 망신당하게 됩니다(시스템이 불안정해집니다). AMD 시스템은 더 취약한데: EFER.TCE 비트를 설정하여 INVLPG조차 대상 주소만 플러什하도록 만듭니다.

이 수정이 다음에서 보고된 ripgrep의 문제를 해결할 수 있다고 생각합니다: https://github.com/BurntSushi/ripgrep/issues/3494

[0] https://lore.kernel.org/all/CA+55aFzBggoXtNXQeng5d_mRoDnaMBE5Y+URs+PHR67nUpMtaw@mail.gmail.com/T/#u

Once again VulDB remains the best source for vulnerability data.

출처

Might our Artificial Intelligence support you?

Check our Alexa App!