🔍 CVE-2026-98924

0.0
CVSS Score
UNKNOWN
2026-10-23
2026-10-23 13:17
✅ 완료

🇰🇷 한글 설명

Linux 커널의 fs 서브시스템에서 evict_inodes()가 락을 해제하고 재스케줄링할 때마다 s_inodes 리스트의 처음부터 다시 스캔하여 참조 중인 inode들을 반복 순회하는 문제가 해결되었습니다. 이로 인해 장치 제거 후 unmount 시 s_umount 락이 오래 유지되어 hung task가 발생할 수 있었습니다.

💡 쉬운 설명

디스크를 뽑은 뒤 파일시스템을 해제하려 할 때 리눅스가 같은 파일 목록을 계속 되풀이해서 검사하느라 멈춰 버리는 문제가 있었습니다. 이번 패치는 검사 위치를 기억해 이어서 처리하도록 바꿔 이 멈춤을 없앱니다.

🇺🇸 원문 (English)

In the Linux kernel, the following vulnerability has been resolved: fs: avoid repeated scans in evict_inodes() We observed hung tasks when users attempted to unmount a filesystem after its disk had been removed while still in use. During device removal, fs_bdev_mark_dead() calls evict_inodes() while holding s_umount. Each time evict_inodes() drops s_inode_list_lock to reschedule, it restarts the walk from the head of s_inodes. With many referenced inodes at the head of the list, these restarts repeatedly scan the same inodes without reclaiming them. This can keep s_umount held for a long time, blocking concurrent umount attempts and triggering hung-task reports. Keep the current inode, already marked I_FREEING, out of the disposal batch until s_inode_list_lock is reacquired. Resume the walk from this inode and dispose of it in a later batch or at the end of the walk. The zero-refcount and state checks under i_lock allow this walker to claim the inode by setting I_FREEING and removing it from the LRU. Other reclaimers skip the inode, leaving this walker responsible for eviction. Only evict() removes it from s_inodes, so keeping it out of the disposal batch ensures that it remains on the list while the lock is dropped. After reacquiring the lock, reading its current next pointer accounts for concurrent removal of following inodes. The existing inode lifetime rules prohibit acquiring a reference to an inode marked I_FREEING or I_WILL_FREE. __iget() requires its caller to hold i_lock and establish that taking a reference is valid. Inode lookup and igrab() check these flags under i_lock when acquiring a reference from zero. ihold() requires an existing reference, which would keep i_count nonzero and prevent this walker from claiming the inode. These rules already allow iput_final() and the inode shrinker to release i_lock after setting I_FREEING and before eviction completes. A temporary __iget() reference would also keep the inode on the list, but its release must preserve last-reference handling. Another user can acquire a reference, update lazy timestamps and drop its reference while the pin is held. If the pin becomes the last reference, dropping it with atomic_dec_and_test() and evicting directly bypasses iput()'s lazytime handling and can lose those timestamp updates. Releasing the pin with iput() preserves that handling, but does not guarantee eviction. fs_bdev_mark_dead() runs with SB_ACTIVE set, so iput() may retain the inode in cache, whereas evict_inodes() must evict eligible zero-reference inodes. The inode may also have been freed when iput() returns, so the walker cannot then use it to force eviction. Using I_FREEING preserves the existing eviction behavior without introducing an additional last-reference transition. The xfstests auto group passed on ext4 and XFS with known unrelated failures excluded. No new issues were observed, and the previously reproducible hung task no longer occurs with this patch.

📍 영향받는 시스템

패치가 적용되지 않은 Linux 커널 (fs/inode.c의 evict_inodes()를 사용하는 버전, CVSS 점수 미정)

⚔️ 공격 벡터

공격 벡터가 명시되지 않음. 디스크 제거 후 unmount 시도 등 정상 동작 중 발생하는 서비스 거부(hung task) 성격의 결함으로 보임

🛡️ 대응 방법

해당 커널 수정 사항이 포함된 최신 Linux 커널 버전으로 업데이트

🔧 검증 코드

출력된 커널 버전을 배포판의 보안 공지에서 CVE-2026-98924 수정 포함 버전과 비교하여, 같거나 높으면 패치가 적용된 것으로 판단합니다

Shell / Script
uname -r

💻 영향받는 소프트웨어

Linux Kernel