Bluetooth LE LED照明コントローラーのリバースエンジニアリング、あるいは私がどうやってクリスマスの照明を壊してしまったか
- Bluetooth LEで通信し、アプリがあるデバイスは、家庭内自動化システムに統合する価値がある。
- 低予算のLEDライトストリップをリバースエンジニアリングして自動化することに、かなりの時間を費やしてきた。
- 最近では、最安の2.38ポンドのBluetooth LE制御5M非アドレス指定ストリップを、数時間でHome Assistantに接続することに成功した。
ステップ1. 配線越しのバイト
- 独自ソフトウェアからデバイスを制御するには、アプリからデバイスに送られるBluetoothバイト列を調べるのが第一歩である。
- Androidではこの作業が簡単にできる。開発者モードを有効にし、照明アプリをインストールしたうえで、開発者設定の
Bluetooth HCI snoop を有効にしてログを記録する。
- Wiresharkでログを開けば、正確なバイト列を確認し、値のパターンを見つけて、各操作に対応するバイト列を特定できる。
ステップ2. リプレイ攻撃
- 単に照明のオン・オフが目的なら、観測した繰り返しのバイト列だけで電源制御には十分かもしれない。
gatttool を使えば、BLEデバイスに接続してバイト列を送るテストができる。
ステップ3. Androidアプリの逆コンパイル
- アプリのAPKをダウンロードし、jadxで開いて内部の秘密を確認する。
- ソース内でAESへの参照を見つけ、暗号化されたプロトコルの可能性が示唆された。
- 暗号化されたデータは毎回変化するわけではなく、低消費電力MCU上で高速な復号が必要であり、各デバイス固有ではない固定キーが使われている可能性がある。
ステップ4. すべての機能
- アプリの各機能を試しながら、送信されたバイト列を記録した。
- 各操作を記録し、繰り返し、パターンを見つけ、キャプチャしたバイト列とメモを対応付けるのに役立つ。
ステップ5. 自動化された電子廃棄物生成機
- 色の変更を探っている最中に、アプリが赤・緑・青に対して 0x1F を超える値を送っていないことに気づいた。
- 8ビット値を試してみると、より明るい色も問題なく動作することがわかった。
- 追加のエフェクトがあるのではないかと考え、単純なループで試してみた。
- 10番目のエフェクトまではうまく動いたが、11番目で秘密のモードを発見し、12番目で闇が訪れた。
- 再起動も試したが照明は二度と点灯せず、Bluetoothのアドバタイズも行わなくなったため、これ以上接続できなくなった。
- バッファオーバーフローでファームウェアが破損したのだろうと推測している。
- とはいえ、LED自体は標準的なアドレス指定可能LEDなので、別のマイクロコントローラーにつないで使うことはできる。
どうすれば私の照明を壊せるのか
- 問題が起きたにもかかわらず、プロトコルの大部分を文書化し、Home Assistantのカスタムコンポーネントを含むGithubプロジェクトを作成した。
- 動作はするが、リスクを承知のうえで進める必要がある。
GN⁺の見解
- この記事で最も重要なのは、自宅で使うスマート照明を自動化システムに統合しようとするDIY精神と、リバースエンジニアリングへの情熱である。
- リバースエンジニアリングの過程は、技術的知識だけでなく問題解決能力や創造性も必要とし、初級ソフトウェアエンジニアにとっても非常に興味深いテーマである。
- 失敗の経験を共有することは、他の人が同じ失敗を繰り返さないように助けとなり、このような公開の知識共有はオープンソースコミュニティの中核的価値の一つである。
1件のコメント
Hacker Newsの意見
復号したパケットの分析
電源供給の問題
暗号化された照明のリバースエンジニアリングの試み
BLE照明についての意見
BLE接続のクリスマス照明を自動化しようとした試み
メッセージ暗号化への疑問
暗号化についてのコメント
照明ハッキングについてのユーモラスなコメント
Govee照明のリバースエンジニアリングに関する初心者の質問