🇰🇷 한글 설명
Linux 커널의 F2FS 파일 시스템에서 gc_merge 옵션을 사용할 때 f2fs_balance_fs()의 gc_merge 경로에서 데드락(교착 상태)이 발생할 수 있는 취약점입니다. 특정 작업 흐름이 서로의 자원을 기다리며 무한 대기에 빠지는 현상이 발견되어, 캐시된 BIO를 커밋하는 함수를 호출하도록 수정되었습니다.
💡 쉬운 설명
컴퓨터의 파일 저장 시스템에서 여러 작업이 서로 상대방의 작업이 끝나기만을 기다리다가 시스템이 멈춰버리는 현상이 발생할 수 있습니다. 이 문제는 특정 설정에서 데이터 정리 작업이 충돌하여 발생하며, 최신 업데이트로 해결되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix potential deadlock in gc_merge path of f2fs_balance_fs()
When we mount device w/ gc_merge mount option, we may suffer below
potential deadlock:
Kworker GC trehad Truncator
- f2fs_write_cache_pages
- f2fs_write_single_data_page
- f2fs_do_write_data_page
- folio_start_writeback --- set writeback flag on folio
- f2fs_outplace_write_data
: cached folio in internal bio cache
- f2fs_balance_fs
- wake_up(gc_thread)
: wake up gc thread to run foreground GC
- finish_wait(fggc_wq)
: wait on the waitqueue --- wait on GC thread to finish the work
- truncate_inode_pages_range
- __filemap_get_folio(, FGP_LOCK) --- lock folio
- truncate_inode_partial_folio
- folio_wait_writeback --- wait on writeback being cleared
- do_garbage_collect
- move_data_page
- f2fs_get_lock_data_folio
- lock on folio --- blocked on folio's lock
In order to avoid such deadlock, let's call below functions to commit
cached bios in GC_MERGE path of f2fs_balance_fs() as the same as we did
in NOGC_MERGE path.
- f2fs_submit_merged_write(sbi, DATA);
- f2fs_submit_all_merged_ipu_writes(sbi);
📍 영향받는 시스템
gc_merge 마운트 옵션을 사용하는 Linux 커널 기반 시스템 (F2FS 파일 시스템 사용 시)
⚔️ 공격 벡터
직접적인 외부 공격보다는 특정 파일 시스템 옵션 사용 중 시스템 부하 및 특정 작업 패턴에 의해 발생 가능
🛡️ 대응 방법
F2FS 데드락 수정 패치가 적용된 최신 버전의 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인