🇰🇷 한글 설명
Linux 커널의 drm/vmwgfx 구성 요소에서 외부 BO(Buffer Object) 복사 시 경계 검증이 미흡하여 발생하는 취약점입니다. 공격자가 조작된 오프셋, 스트라이드(stride), 높이 값을 전달할 경우 메모리 경계를 벗어나 데이터가 복사되는 버퍼 오버플로우가 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터의 그래픽 메모리를 다루는 과정에서 데이터의 범위를 제대로 확인하지 않아 발생하는 오류입니다. 나쁜 의도를 가진 프로그램이 잘못된 크기 정보를 보내면 컴퓨터의 중요한 메모리 영역을 침범할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/vmwgfx: validate external BO copy bounds for both stride paths
vmw_external_bo_copy() trusts caller-supplied offsets, strides, and
heights and operates on imported dma-buf vmaps:
- The equal-stride memcpy() bound was clamped after subtracting the
offsets from dst_size and src_size; an offset larger than the BO
size wraps the unsigned subtraction to a huge value and the
resulting memcpy() runs off the end of the vmap. dst_stride *
height is also a u32 multiplication that can overflow.
- The non-equal-stride row-by-row path had no bound at all. The
loop touches bytes through offset + (height - 1) * stride +
width_in_bytes, with only a WARN_ON(dst_stride < width_in_bytes),
and could likewise step past the end of either mapping.
The offsets and strides are derived from STDU/SOU plane state, so a
configured CRTC submitting a crafted atomic commit on an imported
framebuffer can reach this path.
Validate the exact row-copy endpoint against each BO's size up front
using check_mul_overflow() and check_add_overflow(). Use the bulk
memcpy() path only when width_in_bytes covers the whole stride;
otherwise copy one row at a time so partial-row updates near the bottom
of a framebuffer remain valid. Also reject zero strides and stride <
width_in_bytes, both of which the row-by-row path cannot represent
safely.
📍 영향받는 시스템
Linux kernel (drm/vmwgfx 드라이버를 사용하는 시스템)
⚔️ 공격 벡터
조작된 atomic commit을 포함한 프레임버퍼를 제출하여 취약한 메모리 복사 경로 실행
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 경계 검증 로직 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 취약점이 해결된 패치 버전인지 확인합니다.