
The official reference implementation & vulnerability verification of our attack WhisperPair (CVE-2025-36911) which affects Google's Fast Pair protocol.
Google Fast Pair 기기가 페어링, 계정 바인딩, 프로토콜 수준 공격에 취약한지 테스트할 수 있는 실용적인 도구입니다.
이 저장소는 Google Fast Pair 기기의 보안을 평가하기 위한 도구인 WhisperPair 테스트 도구를 제공합니다. 연구자와 실무자가 당사의 연구 결과를 재현하고 자체 기기를 테스트할 수 있도록 설계되었습니다.
프로젝트 개요, 영향을 받는 기기 및 추가 컨텍스트는 당사 웹사이트를 참조하십시오.
이 저장소에는 IEEE S&P 2026에서 발표된 논문 One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol에 대한 부속 자료도 포함되어 있습니다.
전체 논문은 여기에서 확인할 수 있습니다. 이 작업이 유용하다고 생각되면 다음 논문을 인용해 주시기 바랍니다:
@inproceedings{whisperpair2026,
title = {One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol},
author = {Duttagupta, Sayon and Wyns, Seppe and Antonijević, Nikola and Singelée, Dave and Preneel, Bart},
booktitle = {2026 IEEE Symposium on Security and Privacy (S\&P)},
year = {2026},
}
이 자료는 당사 평가의 재현성을 보장하고 연구자가 방어적 테스트를 수행하는 것을 돕기 위해 제공됩니다. 승인된 보안 연구 및 소유하거나 명시적 테스트 허가를 받은 기기에 대한 방어적 검증 목적으로만 사용하십시오. 이 저장소의 코드는 소비자 액세서리의 취약점을 보여주므로, 명확한 서면 허가 없이 타사 기기를 공격하는 데 사용하지 마십시오. 저자는 프로젝트 팀이 소유하거나 정보에 입각한 동의를 받아 기증된 기기에서만 모든 실험을 수행했습니다. 이 도구를 실행함으로써 방어적 연구, 당사 결과 재현, 또는 기기 자체 테스트 목적으로만 사용하는 데 동의하는 것으로 간주됩니다.
[!NOTE] 요약: Bluetooth 어댑터가 있는 Linux 머신과 Node.js(LTS) 및 pnpm이 설치되어 있는지 확인하십시오.
bash build.sh를 실행한 다음bash start.sh를 실행하면 동일한 머신에서 UI와 서버를 모두 실행할 수 있습니다.
이 저장소는 대상 기기가 Google Fast Pair의 특정 보안 요구 사항을 올바르게 구현하는지 평가하기 위한 테스트 도구를 포함합니다. 이 도구는 페어링 상태 프레디킷이 올바르게 구현되었는지, 재사용된 논스가 포함된 메시지가 거부되는지, 기기가 무효 곡선 공격에 취약한지 테스트할 수 있습니다. 도구는 백엔드 서버와 프론트엔드 웹 UI로 구성됩니다.
[!NOTE] 공격의 구체적인 구현을 찾고 있다면:
./toolkit-server/src/fast-pair-service.ts및./toolkit-server/src/protocol.ts에 공격 및 Fast Pair 프로토콜 구현이 포함되어 있습니다.
도구는 서버와 UI의 두 가지 구성 요소로 구성됩니다. 서버는 Linux 시스템에서 실행해야 하며 Raspberry Pi 4에서 테스트되었습니다. UI는 서버를 제어하는 데 사용할 수 있는 Next.js 프론트엔드이며 Node.js가 지원되는 모든 곳에서 실행할 수 있습니다. UI는 네트워크를 통해 서버에 연결할 수 있어야 합니다.
Raspberry Pi OS Lite (64비트) (6.12.47+rpt-rpi-v8), BlueZ 버전 5.82에서 도구를 테스트했습니다.
BlueZ, Node.js 및 pnpm이 설치된 Linux 머신.
현재 LTS(Long-Term-Support) 버전의 Node.js(v24.14.0)를 사용하는 것이 좋습니다. 이 버전에서 도구가 제대로 작동하도록 확인했습니다. 이전 버전은 v18까지 작동할 수 있지만, 더 오래된 버전은 충돌하거나 예상치 못한 결과를 초래할 가능성이 높습니다.
nvm.shnvm을 사용하여 설치된 Node.js 버전을 관리하는 경우 root도 nvm으로 관리되는 Node.js 버전에 액세스할 수 있는지 확인해야 합니다.
이 StackOverflow 게시물에 설명된 대로 새 심볼릭 링크를 만들어야 할 수도 있습니다.
# 출처 - https://stackoverflow.com/a/40078875
# SimpleJ가 게시, 커뮤니티에서 수정. 변경 내역은 게시물 'Timeline' 참조
# 2026-03-30 검색, 라이선스 - CC BY-SA 4.0
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
[!NOTE] 서버를 실행하려면
node만 연결하면 됩니다.
Node.js가 외부 패키지 관리자를 통해서도 설치된 경우 sudo에서 사용할 수 있는 버전이 nvm에서 사용하는 버전과 다를 수 있습니다.
node -v와 sudo node -v의 출력을 비교하여 확인할 수 있습니다.
Node.js LTS v24를 권장하지만 서버는 v18까지 제대로 작동해야 합니다.
pnpmNode.js v24 LTS가 설치된 경우 다음 명령을 사용하여 pnpm을 활성화할 수 있습니다.
corepack enable
도구에는 hcitool 및 l2ping도 필요합니다.
Linux 배포판에 따라 hcitool을 사용하지 못할 수도 있습니다. bluez-deprecated-tools를 설치해야 할 수 있습니다.
작성 시점(2025년 10월 1일) 기준 최신 Raspberry Pi OS Lite 버전에는 사전 설치되어 있습니다.
Bluetooth 어댑터가 켜져 있지 않으면 서버가 rfkill을 사용하여 켜기를 시도합니다.
Audio Switch 확장을 테스트하려면 rfcomm이 필요합니다.
[!NOTE] 서버는 시작 시 이러한 도구의 가용성을 확인합니다. 사용할 수 없는 기능에 대한 추가 정보가 콘솔에 표시됩니다.
결과를 재현하려면 취약한 기기에 물리적으로 액세스해야 합니다. 대부분의 공급업체가 WhisperPair에 대한 소프트웨어 업데이트를 출시했으므로 이전 펌웨어가 있는 기기가 필요할 수 있습니다. 평가에 사용한 기기에 대한 자세한 내용은 기기 선택을 참조하십시오.
동일한 Linux 머신에서 UI와 서버를 실행하려면 build.sh 및 start.sh 스크립트를 사용할 수 있습니다.
먼저 필요한 종속성을 설치하고 구성 요소를 빌드합니다.
bash build.sh
Bluetooth가 활성화되어 있는지 확인합니다.
sudo rfkill unblock bluetooth
그런 다음 다음을 사용하여 UI와 서버를 실행합니다.
bash start.sh
이제 UI를 http://localhost:3000에서 사용할 수 있습니다.
UI와 서버를 다른 호스트에서 실행할 수 있습니다. 이렇게 하면 Linux 머신에서 서버를 실행하고 UI는 로컬에서 실행할 수 있습니다. 권장되지는 않지만 다음과 같이 할 수 있습니다.
toolkit-server 디렉터리가 Linux 머신에 있는지 확인합니다.bash build.sh를 실행하여 toolkit-server를 빌드합니다.toolkit-ui 디렉터리의 .env 파일에서 SERVER_URL 변수가 서버 URL로 설정되도록 업데이트합니다.
bash update_server_url.sh <YOUR_URL>을 실행하여 .env 파일을 자동으로 업데이트할 수 있습니다.bash build.sh를 실행하여 toolkit-ui를 빌드합니다.bash start.sh를 실행하여 toolkit-server를 시작합니다.bash start.sh를 실행하여 toolkit-ui를 시작합니다.이제 UI를 http://localhost:3000에서 사용할 수 있습니다.
build.sh 및 start.sh 스크립트를 사용하는 대신 서버를 수동으로 빌드하고 시작할 수도 있습니다.
자세한 단계는 toolkit-server README에 나와 있습니다.
build.sh 및 start.sh 스크립트를 사용하는 대신 UI를 수동으로 빌드하고 시작할 수도 있습니다.
자세한 단계는 toolkit-ui README에 나와 있습니다.
공격을 수행하고 도구를 사용하려면 Fast Pair 호환 액세서리가 필요합니다. 아래 표와 같이 16개 공급업체의 25개 기기를 평가했습니다. 해당 기기가 있고 2025년 9월 이후 펌웨어가 업데이트되지 않은 경우 당사 결과를 재현할 수 있습니다.
또한 도구를 사용하여 테스트하지 않은 기기를 평가할 수도 있습니다. 단, 대상 기기의 Bluetooth 칩셋 신뢰성에 따라 예기치 않은 오류가 발생할 수 있습니다.
공격을 수행할 때 대상 기기가 페어링 모드인지 여부를 확인하십시오. 일부 공격은 기기가 페어링 모드가 아니어야 하며, 그렇지 않으면 거짓 긍정이 발생할 수 있습니다. 다른 공격은 기기가 페어링 모드여야 하며, 그렇지 않으면 작동하지 않을 수 있습니다.
Fast Pair 호환 기기를 찾고 있다면 Model ID 목록을 사용하여 모든 Fast Pair 인증 기기를 볼 수 있습니다.
Model not included in test set 경고 메시지테스트 세트에 포함되지 않은 기기를 선택한 경우 UI에 경고 메시지가 표시됩니다. 이 메시지는 Model ID를 기반으로 표시되며, 동일한 기기의 색상 및 지역에 따라 다를 수 있습니다. 예를 들어, 파란색 Sony WH-1000XM6 헤드폰과 검은색 Sony WH-1000XM6 헤드폰은 다른 Model ID를 사용합니다.
이러한 기기는 Model ID가 다르더라도 펌웨어가 동일할 가능성이 높으므로 이 경고 메시지를 무시해도 안전합니다.
No device with Model ID <number> was found 오류 메시지Fast Pair gRPC API에서 시행하는 더 엄격한 속도 제한으로 인해 모델 데이터에 대한 일부 요청이 빈 본문과 함께 성공 응답을 반환할 수 있습니다.
이로 인해 UI에 No device with Model ID <number> was found가 표시됩니다.
입력한 Model ID가 확실하다면 몇 분 기다린 후 다시 시도하십시오.
[!NOTE] 테스트 세트에 있는 기기의 모델 데이터는 이 저장소에 포함되어 있으며 캐시에서 읽힙니다. 이러한 기기를 평가하는 데 gRPC 서비스에 대한 API 호출이 필요하지 않습니다. 동일한 시리즈의 기기는 동일한 Model ID를 갖지 않을 수 있습니다. 자세한 내용은 Model not included in test set 경고 메시지를 참조하십시오.

UI는 시작 시 서버에 연결을 시도합니다. 연결에 성공하면 화면 오른쪽 하단에 "Connected to the server" 메시지가 표시됩니다.
기기가 취약한지 평가하려면 기기 검색, Model ID 설정, 공격 실행의 세 단계가 필요합니다.
도구는 Bluetooth Low Energy 기기를 지속적으로 스캔하며, 화면 왼쪽에 표시됩니다. Fast Pair 데이터를 광고하는 기기가 상단에 표시됩니다. 기기에서 "Select"를 클릭하면 오른쪽에 기기 세부 정보가 표시됩니다.
논문에 설명된 테스트를 실행하려면 기기의 Model ID를 설정해야 합니다. 기기가 Fast Pair GATT 특성을 노출하는 경우 기기 세부 정보에 "Read Model ID" 버튼이 표시됩니다. 이 버튼을 클릭하면 Model ID 읽기를 시도합니다.
많은 기기가 이 특성을 올바르게 구현하지 않아 잘못된 Model ID를 반환합니다. 또는 "Set Model ID" 버튼을 누르고 값을 직접 입력하여 기기의 Model ID를 수동으로 설정할 수 있습니다. 테스트 중에 평가된 기기를 선택하거나 사용자 정의 값을 입력할 수 있습니다. Fast Pair 호환 기기의 전체 목록은 이 저장소의 루트에 포함되어 있습니다.
Model ID가 설정되면 기기 세부 정보에 기기에 대한 메타데이터가 표시됩니다.
공격을 실행하려면 기기 세부 정보 창에서 "Attack" 버튼을 클릭합니다. 구현된 공격은 페어링 상태 프레디킷 강제 검사, 논스 재사용, 무효 곡선 공격의 세 가지입니다. 이미 기기에 연결되어 있는 경우 "Reconnect" 확인란을 선택하면 공격을 수행하기 전에 기기 연결이 끊어졌다가 다시 연결됩니다.
페어링 상태 프레디킷 강제 검사는 몇 가지 추가 구성 옵션을 제공합니다.
공격이 진행되는 동안 로그가 UI에 실시간으로 표시됩니다. 공격이 완료되면 지속 시간이 표시됩니다.
때때로 공격 또는 페어링이 예상보다 오래 걸릴 수 있습니다. 해당 대화 상자에서 "Cancel" 버튼을 클릭하여 공격 또는 페어링을 취소할 수 있습니다. 공격 또는 페어링 중에 UI를 새로고침한 경우 작업 관리자를 사용하여 대신 취소할 수 있습니다.
화면 오른쪽 상단에서 오른쪽에서 두 번째 버튼은 작업 상태를 표시합니다. 활성 작업이 없으면 "No active tasks"가 표시됩니다. 그렇지 않으면 "Task in progress"가 표시됩니다. 작업을 취소하려면 "Task in progress" 버튼을 클릭한 다음 "Cancel" 버튼을 누릅니다.
서버가 취소할 수 없는 보류 작업으로 인해 중단된 경우 Bluetooth 어댑터 재설정을 시도하십시오.
[!NOTE] 작업을 취소하는 데 최대 20초가 걸릴 수 있습니다.
경우에 따라 Bluetooth 어댑터가 "나쁜 상태"에 "갇힐" 수 있습니다. 이 문제에 대한 가장 쉬운 해결책은 Bluetooth 어댑터를 재설정하는 것입니다. 재설정을 수행하려면 화면 오른쪽 상단의 렌치 아이콘을 눌러 문제 해결 메뉴를 엽니다. 그런 다음 "Reset BLE adapter"를 선택하고 대화 상자에서 "Reset"을 클릭하여 재설정을 확인합니다.
치명적인 오류가 발생하여 서버를 종료해야 하는 경우 start.sh 스크립트가 자동으로 서버를 다시 시작합니다.
주변에 BLE 기기가 많은 시나리오에서는 D-Bus 오류로 인해 서버가 예기치 않게 종료될 수 있습니다.
이는 매우 드물게 발생하며, ./start.sh 스크립트가 이 경우 자동으로 서버를 다시 시작해야 합니다.
Fast Pair 호환 기기를 찾고 있다면 Model ID 목록을 사용하여 모든 Fast Pair 인증 기기를 볼 수 있습니다.
이 연구는 VOEWICS02 교부금 번호로 플랑드르 정부의 사이버 보안 연구 프로그램(Cybersecurity Research Program)의 지원을 받았습니다.
| 제조사 | 기기 이름 | Model ID | 하이재킹 취약 | 하이재킹 시간 (초) | 논스 재사용 취약 | 무효 곡선 공격 취약 |
|---|
| Apple | Beats Solo Buds | 6980580 | 아니요 | 예 | 아니요 | |
| Pixel Buds Pro 2 | 12934265 | 예 | 6.89 | 아니요 | 아니요 | |
| Jabra | Elite 8 Active | 3778746 | 예 | 32.01 | 아니요 | 아니요 |
| JBL | Tune Beam | 3293323 | 예 | 6.91 | 동일 세션에서만 | 아니요 |
| Marshall | MOTIF II A.N.C. | 15473012 | 예 | 9.49 | 예 | 아니요 |
| Nothing | Ear (a) | 8625818 | 예 | 38.80 | 동일 세션에서만 | 아니요 |
| OnePlus | Nord Buds Pro 3 | 13394952 | 예 | 10.19 | 동일 세션에서만 | 아니요 |
| HP | Poly VFree 60 | 15984097 | 아니요 | 아니요 | 아니요 | |
| Redmi | Buds 5 Pro | 11155060 | 예 | 8.32 | 동일 세션에서만 | 아니요 |
| Soundcore | Liberty 4 NC | 5409858 | 예 | 15.27 | 예 | 아니요 |
| Sony | WF-1000XM5 | 12499626 | 예 | 9.43 | 예 | 아니요 |
| Audio-Technica | ATH-M20xBT | 13285048 | 아니요 | 동일 세션에서만 | 아니요 | |
| Bose | QuietComfort Ultra | 5723549 | 아니요 | 아니요 | 아니요 | |
| JBL | Live 775 NC | 14502233 | 예 | 7.62 | 동일 세션에서만 | 아니요 |
| Marshall | Major V | 12915160 | 예 | 11.70 | 동일 세션에서만 | 아니요 |
| Sonos | Ace V | 7340495 | 아니요 | 아니요 | 아니요 | |
| Sony | WH-1000XM4 | 13386638 | 예 | 9.69 | 예 | 아니요 |
| Sony | WH-1000XM5 | 13911719 | 예 | 12.38 | 예 | 아니요 |
| Sony | WH-1000XM6 | 6360443 | 예 | 12.94 | 동일 세션에서만 | 아니요 |
| Sony | WH-CH720N | 16003068 | 예 | 7.46 | 예 | 아니요 |
| Bang & Olufsen | Beosound A1 | 2431472 | 아니요 | 아니요 | 아니요 | |
| Jabra | Speak2 55 UC | 9888885 | 아니요 | 아니요 | 아니요 | |
| JBL | Clip 5 | 1917389 | 예 | 36.19 | 예 | 아니요 |
| JBL | Flip 6 | 7278954 | 아니요 | 아니요 | 아니요 | |
| Logitech | Wonderboom 4 | 11575855 | 예 | 11.96 | 동일 세션에서만 | 아니요 |