🇰🇷 한글 설명
Reachy Mini Bluetooth 서비스가 인증 상태를 기기별로 관리하지 않고 서비스 인스턴스의 공유 플래그로 관리하는 취약점입니다. 이로 인해 한 사용자가 PIN 인증을 완료하면, 근처의 공격자가 인증 과정 없이도 동일한 세션에 무임승차하여 명령을 실행할 수 있습니다.
💡 쉬운 설명
한 명의 사용자가 비밀번호를 입력해 로그인을 성공하면, 근처에 있는 다른 사람도 비밀번호 없이 로봇을 조종할 수 있는 보안 허점입니다. 인증 정보가 '누가' 했는지를 구분하지 않고 '인증이 되었는지'만 확인하기 때문에 발생합니다.
🇺🇸 원문 (English)
The Reachy Mini Bluetooth service asks a connecting device for a PIN before it will accept commands. The check protects the session but not the caller, so an attacker in Bluetooth range can ride along on someone else's successful authentication.
The authenticated state is kept in a single shared flag on the service instance rather than per device. BlueZ passes the calling device's identity to the characteristic write handler in the options argument, but WriteValue(self, value, options) in src/reachy_mini/daemon/app/services/bluetooth/bluetooth_service.py ignores options entirely. The handler therefore has no idea which device sent a given write, and it cannot tell the authenticated one from any other.
Once any device completes the PIN exchange, the flag is set and every nearby device can send CMD_ commands until it resets. An attacker simply waits within radio range for a legitimate user to authenticate, then writes commands into the same window. No PIN is ever guessed or brute-forced.
This is the second step of a three-step chain that JFrog documented against the robot. The first is the unrestricted file upload in the media sounds API, tracked as CVE-2026-55419, which places an attacker-controlled script on the filesystem. This issue then provides command access over Bluetooth. The third is the Bluetooth command handler path traversal, tracked as CVE-2026-62661, which runs that script as root.
📍 영향받는 시스템
Reachy Mini Bluetooth service (src/reachy_mini/daemon/app/services/bluetooth/bluetooth_service.py)
⚔️ 공격 벡터
Bluetooth 통신 범위 내에서 정상 사용자의 PIN 인증 완료를 기다린 후, 인증 플래그가 활성화된 상태에서 명령어를 전송
🛡️ 대응 방법
bluetooth_service.py의 WriteValue 핸들러가 options 인자를 사용하여 호출 기기의 ID를 확인하고, 기기별로 개별적인 인증 상태를 관리하도록 수정
🔧 검증 코드
명령어 결과에서 options 인자가 전달됨에도 불구하고 내부 로직에서 이를 활용하여 기기를 식별하는지 확인
grep -r "WriteValue(self, value, options)" src/reachy_mini/daemon/app/services/bluetooth/bluetooth_service.py
📊 CVSS Vector String
CVSS:3.1/AV:A/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
💻 영향받는 소프트웨어
IBM Verify Identity Access