DJI Mavic 3ドローン研究パート1:ファームウェア分析

DJI Mavic 3ドローン研究パート1:ファームウェア分析

Nozomi Networks ラボは最近、DJI Mavic 3シリーズのドローンのセキュリティに関する調査を行い、特にQuickTransfer Modeと呼ばれるWiFiベースのプロトコルに焦点を当てた。このプロトコルは、ドローンが飛行していない時に、ユーザーがドローンから直接携帯電話にビデオや写真を素早くダウンロードすることを可能にする。

ファームウェアのダウンロードと解析に成功した後、まだパッチが適用されていない脆弱性がいくつか発見されました。パッチの適用プロセスはまだ進行中であるため、これらの脆弱性の詳細をお伝えすることはできません。しかしながら、パッチがリリースされ次第、今後のブログで詳細をお伝えする予定です。

このブログ・シリーズの第 1 部では、DJI がクラウドベースのインフラを経由して実施したファームウェア・ アップグレード手順について説明し、DJI の公式モバイル・アプリを分析し、公式ファームウェアをダウン ロードして分析するために、どのようにその保護をバイパスすることができたかについて詳述する。

DJI通信コンポーネント

通常、デバイスのセキュリティ評価を実施する場合、最初のフェーズでは、ファームウェアの広範な分析が 行われる。これにより、調査者は、デバイス上で実行されているオペレーティングシステムと主要なサービスを構成するバイナリとコンフィギュレーション・ファイルを入手し、検査することができる。

残念ながら、DJIデバイスのファームウェア・イメージはダウンロードできないが、サードパーティのウェブ・プラットフォームの中には、最も使用されているDJIドローンやRC(リモート・コントローラー)のファームウェア・イメージを配布しているものもある。そのような選択肢もあったかもしれないが、セキュリティ研究者としては、いくつかの理由から、ファームウェアイメージを入手するためにサードパーティのプラットフォームに依存することは好まない:

  • サードパーティのプラットフォームが信頼に足るかどうか、本物のデータを配信しているかどうかは不明だ;
  • 画像がいつまでオンラインでアクセスできるかは不明;
  • 新しく導入された機能を分析するためには、新しいファームウェア・リリースにすぐにアクセスする必要がある。

これらの理由から、我々は、DJIクラウドインフラストラクチャから直接ファームウェアを取得するために、物理的なドローン上のDJIファームウェアアップグレード手順を分析することを選択した。

ドローンに送信されたファームウェア・パッケージを傍受するためには、アップグレード手順に関わる主要な通信コンポーネントを理解しなければならない:

  1. DJI Cloudインフラ:各ドローンモデルのファームウェアパッケージを保存するクラウドベースのウェブインフラ、
    ‍。
  2. リモートコントローラー: ドローンのリモートコントローラーとして機能する装置。これは2つの異なるコンポーネントで構成される:
    ‍。
  3. 無線コントローラー:OcuSyncと呼ばれるDJI独自の無線プロトコルを介してドローンと通信するDJI専用のハードウェアで、
    ‍。
  4. モバイルデバイス:無線コントローラに物理的にリンクされたスマートフォン(IOSまたはAndroid)で、ユーザーのグラフィカルインターフェースとして機能する。
  5. ドローン・デバイス: ファームウェア・アップグレード・パッケージを受信し、インス トールするターゲット・デバイス。

DJIファームウェアのアップグレード手順

ラジコンに接続するには、モバイルデバイスにDJIの公式ウェブサイトからダウンロードしてインストールできるDJI Flyアプリケーションが必要です。このアプリにより、ユーザーは新しいファームウェアリリースを入手し、それを無線コントローラーを通じてドローンにプッシュすることができる。新しいファームウェアがリリースされると、DJI Flyはユーザーに通知を送り、ユーザーはそれをインストールするかどうかを選択できる。ファームウェアはDJIによって署名され、署名の検証が成功した場合のみドローンに受け入れられる。図1は、プロセス全体の概要を示すDJIの公式ドキュメントの画像である。

安全なファームウェア・アップグレード手順
図1.安全なファームウェアのアップグレード手順(DJI公式ドキュメントより)。

モバイル・アプリケーションの簡単な分析を行った後、いくつかの追加情報を収集することができました。モバイル・アプリケーションとクラウド・インフラストラクチャ間のトラフィックを受動的にスニッ フしようと試みましたが、HTTPS により暗号化されているため、これでは不十分であることがすぐにわかりました。

DJIセキュアアップグレード手順
図2.DJIセキュアアップグレードの手順。

モバイル・アプリケーションに実装された証明書のピン留めにより、信頼できるTLS証明書を提供するサービスとの接続のみが許可されるため、中間者(MitM)攻撃の最初の試みも失敗した。証明書のピン止めは、標準的なライブラリを使ったり、アプリケーション内に直接カスタムコードを実装したりと、いくつかの方法で実装することができます。さらなる盲目的な試みを回避し、多くの障害を克服するために、私たちはDJI Flyモバイル・アプリケーションについてより徹底的な分析を行い、標的型攻撃のシナリオを開発することにしました。良いニュースは、アプリケーションを検査することで、我々の分析を強化するための貴重な洞察を得ることができるということです。

DJI Fly アプリケーション分析

分析時にAndroidで利用可能な最新のDJI Flyアプリのバージョンを分析しました:

  1. バージョン1.9.0-3055175(2022年12月)
  2. SHA256 7fbc75516445cf6c26decc08d286f76a46ab8079
アプリケーション・マニフェストとデコンパイルした デックス ファイル内の .apk ファイルを見ると、このアプリケーションにはDJIの実装が含まれていないことがわかった。その代わりに、com.secneoとして実装されたアプリケーション・ラッパーが含まれており、このラッパーは、以下のように知られるネイティブ・ライブラリをロードするためのメイン・ポイントとして機能する。 libDexHelper.so を実行し、その上でネイティブ・メソッドを実行する。
デコンパイルされたアプリケーションの内容。
図3.デコンパイルされたアプリケーションの内容。
に加えて libDexHelper.so ファイルには、他にも多くのネイティブ・ライブラリが含まれている。しかし、コードが高度に難読化されているため、Ghidra や IDA Pro のようなツールではすぐに解析することができません。さらに分析を進めると、パッカーにはいくつかのアンチデバッグ技術や特定のフリーダ検出機能も実装されていることがわかり、アプリケーションの分析がさらに複雑になりました。デバッグやインストルメントを行うために、これらの防御を回避する方法を理解するためにパッカーを反転して解析することは、利用されているコードが強力に難読化されているため、非常に時間がかかる可能性があります。コードを単純化し、さらに分析できるようにするため、私たちは暗号化解除されたコードをダンプしました。 デックス ファイルからアプリケーションの生のメモリ・レイアウトを読み取る。 /proc/self/maps を悪用したコード・インジェクション DT_NEEDED のエントリーをQuarksLabのLIEFで検査し、アンパックされたデータを抽出する。
その結果 デックス を抽出し、dex2jarを使用してスクリプトを作成した後、アプリケーション・コードを含む1つのJARファイルを作成した。このJARファイルは、図4に示すように、Jd-Guiなどのツールで解析することができる。
解凍されたDJI Fly Androidアプリケーション
図4.解凍されたDJI Fly Androidアプリケーション。

証明書のピン留めを破る

コードを検査することで、証明書ピン留めの実装を見つけることができ、それはAndroidエコシステムが提供する標準ライブラリを使って実行されているようだ。その TrustManagerFactory Java クラスが提供する javax.net.ssl この目的のために、図5に見られるようなパッケージが使用される。
証明書のピン留め実装
図5. 証明書のピン留め実装
この段階では、証明書のピン留めをバイパスするのは比較的簡単な作業である。の動作を変更することで実現できる。 TrustManagerFactoryclass の実装を、証明書チェックを無視するような方法で変更した。パッカーのアンチデバッギングとフリーダ検出機能を回避するために、私たちはターゲットの TrustManagerFactory にて。 接合子 レベルを生成する。Android OS上のすべてのアプリケーションは、起動するメイン・プロセスのクローンを生成するため、アプリケーションのブートストラップ前に発生するインジェクションを透過的に保つことができる。我々は、root化されたPixel 6aモバイル・デバイス上で2つのツールを使ってこれを実現した:
  • LSPosedフレームワークは、接合子レベルでの注入を可能にする
  • TrustMeAlreadyプラグインは、アプリケーション起動時に接合部レベルでTrustManager Androidクラスのインスツルメンテーションを実装します。

ファームウェアのダウンロードと解析

DJIモバイルアプリケーションとDJIクラウドインフラストラクチャの間で交換されたデータを検査する能力により、ドローンのファームウェアアップグレード中に交換されたリクエストとレスポンスのタイプを分析することができました。Mavic 3 Classicをアップグレードしている間、我々は通信を傍受し、新しいファームウェアパッケージをダウンロードするために使用されたAPIのエンドポイントを分析した。調査の結果、ドローンにはいくつかのコンポーネントがあり、それぞれがモジュール ID によって識別される固有のファームウェア・イメージを持ち、個別にダウンロードされることが判明した。このプロセスは、認証された HTTP REST リクエスト(各ファームウェア・モジュールに1つずつ)をエンドポイントに送る。 /getfile/ダウンパス にある。 mydjiflight.dji.com 図6に示すように
図 6 ファームウェア・ダウンロード HTTP リクエスト
図6.ファームウェアダウンロードのHTTPリクエスト。
モジュール ID、製品 ID、バージョンなど、ファームウェア・イメージをダウンロードするために必 要な情報に加えて、POST リクエストは、リクエスト自体を認証するための署名を含んでいる。レスポンスには、関連する認証キーとリンクが含まれる、 auth_key 図6にあるように、ファームウェア・イメージのダウンロードに必要です。単に ウィジェットツール 図7に示すように、提供されたリンクと認証キーをパラメータとしてファームウェアをダウンロードするだけで十分です。
wgetによるファームウェアのダウンロード
図7. wgetによるファームウェアのダウンロード。
ダウンロードされたファームウェア・イメージは、以下のフォーマットに従っている。 productID_moduleID_moduleVersion_buildDate.pro.fw.sig. Mavic 3 Classic の場合、利用可能なリストの中で最も興味深いアップグレードパッケージは、関連 ID 0802 のモジュールで、そのサイズが大きいため、おそらくドローンのメインオペレーティングシステムが含まれていることを示唆している。ファームウェアイメージの構造を分析するための優れた情報源は、コミュニティが管理する Github リポジトリ dji-firmware-tools である。のコードを調べることで dji_imah_fwsig.pyファームウェアの画像がどのように構成されているかを理解することができる:
  • 暗号化されたチャンクベースのペイロードのサイズ(チャンク数)と、暗号化されたデータと復号化されたデータのチェックサムを含む画像ヘッダー。
  • 画像内のデータチャンクのオフセットとサイズを指定するチャンクヘッダーのリスト。
  • 画像とチャンクヘッダーの両方に対するRSAベースのデジタル署名。
  • ファームウェアのアップグレードに必要なデータを含むAES暗号化チャンクのリスト。
DJIファームウェアの画像レイアウト
図8. DJIファームウェアの画像レイアウト。

ファームウェア・イメージの真正性は、デジタル署名されたイメージ・ヘッダーによって強制 される。あらゆる種類のデータを改ざんしようとする 攻撃者は、画像ヘッダー内のチェックサム値とダイジェスト値を更新し(図 8)、新しい有効な RSA 署名を生成する必要がある(必要な秘密鍵がなければ実行不可能であることは明らかである)。これにより、ドローンは DJI から提供されたファームウェアのみをインストールすることになる。DJI の公式ドキュメントから、鍵管理は、暗号化および署名検証処理を実行するための鍵を格納する ARM TrustZone CryptoCell を介して、ドローンに強制されることが理解できる。

で提供されるスクリプトは dji-firmware-tools (dji_imah_fwsig.py) には、ファームウェアを復号化するために使用できるリークされたキーのリストが含まれているが、これらのキーのどれも、我々が作業していたダウンロード・イメージには有効ではなかった。幸運なことに、私たちはTwitterでFelix Domkeという独立系のセキュリティ研究者を見つけた。 dji-firmware-tools レポジトリにある。2022年4月のツイートの中で、彼はJDI Mavic 3に関連する2つのキーを共有し、Update Firmware Image Encryption Key (UFIE)とTrusted Boot Image Encryption Key (TBIE )と特定した。これらの特定の鍵は、「Mavic 3」の鍵リストには含まれていなかった。 dji-firmware-tools スクリプトでファームウェアの解読と解凍を行うため、手動でコードに追加した。 UFIE-2022-04 そして TBIE-2022-04をそれぞれ追加した。この追加により、手動で追加した鍵を使ってファームウェアを復号化することに成功した。 UFIE-2022-04図9に示すように。
Mavic 3 Classicファームウェアの復号化。
図9. Mavic 3 Classicファームウェアの復号化。

解凍すると、チャンクは図10に示すようなJARアーカイブであることがわかった。調べてみると、公式ドキュメントに記載されているAndroid OTAパッケージと同じ構造であることがわかった。このことから、Mavic 3ドローンシリーズはAndroidベースのオペレーティングシステムを搭載していると考えられる。

Mavic 3 classicのアンドロイド画像
図10. Mavic 3 classicのAndroid画像。

アーカイブの中身を解凍した後、我々はメインのAndroidオペレーティングシステムを構成するファイル、つまりカーネル、バイナリ、設定ファイルに注目した。というのも、私たちの主な目的は、リバースエンジニアリングを行い、ドローン上で実行されているサービスの脆弱性を特定する可能性があるからだ。

私たちはそれを解きほぐすことができた。 ベンダー.new.dat.br そして system.new.dat.br Googleが提供するBrotli公式ユーティリティとsdat2imgツールを使って、システム(/systemフォルダ)とベンダー(/vendorフォルダ)のパーティションにマウント可能な エクステンドフォー の画像は図11に示されている。システムパーティションとベンダーパーティションには、ドローンのサービスを実行するために必要なすべてのバイナリ、ライブラリ、設定ファイルが含まれている。
ベンダーとシステム・パーティションのリスト。
図11. ベンダーとシステムのパーティション一覧。
システムとベンダーのパーティションに加えて、ファイル normal.img は、Linuxのメイン・イメージ(カーネルとルート・ファイル・システム)が格納されているため、もう一つの興味深いターゲットである。このファイルは暗号化されており、手動で追加した TBIE-2022-04 のキーを押します。 dji_imah_fwsig.py スクリプトを作成した。このキーで復号化すると、18個の復号化されたデータが生成された。

復号化されたチャンクは、主にLinuxカーネルイメージと実行に必要なファイル、そしてcpioを使って解凍できるルートファイルシステムパーティションを含む追加アーカイブで構成されている。ルート・パーティション内に先に抽出したベンダー・フォルダーとシステム・フォルダーをコピーすることで、ドローン上で実行されているサービスを分析し、リバースエンジニアリングするために必要なすべてのものを含む、図12のファイルシステムAndroidレイアウトが完成する。

完全なファイルシステムのレイアウト。
図12. 完全なファイルシステムのレイアウト。

ドローンの完全なファイルシステムを手に入れたので、オペレーティングシステムのコンフィギュレーションを検査して内部を理解し、攻撃対象領域をマッピングすることができる。

initスクリプト(init.rcとインポートされたすべての設定スクリプトを含む)を徹底的に解析することで、ドローン上で実行される主なサービスと、それを実装するバイナリを把握することができる。これにより、それらを静的にリバースエンジニアリングし、可能であればエミュレーションによって動的に解析できる可能性がある。

を徹底的に分析する。 initスクリプト (を含む init.rc およびインポートされたすべてのコンフィギュレーション・スクリプト)により、ドローン上で実行される主なサービスと、それらを実装するバイナリを把握することができる。これにより、それらを静的にリバースエンジニアリングし、可能であればエミュレーションによって動的に解析できる可能性がある。

DJIは90%以上のシェアでドローン市場を独占しており、プロとアマチュアの両方のユーザーに対応している。市場での存在感が大きいだけに、DJIのデバイスにセキュリティ上の脆弱性があれば、大きな影響を及ぼす可能性があり、軽視できない。

このブログシリーズのパート2では、Mavic 3シリーズに実装されているQuickTransfer Modeに関連する、さらなる分析によって明らかになったいくつかの脆弱性について見ていきます。