🇰🇷 한글 설명
Linux 커널의 drm/i915 드라이버에서 4GB 이상의 GEM shmem 객체를 처리할 때, scatterlist의 length 필드(unsigned int)가 오버플로우되어 메모리 매핑 중 예상치 못한 페이지 접근 오류가 발생합니다. folio에서 할당된 페이지를 scatterlist에 추가할 때 max_segment 제한을 초과하면서 발생하는 문제입니다.
💡 쉬운 설명
Intel GPU 드라이버가 매우 큰 메모리(4GB 이상)를 다룰 때 크기 계산 오류가 발생합니다. 이로 인해 프로그램이 잘못된 메모리 위치에 접근하여 크래시하거나 예상치 못한 동작을 할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/i915: Fix potential overflow of shmem scatterlist length
When a scatterlists table of a GEM shmem object of size 4 GB or more is
populated with pages allocated from a folio, unsigned int .length
attribute of a scatterlist may get overflowed if total byte length of
pages allocated to that single scatterlist happens to reach or cross the
4GB limit. As a consequence, users of the object may suffer from hitting
unexpected, premature end of the object's backing pages.
[278.780187] ------------[ cut here ]------------
[278.780377] WARNING: CPU: 1 PID: 2326 at drivers/gpu/drm/i915/i915_mm.c:55 remap_sg+0x199/0x1d0 [i915]
...
[278.780654] CPU: 1 UID: 0 PID: 2326 Comm: gem_mmap_offset Tainted: G S U 6.17.0-rc1-CI_DRM_16981-ged823aaa0607+ #1 PREEMPT(voluntary)
[278.780656] Tainted: [S]=CPU_OUT_OF_SPEC, [U]=USER
[278.780658] Hardware name: Intel Corporation Meteor Lake Client Platform/MTL-P LP5x T3 RVP, BIOS MTLPFWI1.R00.3471.D91.2401310918 01/31/2024
[278.780659] RIP: 0010:remap_sg+0x199/0x1d0 [i915]
...
[278.780786] Call Trace:
[278.780787] <TASK>
[278.780788] ? __apply_to_page_range+0x3e6/0x910
[278.780795] ? __pfx_remap_sg+0x10/0x10 [i915]
[278.780906] apply_to_page_range+0x14/0x30
[278.780908] remap_io_sg+0x14d/0x260 [i915]
[278.781013] vm_fault_cpu+0xd2/0x330 [i915]
[278.781137] __do_fault+0x3a/0x1b0
[278.781140] do_fault+0x322/0x640
[278.781143] __handle_mm_fault+0x938/0xfd0
[278.781150] handle_mm_fault+0x12c/0x300
[278.781152] ? lock_mm_and_find_vma+0x4b/0x760
[278.781155] do_user_addr_fault+0x2d6/0x8e0
[278.781160] exc_page_fault+0x96/0x2c0
[278.781165] asm_exc_page_fault+0x27/0x30
...
That issue was apprehended by the author of a change that introduced it,
and potential risk even annotated with a comment, but then never addressed.
When adding folio pages to a scatterlist table, take care of byte length
of any single scatterlist not exceeding max_segment.
(cherry picked from commit 06249b4e691a75694c014a61708c007fb5755f60)
📍 영향받는 시스템
Linux 커널 6.17.0-rc1 이전의 Intel Meteor Lake 및 호환 GPU 시스템(drm/i915 드라이버)
⚔️ 공격 벡터
로컬 권한 있는 사용자가 4GB 이상의 GEM 객체에 메모리 매핑을 시도하면 자동으로 트리거됨
🛡️ 대응 방법
Linux 커널을 패치 버전 06249b4e691a75694c014a61708c007fb5755f60 이후로 업그레이드
🔧 검증 코드
커널 버전이 6.17 미만이면 취약할 수 있음. 6.17.0-rc1 이후 버전이면 패치됨.
cat /proc/version | grep -oE '6\.(1[0-6]|[0-9]\.)' | head -1