🇰🇷 한글 설명
Linux 커널 시리얼 드라이버(serial/core)의 divide by zero 취약점. TIOCSSERIAL ioctl 호출 시 유효하지 않은 baud_base로 인해 uartclk이 0으로 설정되면, uart_get_divisor() 함수에서 0으로 나누는 연산이 발생하여 커널 패닉 유발.
💡 쉬운 설명
Linux의 시리얼 포트 설정 명령어에 잘못된 값을 전달하면 커널이 0으로 나누려고 시도하여 시스템이 충돌합니다. 로컬 사용자가 이를 악용하여 서비스 거부 공격을 수행할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
serial: core: check uartclk for zero to avoid divide by zero
Calling ioctl TIOCSSERIAL with an invalid baud_base can
result in uartclk being zero, which will result in a
divide by zero error in uart_get_divisor(). The check for
uartclk being zero in uart_set_info() needs to be done
before other settings are made as subsequent calls to
ioctl TIOCSSERIAL for the same port would be impacted if
the uartclk check was done where uartclk gets set.
Oops: divide error: 0000 PREEMPT SMP KASAN PTI
RIP: 0010:uart_get_divisor (drivers/tty/serial/serial_core.c:580)
Call Trace:
<TASK>
serial8250_get_divisor (drivers/tty/serial/8250/8250_port.c:2576
drivers/tty/serial/8250/8250_port.c:2589)
serial8250_do_set_termios (drivers/tty/serial/8250/8250_port.c:502
drivers/tty/serial/8250/8250_port.c:2741)
serial8250_set_termios (drivers/tty/serial/8250/8250_port.c:2862)
uart_change_line_settings (./include/linux/spinlock.h:376
./include/linux/serial_core.h:608 drivers/tty/serial/serial_core.c:222)
uart_port_startup (drivers/tty/serial/serial_core.c:342)
uart_startup (drivers/tty/serial/serial_core.c:368)
uart_set_info (drivers/tty/serial/serial_core.c:1034)
uart_set_info_user (drivers/tty/serial/serial_core.c:1059)
tty_set_serial (drivers/tty/tty_io.c:2637)
tty_ioctl (drivers/tty/tty_io.c:2647 drivers/tty/tty_io.c:2791)
__x64_sys_ioctl (fs/ioctl.c:52 fs/ioctl.c:907
fs/ioctl.c:893 fs/ioctl.c:893)
do_syscall_64 (arch/x86/entry/common.c:52
(discriminator 1) arch/x86/entry/common.c:83 (discriminator 1))
entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
Rule: add
📍 영향받는 시스템
모든 Linux 배포판의 kernel (serial/core 모듈 포함), 패치 전 모든 버전
⚔️ 공격 벡터
로컬 사용자가 TIOCSSERIAL ioctl을 호출하여 invalid baud_base 값을 전달해 uartclk을 0으로 설정
🛡️ 대응 방법
Linux 커널 패치 적용 (uart_set_info() 함수에서 uartclk 0 검증 추가)
🔧 검증 코드
커널 버전을 확인하여 kernel.org 보안 공지 또는 배포판별 패치 리릴리스 목록에서 해당 버전이 CVE-2024-43893 패치를 포함하는지 확인
uname -r | grep -oE '[0-9]+\.[0-9]+' && cat /proc/version | grep -oE 'Linux version [^ ]+'