🇰🇷 한글 설명
Linux 커널의 FUSE 파일 시스템에서 setattr 작업 중 writeback 실패 시 invalidate lock이 해제되지 않고 누수되는 취약점입니다. 이로 인해 해당 파일에 대한 이후의 fault 또는 truncate 작업이 stale rwsem으로 인해 중단(stall)될 수 있습니다.
💡 쉬운 설명
파일의 속성을 변경하는 과정에서 오류가 발생했을 때, 시스템이 사용하던 잠금 장치를 제대로 풀어주지 않는 문제입니다. 이로 인해 해당 파일에 접근하려고 하면 시스템이 응답하지 않고 멈춰버릴 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fuse: fix invalidate lock leak on setattr writeback failure
fuse_do_setattr() takes filemap_invalidate_lock() for a DAX truncate
(fault_blocked = true) and releases it at the out:/error: labels. But
when a writeback flush is also needed, a write_inode_now() failure
returns directly and leaks the lock, so any later fault or truncate on
the file stalls on the stale rwsem.
For example, truncate(2) on a setuid file reaches fuse_do_setattr()
with both ATTR_SIZE and ATTR_MODE set:
truncate(2)
└─ do_truncate()
├─ dentry_needs_remove_privs() # S_ISUID
└─ notify_change() # KILL_SUID -> ATTR_MODE
└─ fuse_setattr() # no killpriv:
│ # ia_valid |= ATTR_MODE
└─ fuse_do_setattr()
├─ filemap_invalidate_lock() # IS_DAX && is_truncate
└─ write_inode_now() # is_wb && ATTR_MODE
└─ if (err) # e.g. daemon -> -EIO
return err # <- lock leaked
Fix this by adding an unlock label that releases the lock before
returning the error, and use it for the fuse_dax_break_layouts()
failure path as well.
📍 영향받는 시스템
Linux kernel (FUSE module 사용 시스템)
⚔️ 공격 벡터
FUSE 파일 시스템을 사용하는 환경에서 특정 조건(DAX truncate 및 writeback 실패)을 유도하여 시스템 교착 상태 유발
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 invalidate lock 누수 수정 사항 반영
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인