🇰🇷 한글 설명
Linux 커널의 F2FS 파일시스템에서 extent 노드 삭제 중 동시성 경쟁 조건이 발생하여 데이터 무결성 오류를 유발합니다. I_SYNC 상태에서도 비동기 쓰기백 작업이 새로운 extent 노드를 삽입할 수 있어 버그 조건이 트리거됩니다.
💡 쉬운 설명
파일 시스템이 정리되는 순간 다른 작업이 동시에 파일을 수정하려다 충돌이 발생하는 문제입니다. 이로 인해 시스템이 불안정해지거나 데이터 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix node_cnt race between extent node destroy and writeback
f2fs_destroy_extent_node() does not set FI_NO_EXTENT before clearing
extent nodes. When called from f2fs_drop_inode() with I_SYNC set,
concurrent kworker writeback can insert new extent nodes into the same
extent tree, racing with the destroy and triggering f2fs_bug_on() in
__destroy_extent_node(). The scenario is as follows:
drop inode writeback
- iput
- f2fs_drop_inode // I_SYNC set
- f2fs_destroy_extent_node
- __destroy_extent_node
- while (node_cnt) {
write_lock(&et->lock)
__free_extent_tree
write_unlock(&et->lock)
- __writeback_single_inode
- f2fs_outplace_write_data
- f2fs_update_read_extent_cache
- __update_extent_tree_range
// FI_NO_EXTENT not set,
// insert new extent node
} // node_cnt == 0, exit while
- f2fs_bug_on(node_cnt) // node_cnt > 0
Additionally, __update_extent_tree_range() only checks FI_NO_EXTENT for
EX_READ type, leaving EX_BLOCK_AGE updates completely unprotected.
This patch set FI_NO_EXTENT under et->lock in __destroy_extent_node(),
consistent with other callers (__update_extent_tree_range and
__drop_extent_tree) and check FI_NO_EXTENT for both EX_READ and
EX_BLOCK_AGE tree.
📍 영향받는 시스템
Linux kernel (F2FS 파일시스템 사용 시스템)
⚔️ 공격 벡터
로컬에서 동시 파일 입출력 및 삭제 작업을 유발하여 커널 패닉 또는 데이터 손상을 일으킴
🛡️ 대응 방법
운영 체제 및 커널을 최신 보안 패치 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 버전인지 확인하십시오.