몇달전에, 친척집 정리를 돕다가 옷장에서 뜯어보지도 않은 실내용 IP 카메라를 한 대 찾게 되었습니다. 헤이홈이란 중소기업에서 나온 제품이었는데, 필요하지도 않고 원하지도 않는다고 하셔서 한번 어떻게 작동하는지, 그리고 로컬-전용 IP 카메라로 설정할 수 있는지 알아보면 재밌겠다 생각했습니다.
너무 기대하시기 전에, 성공담은 아니라는 점 알고 계시면 되겠습니다. 이 글에선 카메라가 원하는 방식으로 동작하도록 씨름한 경험담과, 로컬 연결 옵션이 없는 이런 저렴이 IoT 제품들이 폐가전이 되어가는 짜증나는 현실에 대해 한번 적어보려고 합니다.
일단 제가 가지고 있는 제품은 “스마트 홈카메라 프로”라는 이름으로 출시되었는데, 제품 뒤에 적힌 공식 모델 식별명은 GKW-MC055
되겠습니다. 전원 공급선만 연결되어 있는 마이크로USB 단자가 하나 뒤에 자리잡고 있고, 리셋 구멍과 마이크로SD 카드 슬롯 하나가 전부입니다.
앞에는 조그만 렌즈가 하나 있고, 위에 두 개의 LED 표시등이 있습니다. 하나는 카메라의 상태를 나타내는데, 전원이 연결되면 빨간색으로 빛나다가 부팅이 완료되면 파란색으로 바뀝니다. 다른 LED는 카메라가 야간 적외선 모드로 진입하면 켜지는데, 이때 렌즈 주변부 링에 자리잡고 있는 IR LED 등들이 전부 켜지면서 주변 환경을 비춰줍니다.
추가적으로 어플로 양방향 소통이 가능토록 스피커와 마이크도 각각 하나씩 구비되어 있습니다.
어플 얘기가 나왔으니 한번 설정 과정을 진행해보겠습니다!
일단 공식 제조사 어플로 카메라를 설정해보는게 가장 보편적인 방법이겠죠. 하지만 다운로드하고 열어보니 계정을 만들라고 닦달합니다. 귀찮지만… 그냥 시키는대로 계정을 하나 파서 카메라 스트림에 모습이 나오는 것까지 확인해줍니다.
다음으로 설정 메뉴에 진입해서 RTSP나 ONVIF로 로컬 접속을 가능하게 하는 옵션이 있는지 찾아봤지만 어떠한 설정값 하나 없었습니다. FAQ 섹션에도 관련 정보는 하나도 찾아볼 수 없었고요.
아마도 로컬 접속 포트는 이미 열려있지 않을까? 생각해봤습니다.
카메라 포트 스캔을 할 시간이 왔군요!
$ nmap 192.168.8.123
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-17 13:33 US Eastern Daylight Time
Nmap scan report for xxx.lan (192.168.8.123)
Host is up (0.022s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
6668/tcp open irc
MAC Address: B4:FB:E3:XX:XX:XX (AltoBeam (China))
Nmap done: 1 IP address (1 host up) scanned in 2.28 seconds
이상하게도 포트 하나만 열려 있고, 이마저도 카메라에서 IRC 서버를 돌릴 이유가 없죠. 더 자세한 스캔을 시도해봐도 결과는 마찬가지였습니다:
$ nmap -sS -p- 192.168.8.123
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-17 13:35 US Eastern Daylight Time
Nmap scan report for xxx.lan (192.168.8.123)
Host is up (0.019s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
6668/tcp open irc
MAC Address: B4:FB:E3:XX:XX:XX (AltoBeam (China))
Nmap done: 1 IP address (1 host up) scanned in 28.72 seconds
온라인에 검색해보니, 포트 6668
은 Tuya SDK를 기반으로 하는 IoT 기기들이 사용하는 것으로 확인했습니다. Tuya는 IoT 플랫폼을 다른 회사들이 사용할 수 있도록 라이센싱하고 베포하는 회사인데, 헤이홈이 거래하는 기업들 중 하나인 듯 했습니다. 공식 판매처에서 그렇게 많은 제품들을 빠르게 쏟아낼 수 있는 이유이기도 하죠.
하지만 이걸 안다고 도움이 되진 않죠. 카메라가 기반으로 하는 Tuya SDK에서 ONVIF를 활성화할 수 있는 방법이 있는지 찾아보다가 이 페이지를 발견하게 되었습니다. ONVIF를 활성화할 수 있게 하는 설정값만 하나 바꾸면 되는 듯 해서 헤이홈을 운영하는 회사에다가 이메일을 보내, 이 설정값을 제발 활성화해주면 안되는지 문의했습니다. (찾기로는 이 값을 변경한다고 해서 Tuya에서 돈을 더 청구하는 건 아닌 걸로 알고 있는데, 바꾸는데 완전히 무료라면 안 해줄 이유가 없지 않을까요.) 3월 25일쯤 이메일을 보냈는데도, 아쉽게도 아직까지 답변을 받지 못했습니다.
그럼 다음으론 무엇을 해볼 수 있을까요?
카메라를 분해해서 안에 있는 플래시 칩에서 펌웨어를 추출해, 정보를 더 캐낼 수 있는지 알아보기로 했습니다. 분해를 시작할 때 아랫 부분부터 확인하기 시작했는데, 카메라의 밑에 부분에선 마이크로USB 포트만 접근이 가능했습니다. 전원 케이블만 납땜해서 교체할 수 있게 되어 있어, 추후에 USB-C 포트로 교체할 수도 있게 되어 있었죠. 하지만 카메라의 주요 부품은 아랫쪽이 아니라 카메라의 윗부분에 자리잡고 있었는데, 만약 분해 과정에서 조금이라도 더 힘을 줘 강제로 분리했다면 카메라가 고장나서 더 이상 진행할 수 없었을 듯 합니다.
결국 이것저것 시도해보다 카메라의 윗부분을 분해할 수 있는 것을 알아냈습니다. 더 자세히 설명드리자면, 위에 있는 구 모양의 플라스틱 부분이 둘로 나뉘었는데, 여기에서 메인보드와 렌즈 구조물을 전부 꺼낼 수 있었습니다. 보드와 구조물은 얇게 접합되어 있었는데, 이 보드만으로 카메라의 모든 기능이 구현되어 있었습니다. 여기엔 수직/수평으로 카메라를 조절하는 모터들과, 녹화 기능을 위한 SD 카드 슬롯, 그리고 아랫 부분에서의 전원 단자에서 전원 공급까지 전부 다 포함되었죠.
바로 눈에 띤 부분은 XMC사 글귀와 칩 정보가 적혀있는 플래시 칩이였습니다. 마킹으론 XMCQH64AHIG
모델명이 적혀 있었는데, flashrom
으로 내용물을 추출할 수 있을 거라고 알고 있었습니다. 하지만 flashrom GitHub를 조금 찾아보니 칩 지원에 대해 이 이슈를 발견했는데, 2020년 7월에 처음 열려 지금까지 해결되지 않은 문제였습니다.
왜 연결된 두 패치가 닫혔는지 알아보다가, flashrom
팀이 개발을 위해 GitHub를 사용하지 않는다는 점을 알아냈습니다. 개발은 전부 전용 Gerrit 서버에서 진행됐는데, 패치를 추가하려면 여기에서 리뷰를 받아야 했죠. GitHub에서 연결된 패치(그리고 또 다른 패치)들은 예전에 Gerrit으로 이전되었지만 무슨 이유에선지 없어졌고, 기존 패치들은 GitHub상에서 통합되지 않은 채 닫혀버렸습니다.
그래서 한번 직접 패치를 접수해봤는데, 드디어 3월 29일에 정식으로 프로젝트에 포함되었습니다! 약 5년이 지나 flashrom
이 이 칩을 읽고 쓸 수 있게 된 셈이죠.
이제 칩 정보가 추가되었으니, 컴파일된 개발용 flashrom
바이너리로 보드에서 펌웨어를 추출해냈습니다. 다음으로, binwalk -Me cctv.bin
을 사용해서 덤프 속 내용물을 추출한 다음 확인해봤습니다.
폴더 중 이름이 tuya_config.json
인 파일 하나를 발견했는데, 안의 내용이 제가 찾던 것이랑 비슷해서 기대가 늘었습니다. 특히 이 옵션값이 중요해 보였습니다:
"onvif_enable": 0,
그냥 이 값을 1
로 변경해버린다면? 갑자기 든 생각에, 펌웨어 덤프 파일을 복사한 후 hexedit
을 사용해서 연 후, 수동으로 값 6F 6E 76 69 66 5F 65 6E 61 62 6C 65
를 검색했습니다(16진수에서 변환하면 onvif_enable
값이 됩니다). 바로 다음에 적혀있는 값 30
(0
)을 31
(1
)로 변경했습니다. 그 다음으로 수정된 펌웨어를 다시 기기에 입힌 후 전원에 연결해봤습니다.
카메라가 부팅하면서, 예전에 없었던 놀랄만큼 큰 시작음이 들려왔습니다. 갑자기 난 소리에 놀랐지만 ONVIF가 드디어 활성화된 줄 알고 기대하고 있었죠. 아쉽게도, nmap
으로 재검색해본 결과, 추가로 열린 포트가 없다는 점을 확인했습니다.
다음으로 헤이홈과 Tuya의 비공개 펌웨어를 갈아엎을, 완전히 새로운 펌웨어 이미지를 구할 수 있는지 찾아보기로 했습니다.
방금 전에 카메라를 분해하면서, 안에 사용된 SoC가 “Anyka”라는 회사에서 만들어진 AK3918
칩이란 것을 확인했었습니다. 찾아보니, IoT 카메라 제조사들에게 납품하는, 통합형 SoC를 제조하는 중국 회사의 칩이였습니다.
데이터시트가 공개되어 있었지만, 드라이버와 하드웨어 구성은 리눅스 커널에 공식으로 제출된 적이 없었죠. 중국 회사들은 이런 부분에서 특히 미흡한 것이 공통적입니다. 사실, 개조된 리눅스 커널을 제품과 함께 출시하였음에도 커널 소스조차 공개하지 않고 있는데, GPL에 위반되는 사항이지만 이러한 하드웨어 OEM들은 소프트웨어 라이선스 따위는 별로 신경쓰지 않는다는 걸 다 알고 계실 겁니다.
이 SoC를 기반으로 한 카메라들을 역공학으로 분석하는 레포지터리가 몇몇 있었지만, 확인하면서 SoC가 버전별로 출시했다는걸 알게 됐습니다. 찾은 대부분의 레포지터리는 AK3918v200
버전을 지원했는데, 제 카메라에 들어가 있는 버전은 역시 다른 AK3918v300
버전이였죠. v200
레포에서 수정을 해서 v300
버전에 돌아가게 만든다 하더라도, 레포지터리 내용물은 간단한 스크립트들만 있었고, 이를 사용해서 RTSP나 ONVIF를 설정할 수 있을지도 의문이였죠.
아쉽지만, 여기에서 마무리지어야 할 것 같습니다. 카메라를 분해하고, 안의 펌웨어를 추출하고, 그 과정에서 flashrom
프로젝트에 기여하는 것도 재밌었지만, 더 이상의 노력은 시간낭비라고 여겨지니까요.
비교 대상을 가져온다면, ONVIF를 지원하는 카메라는 아마존에서 25불 정도에 구매할 수 있습니다. 구매하고, 설치하고, Home Assistant에 연결하는데 드는 시간은 방금 적어본 경험담보단 훨씬 덜 걸리죠. 이 카메라를 로컬-전용으로 연결할 수 있게 만드는 데 몇날며칠이 걸릴진 모르겠지만, 그 시간이 $25보단 더 값지다는 것은 확신할 수 있습니다.
비교 대상을 잠시 잊더라도, 로컬 서버에 스트리밍이 원천적으로 가능한 카메라가 무슨 비공개 SDK 설정값 때문에 기능이 막혀있다는게 이해가 되질 않습니다. 이 기능이 없다면 저한테는 쓸모가 없고, 거의 대부분의 사용자들에게도 쓸모가 없겠죠. 집 내부를 중국 어딘가에 있는 서버 데이터센터에 스트리밍하면서 불안하지 않을 분들은 없을테니까요… 적어도 그래서는 안 되야겠죠.
하지만 이렇게 구성된 플랫폼은 사용자들이 설정하기 쉬우니 Tuya와 기반한 회사들이 사용하는 방식인 듯 합니다. 폐가전을 운명으로 하는 이런 IoT 제품들을 계속 출시하면 전자제품에 별로 관심이 없는 분들이 구매하게 하는데, 포트 포워딩과 NVR 설치 등을 필요로 하지 않고 간단하게 사용할 수 있으니까요. 하지만 작동 방식에 대한 자세한 이해가 없다면, 제3자가 거실이나 아이 침실 등에 원격으로 접근할 수 있다는 가능성도 이해하기 어려울 겁니다.
그래서 만약 지인분이 집에 실내 카메라(또는 아무런 IoT 기기)를 설치하려고 한다면, 로컬-전용 연결의 중요성을 강조하고, 사용하기 편리하더라도 인터넷을 경유하는 기기들을 들이지 않아야 하는 이유에 대해서 설명해주세요. 요즘에 Home Assistant는 설치하기도 쉽고, 몇 분 만에 설정 가능한 키트도 판매하고 있으니 차라리 이런 로컬 솔루션을 사용하지 않을 이유도 없죠.