ニュース

【追記あり】「Magisk」を使ってアプリのroot化端末チェック(SafetyNet)を回避する方法

Android PayやPokemon GO(ポケモンGO)など一部のアプリはroot化チェックを行っており、root化された端末では動作しないようになっています。
そのチェックを回避し、アプリを動作させる「Magisk」の使用方法を説明します。
2017/2/13…更新により再び回避可能になっていたことを追記
2016/10/8…root切り替え機能が無くなったことを追記
2016/9/16…カスタムROM(CM13やRRなど)でもMagiskが使えたことを追記

システム改変(root化)をチェックする「SafetyNet API」

Android PayやPokémon GOでは「SafetyNet API」という厳しいシステム改変・rootチェック機構が使用されています。

詳しくは下記の記事を参照してください。

SafetyNetは「Magisk」で回避可能

このようにシステム改変をチェックする機構であるSafetyNetですが、実は回避する方法があります。

それが「Magisk」です。

Magiskには「Magisk Hide」という機能があります。「Magisk Hide」は、アプリがroot権限を使用していても、それを隠す(hide)ものです。そのため、SafetyNetなどのroot検知システムに対して、root権限を使用していないように見せることができます。
この仕組みによってSafetyNetを回避できるというわけです。

今回は、Android 7.1.1(カスタムROM:AICP 12.1)を導入したNexus 6Pを例にして、Magiskの導入手順や設定方法を紹介します。

Magiskの利点

他にもSafetyNetを回避する手段がいくつかあるのですが、それらと比較したMagiskの利点は以下の通りです。
  1. 操作不要、再起動不要で回避できる
    ⇒特定のアプリを指定し、それが起動した際に自動的にrootを隠します。アプリ起動前に毎回端末を再起動する必要もありません。
  2. 事前に「su」を削除する必要がない
    ⇒導入時に自動的に削除されます
  3. 別途のroot化が不要
    ⇒Magisk内部にrootシステムが組み込まれています

Magiskの制約

非常に便利なMagiskですが、いくつか制約があります。

root権限を保ったまま回避できるわけではない

~2017/2/13追記~
更新により以前と動作が変わったため、現在は回避中でもroot権限が使用できる可能性があります。(未検証)

注意して欲しいのが、「root権限を維持したままチェック回避できるわけでない」という点です。

Magiskはあくまでも「root/非root」を手間なく切り替えるものです。非rootへ切り替えれば確かにチェックを回避できますが、一方で端末全体が完全に非root状態となります。その間、root権限が必要なアプリは当然動作しません。

再びrootへ切り替えればもちろん動作しますが、Magiskでは「チェック回避が必要なアプリとroot権限が必要なアプリは同時動作できない」ということを覚えておいて下さい。
(チェックの瞬間だけ非rootへ切り替えて、その後すぐにrootへ切り替えるというのも可能)

サポートはAndroid 5.0以上

上記に加えて、Androidバージョンの制約もあります。

MagiskはAndroid 5.0以上をサポートしているので、それ未満のバージョン(Android 4.4など)では動作しません

無理やり導入しようとしても、後述する本体zipインストール時に弾かれてしまうようです。(2016/9/16時点)

"systemless root"が不可能な端末では使えない

Magiskでは"システムを改変しないように"root化します。これを"systemless root"(システムレス ルート)と言います。

systemless rootは、システム領域(/system)ではなくカーネル領域(boot)を利用することでroot化を行います。カーネル領域を変更できない端末ではsystemless rootが出来ないため、Magiskを使うことが出来ません。

systemlessが不可能な端末としては、国内版Xperiaが挙げられます。
国内版Xperiaはブートローダーがアンロック出来ないため、いわゆる"prerooted.zip"をカスタムリカバリから導入し、ROMごと入れ替える形でroot化を行います。これ以外でのroot化は不可能なようです。

なお、海外版では使用可能です。(アンロックし、systemless rootを行える状態の場合)

※筆者はXperiaを所有してないため、もしかしたら間違っているかもしれません。その際はコメント欄よりご指摘頂けるとありがたいです。

※ブートローダーがアンロックできない端末全てがsystemless root不可能なわけではありません!アンロックしていなくてもカーネル領域を変更できれば可能です。(ASUS ZenPad 8.0など)

カスタムリカバリを起動できる必要がある

Magisk導入のためにカスタムリカバリを起動する必要があります。
カスタムリカバリが無い(もしくは、起動できない)端末では導入できません

今回は現在最も一般的に用いられている「TWRP」を例に説明します。詳しくはこちらの記事を参照して下さい。

追記:Xposedは使用不可能

~2017/2/13追記~
Android 7.1ではXposedが使用できないため、未検証です。

Xposedが導入されていると動作しません。Xposedを削除するか、またはそもそも導入しなければ動作することが出来ます。

Xposedを利用したい場合は、こちらの記事で紹介した「suhide」を使用して下さい。

Magisk導入に必要な準備

まずは導入準備として以下の作業を行います。

必ずバックアップを!

Magiskはシステムを改変しませんが、カーネルなど端末の重要な部分を変更します。最悪の場合、環境によっては端末が起動しなくなることも考えられます。
導入する前に、いつでも戻せるように予めカスタムリカバリ等でシステムのフルバックアップを必ず取って下さい。

カスタムリカバリ(TWRP)でバックアップを行う方法はこちらの記事を参照して下さい。

システムを初期状態に戻す

Magiskを導入する前に、一旦端末を非root化し、システムを初期状態(改変されていない状態)にする必要があります。
システムが完全に初期状態でないとMagiskを導入できません。(導入しても機能しない)

初期状態に戻す方法をいくつか示します。下記方法を参考に初期状態にしてください。

~2016/9/17追記~
「参考情報」に書きましたが、初期化せずに「su」ファイル2つとXposedを削除した状態で導入しても動作してしまいました。どうしても初期化できない・初期化が面倒だと言う方は、上記を削除した状態で試してみても良いかもしれません。
※削除前に必ずバックアップして下さい。
※思わぬ不具合防止のため、基本的には初期化することをオススメします。

方法①:ファクトリーイメージを使う

メーカー公式ROMを使用している場合、可能ならばバックアップ後にファクトリーイメージを用いて工場出荷状態に戻して下さい。(システム領域のみ戻せばOK)

Nexus端末へのファクトリーイメージの書き込み方法はこちらの記事を参照して下さい。

方法②:ROMをインストールし直す

カスタムROMを使用している場合、バックアップ後に現在のROMを一旦削除(フルWipe)し、新規インストールし直してください。

なお、最初からroot化されているカスタムROMの場合、一旦「/system/bin/su」及び「/system/xbin/su」を削除する必要があります。
詳しくは「Magiskを導入する―システム領域内の「su」を削除」で述べます。
⇒Magisk導入時に「su」が削除されるようになったため、この作業は不要です。

方法③:手動で元に戻す

上記2つとも不可能な場合、手動でシステム領域を全て元に戻して下さい。

まず、Xposedを導入している場合はuninstall.zipをカスタムリカバリからインストールし、削除してください。(詳しくはこちら

また、既にSuperSUなどでroot化している場合は必ずroot権限を削除(アンルート)してください。
SuperSUを開き、「設定」タップ、少し下にスクロールして「ルート権限を破棄 (アンルート)」をタップして下さい。
「続行」をタップし、bootイメージを復元で「はい」をタップ、recoveryイメージの復元で「いいえ」をタップして下さい。
端末が自動的に再起動され、非root化されているはずです。

必要なファイルを用意

以下のファイルの最新版端末内部ストレージのわかりやすい場所に配置して下さい。
  1. Magisk本体と管理アプリ
  2. root化ファイル

Magisk本体と管理アプリ

Magisk本体のzipファイル(カスタムリカバリから導入)と管理アプリです。

管理アプリ(Magisk Manager)はMagiskを導入すると自動的にインストールされます。SafetyNetからrootを隠すアプリを指定するために使用します。

こちらのページの一番上の投稿にある「Downloads」より「Latest Magisk」をクリックし、ダウンロードして下さい。
  • 本体:Magisk-v11.1.zip
    ※更新等によりファイル名が異なる可能性あり
  • 管理アプリ:Magisk_Manager_v2.0.apk
    ※更新等によりファイル名が異なる可能性あり

    ⇒Magisk本体と一緒にインストールされるようになったので、別途導入は不要です。
「Latest Magisk」をクリックしてダウンロード

root化ファイル

~2017/2/13追記~
Magisk本体にrootシステムが組み込まれているため、別途のroot化は不要です。

Magiskを導入する

それでは実際にMagiskを導入していきます。

導入は以下の様な流れで行います。
  1. システム領域内の「su」を削除
    ※最初からroot化されているカスタムROMのみ(CyanogenModやResurrection Remixなど)
    ⇒Magiskインストール時に自動的に削除されるため、この作業は不要です(2017/2/13追記)
  2. Magisk本体をインストール

システム領域内の「su」を削除

~2017/2/13追記~
Magiskインストール時に自動的に削除されるようになったため、不要です。

※本作業は、「最初からroot化されているカスタムROM」(CyanogenModやResurrection Remixなど)の場合のみ必要です。それ以外の場合は行う必要はありません。

まずは、以下の示すシステム領域内にあるrootファイル「su」を削除します。これにより、カスタムROMであっても端末を完全に非root化します。
  • /system/bin/su
  • /system/xbin/su
削除はどのような方法でも構いません。OS起動中にroot対応ファイラーアプリ(ESファイルエクスプローラなど)で削除しても良いですし、adbコマンドを使っても良いです。


今回は例として、「システムを初期状態に戻す ― ROMをインストールし直す」に書いた"カスタムROMの新規インストールし直し"の直後を想定し、カスタムリカバリ(TWRP)上で削除します。
  1. 左下から1つ上の「Mount」をタップする
  2. 上の「system」をタップし、チェックを付ける
    ※左下の「Mount system partition read-only」のチェックは外す
  3. 下中央のホームボタンをタップし、TWRPのメニュー画面に戻る
  4. 左下の「Advanced」をタップする
  5. 右上から1つ下の「File Manager」をタップする
  6. 端末内のフォルダが表示されるので、少し下にスクロールし「system」をタップして開く
  7. 「system」フォルダが表示されるので、「bin」をタップして開く
  8. 「bin」フォルダが表示されるので、少し下にスクロールし「su」をタップして選択する
  9. 左上のファイル名(/system/bin/su)を確認し、左下の「Delete」をタップしてファイルを削除する
  10. Swipe to Confirm」を右にスワイプして削除を実行する
  11. 上に「Succeful」と表示されていることを確認し、左下の「Back」をタップして戻る
  12. 「su」ファイルが削除されていることを確認し、一番上までスクロールし「(Up A Level)」をタップして1つ上に戻る
  13. 「system」フォルダが表示されるので、少し下にスクロールし「xbin」をタップして開く
  14. 「xbin」フォルダが表示されるので、少し下にスクロールし「su」をタップして選択する
  15. 左上のファイル名(/system/xbin/su)を確認し、左下の「Delete」をタップしてファイルを削除する
  16. 上に「Succeful」と表示されていることを確認し、左下の「Back」をタップして戻る
  17. 「su」ファイルが削除されていることを確認し、下中央のホームボタンをタップしてTWRPのメニュー画面に戻る
これでシステム領域内の「su」を削除し、カスタムROMを完全に非root化することができました。

Magisk本体をインストール

カスタムリカバリからMagisk本体をインストールします。
  1. カスタムリカバリを起動する
    ※今回はTWRPを使用
  2. 左上の「Install」をタップする
  3. フォルダ名をタップし、「必要なファイル」を配置してあるフォルダまで移動する
    ※今回は「Download」に配置
  4. Magisk-v◯.zip」をタップする
    ※◯はファイルのバージョン名。今回は「11.1」。(2017/2/13時点)
  5. 下の「Swipe to confirm Flash」を右にスワイプし、インストールする
  6. 一番下に「Done」と表示されて正しく完了したことを確認し、「Reboot System」をタップして再起動する
これでMagisk本体の導入が終わりました。

あとはOSを起動し、設定を行うだけです。

Magiskを使ってみる

実際にMagiskを使って、root/非rootを切り替えてみます。

初期設定

※環境によってはMagisk Managerが自動的にインストールされないことがあるようです。その場合は、こちら(Google Playストア)から手動でインストールして下さい。

まずは、Magiskの初期設定を行います。
  1. Magisk Manager」を起動する
  2. 補足手順:端末内のファイルへのアクセス許可を求められた場合は、「許可」する
  3. 左上のハンバーガーアイコンをタップし、メニューを開く
    ※画面左端からスワイプしても開くことができます
  4. Settings」をタップして開く
  5. 「Enable BusyBox」「Magisk Hide」「Systemless hosts」の3箇所をタップし、全てONにする
  6. 3つ全てがONになっていることを確認し、左上の「←」(戻る)ボタンをタップしてメイン画面に戻る
これで初期設定が完了しました。

root権限を隠すアプリを指定/解除する

続いて、「Magisk Hide」を使ってroot権限を隠すアプリを指定/解除します。SafetyNetのチェックを回避したいアプリを指定して下さい。

※Pokémon GOは最初から自動的に指定されているので、この作業は不要です。端末を一度再起動して、回避できているか確認してみて下さい。
  1. Magisk Manager」を起動する
  2. 左上のハンバーガーアイコンをタップし、メニューを開く
    ※画面左端からスワイプしても開くことができます
  3. Magisk Hide」をタップし、開く
  4. root権限を隠したいアプリをタップし、チェックを付ける
  5. チェックが付いたことを確認する
  6. 端末を再起動する
    ※再起動しないと機能しません!必ず行って下さい
    ※指定/解除の変更後のみ再起動が必要です
解除したいときは、もう一度アプリをタップしてチェックを外して下さい。その後、一度再起動して下さい。

Magiskを更新するときは

新しいバージョンがリリースされた際などにMagiskを更新するには、「Magiskを導入する」の手順をもう一度行って下さい。

または、「Magisk Manager」アプリ内から直接更新することもできます。更新手順は以下の通りです。
  1. Magisk Manager」を起動する
  2. 左上のハンバーガーアイコンをタップし、メニューを開く
    ※画面左端からスワイプしても開くことができます
  3. Install」をタップし、開く
  4. Magiskify」をタップする
  5. DOWNLOAD & INSTALL」をタップする
  6. ファイルのダウンロードが始まるので、画面の指示に従ってインストールする

参考情報

実際に導入してみて気付いたことを参考までに書いておきました。

SELinuxがEnforcingでなくてもSafetyNetは回避可能?

Magisk Managerのメイン画面(Status画面)の一番下「Tap to start SafetyNet check」をタップすると、SafetyNetを回避できる状態かどうかを確認することができます。
SafetyNetを回避できる状態か確認できる
このチェック結果は、SELinuxの状態によって変化します。
SELinuxとはAndroid(Linux)のセキュリティ機構の1つで、これがEnforcingの状態だと制限が厳しく、一部のroot権限が必要なアプリが動作しないこともあります。

SELinuxが「Enforcing」(強制)の状態でタップすると、「SafetyNet Passed」と表示され、回避可能な状態でした。
「SafetyNet Passed」で回避可能な状態
一方、「Permissive」(許可)の状態でタップすると、「SafetyNet Failed: CTS profile mismatch」と表示され、回避不可能な状態と判定されました。
「SafetyNet Failed: CTS profile mismatch」で回避不可能な状態なはずだが…?
しかし、この状態で実際にPokémon GOを起動してみると、問題なく動作しました。

Pokémon GOがSELinuxまで見ていない、もしくはSafetyNet自体がSELinuxの状態とは関係ないことが考えられます。

システムの全てチェックしているわけではない?

本来は完全初期化してから導入すべきなのですが、システム領域が完全に元に戻っていない状態のカスタムROM(RR)で試したところ、Magiskの導入・動作共に問題なくPokémon GOやAndroid Payも動作しました。

その時は、導入前に「su」とXpoesdは削除したものの、システムを変更するその他のもの(サウンドMOD「A.R.I.S.E. Sound Systems」など)は削除せずそのままでした。

冒頭にも書きましたが、SafetyNetはrootだけでなくシステムの改変を見ているはずです。

しかし、実際には改変が残っていても回避できてしまったので、もしかしたら全部はチェックしていないのではないのではないかともしれません。
(私の端末環境の問題やこれらアプリだけがたまたま起動してしまった可能性もあります)

まとめ

  • Android PayやPokémon GOなどは「SafetyNet API」で端末のシステム改変(root化)をチェック
    →チェックに引っかかるとアプリは動作できず
  • SafetyNetのチェックは「Magisk」で回避可能
  • Magiskは以下の環境で使用可能
    • 「メーカー公式ROM」または「後からroot化するカスタムROM」(CMやRRなどは不可)→どのROMでもOK
    • Android 5.0以上
    • systemless rootが可能
  • Magiskはroot/非rootの切り替えを行う
    非root中はチェック回避できるが、他のアプリもroot権限使えず(未検証)
  • AutoMagiskで自動切替可能
    ⇒Magisk本体の機能に組み込まれた

参考にした情報

Powered by Blogger.