- 화면 달린 이어버드 케이스가 실제로는 Android 기기에 가까웠고, ADB가 켜진 상태라 앱 추출·사이드로드·API 분석까지 이어졌음
- ChatGPT 연동은 기기에서 OpenAI API로 직접 통신했으며, 런처 앱의
SecurityStringsAPI와 난독화된 네이티브 라이브러리 우회로 API 키와 시스템 프롬프트가 노출됐음 - 동반 앱과 서버 API는 device id/IMEI만으로 채팅 기록을 조회할 수 있어, 튜토리얼 영상에 노출된 데모 기기 ID로 전체 데모 채팅 기록을 가져올 수 있었음
- 임의 IMEI로 QR 코드를 만들면 미바인딩 기기를 앱에 연결할 수 있었고, 이미 바인딩된 기기는 오류 응답에서 계정의 이름 조합이 드러났음
- IKKO는 점검과 앱·기기 업데이트로 채팅 조회에 서명 헤더를 추가했지만, 2025년 1월 13일 업데이트 기준 프록시 API는
okhttp/4.9.0User-Agent만 요구했고 이전 ChatGPT API 키는 그때서야 교체됐음
화면 달린 이어버드 케이스의 정체
- IKKO Activebuds는 케이스 화면에 시간과 ChatGPT를 전면 배치한 이어버드형 기기임
- 번역 같은 AI 기능도 제공하며, IKKO 스토어에서 앱을 설치할 수 있음
- Google Play Store는 없고, CEO는 ActiveBuds 화면에 맞게 앱들이 수정됐기 때문이라고 설명함
- 스토어에는 Spotify 같은 음악 앱과 Subway Surfers 같은 게임 앱이 있었지만, 작은 화면 탓에 탐색이 불편했음
- 앱 존재와 동작을 통해 기기가 Android를 실행한다는 점이 확인됨
- 기본 EQ 프로필의 음질은 좋지 않았고, EQ 곡선을 직접 조정하면 사용 가능한 수준까지 올릴 수 있었다고 평가됨
ADB 활성화로 열린 분석 경로
- 기기에는 브라우저가 없어 다른 앱을 직접 내려받기 어려웠고, Android 설정 앱은 열 수 있었지만 빌드 번호를 7번 눌러도 개발자 모드가 켜지지 않았음
- PC에 연결하자 ADB가 활성화된 상태였고, 이를 통해 앱 사이드로드가 가능해짐
- DOOM을 사이드로드한 뒤 ChatGPT 통합이 백엔드에서 어떻게 동작하는지 확인하기 시작함
- 루팅 없이 시스템 인증서를 설치할 수 없어 HTTP 검사만으로 정확한 URL을 보기 어려웠지만, 앱 추출과 디컴파일로 필요한 정보를 확인함
- Spreadtrum/Unisoc 기기에서 기본 서명 키를 쓰는 경우 부트로더 잠금 해제 도구를 사용할 수 있었고, 이 기기도 해당됐음
- 다만 기기에 볼륨 업 키가 없어 잠금 해제 확인 화면을 통과하지 못함
- 직접 서명한 파티션을 플래시하는 방법은 가능할 수 있다고 봤지만 진행하지 않음
APK 안에서 드러난 도메인과 키
- APK 추출 도구로 앱을 덤프하고 런처 앱을 JADX로 열자 통신 도메인이 드러남
api.openai.com: OpenAI APIchat1.chat.iamjoy.cn: ChatGPT 외 앱스토어 등 기기 전체 기능용 API로 보였고, 브라우저에서 열면 로그인 페이지가 나타남chat2.chat.iamjoy.cn:chat1과 같은 성격으로 보였고, 백업 서버 가능성이 있음openspeech.bytedance.com: 음성 인식 백업일 가능성을 추정했지만, 기기 통신은 확인하지 못함www.airdimple.cn: OpenAI API 미러 또는 프록시처럼 보였음
SecurityStringsAPI파일에는 암호화된 엔드포인트와 인증 키가 들어 있었음- 첫 단계는 base64였고, 두 번째 단계는 심하게 난독화된 네이티브 라이브러리가 처리함
- 루팅된 다른 기기에 앱을 사이드로드하자 앱이 그대로 동작했고, 이 과정에서 OpenAI 키를 확인함
- ChatGPT 시스템 프롬프트도 노출됐으며, 기기에는
Angry Dan과In-Love Dan모드도 있었음Angry Dan은 욕설이 많아 18세 이상 확인이 필요했음
채팅 로그와 동반 앱의 인증 부재
- 기기는 ChatGPT 대화를
chat1도메인의 다른 엔드포인트로 기록했음 - 해당 요청 헤더에는 메시지, 모델, 응답, IMEI 기반 device id가 포함됨
- 이후 동반 앱을 조사하면서 이 로그가 앱에서 기기와의 과거 대화를 보여주는 용도임을 확인함
- 동반 앱은 기기의
Membership메뉴에서 QR 코드를 스캔해 바인딩함 - HTTP 검사 결과, 앱은 계정 토큰과 device id로 API를 조회해 기기에서 나눈 모든 채팅을 가져왔음
- 계정 토큰을 제거해도 요청이 계속 동작했기 때문에, 채팅 조회 API의 실질적 인증은 device id뿐이었음
- 튜토리얼 영상의 한 프레임에서 제대로 블러 처리되지 않은 device id를 사용하자 데모 기기의 전체 채팅 기록을 가져올 수 있었음
- IMEI는 특정 범위를 가지므로, 고객의 채팅 기록도 알아낼 수 있고 민감한 정보가 포함될 수 있다고 판단함
QR 코드 생성, 이름 노출, 메시지 주입
SecurityStringsAPI의 변수명은 암호화된 API 엔드포인트의 용도를 그대로 드러냈고, 이를 통해getBindDevQrCodeAPI를 찾음- 임의 IMEI를 넣으면 QR 코드 base64 이미지를 생성할 수 있었음
- 이미 다른 앱에 바인딩된 기기를 연결하려 하면 “이미 다른 사용자에게 바인딩됨” 오류가 나와, 임의 탈취는 막혀 있었음
- 하지만 오류 응답에는 앱 계정 생성 시 입력한 이름이 노출됨
- 계정 생성 화면에는 사용자명 필드가 없고 이름과 성만 있었음
- 예시 계정의 이름
Cheese2, 성Delight2는 응답에서Cheese2Delight2로 노출됐음
- 가능한 흐름은 IMEI 추측, QR 코드 생성, 미바인딩 기기 바인딩, 이미 바인딩된 기기의 이름 노출, 채팅 기록 조회로 이어졌음
unbind_dev엔드포인트도 있었지만, 계정 토큰을 검사해 임의 IMEI 기기 해제는 허용하지 않았음- 채팅 로그 엔드포인트도 device id만 인증에 사용해, 다른 사용자의 동반 앱에 임의 텍스트를 보낼 수 있었음
- HTML과 JavaScript를 보내 동반 앱 공격을 시도했지만, 앱이 Vue를 사용하고 Vue의 기본 HTML/JS 삽입 방어가 있어 주입은 성공하지 않음
- 그래도 임의 사용자에게 사기성 메시지 같은 텍스트를 보낼 수 있는 상태였음
IKKO의 대응과 남은 취약점
- 취약점은 IKKO 보안 부서에 이메일로 보고됐음
- IKKO는 이후 앱을 잠그고 일주일간 점검한다는 공지를 냄
- 점검 뒤 앱 업데이트와 기기 업데이트가 배포됨
- 채팅 기록 조회 엔드포인트는 새로
signature헤더를 요구하게 됨- 서명은 계정 토큰, device id, 언어, 현재 시간을 공개키/개인키와 비밀번호로 인코딩해 구성됐음
- 이 변경으로 유효한 계정 토큰 없이 채팅을 가져오는 것은 불가능해짐
- 하지만 추측 가능한 IMEI로 QR 코드를 생성해 아직 바인딩되지 않은 기기를 앱에 연결할 수 있는 문제는 남아 있었음
- 기기 업데이트 뒤에는 IkkoBuds가 아닌 다른 기기에서 ChatGPT 기능이 동작하지 않게 됨
- 키는 여전히 기기 안에 남아 있었고, 당시에는 교체되지 않았음
- 마지막 이메일 이후 한 달 반 동안 추가 답변이 없었다고 밝힘
- 글 작성 시점 기준 남은 문제는 다음과 같았음
- 다른 사용자의 앱에 메시지 주입 가능
- 아직 동반 앱에 바인딩되지 않은 기기 연결 가능
- 이미 바인딩된 기기의 이름과 성 노출 가능
2025년 1월 13일 업데이트
@haro7z의 도움으로 기기를 루팅함- 이후 IKKO는 ChatGPT 통합 사용 전에 기기의 IMEI를 확인하도록 변경함
- OpenAI에 직접 호출하는 방식 대신 프록시 API를 사용하게 됨
- 그러나 이 프록시 API는 별도 인증이 필요 없고, User-Agent를
okhttp/4.9.0으로 설정하면 됐음 - 이전 ChatGPT API 키는 이 시점에 마침내 교체됨