
2026/11/13 7:03
Coway の空気清浄機をリバースエンジニアリングしてクラウド接続を回避する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Coway 空気清浄機の制御手法の進化は、不安定なクラウドベースのハッキングから、Home Assistant を使用した堅牢かつローカル限定のソリューションへ移行しました。初期の統合では、Coway の IoCare アプリをリバースエンジニアリングし、Raspberry Pi アクセスポイントを用いたマン・イン・ザ・ミドル(MITM)プロキシ構成を利用しました。この初期アプローチは、弱い eMudhra ルート証明書を利用して Amazon のルート CA を差し替える HTTP 要求の傍受に依存しており、サーバーのダウン時間、SSL の変更、Coway によるアカウントBANなどの理由で信頼性の問題を抱えていました。重要な転換点は、Bluetooth キャラクターISTIC ス通过へのリバースエンジニアリングにより、Wi-Fi プロビジョニングが暗号化されたペイロードを使用していることが明らかになったことです。Android アプリのデコンパイルを AI に活用してこの発見を加速させた結果、設定時の Bluetooth 構成ペイロードにカスタムサーバー認証情報を直接埋め込むことが可能となりました。この手法は、永続的な外部プロキシまたはクラウドインフラストラクチャの必要性を排除し、Apple HomeKit などのスマートホームエコシステムとのシームレスな統合を可能にする直接的なローカル Wi-Fi 通信を実現します。加えて、このセキュリティ分析は、埋め込まれたルート証明書が利用可能な広範な脆弱性を明らかにしており、これはメーカーに対してプロビジョニングプロトコルの更新およびデバイスセキュリティ基準の強化を促す可能性があります。
本文
空気清浄機 Coway Airmega を Home Assistant で完全制御:MitM と Bluetooth プロトコルの逆解から自走サーバーへ
2017 年、西海岸の激しい野火により空気が悪化しました。断熱材も気密性も不足する家屋で、煤(すみ)窒息を避けるため多くの人が空気清浄機を購入しました。特に不動の名物製品である Coway Airmega は、高価な箱型ファンに HEPA フィルターとセンサーが搭載された実用的なデバイスでした。
妻の「夜間のホワイトノイズ」と私の「睡眠中の必要性」を経て、このデバイスは家庭必需品となりつつありました。スマート照明と連携させるためには、旧モデルでは Wi-Fi 接続の欠落が障壁となりました。現在は廃盤となった Coway Airmega IconS(Wi-Fi 接続対応)を購入し、Apple Home との連携を試みました。
既存の連携アプローチとその限界
1. Coway クラウド依存による脆弱性
Coway の公式 iPhone アプリはクラシックな IoT アプリですが、起動が遅く認証が煩雑です。これをリバースエンジニアリングして Home Assistant 統合を作成し、クラウド経由での制御を実現しました。
動作フロー:
graph LR A[Home Assistant] -->|IoCare 連携 | B[Coway IoCare クラウド] B -->|ステータス・コマンド | C[Airmega IconS] D[Apple Home] -->|「グッドナイト」ボタン | A
しかし、このアプローチには以下の致命的な欠点があります。
- サービスの不安定さ: Coway のサーバーが年 1〜2 回ダウンすることがあり、遠隔制御不可になります。
- 統合の破損リスク:
- コミュニティと長期的な議論を経て許可されたアクセス制限。
- アプリリニューアルに伴うサービス名変更(IoCare → IoCare+)。
- HTML レイアウトの細かな変更によるスクリピング失敗。
- アカウント凍結リスク。
- サービスの存続不確実性: 将来的に利用課金化または終了される可能性が高く、既に廃盤のモデルは対応できないでしょう。
突破口:中間者攻撃(MitM)の自動化
Coway のクラウドから脱出し、独自のサーバーで制御する道を探りました。
1. 技術的障壁と変化
完全な MitM(中間者攻撃)環境構築には、隔離された Wi-Fi ネットワークへの接続やルーター設定の変更など、多くの手間がかかります。しかし、状況に変化がありました。
- セキュリティインシデント: eMudhra という証明書発行機関の秘密鍵が弱かったため、ルート CA が入手可能になりました(2026 年 10 月の事例)。これにより MitM で SSL 検証を通過させやすくなりました。
- AI の活用: LLM(大規模言語モデル)を活用し、MitM 環境のセットアップやファンの内部構造調査を自動化しました。
2. Raspberry Pi と mitmproxy によるトラフィック傍受
空気清浄機とインターネット間に Raspberry Pi を挟み込み、
mitmproxy で通信の中継・復号化を行いました。
ネットワーク構成:
- 空気清浄機(Wi-Fi) ↔️
(Wi-Fi アクセスポイントとして隔離ネットを構築)Raspberry Pi - Pi のトラフィック →
で中継・ログ記録mitmproxy
↔️ ノート PC(イーサネット経由でブリッジ)mitmproxy
nftables ルールの設定例: Pi 上で masquerade と redirect ルールを設定し、HTTP/HTTPS を
mitmproxy (ポート 8080) へ前方転送します。
sudo nft -a list ruleset table inet mitmproxy_ap { # ハンドル 8 set client_interfaces { # ハンドル 4 type ifname elements = { "wlan0" } } chain prerouting { # ハンドル 1 type nat hook prerouting priority dstnat; policy accept; meta nfproto ipv4 iifname @client_interfaces tcp dport { 80, 443 } counter packets 2 bytes 120 redirect to :8080 # ハンドル 6 } # ... (他のチェーン略) }
eMudhra 証明書の自動利用: 標準パッケージの
mitmproxy にビルトインオプション --emudhra-old を使用し、旧 eMudhra ルート CA を自動的にトラフィック傍受に活用します。
mitmweb \ --mode transparent \ --showhost \ --listen-host 0.0.0.0 \ --listen-port 8080 \ --web-host 127.0.0.1 \ --web-port 8081 \ --set web_open_browser=false \ --emudhra-old
3. 仮説の検証:ルート CA の動的ダウンロード
アプリが「接続失敗」を報じても、隔離ネットに接続していることが確認できました。分析の結果、ファンは平文 HTTPで Amazon のルート CA を読み込んでいることを発見しました。
結論: デバイスは組み込みの固定ルート証明書を持っていないため、外部から公開されている証明書をダウンロードして検証しています。
この仮説を検証し、公開証明書を読み込む場所を
mitmproxy が生成する自身の CA で差し替えました。
def response(flow: http.HTTPFlow) -> None: if ( flow.client_conn.peername[0] == "10.42.0.93" # デバイス IP and flow.request.scheme == "http" and flow.request.method == "GET" and flow.request.pretty_host == "rootca-fs.iocareus.com.s3.ap-northeast-2.amazonaws.com" and flow.request.path.split("?", 1)[0] == "/AmazonRootCA1.pem" ): certificate = Path("/var/lib/mitmproxy-ap/mitmproxy-ca-cert.pem").read_bytes() flow.response = http.Response.make( 200, certificate, { "Content-Type": "application/x-pem-file", "Cache-Control": "no-store", }, )
この変更により、ファンは新しい CA を信頼し、残りのトラフィックを
mitmproxy が傍受・中継できるようになりました。クラウドサービスへの接続が不要となりました。
4. MQTT プロトコルの発見と独自サーバーの構築
コマンド実行時の通信を解析すると、ポート 8883 で TLS over MQTT のトラフィックが確認できました。 API レスポンスから以下のような情報を取得し、キーとサーバー位置を特定しました。
{ "header": { "success": true, "result": "S1000" }, "payload": { "macAddr": "<redacted>", "host": "a29vouc2qruduj-ats.iot.ap-northeast-2.amazonaws.com", "port": 8883, "caUrl": "http://rootca-fs.iocareus.com.s3...", "certSvrUrl": "https://icert-fs.iocareus.com/<redacted>..." } }
成果:
- ファンが MQTT サーバーに接続するためのキーとサーバーアドレスを独自に生成・制御可能になりました。
のプラグインで応答を操作し、独自キーを注入することで、MQTT プロトコル自体のプロキシ化も実現します。mitmproxy
Bluetooth 経由でのプロビジョニングと完全脱獄
Coway アプリでは初期設定(プロビジョニング)が Bluetooth を通じて行われます。ここでも独自のサーバーへの転換を目指しました。
Android アプリのデコンパイルによる解析
従来のデコンパイルやオブフスケーションへの対処に加え、Android ブルートゥースデバッグログを AI に解析させることで、プロトコルを再構築しました。
この調査から、プロビジョニングの詳細な手順が明らかになりました。
- MAC アドレス取得: キャラクター
を通じてデバイスの識別情報を Bluetooth で読み取る。FFA0 - 暗号化キー設定: 特性
に 20 文字のランダム ASCII キーを書き込む。FFA2P001 + プロトobuf { command: 1, key: Base64(random_letters) } - AES キー生成: キーと MAC アドレス(上段 12 文字)を連結して AES キーを構築。
- 構成ペイロードの作成・暗号化:
JSON ペイロードをプロトobuf で包装し、PKCS#7 でパディング後、AES で暗号化する。
{ "cmd": 2, "ssid": "Example Wi-Fi", "pwd": "example-wifi-password", "bssid": "AABBCCDDEEFF", "macAddr": "112233445566", "caUrl": "http://192.0.2.1:8080/ca.pem", "certSvrUrl": "https://192.0.2.1:9443/iot/v1/cert/r0", // ... その他パラメータ }
: 平文 HTTP でルート CA を読み込む場所。caUrl
: MQTT 構成情報を取得する HTTPS POST 宛先。certSvrUrl
独自のサーバーへの完全移行
AI と Python スクリプトを活用し、このフロー全体を再実装しました。Bluetooth ログに含まれるデータが復号化の正しさを保証するため、手動でのデコンパイル分析よりも効率的です。
最大の発見: ペイロード内の
caUrl と certSvrUrl を自由に設定できることが分かりました。これにより、
- 独自の Web サーバーで CA 証明書を提供。
- 独自 MQTT サーバーで構成情報を提供。
することで、MitM 環境(隔離ネットやルーター設定)の構築すら不要になりました。設定時は Coway アプリを一部使用して Bluetooth プロビジョニングを行い、その後 Wi-Fi で直接独自のサーバーと通信するようになります。
Home Assistant 統合の完成
これら発見に基づき、Home Assistant 用カスタム統合を開発しました。
- Web ブルートゥース連携: Home Assistant サーバーがBluetoothを持たない場合でも、ラップトップをファンの隣に設置して Web ブルートゥースを使用し、設定可能です。
- 完全な独立: 一度設定すれば、デバイスと Coway クラウドとの通信は完全に遮断され、Home Assistant を介して全てを制御できます。
- Apple Home へのブリッジ: 独自サーバーで動作しているため、Apple Home との連携も維持可能です。
ついに、「グッドナイト」ボタンを押すだけで、灯りが消え、設定済みの音量のホワイトノイズが流れ、Air Purifier が自律的に稼働します。Coway クラウドへの依存は解消され、完全なる自走型の IoT デバイスとしての運用を実現しました。