- 2人のサイバーセキュリティ学生が、楽しさと挑戦のために洗濯機のハッキングを試みた
- 洗濯機のモバイルアプリをリバースエンジニアリングで分析し、APIと暗号化方式を調査した
- XOR暗号化キーを突き止め、洗濯機の状態データをリアルタイムで読み取り、復号する方法を実装した
- Discord Webhookを活用して、洗濯機の稼働状況や完了通知を自動化する通知ボットを作成した
- 今後は、ほかの「おバカな」家電にも同様のスマートホーム自動化を適用する予定
はじめに
- 筆者は新しく引っ越した家で、友人と一緒に洗濯機ハッキングプロジェクトを進めた
- 純粋な実用性よりも、楽しさと技術的な挑戦が目的だった
- 洗濯機やそのほかの家電をスマートホームシステムにつなげたいという好奇心が出発点だった
- 自分でハッキングして得た経験は、実践的なリバースエンジニアリングの練習にも役立った
背景説明
- 家にはWi-Fi対応のスマート洗濯機が備え付けられていた
- この洗濯機では、モバイルアプリで進行状況の通知を受け取れる
- 一度に1人しかアプリと連携できず、共有しづらい
- この問題を好機と捉え、アプリの制限なしに複数人が状態通知を受け取れるようにすることにした
ドアベルの事例
- 家のドアベルは、433MHzの無線信号で通知を送る仕組みだった
- 友人がドアベル信号を検知し、Discordサーバーに通知を送るシステムを作った
- 実際のドアベル音とあわせて、バックアップ通知用としても活用されていた
- この成功例を見て、洗濯機も同じ方式で通知の自動化連携を試すことになった
計画と準備
- 筆者はモバイルアプリをリバースエンジニアリングして、APIの動作を把握することにした
- スマート洗濯機から直接ネットワークトラフィックをキャプチャするため、OpenWRTルーターを活用した
- 洗濯機を一時的なWi-Fiに接続し、パケットキャプチャで通信パターンを把握しようとした
洗濯機トラフィックの分析
- 洗濯機は、自身のIP、255.255.255.255(ブロードキャスト)、外部サーバー(HTTP API、暗号化トラフィック)、**アプリとの直接HTTP通信(ポート80)**など、複数の経路でトラフィックを送受信していた
- とくにモバイルアプリと直接通信する部分に注目し、この部分を重点的に分析した
洗濯機APIのリバースエンジニアリング
- アプリは /http-read.json?encrypted=1(状態読み取り)と /http-write.json?encrypted=1(コマンド送信)の2つのエンドポイントを繰り返し使用していた
- 注目対象は読み取りエンドポイントだったが、レスポンスデータが暗号化されており(HEX、HTMLタイプ)、そのままでは読めなかった
- クエリパラメータ
encrypted=0 を与えても、復号失敗または400エラーしか返らなかった
暗号化の分析とキーの取得
- XORベースの単純な暗号化だろうと推測し、CyberChef などのオンラインツールでブルートフォース解析を試みた
- 参考プロジェクト(CandySimplyFi-tool)ですでにキー抽出に成功したコードを確認し、それを活用して数秒でキーを復元し、データの復号に成功した
- データスキーマをさらに把握するため、ofalvai/home-assistant-candy のオープンソースコードも参考にした
洗濯機の状態値の実験
- 洗濯機の各種物理操作(プログラム変更、温度・回転速度の調整、稼働・停止・終了)を行った際のデータ変化を確認した
- 主な状態値フィールド:
- Pr: プログラム選択ノブの状態
- PrPh: 進行中の洗濯サイクル
- Temp: 設定温度
- SpinSp: 設定回転速度
- RemTime: 残り時間(分、10分で固定される状況が発生することもある)
- 欠点: 一部の値(例: SpinSp)は実際の値と異なる場合がある
通知自動化スクリプトの開発
- 洗濯機APIのスキーマ、暗号化キー、データの読み取りと復号、状態判定まで実装を完了した
- Discord Webhookを使った通知ボットスクリプトを作成した
- 主な動作の流れ:
- 洗濯機をポーリング
- 状態変化がなければスリープして繰り返す
- 変化を検知したら最後のメッセージを更新するか、新しいメッセージを送信
- 繰り返し
まとめと今後の計画
- すでにドアベルと洗濯機通知の自動化には成功している
- 今後は食洗機、乾燥機、テレビなどにも、同様の自動化(スマートプラグ、振動センサー、IRブラスター)を適用する構想がある
- Webカメラを活用した簡易セキュリティシステムも試す予定
結論
- 今回のプロジェクト経験を通じて、実践的なIoTリバースエンジニアリングと、簡単なスマートホームハッキングの基礎を学べた
- 実用性と楽しさの両方を体験できた事例だった
1件のコメント
Hacker Newsの意見
まず最初に、元記事への批判ではないことは明言しておきたい。本当に興味深い機器解析の過程が見事に紹介されていたと思う。
機器がAndroidアプリと通信しているなら、apk-mitmを勧めたい。
このツールは、既知の証明書ピンニングのほとんどをapkから除去してくれて、ローカル証明書もroot化なしで使えるようにマニフェストを書き換えてくれる。
元のアプリを削除してからapk-mitmの生成物をサイドロードすれば、一般的な素の端末でmitmproxyが使える。
それと重要なのは、アプリに暗号化されたデータを送ってアプリ側で復号して表示しているなら、鍵はアプリのどこかにあるか、どこかから受け取っているはずだということ。
jadxでapkを解析すれば、ほぼJavaコードの形で見られるので、鍵が見つかることもよくある。
ただし、メーカーによっては暗号化処理をネイティブコードに移していることもあるので、その場合はGhidraなどでリバースエンジニアリングする必要がある。
こういう作業はとても退屈なこともあるし、ものすごく面白いこともある。
筆者は既存の他の人たちの研究成果に基づいていたとはいえ、誰もやったことのない作業だとしても、諦めずに挑戦する価値は十分あると思う。
結局のところ、自分が所有する機器の動作を明らかにしながら多くを学べる。
結局そのうちサーバー接続が塞がれ、証明書ピンニングを偶然知ってこのリポジトリを試してみたところ、本当にきれいに解決した。
古い広告URLだったのか、広告まで表示されなくなった。
開発元もアプリをどんどん駄目にすることにしか注力していなかったので、未練はない。
私はBoschの洗濯機を活用して(元記事とは違って)、家の反対側にある洗濯機の進行状況を監視している。
Bosch APIのおかげで、洗濯サイクルが終わったか、ドアが開いたかを把握できる。
現在は基本のAPIバージョンを使っているが、PoCが完了したので、今後はローカルホスティングのオプションに移行する予定だ。
Home Assistantで、サイクルが終わったのにドアが開いていなければ、まだ濡れた洗濯物があるという意味になる。
そこで15分ごとに自分のスマホと、妻が家にいるときだけ彼女のスマホにも洗濯物の通知が届くようにした。
とても単純で、完璧に機能している。
うちの洗濯機は古い90年代のモデルで、タイマーダイヤルに従って動く。
コンピュータやセンサーはなく、水を入れる段階だけ追加で検知している。
いつも40分タイマーに合わせれば終わるし、アラームを切る機能まであるので、これ以上ないほど簡単だ。
私も似たようなことを小型オーブンに適用しようと考えている。
APIや接続機能はないが、スマートプラグにつないで消費電力を測定し、待機状態/動作状態を監視して通知する仕組みだ。
寝る前に洗濯機を回して翌日に持ち越してしまうことがよくあるが、うちの洗濯機には「延長回転」のような機能があって、洗濯物を一晩中フレッシュに保ってくれる。
多少水は余計に使うが、夜のルーティンを救ってくれるし、夜間電力を使うのにも役立つ。
うちのElectroluxは本当に気に入っていて、たぶん他社にも似た機能はあると思う。
私はG-Shock 5600の腕時計を15年以上、洗濯機タイマー通知用に使っている。
洗濯を始めるときに全所要時間を時計のタイマーに設定しておけば、終わるとビープ音で知らせてくれる。
APIの有無に関係なく、ブランドも問わず使える。
本当にエレガントな解決策だ。
単純なロジックなのに、実生活の改善効果が確実にある。
私はいま冷蔵庫のハードウェアハックをしている。
ソフトウェアではなく、キャンピングカー用の高価な冷蔵庫で、ガス/12v/220vに対応している。
電子制御部で火災が起きてケーブルや内部が損傷したが、冷蔵庫本体は無事だった。
なので部品も全部交換しなければならず、250ドル出して新品のコントロールボードを買うより、古いガスボイラーの部品を組み合わせて新しいシステムに置き換えようとしている。
ボイラーのマザーボードに点火装置が一式入っているので、ロジックと安全装置さえきちんと組めば、ガス運転モードで使えるはずだ。
新しい冷蔵庫を買わずに済むし、9歳の息子に電子工学を教えられる良いプロジェクトでもある。
もちろんガスなので危険な可能性はあるが、結局のところいつも楽しいし、ハックが終われば批判も消える。
進捗に興味があれば、まとまった投稿にすることもできる。
私は洗濯機/乾燥機にZigbeeの振動センサーを付けて、Home Assistantにつないで使っている。
スマートコンセントで電流/電圧を監視する方法は思いつかなかったが、いいアイデアだと感じた。
簡単なトリガー条件によって、洗濯機の開始/完了時点でダッシュボード更新やメール通知まで自動化される。
アプリやBluetooth機能もあるが、アプリが私のスマホのカメラ、音声、連絡先へのアクセスを要求するので使う気はない。
HA連携に関する作業は、下のリンクでも進められているようだ。
https://github.com/home-assistant-HomeWhiz/home-assistant-HomeWhiz/blob/main/README.md
こういう記事こそがHacker Newsの真髄だと思う。
実際のハッキング(趣味的な改造)として、こういう記事がもっと増えてほしい。最近はAI/LLMの話ばかりだと感じる。
こういう種類のハードウェアハックが好きなら、https://hackaday.com/ も強くおすすめする。
root化されていないAndroidで個人証明書をインストールするのは面倒なほうだ。
システム証明書ストアにしか追加できず、普通はMagiskモジュールが必要になる。
もっと簡単な方法は、古いAndroidエミュレータをPCで動かして証明書を入れ、トラフィックをBurpsuiteやmitmproxyに流すことだ。
端末を替える必要もない。
APKLabやJadxでアプリコードを解析すれば、鍵導出アルゴリズムくらいは見つけられるかもしれない。
アプリと洗濯機が必ず同じネットワーク上にいるときだけ動作するのか気になるが、その点は気に入っている。
「3時間コース」(実際には4〜5時間)という洗濯サイクルだという話に驚いて質問した。
うちの洗濯機は通常のエコモードでも30分もかからず、終わるとかなり大きな音で知らせてくれる。
短いサイクルと通知の組み合わせのおかげで、別途複雑な技術的解決策は必要ない。
たぶんそのコメントを書いた人はアメリカ人だと思う。
ヨーロッパの洗濯機は、水や電力の使用量に関する要件が厳しいため、もっと時間がかかる。
あの記事の機器は洗濯乾燥一体型なので、さらに長くかかるようだ。
うちでは通常モードでも104分で、詰め込みすぎると最大3時間かかる。
長いサイクルのほうが、酵素系洗剤や活性酸素系漂白剤の成分を使うことで微生物除去がより確実になる。
30分コースは、洗濯物をただ「すすいでいる」程度だ。
https://pubmed.ncbi.nlm.nih.gov/25207988/
うちの乾燥機はダクトレスモデルで(正直ぼやきたくなる)、そのせいで3時間もかかる。
洗濯から乾燥まで4.5時間も消費する。
今まで使った家電の中で一番不満が大きい。
たまに乾燥もきちんと終わらない。
暗号化が見当たらないと指摘している。
最初のスクリーンショット(cyberchef.avif)のinput windowにあるデータは、単純な未暗号化のhex ASCIIだと分析している。
例として、7Dは{、0D0AはCRLF、09はTAB、22は"といった解釈を示している。
つまりデコード済みの平文であり、XOR暗号化だという説明とは一致しないように感じた。
また、スクリーンショットに出ている鍵の値もバイト境界やアラインメントが合っておらず、実際の入力のgapとも一致しないと分析している。
そのため、スクリーンショットが捏造または編集されたものではないかと疑っている。
理由が何なのか、何が起きているのか知りたいと述べている。
“For now, I plugged this key into CyberChef, and was able to decrypt the data.” と記された画像リンクが壊れていると知らせている。
特定のHTML要素と関連リンクまで詳しく示している。
「洗濯機が自分自身とものすごく通信していた」という部分について、ネットワークスタックの設計者がloopbackインターフェースの概念を知らなかったために起きたのではないかと指摘している。
自分自身のIPに大量のパケットを送り、255.255.255.255にも毎秒パケットを送っていたそうだが、本人はあまり気にしていなかったという。
IoT機器でこういう挙動はよく見かけるし、IP衝突や変更の検知のために使うこともある。
自分も同じように思う。