🇰🇷 한글 설명
Linux 커널의 f2fs 파일 시스템에서 대형 폴리오(large folio)를 무효화할 때 발생하는 레이스 컨디션 취약점입니다. 참조 카운트를 해제하기 전에 페이지 수를 먼저 가져오지 않아, 동시에 발생하는 truncate 또는 folio split 작업으로 인해 xarray 슬롯 상태가 손상되고 시스템 라이브락(livelock)이 발생할 수 있습니다.
💡 쉬운 설명
파일을 관리하는 과정에서 데이터의 크기를 계산하는 순서가 잘못되어 시스템이 멈추거나 데이터 상태가 꼬이는 문제입니다. 이로 인해 안드로이드 시스템과 같은 환경에서 기기가 응답하지 않는 현상이 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix folio_nr_pages() race after put in large folio invalidate
Our v6.18 based Android system is continuely suffering livelock and bad
page stat as shown in[1] which related to broken xarray slot status. By
investigating big folio operations within f2fs, we find below races and
fix it by get the nr_pages before drop the refcount and folio_lock.
f2fs_get_read_data_folio() calls f2fs_folio_put() before
folio_nr_pages() when invalidating a large folio from the page cache.
That unlocks the folio and drops the caller reference, leaving a window
where a concurrent truncate or folio split can shrink the compound folio
or free it before the invalidate range is computed. An undersized range
then leaves split sub-folios in mapping->i_pages, which can later
interact badly with truncate and reclaim (stale xarray entries and bad
page state when folio->mapping no longer matches the mapping being
truncated).
[1]
PID: 2594 TASK: ffffff8169b81580 CPU: 7 COMMAND: "Thread-3"
#0 [ffffffc08ef2b8a0] xas_load at ffffffe52d1f42a4
#1 [ffffffc08ef2b900] find_get_entries at ffffffe52c185798
#2 [ffffffc08ef2bb60] truncate_inode_pages_range at ffffffe52c19e83c
#3 [ffffffc08ef2bbc0] truncate_inode_pages_final at ffffffe52c19ec2c
#4 [ffffffc08ef2bc20] f2fs_evict_inode at ffffffe52c4c8400
#5 [ffffffc08ef2bcc0] evict at ffffffe52c2de9f4
#6 [ffffffc08ef2bd00] iput at ffffffe52c2db1b4
#7 [ffffffc08ef2bd30] dentry_unlink_inode at ffffffe52c2d7204
#8 [ffffffc08ef2bd50] __dentry_kill at ffffffe52c2d3dcc
#9 [ffffffc08ef2bd80] dput at ffffffe52c2d3c3c
#10 [ffffffc08ef2bda0] __fput at ffffffe52c2b0a7c
#11 [ffffffc08ef2bde0] ____fput at ffffffe52c2b1034
#12 [ffffffc08ef2bdf0] task_work_run at ffffffe52beea200
#13 [ffffffc08ef2be20] exit_to_user_mode_loop at ffffffe52bfbc17c
#14 [ffffffc08ef2be80] el0_svc at ffffffe52d1f8e54
#15 [ffffffc08ef2beb0] el0t_64_sync_handler at ffffffe52d1f8d10
📍 영향받는 시스템
Linux kernel (v6.18 기반 Android 시스템 포함)
⚔️ 공격 벡터
로컬 공격자가 특정 파일 시스템 작업(truncate, folio split 등)을 유도하여 시스템 라이브락 유발
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 f2fs의 folio_nr_pages() 레이스 컨디션 수정 사항 반영
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 수정된 버전인지 제조사의 보안 공지와 대조하여 확인