🇰🇷 한글 설명
Linux 커널의 VMCI 드라이버에서 memcpy() 함수가 구조체 필드 경계를 넘어 메모리를 복사하는 버그입니다. payload_size를 포함한 전체 데이터그램 크기만큼 복사하려고 하지만, 목적지 버퍼의 msg 필드는 24바이트로 고정되어 있어 오버플로우가 발생합니다.
💡 쉬운 설명
Linux 커널이 메모리에 데이터를 복사할 때 버퍼 크기를 초과해서 복사하려는 시도를 했습니다. 이는 메모리 보안 문제를 일으킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
VMCI: Fix memcpy() run-time warning in dg_dispatch_as_host()
Syzkaller hit 'WARNING in dg_dispatch_as_host' bug.
memcpy: detected field-spanning write (size 56) of single field "&dg_info->msg"
at drivers/misc/vmw_vmci/vmci_datagram.c:237 (size 24)
WARNING: CPU: 0 PID: 1555 at drivers/misc/vmw_vmci/vmci_datagram.c:237
dg_dispatch_as_host+0x88e/0xa60 drivers/misc/vmw_vmci/vmci_datagram.c:237
Some code commentry, based on my understanding:
544 #define VMCI_DG_SIZE(_dg) (VMCI_DG_HEADERSIZE + (size_t)(_dg)->payload_size)
/// This is 24 + payload_size
memcpy(&dg_info->msg, dg, dg_size);
Destination = dg_info->msg ---> this is a 24 byte
structure(struct vmci_datagram)
Source = dg --> this is a 24 byte structure (struct vmci_datagram)
Size = dg_size = 24 + payload_size
{payload_size = 56-24 =32} -- Syzkaller managed to set payload_size to 32.
35 struct delayed_datagram_info {
36 struct datagram_entry *entry;
37 struct work_struct work;
38 bool in_dg_host_queue;
39 /* msg and msg_payload must be together. */
40 struct vmci_datagram msg;
41 u8 msg_payload[];
42 };
So those extra bytes of payload are copied into msg_payload[], a run time
warning is seen while fuzzing with Syzkaller.
One possible way to fix the warning is to split the memcpy() into
two parts -- one -- direct assignment of msg and second taking care of payload.
Gustavo quoted:
"Under FORTIFY_SOURCE we should not copy data across multiple members
in a structure."
📍 영향받는 시스템
Linux kernel의 VMCI 드라이버 (drivers/misc/vmw_vmci/vmci_datagram.c)
⚔️ 공격 벡터
로컬 공격자가 VMCI 통신 인터페이스를 통해 payload_size를 조작하여 버퍼 오버플로우 트리거
🛡️ 대응 방법
커널을 최신 패치 버전으로 업데이트하여 memcpy()를 msg와 payload 복사로 분리한 수정 사항 적용
🔧 검증 코드
현재 커널 버전을 확인하고 VMCI 드라이버 모듈이 시스템에 존재하는지 확인합니다. 출력된 버전이 수정된 패치 버전인지 보안 공지에서 확인하세요.
uname -r && ls -la /lib/modules/$(uname -r)/kernel/drivers/misc/vmw_vmci/ 2>/dev/null | grep -i vmci