どうも(人によってはお久しぶりです)、ν(ニュー)です。
個人的に最近スマートフォンの内部の話にハマっていて、いろいろ調べています。今回は、その中からQualcomm製SoCに搭載されている「EDLモード」についての話をします。
注意
説明を簡単にするために、一部正確な定義とは異なる呼び方をしているものがある可能性があります。その点を理解の上お読みください。
そもそもEDLモードとは?
EDL(Emergency DownLoad)モードとは、主に端末が起動しなくなった際などに、USB通信経由で内部のファームウェアの読み書きなどができるモードです。このモードに入った際のUSBのPIDが0x9008
なことに由来してか「Qualcomm 9008 Mode」と呼ばれることもあります。
EDLモードに入るためには
EDLモードに入るためには、主に以下の方法があります。
- 専用のケーブル(Deep Flash Cable、自作可能)を使う
- USBデバッグ経由で「
adb reboot edl
」を実行する - 端末の音量ボタンの+/-の両方を押しながら、USBケーブルを接続する
- 端末を分解し、テストポイントと呼ばれる部分をつつく
- 正規のブートローダーの起動に失敗した場合
しかし、最近の端末ではEDLモードに入るための制限が加わっていることが多く、特に分解しないで済む方法は使用が困難になってきています。
EDLモードに入った後
EDLモードに入っただけではまだダメで、ここからFirehose programmerと呼ばれるプログラムを端末に読み込ませる必要があります。
このプログラムが端末上で実行されることで、PCからファームウェアの読み書きが可能になります。
多くの場合、プログラムに対しては適切な署名がされていることが求められており、悪意のあるコードの実行を簡単には行えないようになっています。
拡張子は*.mbn
であることが多く、これはELF形式にセキュアブートに必要なデジタル署名を付加したものになります。
データ構造や機能の概説は、Qualcommの以下の資料に記載があります。
Secure Boot and Image Authentication
https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/secure-boot-and-image-authentication-version_final.pdf
Firehose programmerの入手は、メーカーが配布しているリカバリ用イメージなどから行われることが多いです。
EDLモードを使ったファームウェアの読み書き
Pythonで実装されたEDLモード上でのファームウェアの読み書きなどが行えるツールがあります。
このツールは非常に有用ですが、一部の端末では正しく動かない場合があります。幸いソースを見ることはできますので、エラーから適切に対処してあげると良いと思います。
EDLモードへの対策は?
EDLモードは、その性格上端末への物理的アクセスができる場合、内部のデータを読み書きされてしまう可能性があります。
EDLモードの利用を脅威とみなす場合、以下のような対策が考えられます。
- セキュアブートを有効にし、プログラムのデジタル署名の検証を行う
- 使いまわしを防止するために、メーカー汎用のデジタル署名を利用しない
- 容易にEDLモードに入るための手段を使えなくする
さらなる理解のために
EDLモードのソフトウェア的な動作が詳しく書かれている資料に、Aleph Researchの「Exploiting Qualcomm EDL Programmers」シリーズがあります。
また、実際にロードされる*.mbn
ファイルの内部を調べることも有用かと思われます。