Nseclog

ペネトレーションテスターがセキュリティ検証内容を発信するブログ

Androidのroot化方法(Google Pixel 3a)

最近、モバイルアプリケーションのセキュリティについて勉強し直したいと思い、アプリの解析環境を整えるため、古いAndroid端末を引っ張り出してきてroot化しました。

3年ほど前は仕事でモバイルアプリケーションの脆弱性診断を担当していたため頻繁にroot化を行っていましたが、今回かなり久しぶりにAndroid端末をroot化したので、備忘録として記録しておきます。

※注意
Android端末のroot化は以下のようなリスクがあります。root化する際は自己責任でお願いします。

  • 起動しなくなる可能性がある
  • 保証の対象外となる
  • Android端末が初期化される
  • 一部のアプリが使用できなくなる

root化したAndroid端末

今回root化したAndroid端末は昔使っていたGoogle Pixel 3aです。 Pixel 3aはすでにサポートが終了しているため、最後に配信されたセキュリティアップデートまで適用した状態のものを使用しています。

項目 内容
Android端末 Google Pixel 3a
OSバージョン Android 12
ビルド番号 SP2A.220505.008

Android端末のroot化手順

今回は、Android端末のroot化においておそらく最も一般的な手法である、Magiskを用いた方法でroot化を行います。

なお、Magiskを用いたroot化には、以下の2つの方法がありますが、今回はTWRPは使わずにroot化しています。

  • (本記事で実施)Magiskでパッチを当てたOSイメージを直接書き込む
  • オープンソースのカスタムリカバリであるTWRP(Team Win Recovery Project)を用いて、Magiskをインストールする

事前準備

以下のドキュメントを参考に、パソコンにadb(Android Debug Bridge)コマンドをインストールしておく必要があります。

developer.android.com

コマンドプロンプトからadb devicesを実行し、以下のようにUSB接続しているAndroid端末が検出されれば問題ありません1

以降の作業は、Android端末をパソコンにUSB接続している前提で進めます。

OEMロックを解除しブートローダをアンロックする

OEMロックの解除

まずはブートローダをアンロックするために、Developer optionsからOEM unlockingを有効化します。

私の端末は2021年より前にドコモで購入したものなのでSIMロックがかかっており、当初OEM unlockingがグレーアウトしていました。

そこで、解除方法を調べてみたところ、SIMロック解除の条件を満たしていたため、Web上からの手続きで簡単に解除することができました(数分程度)。

www.docomo.ne.jp

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

コマンドプロンプトからadb reboot bootloaderを実行し、ブートローダを起動します。

次に、fastboot flashing unlockを実行し、音量を上げる/下げるボタンでUnlock the bootloaderを選択後、電源ボタンで決定します。

これでブートローダのアンロックが完了です。

OSイメージにMagiskでパッチを当てroot化する

OSイメージのダウンロードと準備

Googleの公式ページから、Android端末の現在のビルド番号と一致するOSイメージをダウンロードします。

Android端末のビルド番号はSettingsのAbout phoneから確認できます。

ダウンロードしたzipファイルを解凍し、さらに解凍後のフォルダに含まれているzipファイルも解凍します。

解凍したフォルダ内にboot.imgというファイルが存在するので、そのファイルをコマンドadb push boot.img /sdcard/Download/によってAndroid端末の内部ストレージへコピーします。

MagiskによるOSイメージへのパッチ適用

Magiskのリリースページから最新版のapkファイルをダウンロードします。

次に、コマンドadb install Magisk-<version>.apkを実行し、Android端末にMagiskアプリをインストールします。

Android端末側でインストールしたMagiskアプリを起動し、Install -> Select and Patch a File -> boot.img -> LET'S GOの手順でOSイメージにパッチを当てます。

パッチの適用に成功すると、boot.imgと同じディレクトリにパッチ適用済みのOSイメージが生成されます。

次に、コマンドadb pull /sdcard/download/magisk_patched-26000_CJKbq.imgを実行し、パッチ適用済みのOSイメージをパソコンにコピーしておきます。

パッチを当てたOSイメージの書き込み

コマンドadb reboot bootloaderを実行し、再度ブートローダを起動します。

次に、コマンドfastboot flash boot magisk_patched-26000_CJKbq.imgを実行し、パッチ適用済みのOSイメージをAndroid端末へ書き込みます。

このとき、「Waiting for any device」というメッセージが表示され、書き込みが進行しないことがあります。 その場合は、Googleの公式ページからGoogle USB Driverをダウンロードし、パソコンへインストールすることで解消する可能性があります。

最後に、コマンドfastboot rebootを実行し、Android端末を再起動します。 これでAndroid端末のroot化が完了しました。

root権限を行使できるか確認

コマンドadb shellを実行することでAndroid端末のシェルへ入り、root権限を行使可能か確認します。

このとき、Android端末上でroot権限行使の承認を求められるため、許可します。

uidが0であることから、root権限を行使可能であることを確認できます。

LSPosed Frameworkの導入

Android端末のroot化は完了したので、LSPosed Frameworkもインストールしておきます。 LSPosedはシステムやアプリをユーザが直接フッキングしなくても、これらの挙動を変更してくれるモジュールのフレームワークです。

Androidアプリのデバッグを行う上で、いずれFridaなどを使用して手動でフッキングを行うことになりますが、すでにモジュール化されているものについてはLSPosedによってその機能を利用することが可能です。

以前はXposed Frameworkが利用されていましたが、開発終了に伴いEdXposed Frameworkが主流となり、今ではEdXposedも開発されなくなったため、後継となるLSPosedが主流となりました。

また、以前はフッキングの仕組みとしてRiruというモジュールが利用されていましたが、現在はRiruの開発が終了し、Zygiskへ統合・移行しているようなので本記事でもZygiskを利用しています。

Riruの説明やRiruとZygiskの違いについては、以下の記事の解説が参考になります。

www.xda-developers.com

Zygiskの有効化

Magiskアプリの設定を開き、Zygiskを有効化後、Android端末を再起動します。

LSPosed Frameworkのインストール

LSPosedのリリースページから最新版のzipファイル(Zygisk版)をダウンロードします。

次に、ダウンロードしたzipファイルをコマンドadb push LSPosed-<version>-zygisk-release.zip /sdcard/Download/によってAndroid端末の内部ストレージへコピーします。

Magiskアプリを起動し、Modules -> Install from storage -> LSPosed-<version>-zygisk-release.zip -> OK -> Rebootの手順でLSPosedをインストールします。(Android端末が再起動します。)

LSPosedはアプリのアイコンが存在しないので、通知から起動する必要があります。 初回起動時にショートカットの作成について聞かれるので、次回以降他のアプリと同様の方法で起動できるようショートカットを作成しておくと便利です。

LSPosedの起動画面にActivatedと表示されていれば、インストール完了です。

おわりに

Android端末は、root化が容易で自由度も非常に高いところが良く、個人的にはiOSより好きです。

今回でroot化済みのAndroid端末が準備できたので、次はFridaによるAndroidアプリのデバッグなどをやっていきたいと思っています。

参考文献


  1. Android端末のDeveloper optionsとUSB debuggingを有効化する必要があります。