FlawOpen

flawopen.com/Teardowns/cve-2026-55269-android-snooplogger-heap-write

● CVE-2026-55269 · CVSS 7.8 · 높음
보안 연구 · FlawOpen

CVE-2026-55269: Android Bluetooth SnoopLogger 힙 버퍼 범위 밖 쓰기

CVE-2026-55269는 Android Bluetooth SnoopLogger의 메모리 안전성 결함으로, 로컬 권한 상승으로 이어질 수 있습니다. 특정 개발자 로깅 설정에서 컨트롤러의 짧은 패킷이 공간이 부족한 상태로 고정 문자열 쓰기 경로에 도달할 수 있었습니다. Google은 반대로 된 크기 조정 조건을 수정하고 파싱 길이를 제한했습니다.

💡 알기 쉬운 설명 (ELI5)

직원이 좁은 소포에 “PROHIBITED” 도장을 찍는다고 생각해 보세요. 먼저 완충재를 넣어야 하지만, 반대로 붙은 표지 때문에 가장 작은 소포는 그 단계를 건너뛰었습니다. 수정은 도장을 찍기 전에 짧은 패킷에 공간을 더하고 기록 길이를 실제 크기로 제한합니다.

핵심 개념 및 용어

SnoopLogger
캡처된 HCI 패킷을 필터링하고 기록하는 Android Bluetooth 코드입니다. 영향을 받는 경로에는 설명된 필터 로그 설정이 필요합니다.
HCI ACL 패킷
Bluetooth 호스트와 컨트롤러 사이의 데이터 패킷입니다. Upstream 변경은 해당 필터가 활성화된 경우 매우 짧은 패킷이 버퍼 부족 경로를 드러낼 수 있다고 설명합니다.
EXTRA_BUF_SIZE
필터링된 패킷에 고정 “PROHIBITED” 표시를 쓰기 전에 추가하는 용량입니다. 수정은 짧은 패킷에도 이를 확보합니다.
CWE-20
입력 검증 부적절. CISA ADP가 매핑한 약점이며, 구체적인 결함은 패킷 버퍼 처리의 크기 조건이 반대로 된 것입니다.

프레임워크 매핑

  • MITRE CWE에 대한 FlawOpen의 개념적 매핑입니다. 공급업체나 CVE 레코드가 이 연구 시연에 해당 약점 ID를 지정한 것은 아닙니다. CWE-20

근본 원인 분석 (Root Cause)

2026년 10월 Android 보안 게시판은 CVE-2026-55269의 영향을 받는 버전으로 Android 16, 16 QPR2, 17을 나열합니다. NVD에는 현재 CISA ADP의 CVSS 3.1 7.8(높음)이 표시되며 Google 게시판은 System 항목을 치명적으로 분류합니다. 서로 다른 평가입니다. Upstream Bluetooth 커밋에서 SnoopLogger::FilterCapturedPacket은 필터링된 PBAP/MAP 경로에 들어가고 PayloadStrip은 고정 PROHIBITED 표시를 쓸 수 있습니다. 취약한 조건 packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE은 작은 패킷의 확장을 건너뛰어 공간 부족을 남겼습니다. 수정은 비교를 <=로 바꾸고 length를 packet.size() + PACKET_TYPE_LENGTH 이하로 제한합니다. 커밋은 악성 Bluetooth 컨트롤러가 짧은 HCI ACL 패킷을 보내는 경우를 설명하지만 관련 개발자 옵션과 SnoopLogger 필터가 활성화되어야 합니다. 인터넷에서 접근 가능한 Android 서비스가 아닙니다. 공격 페이로드는 제공하지 않습니다. 업데이트 배포 시점은 제조사에 따라 다릅니다.

단계별 공격 실행 흐름

단계 1

특정 로깅 설정이 활성화됨

커밋은 개발자 옵션에서 Bluetooth SnoopLogger 필터링을 활성화하고 PBAP/MAP 필터 프로필을 magic으로 설정한 경우를 설명합니다. 모든 Android 기기나 기본 설정으로 일반화하지 마세요.

단계 2

컨트롤러가 매우 짧은 패킷을 전달함

악성 Bluetooth 컨트롤러는 짧은 HCI ACL 패킷을 필터 캡처 경로로 보낼 수 있습니다. 이 문서에서는 패킷 바이트와 실행 절차를 생략합니다.

단계 3

반대 조건이 필요한 여유 공간을 생략함

FilterCapturedPacket에는 >가 사용됐지만 <=가 필요했습니다. 짧은 패킷은 EXTRA_BUF_SIZE를 받지 못했지만 이후 필터가 작은 버퍼에 PROHIBITED를 쓸 수 있었습니다.

단계 4

Upstream 수정이 버퍼 경계를 복구함

수정은 해당 짧은 패킷에 공간을 추가하고 파싱 길이를 사용 가능한 데이터로 제한합니다. 제조사 업데이트가 제공되면 패치 수준 2026-10-01 이상을 설치하세요.

소스 코드 비교: 취약한 구현 vs 보안 패치

이 발췌는 Google의 공개 변경을 반영합니다. 비교 연산자를 반전해 짧은 패킷에 표시용 공간을 추가하고 파싱 길이를 사용 가능한 크기로 제한합니다. 커밋은 짧은 패킷 테스트도 추가합니다. 이는 upstream 수정의 축약 설명이며 기기에 직접 적용하는 단독 패치가 아닙니다. 제조사가 제공하는 패치 수준 2026-10-01 이상 업데이트를 설치하세요.

소스 코드 발췌: snoop_logger.cc

취약한 구현
if (packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE) {
  // 짧은 패킷에는 필터 마커를 위한 공간이 필요합니다.
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// 그다음 PayloadStrip이 고정된 PROHIBITED 마커를 기록합니다.
보안 강화 패치
if (packet.size() + EXTRA_BUF_SIZE <= DEFAULT_PACKET_SIZE) {
  // 필터링 전에 대상이 되는 짧은 패킷을 패딩하세요.
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// 파싱된 길이가 크기가 조정된 패킷 범위 안에 있도록 하세요.
length = std::min(
    length, static_cast<uint32_t>(packet.size() + PACKET_TYPE_LENGTH));

엔지니어링 및 시스템 보안 강화 체크리스트

출처