CVE-2026-98844 in Linux
요약
\~에 의해 VulDB • 2026. 10. 20.
리눅스 커널에서 다음 취약점이 해결되었습니다:
netfs: write를 통해 파일을 확장할 때 EOF 이후의 페이지 캐시(pagecache) 지우기
ordinary write로 인해 EOF 뒤에 생성된 구멍(hole)의 내용을, mmap 영역을 통한 쓰기 전에 더티 데이터가 남아 있었던 경우 netfs가 삭제하도록 수정합니다. 버퍼드(buffered) 경로와 언버퍼드/DIO(unbuffered/DIO) 쓰기 경로 모두 해당 낡은 페이지 캐시를 지우지 않습니다.
확장 쓰기가 수행되기 전에 EOF를 가로지르는 folio의 꼬리 부분을 0으로 초기화합니다. mmap을 통해 EOF 너머로 데이터가 작성될 수 있는 유일한 folio이기 때문입니다. EOF 전체 이후에 위치한 페이지는 fault-in 될 수 없습니다. concurrent한 확장 쓰기에서 데이터 손실이 발생하지 않도록 folio를 삭제하는 대신 0으로 초기화합니다.
두 가지 쓰기 경로 모두 i_rwsem을 shared 상태로 다운그레이드하므로, 확장 쓰기는 동시에 실행될 수 있으며 caller가 읽은 i_size 값이 folio 잠금 해제 시점에는 낡아 있을(stale) 수 있습니다. 따라서 folio 잠금 하에서 i_size를 다시 읽고 0으로 초기화된 범위를 해당 크기까지 제한(clamp)하여, 이미 folio에 데이터를 작성한 레이스 컨디션(racing write) 데이터가 덮어씌워지는(clobbered) 것을 방지합니다.
folio의 쓰기백(writeback)이 완료될 때까지 대기한 후 0으로 초기화하므로, 전송 중 수송 계층(transport)에서 페이지 캐시가 여전히 읽힐 때 수정되지 않습니다. IOCB_NOWAIT를 준수하기 위해 folio 잠금, 쓰기백 또는 mmap된 상태에서의 folio_mkclean() rmap 순회 시 블로킹하는 대신 -EAGAIN을 반환합니다.
truncate_pagecache()는 여기서 사용할 수 없습니다: 이는 i_rwsem이 배타적으로(exclusively) 보유될 때 호출해야 하지만, 이러한 쓰기 경로들은 이를 shared 상태로만 보유하고 있으며, 무조건 블록되어 IOCB_NOWAIT를 위반하게 됩니다.
전체 리사이즈(truncate, setattr, fallocate, clone) 동안 i_rwsem을 배타적으로 보유하는 caller는 genuine한 concurrent buffered writer를 제외하므로, pagecache_isize_extended()가 단일 i_rwsem을 통해 truncate/setattr에 대해 쓰기를 직렬화(file system이 수행)하는 경우와 마찬가지로 folio의 더티 상태(dirty state)로부터 낡은 상태를 결정할 수 있습니다. 이러한 사례를 처리하기 위해 netfs_clear_stale_post_isize() 헬퍼 함수를 내보냅니다(export).
CIFS 클라이언트는 generic/363을 수정하기 위해 이 헬퍼가 필요합니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.