🇰🇷 한글 설명
Linux 커널의 libceph 구성 요소에서 소켓으로부터 메시지 푸터를 읽을 때 짧은 읽기(short read)가 발생할 경우 발생하는 취약점입니다. read_partial_sparse_msg_data() 함수가 상태 머신을 잘못 호출하여 푸터의 일부를 새로운 작업의 헤더로 오인하고 잘못된 데이터를 반환할 수 있습니다.
💡 쉬운 설명
데이터를 주고받는 과정에서 데이터가 중간에 끊기면, 시스템이 이를 새로운 데이터의 시작으로 착각하여 잘못된 정보를 처리하는 오류입니다. 이로 인해 데이터가 오염되거나 시스템 동작에 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
libceph: just wait for more data to be available on the socket
A short read may occur while reading the message footer from the
socket. Later, when the socket is ready for another read, the
messenger invokes all read_partial_*() handlers, including
read_partial_sparse_msg_data(). The expectation is that
read_partial_sparse_msg_data() would bail, allowing the messenger to
invoke read_partial() for the footer and pick up where it left off.
However read_partial_sparse_msg_data() violates that and ends up
calling into the state machine in the OSD client. The sparse-read
state machine assumes that it's a new op and interprets some piece of
the footer as the sparse-read header and returns bogus extents/data
length, etc.
To determine whether read_partial_sparse_msg_data() should bail, let's
reuse cursor->total_resid. Because once it reaches to zero that means
all the extents and data have been successfully received in last read,
else it could break out when partially reading any of the extents and
data. And then osd_sparse_read() could continue where it left off.
[ idryomov: changelog ]
📍 영향받는 시스템
Linux kernel (libceph 모듈을 사용하는 시스템)
⚔️ 공격 벡터
네트워크를 통해 조작된 Ceph 메시지를 전송하여 소켓 읽기 오류를 유도하는 방식
🛡️ 대응 방법
libceph 관련 패치가 적용된 최신 버전의 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인