🇰🇷 한글 설명
Linux 커널 fbdev 드라이버에서 fb_set_var() 함수의 메모리 할당 실패 시 fb_info->var가 이전 상태로 복구되지 않아 fb_videomode_to_var()에서 null pointer dereference가 발생합니다. 디스플레이 설정 변경 중 일반 보호 오류(general protection fault)를 유발하여 커널 패닉을 야기할 수 있습니다.
💡 쉬운 설명
리눅스 화면 설정 코드에서 메모리 부족 시 불완전한 상태가 복구되지 않아 시스템 충돌을 일으킬 수 있습니다. 화면 해상도 변경 시에 발생할 수 있는 DoS 취약점입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fbdev: Fix fb_set_var to prevent null-ptr-deref in fb_videomode_to_var
If fb_add_videomode() in fb_set_var() fails to allocate memory for
fb_videomode, later it may lead to a null-ptr dereference in
fb_videomode_to_var(), as the fb_info is registered while not having the
mode in modelist that is expected to be there, i.e. the one that is
described in fb_info->var.
================================================================
general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN NOPTI
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
CPU: 1 PID: 30371 Comm: syz-executor.1 Not tainted 5.10.226-syzkaller #0
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
RIP: 0010:fb_videomode_to_var+0x24/0x610 drivers/video/fbdev/core/modedb.c:901
Call Trace:
display_to_var+0x3a/0x7c0 drivers/video/fbdev/core/fbcon.c:929
fbcon_resize+0x3e2/0x8f0 drivers/video/fbdev/core/fbcon.c:2071
resize_screen drivers/tty/vt/vt.c:1176 [inline]
vc_do_resize+0x53a/0x1170 drivers/tty/vt/vt.c:1263
fbcon_modechanged+0x3ac/0x6e0 drivers/video/fbdev/core/fbcon.c:2720
fbcon_update_vcs+0x43/0x60 drivers/video/fbdev/core/fbcon.c:2776
do_fb_ioctl+0x6d2/0x740 drivers/video/fbdev/core/fbmem.c:1128
fb_ioctl+0xe7/0x150 drivers/video/fbdev/core/fbmem.c:1203
vfs_ioctl fs/ioctl.c:48 [inline]
__do_sys_ioctl fs/ioctl.c:753 [inline]
__se_sys_ioctl fs/ioctl.c:739 [inline]
__x64_sys_ioctl+0x19a/0x210 fs/ioctl.c:739
do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
================================================================
The reason is that fb_info->var is being modified in fb_set_var(), and
then fb_videomode_to_var() is called. If it fails to add the mode to
fb_info->modelist, fb_set_var() returns error, but does not restore the
old value of fb_info->var. Restore fb_info->var on failure the same way
it is done earlier in the function.
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
📍 영향받는 시스템
Linux kernel 5.10.226 이하 (fbdev 드라이버 활성화 시스템)
⚔️ 공격 벡터
fb_ioctl()을 통한 디스플레이 설정 ioctl 호출로 메모리 할당 실패 발생
🛡️ 대응 방법
Linux 커널을 5.10.227 이상의 패치된 버전으로 업데이트
🔧 검증 코드
커널 버전이 5.10.227 이상이면 Safe, 미만이면 Vulnerable 출력
uname -r | awk -F'[.-]' '{gsub(/[^0-9]/,""); v=substr($0,1,10); if(v>=510227000) print "Safe"; else print "Vulnerable"}'