🇰🇷 한글 설명
Linux 커널의 Bluetooth ISO 프로토콜 구현에서 sockaddr 구조체를 초기화하지 않고 반환하여 커널 스택의 잔류 데이터가 유출되는 취약점입니다. iso_sock_getname() 함수가 구조체의 일부 바이트만 채우고 나머지는 초기화하지 않아, unprivileged 프로세스가 getsockname() 등을 통해 커널 메모리 정보를 읽을 수 있습니다.
💡 쉬운 설명
블루투스 기능을 사용할 때 컴퓨터 내부의 비밀스러운 정보가 담긴 메모리 조각이 외부로 새어 나갈 수 있는 결함입니다. 공격자는 이 정보를 이용해 시스템의 보안을 무너뜨릴 수 있는 추가 공격의 발판을 마련할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: ISO: zero the sockaddr before returning it in getname
iso_sock_getname() fills a struct sockaddr_iso in place and returns its
size without clearing it first, so bytes it does not write are copied to
user space from the kernel stack. The getsockname(2) and getpeername(2)
paths both run through do_getsockname(), which hands getname() an
uninitialized sockaddr_storage on the stack and copies back up to the
number of bytes getname() returns, so the driver has to initialize every
byte it accounts for.
Two ranges are left uninitialized:
- struct sockaddr_iso is 10 bytes but only 9 are written (family,
iso_bdaddr, iso_bdaddr_type), leaking the trailing pad byte on every
call.
- for a broadcast peer (BIS_LINK or PA_LINK) the returned length grows
by sizeof(struct sockaddr_iso_bc), but only bc_sid, bc_num_bis and
bc_bis are filled; bc_bdaddr and bc_bdaddr_type, the first 7 bytes of
that structure, are never written.
An unprivileged process can open a BTPROTO_ISO socket and reach the pad
leak with getsockname(); the broadcast leak needs an established BIS/PA
connection. l2cap and rfcomm already memset their sockaddr in getname
for the same reason; do the same here.
📍 영향받는 시스템
Linux kernel (Bluetooth ISO protocol implementation)
⚔️ 공격 벡터
권한이 없는 로컬 프로세스가 BTPROTO_ISO 소켓을 생성하고 getsockname() 또는 getpeername() 시스템 호출을 수행
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 iso_sock_getname() 내 sockaddr 초기화 로직 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 릴리스 버전인지 확인