🇰🇷 한글 설명
Linux 커널의 ALSA usb-audio 드라이버에서 발생하는 경계 외(OOB) 쓰기 취약점입니다. 악의적인 USB 장치가 비정상적으로 작은 패킷 크기를 광고할 경우, 음수 값이 계산되어 메모리의 허용 범위를 벗어난 영역에 데이터를 쓰는 메모리 오염이 발생할 수 있습니다.
💡 쉬운 설명
가짜 USB 오디오 장치를 컴퓨터에 연결하면 컴퓨터의 메모리 영역을 망가뜨릴 수 있는 보안 약점입니다. 장치가 아주 작은 데이터 크기를 보낸다고 속이면 시스템이 계산 실수를 하여 잘못된 위치에 데이터를 쓰게 됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ALSA: usb-audio: fix OOB write in snd_usbmidi_novation_output()
snd_usbmidi_novation_output() lays out a two-byte header at
transfer_buffer[0..1] and passes &transfer_buffer[2] together with a
length of ep->max_transfer - 2 to snd_rawmidi_transmit():
count = snd_rawmidi_transmit(ep->ports[0].substream,
&transfer_buffer[2],
ep->max_transfer - 2);
ep->max_transfer comes from the output endpoint's wMaxPacketSize via
usb_maxpacket(). A malformed or malicious device can advertise a bulk
OUT endpoint with a wMaxPacketSize of 1 - the USB core only clamps this
value downwards - so ep->max_transfer becomes 1 and the count argument
becomes -1.
snd_rawmidi_transmit() passes the negative count on to
__snd_rawmidi_transmit_peek(), where "if (count1 > count) count1 = count"
leaves count1 negative; get_aligned_size() keeps it negative for a
byte-stream substream, so the following memcpy(buffer, ..., count1) runs
with a (size_t)-1 length and writes far past the transfer buffer, which
was allocated with usb_alloc_coherent(ep->max_transfer).
This is the same class of bug that was fixed for snd_usbmidi_akai_output()
in commit 0970274613fb ("ALSA: usb-audio: fix OOB write in
snd_usbmidi_akai_output()"); the novation output routine was left
unguarded. Bail out when the endpoint cannot hold the two-byte header
plus at least one payload byte.
📍 영향받는 시스템
Linux Kernel (ALSA usb-audio driver components)
⚔️ 공격 벡터
악의적으로 조작된 wMaxPacketSize를 가진 USB MIDI 장치를 연결하여 공격
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.