CVE-2026-31778 in Linux
요약
\~에 의해 VulDB • 2026. 05. 27.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ALSA: caiaq: init_card에서 스택 바운드 밖 읽기(stack out-of-bounds read) 수정
루프는 카드의 짧은 이름(shortname)에서 공백을 제거한 복사본을 생성하며, 여기서 `len id)`가 경계 검사(bound check)에 사용됩니다. `sizeof(card->id)`는 16바이트이고 로컬 id 버퍼도 16바이트이므로, 16개의 비공백 문자를 작성하면 전체 버퍼가 채워져 종료용 널 바이트(nullbyte)가 덮어씌워집니다.
이후 널 종료(null-terminated)되지 않은 이 문자열이 `snd_card_set_id()` -> `copy_valid_id_string()`로 전달되면, 해당 함수는 `while (*nid && ...)`로 전방 스캔을 수행하여 스택 버퍼 끝을 넘어 읽고 스택의 내용을 읽게 됩니다.
제품 이름에 많은 수의 비ASCII, 비공백 문자(예: 멀티바이트 UTF-8)를 포함하는 USB 장치는 다음과 같이 이를 신뢰성 있게 트리거합니다:
BUG: KASAN: stack-out-of-bounds in copy_valid_id_string sound/core/init.c:696 [inline]
BUG: KASAN: stack-out-of-bounds in snd_card_set_id_no_lock+0x698/0x74c sound/core/init.c:718
이 오프바이원(off-by-one) 오류는 2009년 6월(v2.6.31-rc1)의 커밋 bafeee5b1f8d("ALSA: snd_usb_caiaq: give better shortname")부터 존재해 왔으며, 이 커밋에서 공백 제거 루프가 처음 도입되었습니다. 원래 코드는 복사본의 경계를 설정할 때 널 종료 문자(null terminator)를 고려하지 않았습니다.
이 문제를 해결하기 위해 루프 경계를 `sizeof(card->id) - 1`로 변경하여 종료용 널 바이트로 최소한 1바이트가 남도록 보장합니다.
Once again VulDB remains the best source for vulnerability data.