kobar9568のブログ

技術的なメモやその他諸々

Fire TV Stick (第3世代)にLineageOS 18.1 (Android 11)を焼いて純粋なAndroid TVとして使う

はじめに

  • Fire TV Stick (第3世代)に搭載されるSoCである、MediaTek MT8695の脆弱性をついてブートローダーをアンロックし、TWRPを起動することが出来るエクスプロイトがXDAで公開された

    • これにより、TWRPでシステム領域の書き換えが可能になった
  • バージョン7.2.7.3未満のファーム(FireOS)がインストールされている個体が前提となる

    • 以降のアップデートで脆弱性が塞がれ、通用しなくなった
  • 基本的にはXDAに記載された通りの内容になる

    • 一部、フロントのスクリプトの書き換えが必要な部分がある

大まかな手順

  1. 母艦からエクスプロイトを実行してブートローダーをアンロックする
  2. fastbootでTWRPを起動する
  3. 母艦からLineageOS 18.1とGAppsを内蔵ストレージへ転送する
  4. TWRPでストックのファームウェアをワイプする
  5. TWRPでLineageOSとGAppsをインストールする

TWRP起動後の操作は、母艦からadb shellでデバイスに入り、CLIのtwrpコマンドで操作する方法が一番楽。

準備するもの

1. エクスプロイト本体

forum.xda-developers.com

  • スレッド1番目の投稿のAttachments内、"kamakiri-sheldon-1.0.zip"
  • TWRPもこちらに含まれている

2. Fire TV Stick (第3世代)用のLineageOS 18.1ビルド

github.com

  • GitHubリポジトリのReleasesに"lineage-18.1-20220302-UNOFFICIAL-sheldon.zip"としてビルド済みのものが公開されている

3. Open GApps

opengapps.org

  • Google系アプリケーションをAndroid系OSに提供するパッケージ
    • 今回はARM, 11.0, tvminiのバリアントを選択する

4. 母艦となる適当なLinux

  • 無難で楽なのは、Ubuntu 21.10のLive USB辺り
  • USB3.0ポート(5V0.9Aのバスパワー)があれば、Fire TV Stickをバスパワーで起動しつつ母艦になれるので楽
  • VM環境だと失敗の報告が挙がっているので、物理で1台用意するのが無難

5. その他諸々

  • Fire TV Stick本体 (バージョン7.2.7.3未満)
  • microUSB-to-USB Type-Aケーブル (Fire TV Stick付属のもので十分)
  • HDMIを入力できる何か
    • 今回、すべての手順は母艦のコマンドラインからの操作で完結するので本体の映像出力無しでも作業は完了できるが、確認用にあると良い
      • 今回はUVCとして振る舞うHDMIのキャプボを使い、カメラアプリから様子を確認した

1. 環境構築

1-1. 必要なライブラリやツールのインストール

  • XDAでオススメされている通り、Ubuntuuniverseリポジトリを追加し、そちらで必要な物をインストールする
    • 試していないが、Python系はpipで入れつつ、別途adb fastboot辺りを準備しても問題無いとは思う
> sudo add-apt repository universe
> sudo apt install python3-serial python3-usb adb fastboot dos2unix

1-2. ModemManagerの無効化

  • エクスプロイトの実行にあたり、ModemManagerを無効化しておく必要がある
    • stopだけしておけば問題無さそうだが、念の為disableも入れておく
> sudo systemctl stop ModemManager
> sudo systemctl disable ModemManager

1-3. 必要な物のダウンロード

  • エクスプロイト本体・LineageOS・GAppsをダウンロードしておく
  • エクスプロイト本体のみ解凍しておく
    • TWRPを用いてインストールする後者2つについては、解凍しない

2. ブートローダのアンロック

sudo ./bootrom-step.sh
  • 以下のメッセージが表示されたことを確認する
[(実行時刻)] Waiting for device
  • Fire TV Stickを母艦に接続すると、自動でアンロックが開始される

f:id:kobar9568:20220320165940p:plain

  • なお、RuntimeError: downgrade failure, giving upが発生する場合は一部の処理をスキップするようフロントのスクリプトの書き換えが必要
    • 今回試した個体はこちらの書き換えが必要だった

f:id:kobar9568:20220320171504p:plain

vi modules/main.py

f:id:kobar9568:20220320171524p:plain

rpmb = dev.rpmb_read()
if rpmb != b"\x00" * 0x100:
    dev.reboot()
    raise RuntimeError("downgrade failure, giving up")

f:id:kobar9568:20220320172054p:plain

  • Fire TV StickのHDMI出力の方で、ブートロゴの左下にHACKED FASTBOOT modeの表示が出ていることを確認。これでブートローダのアンロックが完了した

3. TWRPの起動

  • 以下のシェルスクリプトを実行すると、fastboot boot recoveryとしてTWRPを送り込んで起動する
> ./fastboot-step.sh

f:id:kobar9568:20220320173119p:plain

f:id:kobar9568:20220320173225p:plain

  • TWRPの操作は母艦からadb shellでデバイスに入り、twrpコマンドで実施する

2. LineageOSのインストール

  • 先にLineageOSとGAppsをadb pushでデバイスに送り込みTWRPでそちらをインストールする

  • adb devicesで認識されていることを確認したのち、内蔵ストレージへadb pushで送り込む

f:id:kobar9568:20220320174440p:plain

  • adb shellでデバイスに入り、twrpコマンドでワイプを実施

f:id:kobar9568:20220320174557p:plain

f:id:kobar9568:20220320174627p:plain

  • 引き続き、twrp installで先程送り込んだ2つのファイルをインストールする

f:id:kobar9568:20220320174722p:plain

  • HDMIの方でも、TWRPのログを確認することが可能

f:id:kobar9568:20220320174755p:plain

  • 完了したら、adb shellの方でrebootを実施する

3. LineageOSの起動

  • 初回起動時はブートロゴで暫く掛かるが、起動を待つ

f:id:kobar9568:20220320174913p:plain

  • 付属のリモコンをペアリングし、後はAndroid TVとして使うことが可能

f:id:kobar9568:20220320175015p:plain

f:id:kobar9568:20220320175527p:plain

  • Android TVでも、デフォルトでホームに広告が出るらしい

f:id:kobar9568:20220320175127p:plain

所感

  • ブラックフライデーのセールで2台4000円で購入し、放置されていた端末を使った

    • おもちゃとして焼き変えてみたものの、UI/UXに関してはFireOSの方が優れている印象
      • 実験目的以外ではおすすめしない
  • Fire TV Stickは本体の裏面に技適ロゴが印刷されているので、今回の手順は特に法的な問題は無い

    • 端末によってはソフトウェア的に技適ロゴを表示するものもあり、そちらはファームの書き換えによって表示できなくなった場合は怪しい(アウト?)な気がする。勿論物理的な分解をすればアウト