🇰🇷 한글 설명
Linux 커널의 Bluetooth RFCOMM 서브시스템에서, rfcomm_dev_add()가 장치를 목록에 등록한 뒤 tty 장치 등록이 실패하면 dev->tty_dev가 설정되지 않은 채 남습니다. 이후 해당 tty를 닫을 때 rfcomm_dev_shutdown()이 NULL 포인터를 검사 없이 역참조하여 커널 패닉 또는 NULL 포인터 역참조 오류가 발생합니다. 수정은 rfcomm_dev_shutdown()에 NULL 검사를 추가하는 것입니다.
💡 쉬운 설명
블루투스 시리얼 통신 기능에서 장치 준비가 완전히 끝나지 않은 상태에서 장치를 닫으면 시스템이 잘못된 메모리 주소를 읽으려다 멈출 수 있습니다. 커널에 간단한 확인 코드를 추가하여 이 문제를 막습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: RFCOMM: Fix NULL tty_dev dereference in rfcomm_dev_shutdown
syzbot hit a NULL pointer dereference in rfcomm_dev_shutdown() when an
RFCOMM tty is closed.
rfcomm_dev_add() puts the new device on rfcomm_dev_list first and only
then registers the tty device and saves it in dev->tty_dev. If that
registration fails, dev->tty_dev is never set at all. The device can be
looked up in the meantime, so an open() of /dev/rfcommN gets through
rfcomm_tty_install() and attaches to it. When that tty is closed again,
rfcomm_dev_shutdown() uses dev->tty_dev without checking it:
Oops: general protection fault, probably for non-canonical address
KASAN: null-ptr-deref in range [0x0000000000000040-0x0000000000000047]
RIP: 0010:rfcomm_dev_shutdown+0x48/0xb0 net/bluetooth/rfcomm/tty.c:131
Call Trace:
tty_port_shutdown+0x1bf/0x220 drivers/tty/tty_port.c:372
tty_port_close+0x4e/0x150 drivers/tty/tty_port.c:705
tty_release+0x359/0x1670 drivers/tty/tty_io.c:1718
__fput+0x418/0xa50 fs/file_table.c:512
rfcomm_dev_destruct() already copes with a NULL dev->tty_dev. Add the
same check to rfcomm_dev_shutdown(), so the tty device is only moved
when it was actually registered.
📍 영향받는 시스템
Linux 커널 (RFCOMM/Bluetooth 서브시스템을 포함한 버전, 수정 커밋 적용 전 커널 전반)
⚔️ 공격 벡터
로컬 사용자가 블루투스 RFCOMM 장치(/dev/rfcommN)를 열고 닫는 경로를 악용하여 커널 충돌 또는 서비스 거부를 유발할 수 있음
🛡️ 대응 방법
배포판 제공 최신 커널로 업데이트하거나 rfcomm_dev_shutdown()에 dev->tty_dev NULL 검사를 포함한 upstream 수정 패치를 적용
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지 또는 Linux 커널 git 로그에서 CVE-2026-99008 수정 커밋이 포함된 버전과 비교하여, 해당 버전 이상이면 패치된 것이고 미만이면 업데이트가 필요합니다.