Meta Ray-Banスマートグラスのハッキング
Hacking the meta ray-ban smartglasses (p0pcycle.com)
要約
セキュリティ研究者がMeta Ray-Banスマートグラスのファームウェアを抽出・解析し、任意のコード実行に成功した方法を解説。OTAアップデートの仕組みを悪用してフルファームウェアを取得し、開発者モードの脆弱性を突いて自己署名アプリのインストールとシェルアクセスを実現した経緯が語られています。
全文翻訳
Meta Ray-Banスマートグラスのハッキング
2026年7月、私はpwn2ownのターゲットを調べたいと思っていました。ルールがまだ公開されていなかったので、昨年(2025年)のターゲットを調べることにしました。似たようなものだろうと思ったからです。
驚いたことに、グラス上で任意のコード実行を達成することができ、しかもそれらはもはやウェアラブルカテゴリに含まれていませんでした :')。
それでも、Metaに報告しました。そして、報酬の交渉を何度か経て、合意に至りました(実際には交渉というほどではありませんでしたが、新しい報酬に同意しました)。
これを試みる前に、友人にこの件について話したのを覚えています。友人は「うわー、頑張って。これらは通常かなり堅牢で、昨年p2oでは誰も試みなかったよ」と言いました。
私の返答:「見てろよ」。
[画像: スマートグラスの外観]
グラスの入手(誰が500ユーロも払うか?私は払わない)
最初のステップはグラスを入手することでした。幸いなことに、私の義兄がほとんど使っていないペアを持っていたので、数週間借りることができました。
初期の偵察
グラスを制御するアプリであるMeta AIアプリをインストールしました(接続、写真の同期など)。
ファームウェアを抽出するために、グラスを分解してプローブなどをいじるつもりは当然ありませんでした。そこで、OTA(Over-The-Air)アップデートを使用して抽出することにしました。
初めてグラスを接続したとき、すぐにファームウェアのアップデートが提供されました。当然、興味をそそられました。JADXを使用してMeta AIアプリをリバースエンジニアリングし、アップデートがどのように取得されるかを確認しました。
OtaArtifactFetcherがアップデートリクエストを準備して送信します。レスポンスは、デバイス/ビルド情報などのメタデータを含むOTAArtifactInfoオブジェクトに変換されます。
そして、OTAArtifactInfo()内のこの代入に気づきました。
str3 = "https://...";
OTAArtifactInfoにフックしてstr3(CDNのアップデートURLが含まれていました)を出力できることに気づき、それをそのまま出力しました。:)))
[画像: JADXによるコード解析のスクリーンショット]
そのURLにはzipファイルが含まれており、それが正しい候補のように見えました。しかし、これは約156MBで、ペイロードはデバイスの既存のビルドに依存していました。これは増分アップデートでした…私は完全なアップデートを求めていました。
完全なファームウェアアップデートの取得
さらにコードをデコンパイルすると、device_firmware_full_update_onlyという名前のGraphQL入力が見つかりました。アプリは通常、これをfalseに設定していましたが、私はGraphQLフィールドを追加する汎用メソッドにフックし、フィールド名が完全に一致する場合にのみ値をtrueに置き換えました。これにより、完全なファームウェアアップデートURLを取得できるようになりました。
その後、CDNからzipファイルを取得することができました。それを解凍すると、これがAndroidアップデートであり、payload.binが含まれていることがわかりました。
[画像: payload.binのスクリーンショット]
payload-dumperをpayload.binで使用して、イメージをダンプし、ファイルシステムにマウントすることができました。
[画像: ダンプされたファイルシステムのスクリーンショット]
ファームウェアは取得できましたが、グラスでシェルを得るにはどうすればよいでしょうか?
Device Access Toolkit
Meta AIアプリには、開発者がグラスと対話できるアプリを作成できる開発者モードがあります。これはDAT SDK(Device Access Toolkit)と呼ばれます。
これを行うには、グラスにDAT APKをインストールする必要があります。MetaAIアプリは基本的にそれをリアルタイムでダウンロードし、DATアプリケーションを取得してデバイスにインストールします。どこに向かっているかわかりますか?
[画像: DAT SDKに関する説明のスクリーンショット]
グラスへの自己署名アプリのインストール
ファームウェア126以前では、ファームウェアはDAT APKがMetaによって署名されているか検証していませんでした。そのため、正規のアプリかどうかに関係なく、任意のアプリをグラスにインストールすることが理論的に可能でした。
簡単な(しかし簡単ではない)入れ替えが可能でした。Fridaを使用して、正規のDATアプリケーションを私の自己署名アプリケーションに置き換えることができました。つまり、グラス上で任意のアプリを実行できるようになったのです。
これで、私の自己署名DAT APKがグラス上で実行されるようになりました!やったぜ!!😎
DAT APKをグラスで実行する方法
DAT APKは、開発者アプリがグラスと対話するためにDATセッションを要求した場合にのみ実行されます。
そのため、偽のDAT APKを実行するために、Metaから提供されているサンプルアプリであるCamera Accessをインストールしました。これにより、グラス上のアプリとDATセッションが作成されます。
[画像: Camera Accessアプリのスクリーンショット]
しかし、それが正常に実行されているかを確認するのは困難でした。デバッグが難しかったのです。
Beep is the new printf
このサングラスには画面がありません。コンソールも、ログも、「おい、お前のコードが実行されてるぞ」という表示もありません。では、どうすればコードが実行されていることを確認できるでしょうか?答えは、それを聞くことです。
DAT APKでandroid.media.ToneGeneratorを使用して、コードのどの部分が実行されているかを示す信号を送りました。
- 3回のビープ音:リスナーが開始され、Wi-Fi Directアドレスを探しています
- 5回のビープ音:1つ見つかりました(Wi-Fiグループ192.168.49.x内)
- 4回のビープ音:TCP 31337がバインドされました、ビジネス開始です
- 6回のビープ音:何か問題が発生しました
このシーケンスを使用して、考慮していなかった大きな問題(Camera Accessアプリが、グラス上の実際のDAT APKを期待していたため失敗していたこと)をデバッグすることができました。DWAを開始できなかった場合、startDwaReadinessProbe()はSTART_ERROR_DWA_UNAVAILABLEを報告しました。
そして、失敗するたびに接続が閉じられました。
修正
Fridaを使用してstartDwaReadinessProbe()にフックし、DWAタイムアウトを無効にして接続を維持しました。
Bind shell
Meta AIアプリがグラスから写真や動画を同期したい場合、サブネット192.168.49.x上にWi-Fi Directグループを作成します。グラスはそのグループに接続し、IPアドレスを取得します。
グラスをWi-Fi Directグループに接続させるために、Fridaを使用してCameraAccessアプリにフックし、Meta AIアプリから「high link lease」を要求しました。
私の埋め込みアプリは、そのアドレス上のTCP 31337でリスナーをバインドし、インタラクティブシェルにドロップされました。
電話からncコマンドで接続し、idのようなコマンドを送信して、アプリのコンテキスト内でシェルレベルの実行を取得できました。
偉大な力には偉大なopsecが必要
偉大な力には偉大なopsecが必要
私は約5日間、この制御不能な力を持ちましたが、グラス上で権限昇格(privesc)を探している間に、シェルアクセスが失われました。
残念ながら、当時の私のopsecはひどかった(可能性あり)か、不運にも彼らが調査してパッチを当てたかのどちらかです。
しかし、恐れることはありません!!
Mobile Config
ファームウェア127では、DAT APKの署名検証が強制されるようになり、自己署名したDAT APKはもはや機能しなくなりました。
このチェックは、MobileConfigファイル内のwss_appmanager.signature_verification_enabledによって実行されていました。
グラスは電話に設定を問い合わせます。電話はMetaのサーバーからそれを取得し、Airship経由で転送します。これは、ファームウェアアップデートを必要とせずに、グラス上の多くの機能フラグを制御します。
それらのフラグの1つは、アプリをインストールする前に、ファームウェアがアプリがMetaによって署名されているかを確認することを要求します。
[画像: MobileConfigファイルの内容のスクリーンショット]
これはペアリングされた電話からグラスに到着し、デバイスはファイルが構造的に正しいか検証した後、それをロードします。改ざんされていないかではありません。
これにより、signature_verification_enabledを含むすべてのフラグが、電話によって変更可能になり、グラスによって受け入れられるようになります。
そこで、0.mctable(値を持つファイル)のバイトを0x80(有効)から0x00(無効)に反転させることで、元々強制されていた署名検証をバイパスし、自己署名APKをグラスに再インストールすることができました。
私たちは再び戻ってきたのです。
今後の展望
これらはすべて、Metaのバグバウンティプラットフォームを通じてMetaに報告されました。彼らは私のブログ投稿を承認しており、それはおそらく修正されたことを示唆しています。
シェルアクセスが得られた今、攻撃対象領域のマッピングを開始するのははるかに容易になりました。これは、皆さん、また別の機会の物語です!
読んでくれてありがとう!
[画像: 記事の最後の画像]