CVE-2026-64283 in Linux정보

요약

\~에 의해 VulDB • 2026. 07. 25.

리눅스 커널에서 다음 취약점이 해결되었습니다:

KVM: guest_memfd: memslot 바인딩의 오프셋(offset)과 크기(size)를 부호 없는(unsigned) 값으로 처리합니다.

guest_memfd 파일에 memslot을 바인딩할 때, 두 값의 합이 파일 크기에 대한 오버플로우 검사 시 잘못된 음성(false negative) 결과를 초래하는 버그를 수정하기 위해 오프셋과 크기를 부호 없는 값으로 취급해야 합니다. 또한 부호 없는 값을 사용하면 다른 흐름에서 안전성을 보장하기 위한 다소 모호한 체크에 의존하지 않게 되며, 의도된 대로 오프셋과 크기가 부호 없는 값으로 추적되도록 할 수 있습니다.

64비트 커널에서는 memslot이 포함하는 페이지의 수가 unsigned 64-bit 값이며, 따라서 guest_memfd 바인딩의 크기(및 오프셋) 또한 unsigned 64-bit 값입니다. offset+size를 uoff_t 대신 loff_t로 처리하면, 오프셋과/또는 크기가 매우 클 경우 부호 없는 값이 우연히 부호 있는(signed) 값으로 변환됩니다.

오프셋과 크기를 로컬에서 signed 값으로 저장하는 것은 그 자체로는 무해합니다(비록 이를 판별하기가 *매우* 어렵지만). 그러나 이들의 합을 연산하는 것은 그렇지 않습니다.

KVM은 오프셋에 대해 명시적으로 음수 값을 체크하고 있습니다. 이는 KVM이 정당한 바인딩을 잘못 거부할 수 있는 것처럼 보일 수 있어 버그처럼 보이지만, 실제로는 그렇지 않습니다. 왜냐하면 KVM_CREATE_GUEST_MEMFD는 크기에 대해 signed 값을 받기 때문입니다. 즉, 잠재적인 음수 오프셋은 어떤 guest_memfd 파일의 최대 가능한 크기보다도 더 큽니다.

크기의 경우를 보면, KVM에는 명시적으로 음수 값을 체크하는 로직이 없어(즉, 겉보기에 결함이 있는 오버플로우 검사) 보일 수 있지만, KVM은 단일 memslot 내 페이지 수를 가장 큰 양의 signed 32비트 값으로 제한합니다:

if (id < KVM_USER_MEM_SLOTS && (mem->memory_size >> PAGE_SHIFT) > KVM_MEM_MAX_NR_PAGES) return -EINVAL;

따라서 최대 "크기"는 항상 0x7fffffff000을 넘지 않습니다.

그러나 두 값의 합은 문제가 됩니다. 크기는 KVM의 memslot 로직에 의해 제한되지만, 오프셋은 그렇지 않습니다. 즉, 오프셋은 "offset + size > i_size_read(inode)" 체크가 이루어지기 전까지 완전히 검증되지 않습니다. 만약 오프셋이 (거의) 가능한 최대 _양수_ 값이라면, 크기를 더했을 때 부호 있는 64비트 음수 값을 초래할 수 있습니다. 파일 크기(항상 양수로 보장됨)와 비교할 때, 이 음수의 합은 항상 작으므로 KVM은 터무니없는 오프셋을 잘못 허용하게 됩니다.

부차적으로 kvm_mm.h에 누락된 include 문을 추가합니다(부모 헤더에 의존하는 대신).

If you want to get best quality of vulnerability data, you may have to visit VulDB.

책임이 있는

Linux

예약하다

2026. 07. 19.

모더레이션

수락

항목

VDB-383069

EPSS

0.00210

출처

Do you need the next level of professionalism?

Upgrade your account now!