愛犬を見守ろうとしたら、TP-Linkを監視することになった
(kennedn.com)- 室内の犬を観察するために Tapoカメラ を購入したが、思いがけず TP-Link機器とアプリの動作原理 を逆解析することになった
- オンボーディング過程 と 暗号化API通信 の構造を分析するため、MITM、APKデコンパイル、復号スクリプト作成などさまざまな手法を用いた
- 初期管理者パスワード の発見とセッションキー導出過程を通じて暗号化メッセージを復号し、デバイスとクラウドアカウント間の信頼性のない同期問題を把握した
- オンボーディング全体の流れ を分析し、主要なAPI呼び出し、アカウント作成、パスワード変更、Wi‑Fi接続過程などを Bash スクリプトで自動化した
- Tapoファームウェアのセキュリティ設計上の欠陥、洗練されていない暗号化実装、不規則なアカウント同期など、低価格IoTデバイスの特徴を指摘している
プロジェクト概要
- 筆者は室内で犬を見守るために 低価格のTapoカメラ を購入して使用した
- 使用する中で 設定の不便さ とオンライン情報の不足により、製品の動作原理を深く掘り下げる動機を持つようになった
- frigate 連携や 2way audio の有効化などで予想外の問題が発生し、クラウド連携なしの 直接オンボーディング の方法に関心を持った
オンボーディングと認証構造の分析
- Tapoカメラの接続手順を分析するため、MITM proxy と frida の動的フックツールを使ってアプリとカメラ間のトラフィックを傍受した
- 最新のアプリはプロキシ無視や certificate pinning などの耐回避機能を備えているため、動的ツールを用いる手法が有効だった
- このような回避構成を整えた後、カメラのオンボーディングフローで デフォルト管理者アカウントのlogin 過程を正確に確認した
- デフォルトlogin API はクラウドアカウントのパスワードとは別に、デバイス固有の デフォルトパスワード で動作することを発見した
暗号化構造とデフォルトパスワードの探索
- APKデコンパイル(JADX使用) とコード分析を通じて、
adminアカウントの デフォルトパスワード(TPL075526460603)を入手した - クラウドのパスワードを変更しても、すでに連携済みのカメラ機器は変更を認識できない点から、アプリとカメラ間の パスワード同期が不正確 であることを確認した
- デフォルトパスワードが判明したため、セッションキー(
lsk,ivb)の導出ロジックを実装し、暗号化APIメッセージ をリアルタイムで復号できるようにした
mitmproxyスクリプティングとAPI分析
- PyTapo オープンソースプロジェクトを参考に、実際の Tapoオンボーディング手順のAPIフロー を詳細に分析した
tapo_decrypt_pretty.pyスクリプトを通じて- loginハンドシェイクの検出
- セッションキーの抽出
- 暗号化APIの復号と可読性の高い出力、JSON保存
- オンボーディング全体のAPI呼び出し履歴のうち、有意な主要過程だけを抽出して自動化ワークフローを作成した
- Wi‑Fi一覧取得(
scanApList) - RTSP/ONVIFアカウントの有効化
- 管理者パスワードの変更
- Wi‑Fi接続
- Wi‑Fi一覧取得(
自動化と結果
- Bashスクリプト(
tapo_onboard.sh)で上記のオンボーディング過程を 自動実行 できるよう構成した- デフォルトadmin login
- Wi‑Fiの選択と接続
- カメラフィードのロゴ削除
- RTSP/ONVIFの使用許可
- 管理者パスワードの再設定
- カメラのファームウェア構造上、次のような特徴と欠陥を発見した
- 一部のAPIは SHA-256ハッシュ を使う一方、いくつかは MD5 など旧式の暗号方式を維持している
- 公開鍵 が2つ存在し、どの状況でどの鍵を使うべきか不明確である
- アプリとデバイス間の パスワード同期 が非常に不安定である
結論と所感
- TapoカメラのファームウェアとAPIのセキュリティ構造は その場しのぎで洗練されていない設計 に感じられた
- 低価格IoT機器の セキュリティ上の欠陥 と不完全なオンボーディングシステムの現実を間接的に体験した
- プロジェクトの最終目標だった犬の見守りには成功し、犬はたいていソファかベッドで寝ていることを確認した
2件のコメント
CVE-2022-37255 は 7.5 点ですね
Hacker Newsのコメント
自分の Frida スクリプトが使われていて面白いと感じた。そのスクリプトはここで確認できる。実環境でうまく動いているようでうれしい。もし追加や修正した点があれば聞きたい
ちなみに、双方向オーディオを frigate で使うには、通常の
rtsp://ではなくtapo://の go2rtc 設定をメインストリームに適用する必要がある。TP-Link は独自 API でしか双方向オーディオを提供していない。この設定をすると ONVIF(オープンソースツールによるカメラのパン/チルト制御)が使えなくなるので面倒だ。両方の機能を使うには、tapo://ストリームの読み取り停止 → onvif クライアント実行/パン・チルト調整 → onvif 終了 →tapo://再起動、というかなり強引なワークフローを繰り返す必要があるIoT セキュリティは全体的にひどいと思う。特に、一般向けルーターがすべてのネットワークトラフィックを処理する監査不能なブラックボックスである点が心配だ。ほとんどの人は、ルーターのファームウェアが何年も更新されておらず、既知の脆弱性が残っていることを知らないことが多い。ネットワーク機器のサプライチェーンにおける信頼モデルは完全に壊れていると思う
このブログ記事は非常によく書かれていると感じた。最近はこういうスタイルの記事が LLM 生成であることも多く、読みにくい場合が少なくないが、この記事は技術的でありながら読みやすいバランスがうまく取れていて印象的だ。(表紙画像は AI 生成だと分かるが、記事の本質とは無関係だと思う)
Frida や mitmproxy のようなツールを Android アプリで今後も使い続けられるのか気になる。来年から署名要件が適用されたらどうなるのか知りたい
ちなみに、関連事例としては The Tapo C200 research project と PyTapo: Tapo カメラ向け Python ライブラリ がある
もう1つの関連資料として、(TP-Link ファームウェアの復号化と C210 V2 クラウドカメラのブートローダー解析)がここにある
OP の犬がベッドから床に移動するのは、もしかすると暖房機(ラジエーター)がついたからではないかと推測する。追加のセンサーデータが必要そうだ
もう、ハードコードされた管理者パスワードが見つかっても大した話ではない時代に来た気がする
Tapo カメラのうち RTSP をサポートするモデルをまとめたリファレンスが欲しい。C210 はそこそこうまく動いていて(クラウドキャプチャは不可)、frigate と連携して使っている。今日 C402(屋外向け)を買ったのだが、こちらは advanced 設定に camera account がなくて残念だった。価格の安さは魅力だが、機能の統一性が足りないと感じる。安価で RTSP ストリーム対応、しかもソーラーパネル付きの良い屋外カメラがあればおすすめを知りたい
rtsp://をサポートしていなくても、tapo://の go2rtc ストリームソースを使うことはできるはずだ。自分の frigate 設定を参考までにここに置いてある