🇰🇷 한글 설명
Linux 커널의 ALSA seq MIDI 구성 요소에서 발생하는 취약점으로, MIDI 출력 해제 과정 중 동기화가 이루어지지 않아 발생합니다. 이로 인해 잘못된 메모리 참조가 발생하여 NULL 포인터 역참조(NULL-deref) 또는 Use-After-Free(UAF) 오류가 발생할 수 있습니다.
💡 쉬운 설명
음악 장치를 제어하는 소프트웨어 내부에서 데이터 처리 순서가 꼬여, 이미 삭제된 메모리 공간을 다시 사용하려고 시도하는 문제입니다. 이로 인해 시스템이 갑자기 멈추거나 보안 공격에 취약해질 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ALSA: seq: midi: Serialize output teardown with event_input
event_process_midi() borrows msynth->output_rfile.output and then
passes the substream to dump_midi() and snd_rawmidi_kernel_write()
without synchronizing with the output open/close transition.
midisynth_use() also publishes output_rfile before
snd_rawmidi_output_params() has finished.
The last midisynth_unuse() can therefore release the same rawmidi file
and free substream->runtime before snd_rawmidi_kernel_write1() takes
its runtime buffer reference. That leaves the event_input path using a
stale substream or runtime and can end in a NULL-deref or use-after-free.
Fix this with two pieces of synchronization. Keep a short IRQ-safe
spinlock only for publishing or clearing output_rfile and for pairing
the output snapshot with an snd_use_lock_t reference. Once
event_process_midi() has taken that in-flight reference, it drops the
spinlock before calling snd_seq_dump_var_event(), dump_midi(), or
snd_rawmidi_kernel_write(). midisynth_unuse() now detaches the visible
rawmidi file under the same spinlock, waits for the in-flight writers
to drain, and only then drains and releases the saved file.
midisynth_use() likewise opens into a local snd_rawmidi_file and
publishes it only after snd_rawmidi_output_params() succeeds.
The buggy scenario involves two paths, with each column showing the
order within that path:
event_input path: last unuse path:
1. event_process_midi() snapshots 1. midisynth_unuse() starts
output_rfile.output. tearing down output_rfile.
2. dump_midi() reaches 2. snd_rawmidi_kernel_release()
snd_rawmidi_kernel_write() closes the output file.
before runtime is pinned. 3. close_substream() frees
3. The callback keeps using substream->runtime.
the borrowed substream.
Validation reproduced this kernel report:
KASAN null-ptr-deref in snd_rawmidi_kernel_write1+0x56/0x360
RIP: 0033:0x7fde7dd0837f
RIP: 0010:snd_rawmidi_kernel_write1+0x56/0x360
📍 영향받는 시스템
Linux Kernel (ALSA seq: midi 구성 요소 포함 버전)
⚔️ 공격 벡터
특수하게 조작된 MIDI 이벤트를 전송하여 커널의 메모리 해제와 데이터 처리 간의 타이밍 차이(Race Condition)를 유도
🛡️ 대응 방법
커널 패치를 적용하여 output_rfile의 게시 및 해제 과정에 스핀락(Spinlock) 동기화를 적용한 최신 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인