最近、モバイルアプリケーションのセキュリティについて勉強し直したいと思い、アプリの解析環境を整えるため、古い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)コマンドをインストールしておく必要があります。
コマンドプロンプトからadb devices
を実行し、以下のようにUSB接続しているAndroid端末が検出されれば問題ありません1。
以降の作業は、Android端末をパソコンにUSB接続している前提で進めます。
OEMロックを解除しブートローダをアンロックする
OEMロックの解除
まずはブートローダをアンロックするために、Developer optionsからOEM unlockingを有効化します。
私の端末は2021年より前にドコモで購入したものなのでSIMロックがかかっており、当初OEM unlockingがグレーアウトしていました。
そこで、解除方法を調べてみたところ、SIMロック解除の条件を満たしていたため、Web上からの手続きで簡単に解除することができました(数分程度)。
ブートローダのアンロック
コマンドプロンプトから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の違いについては、以下の記事の解説が参考になります。
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アプリのデバッグなどをやっていきたいと思っています。