내 스마트 수면 마스크가 사용자들의 뇌파를 오픈 MQTT 브로커로 전송한다

발행: (2026년 2월 15일 오전 12:35 GMT+9)
7 분 소요

Source: Hacker News

블루투스

Claude가 처음 한 일은 주변의 BLE(블루투스 저에너지) 장치를 스캔하는 것이었습니다. 35개의 장치 중 내 장치를 찾아 연결하고 인터페이스를 매핑했는데, 두 개의 데이터 채널이 있었습니다: 하나는 명령 전송용, 다른 하나는 데이터 스트리밍용.

그 다음에는 다양한 명령 패턴(Modbus 프레임, JSON, 원시 바이트, 일반 헤더 등)을 약 백 개 정도 보내며 통신을 시도했습니다. 안타깝게도 장치는 아무 응답도 하지 않았고, 프로토콜이 표준이 아니라는 것이 밝혀졌습니다.

Claude는 Android APK를 열어 jadx로 디컴파일했습니다. 이 앱은 Flutter로 제작되었으며, Dart 소스 코드를 네이티브 ARM64 머신 코드로 컴파일하기 때문에 원본 소스를 직접 읽을 수 없습니다. 비즈니스 로직은 9 MB 크기의 바이너리 블롭에 들어 있습니다.

컴파일된 바이너리에도 문자열이 남아 있습니다. Claude는 바이너리에서 strings 명령을 실행해 다음을 발견했습니다:

  • 모든 앱 복제본이 공유하는 회사 메시지 브로커에 대한 하드코딩된 인증 정보
  • 클라우드 API 엔드포인트
  • 15개의 명령 빌더 함수 이름(예: 진동, 가열, 전기 자극 등을 설정)
  • 패킷 구조를 드러낸 프로토콜 디버그 메시지 – 헤더, 방향 바이트, 명령 타입, 페이로드, 푸터

프로토콜 형태를 알게 된 Claude는 Flutter 컴파일된 Dart 스냅샷을 디컴파일하는 도구인 blutter를 사용했습니다. 이 도구는 읽기 쉬운 주석이 달린 함수들을 재구성해 주었고, 이를 통해 15개 명령 모두에 대한 정확한 바이트 값을 파악할 수 있었습니다.

작동 확인

Claude는 6바이트 쿼리 패킷을 전송했습니다. 장치는 모델 번호, 펌웨어 버전, 시리얼 번호, 그리고 8개의 센서 채널 구성(250 Hz EEG, 호흡, 3축 가속도계, 3축 자이로스코프)을 포함한 153 바이트를 응답했습니다. 배터리 잔량은 83 %였습니다.

  • 진동 제어가 작동했습니다.
  • 가열이 작동했습니다.
  • EMS(전기 근육 자극)가 작동했습니다.
  • 음악 재생이 작동했습니다.

Claude는 각 기능에 대한 슬라이더를 제공하는 간단한 웹 대시보드를 만들었고, 모든 것이 기대대로 동작했습니다.

서버

하드코딩된 인증 정보를 기억하시나요? Claude는 이를 이용해 회사의 MQTT 브로커에 연결했습니다. MQTT는 IoT에서 표준으로 사용되는 pub/sub 메시징 시스템으로, 장치가 센서 데이터를 퍼블리시하고 명령을 구독합니다. 연결에 성공했으며, 데이터 흐름이 시작되었습니다—내 마스크뿐 아니라 동일한 인증 정보를 사용하는 모든 장치에서요. 약 25개의 장치가 활성화돼 있었으며, 그 중에는:

  • 실시간 EEG 뇌파 데이터를 퍼블리시하는 수면 마스크
  • 온도, 습도, CO₂를 보고하는 공기질 모니터
  • 방 점유를 감지하는 존재 센서

Claude는 두 대의 활성 수면 마스크에서 몇 분간의 EEG를 캡처했습니다. 한 사용자는 REM 수면(혼합 주파수 활동) 상태였고, 다른 사용자는 깊은 느린 파동 수면(4 Hz 이하의 강한 델타 파워) 상태였습니다. 전 세계 어딘가에 있는 실제 사람들의 실제 뇌파였습니다.

Live EEG

EMS

이 마스크는 눈 주변에 전기 근육 자극(EMS)도 지원합니다. 제어는 또 다른 명령으로, 모드, 주파수, 강도, 지속 시간을 지정합니다. 모든 장치가 동일한 인증 정보와 브로커를 공유하기 때문에, 누군가 사용자의 뇌파를 읽을 수 있다면 전기 충격도 보낼 수 있습니다.

공개

명백한 이유로 제품이나 회사를 밝히지는 않지만, 해당 이슈에 대해 알리기 위해 연락을 취했습니다.

이 전체 과정은 Karpathy의 Digital Hygiene 포스트를 떠올리게 했으며, 여러분도 읽어보시길 권합니다.

리버스 엔지니어링—블루투스 스캔, APK 디컴파일, Dart 바이너리 분석, MQTT 탐색—은 주로 Claude(Opus 4.6)가 30분짜리 자율 세션에서 완료했습니다.

0 조회
Back to Blog

관련 글

더 보기 »