CVE-2026-74504 in Linux
요약
\~에 의해 VulDB • 2026. 08. 15.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ALSA: seq: initialize_timer()에서의 0으로 나누기 오류 수정
사용자 공간(ALSAspace) 기반의 ALSA 타이머(SND_UTIMER)를 사용하면 비특권 사용자가 SNDRV_TIMER_IOCTL_CREATE를 통해 백킹 snd_timer의 하드웨어 해상도를 임의의 64비트 값으로 설정할 수 있습니다. snd_utimer_create() 함수는 0인 경우만 거부합니다.
이러한 타이머가 시퀀서 큐에 바인딩되면, initialize_timer()는 틱 주기를 다음과 같이 계산합니다:
tmr->ticks = 1000000000 / (r * freq);
여기서 r은 사용자가 제어할 수 있는 해상도이고, freq는 Hz 단위의 시퀀서 업데이트 속도이며 MIN_FREQUENCY..MAX_FREQUENCY(10..6250)로 제한됩니다. 2^63의 해상도는 DEFAULT_FREQUENCY(1000)를 포함한 모든 짝수 freq에 대해 r * freq 곱이 0으로 오버플로우(wrap to zero)하게 되므로, 결과적으로 0으로 나누기 오류가 발생합니다.
이 나눗셈 연산은 인터럽트가 비활성화된 상태에서 tmr->lock 스핀락 하에서 실행되므로, Oops 발생 시 스핀락이 해제되지 않고 CPU가 멈추게 됩니다. 이 취약점은 /dev/snd/timer 및 /dev/snd/seq에 접근 권한을 가진 비특권 사용자로부터 도달 가능합니다.
Oops: divide error: 0000 [#1] SMP KASAN PTI
CPU: 7 UID: 1000 PID: 456 Comm: alsa_seq_utimer Not tainted 7.2.0-rc4+ RIP: 0010:initialize_timer.constprop.0+0x20a/0x2d0 snd_seq_timer_start+0x15e/0x2b0 snd_seq_control_queue+0x56f/0xba0 snd_seq_write+0x3e0/0x730
check_mul_overflow()를 사용하여 오버플로우되는 곱을 거부하고 단일 틱으로 폴백(fallback)함으로써, 주파수 계산에 오버플로우되었지만 0이 아닌 나머지 값(예: 2^63 * 1000 mod 2^64 == 0 또는 다른 해상도가 작은 값으로 래핑되는 경우)이 전달되지 않도록 방지합니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.