CVE-2026-98226 in Linux
요약
\~에 의해 VulDB • 2026. 10. 06.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mm, swap: SWAP_USAGE_OFFLIST_BIT와 실제 사용량 카운터 간의 충돌 수정
SWAP_USAGE_OFFLIST_BIT는 si->inuse_pages 사용량 카운터에 내장되어 있으며, 해당 카운터가 도달할 수 있는 모든 값 위에 위치해야 합니다. 그러나 이 비트는 BITS_PER_TYPE(atomic_t)를 기준으로 정의되므로 30번째 비트(bit 30)입니다. 페이지 크기가 4 KiB인 시스템에서는 사용량 카운터가 4 TiB에 도달하면 플래그와 충돌이 발생합니다.
swap_usage_in_pages() 함수는 bit 30을 마스크하므로, 실제 카운터에서 해당 비트가 설정되어 있을 때 이 함수를 호출하는 모든 곳은 낮은 값으로 4 TiB를 읽습니다:
* /proc/swaps에서는 사용량(Used)이 4 TiB만큼 과소 보고됩니다. * 정확히 2^30인 원시(raw) 카운터는 마스크되면 0이 되므로, try_to_unuse() 함수는 "if (!swap_usage_in_pages(si)) goto success;" 조건에 따라 조기 종료되고 swapoff 장치는 페이지가 여전히 스왑 아웃된 상태로 장치 teardown을 진행합니다. 나머지 swapoff 코드에서는 이 teardown 작업을 중단하는 조치가 없으므로 해당 페이지들이 손실됩니다.
swapoff와 독립적으로, 충돌은 카운터와 plist를 손상시킵니다. 정상적인 사용 중인 디바이스에서 bit 30이 카운터에 설정된 상태로 free가 발생하면, swap_usage_sub() 함수는 실제 카운터 값 대신 플래그를 감지하여 add_to_avail_list()를 호출합니다. 이 함수는 fetch_and(~SWAP_USAGE_OFFLIST_BIT)로 해당 비트를 지워 저장된 카운터를 실제값보다 4 TiB 낮게 만들고, 이미 목록에 등록되어 있는 디바이스에 대해 plist_add()를 호출합니다. 이로 인해 plist_add() 내의 WARN_ON(!plist_node_empty(node))가 트리거되며 노드가 두 번째로 링크됩니다.
SWAP_USAGE_OFFLIST_BIT의 정의를 atomic_long_t 기반으로 변경하십시오. 참고로 사용량 카운터 필드 자체도 동일한 타입이므로, 여전히 유효한 비트입니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.