🇰🇷 한글 설명
Linux 커널 fbdev 모듈의 fb_cvt_hperiod() 함수에서 mode->refresh 값이 0x80000000일 때 정수 오버플로우로 인해 cvt.f_refresh가 0이 되고, 이를 나눗셈 연산의 피제수로 사용하면서 division by 0 오류가 발생합니다. 이로 인해 커널 oops(시스템 크래시)가 유발될 수 있습니다.
💡 쉬운 설명
리눅스 커널의 화면 드라이버에서 특정 설정값을 입력하면 0으로 나누기 오류가 발생해 시스템이 강제로 멈춥니다. 로컬 사용자가 악의적인 값으로 커널을 크래시시킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fbdev: core: fbcvt: avoid division by 0 in fb_cvt_hperiod()
In fb_find_mode_cvt(), iff mode->refresh somehow happens to be 0x80000000,
cvt.f_refresh will become 0 when multiplying it by 2 due to overflow. It's
then passed to fb_cvt_hperiod(), where it's used as a divider -- division
by 0 will result in kernel oops. Add a sanity check for cvt.f_refresh to
avoid such overflow...
Found by Linux Verification Center (linuxtesting.org) with the Svace static
analysis tool.
📍 영향받는 시스템
Linux kernel fbdev 드라이버 (모든 버전, 특히 frambuffer 모드 설정 가능한 시스템)
⚔️ 공격 벡터
로컬 사용자가 fbdev ioctl 인터페이스를 통해 조작된 refresh 값을 전달하여 Denial of Service 유발
🛡️ 대응 방법
Linux 커널을 cvt.f_refresh 오버플로우 체크 패치가 포함된 최신 버전으로 업데이트
🔧 검증 코드
커널 버전과 fbdev 활성화 상태를 확인하여 패치 적용 여부를 판단하고 필요시 커널 업데이트 수행
uname -r | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' && grep -i 'fbdev\|framebuffer' /boot/config-$(uname -r) 2>/dev/null | head -3