🇰🇷 한글 설명
Linux 커널의 Ceph 파일 시스템에서 inline_data를 가져오기 위해 Fwb 캡을 보유하는 동안 발생할 수 있는 데드락(교착 상태) 취약점입니다. 특정 조건에서 파일 생성 및 쓰기 작업이 동시에 발생할 경우, MDS와 클라이언트 간의 캡(cap) 교환 과정에서 서로를 기다리며 시스템이 멈출 수 있습니다.
💡 쉬운 설명
파일을 만들고 바로 내용을 쓰는 과정에서 컴퓨터의 관리 시스템들이 서로의 작업이 끝나기만을 기다리며 무한 대기에 빠지는 문제입니다. 이로 인해 파일 시스템이 응답하지 않거나 시스템이 멈출 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ceph: fix possible deadlock when holding Fwb to get inline_data
1, mount with wsync.
2, create a file with O_RDWR, and the request was sent to mds.0:
ceph_atomic_open()-->
ceph_mdsc_do_request(openc)
finish_open(file, dentry, ceph_open)-->
ceph_open()-->
ceph_init_file()-->
ceph_init_file_info()-->
ceph_uninline_data()-->
{
...
if (inline_version == 1 || /* initial version, no data */
inline_version == CEPH_INLINE_NONE)
goto out_unlock;
...
}
The inline_version will be 1, which is the initial version for the
new create file. And here the ci->i_inline_version will keep with 1,
it's buggy.
3, buffer write to the file immediately:
ceph_write_iter()-->
ceph_get_caps(file, need=Fw, want=Fb, ...);
generic_perform_write()-->
a_ops->write_begin()-->
ceph_write_begin()-->
netfs_write_begin()-->
netfs_begin_read()-->
netfs_rreq_submit_slice()-->
netfs_read_from_server()-->
rreq->netfs_ops->issue_read()-->
ceph_netfs_issue_read()-->
{
...
if (ci->i_inline_version != CEPH_INLINE_NONE &&
ceph_netfs_issue_op_inline(subreq))
return;
...
}
ceph_put_cap_refs(ci, Fwb);
The ceph_netfs_issue_op_inline() will send a getattr(Fsr) request to
mds.1.
4, then the mds.1 will request the rd lock for CInode::filelock from
the auth mds.0, the mds.0 will do the CInode::filelock state transation
from excl --> sync, but it need to revoke the Fxwb caps back from the
clients.
While the kernel client has aleady held the Fwb caps and waiting for
the getattr(Fsr).
It's deadlock!
URL: https://tracker.ceph.com/issues/55377
📍 영향받는 시스템
Linux Kernel (Ceph 파일 시스템 사용 환경)
⚔️ 공격 벡터
로컬 사용자가 특정 조건(wsync 마운트 및 특정 쓰기 패턴)을 유도하여 데드락 발생 가능
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.