subsys/bluetooth/host/classic/sdp.c의 bt_sdp_parse_attribute()는 SDP 레코드 버퍼가 유형 표시 바이트와 2바이트 속성 ID(buf->len < 3 확인)를 보유하고 있다는 것만 검증한 다음 net_buf_simple_pull_u8()을 통해 네 번째 바이트인 데이터 요소 설명자(유형)를 읽습니다. net_buf_simple_pull_u8()은 유일한 경계 가드(CONFIG_ASSERT가 비활성화되었을 때 컴파일되는 __ASSERT_NO_MSG, 프로덕션 기본값) 이전에 buf->data[0]를 역참조하기 때문에 정확히 3바이트(0x
subsys/bluetooth/host/classic/sdp.c의 bt_sdp_parse_attribute()는 SDP 레코드 버퍼가 유형 표시 바이트와 2바이트 속성 ID(buf->len < 3 확인)를 보유하고 있다는 것만 검증한 다음 net_buf_simple_pull_u8()을 통해 네 번째 바이트인 데이터 요소 설명자(유형)를 읽습니다. net_buf_simple_pull_u8()은 유일한 경계 가드(CONFIG_ASSERT가 비활성화되었을 때 컴파일되는 __ASSERT_NO_MSG, 프로덕션 기본값) 이전에 buf->data[0]를 역참조하기 때문에 정확히 3바이트(0x09 다음에 2바이트 속성 ID가 옴)의 레코드는 논리 버퍼의 끝을 지나 1바이트 읽기를 발생시킵니다. 파서는 인바운드 원격 제어 데이터에서 접근할 수 있습니다. SDP 서버 역할을 하는 Bluetooth BR/EDR 피어는 클라이언트 수신 버퍼에 그대로 저장되고 공용 bt_sdp_get_attr()/bt_sdp_has_attr()/bt_sdp_record_parse() 도우미를 통해 구문 분석되는 검색-응답 레코드를 반환합니다. 초과 읽기는 내부 길이 선택기로만 사용되는 단일 바이트로 제한되며 공격자에게 절대 유출되지 않습니다. 후속 길이 확인에서는 잘못된 레코드를 거부합니다. 따라서 현실적인 영향은 극단적인 서비스 거부로 제한됩니다(레코드가 매핑된 메모리 경계에서 정확히 끝나는 경우에만 오류가 발생하거나 CONFIG_ASSERT=y인 경우 결정론적 어설션 패닉이 발생함). Zephyr v4.3.0 및 v4.4.0에 영향을 미칩니다. 길이 확인에 sizeof(type)을 추가하여 수정되었습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 71.00 |
| 악용 신호(PoC 존재) | ×1.20 |
| VPI | 85.20 |
VPI 공식 vpi-v1 기준