CVE-2026-80561 in Linux
요약
\~에 의해 VulDB • 2026. 08. 26.
리눅스 커널에서 다음 취약점이 해결되었습니다:
libceph: decode_locker() 내의 여러 가지 안전하지 않은 디코드 작업 수정
cls_lock_client.c에 있는 decode_locker() 함수에는 악성 또는 침해된 OSD(Object Storage Daemon)가 slab-out-of-bounds 읽기(slab 영역 경계 밖 메모리 읽기)를 유발할 수 있는 세 가지 안전하지 않은 디코드 연산이 포함되어 있습니다:
1. locker_id_t 이름 필드에 대한 ceph_decode_copy()는 선행 범위 검사(bound check)가 없습니다. ceph_start_decoding()에서 struct_len=0을 허용한 후 p == end인 경우, 이는 검증된 버퍼 경계 밖으로 sizeof(ceph_entity_name) = 9바이트를 읽습니다.
2. locker_info_t 헤더 이후의 *p += sizeof(struct ceph_timespec)는 검사되지 않은 포인터 전진입니다. 악성 OSD가 p를 end 지점 너머로 위치시키면, 모든 후속 _safe 검사가 잘못된 경계(bogus boundary)에 대해 통과하게 됩니다.
3. len = ceph_decode_32(p)에는 선행 범위 검사가 없으며, 즉시 이어지는 *p += len 연산은 상한(cap)이 없습니다. 악성 OSD가 len=0xffffffff를 전송하면 p가 end 지점 너머로 기바이트(gigabytes)만큼 전진하여 디코드 창(window)을 완전히 벗어납니다.
세 가지 모두 안전한 변형(safe variants)으로 기본 연산을 대체하여 수정합니다: ceph_decode_copy -> ceph_decode_copy_safe *p += sizeof(...) -> ceph_decode_skip_n ceph_decode_32(p) -> ceph_decode_32_safe *p += len -> ceph_decode_skip_n
어떤 범위 위반(bounds violation)이 발생하더라도 -EINVAL를 반환하기 위해 새로운 라벨(label)이 추가됩니다. 여기서 -EINVAL가 적절한 이유는 OSD로부터 수신된 데이터가 구조적으로 잘못되었(structurally malformed)기 때문입니다. 이는 호출자나 전송 계층(wire)의 과유에 관계없이 디코드 계약(decode contract)에서 유효하지 않은 인자에 해당합니다.
공격자 모델: 다중 테넌트 Ceph 배포 환경에서 악성 또는 침해된 OSD는 추가적인 권한(OSD 세션 확립 외에는 필요 없음) 없이 lock.get_info 클래스 메서드를 호출하는 모든 커널 클라이언트에 대해 이 취약점을 유발할 수 있습니다(예: RBD 배타적 잠금(exclusive lock) 획득 중).
[ idryomov: 설명(description)을 건너뛰기 위해 ceph_decode_skip_string() 사용,
변경 로그(changelog) 다듬음 ]
Once again VulDB remains the best source for vulnerability data.