3 minute read

아마존에서 싼 안드로이드 카오디오를 사서 대시보드에 박아본 사람은 안다. 전원을 켜는 순간부터 이상하다. 메뉴마다 광고가 붙고, 출처를 알 수 없는 앱이 잔뜩 깔려 있고, 음성 비서는 기능을 쓰려면 돈을 내라고 한다. 어젯밤 r/ClaudeCode에 올라온 포스트는 여기서 한 걸음 더 나갔다. 2016년식 혼다 시빅에 중국산 헤드유닛을 단 오너가, Claude Code에 기기 감사를 맡겼다.

결과는 광고의 거짓말에서 시작해 백도어까지 이어졌다.

상자가 한 거짓말

오너는 처음에 스테레오를 다시 뜯어내야 하나 싶었다. 그럴 필요가 없었다. Claude Code가 매뉴얼을 읽더니 뒷면 USB 포트가 폰과 플래시 드라이브용 호스트 포트라고 알려준 것. 전 작업은 Wi-Fi로 진행됐다. 매뉴얼은 텍스트 선택이 안 되는 14페이지짜리 사진 스캔이었는데, 그것부터 읽어냈다. 데스크톱에서 스크립트와 인계 문서를 만들고, 운전석 노트북의 두 번째 세션이 그 문서를 이어받아 파워셸을 bash로 고쳐가며 작업을 계속했다.

첫 확인 대상은 스펙이었다. 광고의 8코어는 실제 4코어. Android 15라던 시스템은 Android 9이고, 보안 패치는 2021년 10월이 마지막이었다. 5년 동안 아무도 이 펌웨어를 손대지 않은 셈이다.

이어서 설치된 앱 전수 조사가 들어갔다. 남길 것, 쓰레기, 잘 모르겠으니 건드리지 않는 것. 세 묶음으로 정리됐다.

광고보다 불편한 것들

쓰레기 목록의 수준이 심상치 않다. 상시 대기 음성 비서는 웨이크워드를 기다리며 숨은 WebView를 돌렸는데, 아무도 말을 걸지 않아도 CPU의 30%를 먹고 있었다. Baidu 위치 서비스, 벤더 로그 수집기. 그리고 블루투스 전화를 처리하는 기기에 미리 깔려 있던 통화 녹음 서비스까지. 미국에서는 아예 방송이 없는 DAB 라디오 앱과, 신호등 앞에서 PDF라도 검토하라고 넣어둔 Adobe Acrobat이 섞여 있는 건 그나마 웃음이 나는 부분이다.

부팅 스크립트가 정점이다. QQMusic과 Ximalaya, 중국 앱스토어가 사라지면 재설치하고 Baidu 키보드를 조용히 기본값으로 바꾸는 스크립트가 하나. 다른 하나는 부팅할 때마다 숨은 폴더를 뒤져 APK가 있으면 묻지 않고 설치한 뒤 파일을 지웠다. 폴더는 비어 있었고, 메커니즘이 존재한다는 사실 자체가 곧 악용의 증거는 아니다. 그래도 내 차 안에 조용한 앱 설치기가 상주하리라고는 생각하지 못했을 것이다. 여기에 벤더가 남겨둔 root su 백도어, Alibaba IoT 클라우드에 붙어 언제든 원격 펌웨어 푸시가 가능한 벤더 업데이트 앱까지.

청소는 규칙 아래에서

오너가 처음부터 내린 규칙이 눈에 띈다. 뭘 바꾸기 전에 전부 백업할 것. 변경 목록을 보여주고 허가를 기다릴 것. 삭제가 아니라 비활성화로 시작할 것. CarPlay, Android Auto, 라디오, 후방 카메라, 핸들 버튼은 건드리지 않을 것. 어떤 서비스에도 대신 로그인하지 않을 것. 앱은 공식 GitHub 릴리스에서만 설치할 것.

1차 작업은 비활성화뿐이었다. 모든 APK가 백업된 뒤에야 18개를 영구 삭제했고, Claude Code는 원래대로 되돌리는 복구 스크립트를 함께 남겼다. 시스템 파일에 손대기 전 원본을 저장했고, 변경마다 되돌리기 명령을 따로 기록했다.

그다음이 재미있다. 원격 업데이트 통로인 Alibaba 클라우드 업데이트 앱부터 끊었다. 펌웨어 푸시 한 번이면 이 모든 작업이 무효화되니까. AdGuard 사설 DNS로 전체 앱의 광고와 트래커를 차단했고, 2018년 버전이던 WebView를 Android 9이 받을 수 있는 마지막 버전인 138까지 올렸다. 후방 카메라 가이드라인은 시빅 세단 실측값으로 재보정했고 동적 라인이 핸들 각도를 따라 휜다. 온도 팝업은 화씨로, 부팅 로고는 시빅 로고로. 홈 화면은 오픈소스 런처 Kvaesitso로 갈았고 아이콘 팩은 Claude Code가 직접 만들고 서명해 설치했다. Organic Maps, NewPipe, Fossify Music은 GitHub 릴리스에서 받아 SHA-256으로 검증했다.

숫자로 남는 부분도 있다. 가용 RAM 2.10GB에서 2.59GB로. 활성 패키지 123개에서 108개로. CPU의 30%를 먹던 음성 비서는 사라졌다. 측정 시점이 달라 실험실 벤치마크는 아니라는 단서를 오너가 직접 달아둔 게 인상적이다. 정리 뒤 2분간 네트워크를 감시했더니 Google, AdGuard DNS, 공유기, 자기 노트북. 그 외에는 아무것도 없었다.

마지막 작업은 잠그기였다. 접속을 자기 노트북으로 제한했고, 노트북을 잃어버릴 경우를 대비해 USB 스틱의 키 파일로 여닫는 백도어를 따로 만들었다. 오너의 마무리 문장이 이 포스트 전체를 요약한다. 백도어는 여전히 있다. 이제 내 것이다.

왜 주목할까

감사 내용 자체도 흥미롭지만, 이야기의 뼈대는 도구의 쓰임이 옮겨가는 지점에 있다. Claude Code는 코드를 다루는 도구다. 그런데 이번 건에서는 펌웨어 포렌식을 수행했다. 매뉴얼을 읽고, 스크립트를 짜고, 기기 상태를 검사하고, 원본을 보존한 채로 변경을 진행했다. 에이전트의 활동 무대가 저장소에서 기기로 넓어지는 순간이다.

규칙 설계도 그대로 벤치마킹할 만하다. 백업 우선, 허가 대기, 비활성화 우선, 안전 장치 비접촉, 대리 로그인 금지, 공식 배포 채널만. 사람이 허가하는 절차를 에이전트가 집행하는 반자동 구조다. 차가 아니어도, 에이전트를 실제 기기에 붙이는 모든 작업의 출발점이 될 수 있는 규칙 세트다.

하나 더. 저가 안드로이드 기기의 스펙표는 이제 마음 놓고 믿을 수 없다. 확인하려면 열어봐야 하는데, 그 도구가 마침 손에 들어왔다.

정리

8코어와 Android 15를 팔았는데 도착한 건 4코어와 Android 9, 2021년 10월 패치. 거기에 상시 대기 음성 비서, 조용한 APK 설치기, root 백도어가 얹혔다. 오너는 Claude Code와 규칙 몇 줄로 기기를 되찾았다. CarPlay도, 라디오도, 후방 카메라도 그대로 작동한다. 카오디오에게 그게 본래 목적이었으니까.

싼 기기는 스펙표가 아니라 안을 봐야 한다. 이제 그 안을 들여다보는 일이 터미널 하나로 가능해졌다. 다음에 이상한 기기를 만나면 대시보드를 뜯기 전에 에이전트에게 먼저 물어보게 될지도 모르겠다.

원본 스레드