Xperia 1 (802SO) のrootを何も失わずに取得する

Xperia 1 (802SO) でbootloaderをunlockせずにrootを取得する方法を紹介します。rootは一時的な取得(temproot)ですが、Xperiaの独自機能を失わずに済みます。

今のところこの方法は802SOにのみ適用できますが、しばらく待てば他の国産機種にも適用できるようになるのではないかと思います。

bootloader unlockとの比較

bootloaderをunlockすることでもroot取得は可能ですが、今回の方法と比較すると以下の点が違います。

  • 〇 お金がかからない
  • 〇 DRM Key を失わずに済むので Xperia の独自機能を使い続けることができる (詳しくはbootloader unlockの記事を参照)
  • 〇 Has Ever Been Unlock のフラグを No のままにできる
    • このフラグは一度bootloaderをunlockするとYesになり基本的には元に戻せません。
    • Yes の場合、修理の場合に余計に費用を請求されるなど、サポートの対応が変わる可能性があります
  • × 特定のファームウェアバージョンを使い続ける必要がある
    • ファームウェアアップデートは普段通りできるので、root取得後、一回だけTitaniumBackupの復元機能を使うような使い方であれば問題ありません
  • × 再起動するとrootが失われる
    • まだワンタップでroot取得するような仕組みはありませんので、AdAwayのようなアプリを常用する場合は再起動しない使い方をすることになります。

rootの取得手順

ファームウェアをダウングレードする

このroot取得方法はLinuxカーネルの脆弱性CVE-2020-0041(解説)を利用しています。そのため、この脆弱性があるファームウェア(セキュリティパッチバージョンが 2020年3月より前)で動作している必要があります。

802SOの場合、脆弱性が残っている最も新しいファームウェアは 55.1.B.0.202 ですのでこれを使います。他の機種の場合もxda-develpersのスレッドに書かれているバージョンのファームウェアが必要です。カーネルのバイナリが全く同じ場合は他のファームでも動作する可能性がありますが、基本的にはここに書かれていないバージョンでは動作しないと考えてください。

ファームウェアをダウングレードする際にはユーザー領域の初期化が必要です。(本来は不要なはずですが、ユーザー領域を初期化せずにダウングレードする方法を見つけられていません)

bootloaderをunlockする際にも初期化されるので、この点はどちらのroot取得方法も状況は同じです。

ファームウェアの準備

  • ファームウェア 55.1.B.0.202 をダウンロードします
    • 過去ファームはXperiFirmでは取得できませんので、AndroPlus さんなどから取得します。
  • ダウンロードが済んだら適当な場所に展開します。
  • 展開した後、.ta で終わるファイルと persist.sin を削除しておきます。
    • この削除の手順を忘れると端末が復旧可能になりますので注意してください。
  • ftfを展開した場合: boot_delivery.xmlをbootフォルダの中に移動しておきます。

802SOに関しては、予め上記の準備を済ませたものを置いておきますので、心配な方はこちらを使ってください。802SO_SoftBank JP_1318-7898_55.1.B.0.202_R9B.7z

newflasherのダウンロードと展開

Xperia 1ではファームウェアの書き込みにnewflasherが必要です。

xda-develpersのnewflasherのスレッドからダウンロードして来ます。

ダウンロードした newflasher_vXX.rar は先ほど準備したファームウェアのフォルダの中に展開します。

ファームウェアの書き込み

注:手順を間違えるとデバイスが復旧可能になりますので、この記事の手順やほかのサイトの記事を参考にして、事前に手順を念入りに確認しておいてください。

また、万が一端末が起動不能になった場合はXperia Companionで復旧できることがありますので、こちらの手順も事前に確認しておいてください。

以下がファームウェアの書き込み手順です。

  1. ファームウェア書き込み用のドライバをインストールします。
  2. 端末の電源を切ります
  3. VOL DOWNキーを押しながら電源を入れ、USBケーブルを接続します
  4. newflasherを実行します

実行するといくつか質問が表示されますがすべて N を選べば大丈夫です。(バージョンアップによってこの辺の挙動は変わる可能性がありますので、文面の意味を十分に理解して実行してください)

rootの取得

ファームウェアのダウングレードができたらいよいよrootを取得します。

root獲得用プログラムの準備と転送

  1. xda-develpersのスレッドからroot取得用のプログラムをダウンロードします。
  2. 適当な場所に展開し、端末本体にファイルを転送します。転送先は /data/local/tmp 以下にします。
    • adb push x1x5mroot /data/local/tmp
  3. そのあと x1x5-mroot に実行権限を付けておきます。
    • adb shell chmod +x /data/local/tmp/x1x5mroot
  4. magiskもgithubから取得して同じ場所に転送しておきます。かならず Magisk-v20.4.zip を選びます。
    • adb push Magisk-v20.4.zip /data/local/tmp

temprootの取得

このroot取得プログラムはUse After Freeと呼ばれるメモリ関連のバグを利用しているため、発声条件がシビアです。成功率を上げるため、一見関係ないような手順やおまじないが必要になっていますが、手順省略しないようにしてください。

  1. 端末を再起動した後機内モードにし、ネットワーク接続を遮断します
  2. adb shell で端末に接続し /data/local/tmp に移動します
    • adb shell
    • cd /data/local/tmp
  3. magisk を適用する下準備として sh magisk-setup.sh を実行します
    • sh magisk-setup.sh
  4. 端末をスリープにしない状態で2分ほど放置します
    • 十分な時間が経過しているかどうかは、別のコマンドプロンプトから adb logcat を実行しログの流れが落ち着いたかどうかで判断できます。
  5. temprootを取得するためのプログラム x1x5-mroot を実行します。成功するとrootのシェルが起動します
    • ./x1x5-mroot 
  6. rootシェルが起動した後以下のようなコマンドを実行してmagiskを有効にします。
    • sh magisk-start.sh -1
    • sh magisk-start.sh -2
    • sh magisk-start.sh -3
  7. 全ての処理が終わったら、必ずexitと入力してrootシェルを終了します。
    • exit
802SO:/ $ cd /data/local/tmp
802SO:/data/local/tmp $ ./x1x5-mroot
[+] factoryversion = '802SO-55.1.B.0.202'
[+] Mapped 200000
[+] selinux_enforcing before exploit: 1
[+] pipe file: 0xffffffe5cd6e3b00
[+] file epitem at ffffffe54d87eb00
[+] Reallocating content of 'write8_inode' with controlled data..[DONE]
[+] Overwriting 0xffffffe5cd6e3b20 with 0xffffffe54d87eb50...[DONE]
[+] Write done, should have arbitrary read now.
[+] file operations: ffffff90392212d0
[+] kernel base: ffffff9037e80000
[+] init_cred: ffffff903a02d808
[+] memstart_addr: 0xffffffdbc0000000
[+] First level entry: 145437003 -> next table at ffffffe585437000
[+] Second level entry: 1e6b41003 -> next table at ffffffe626b41000
[+] sysctl_table_root = ffffff903a05d380
[+] Reallocating content of 'write8_sysctl' with controlled data.[DONE]
[+] Overwriting 0xffffffe6352bcb68 with 0xffffffe54b8a3000...[DONE]
[+] Injected sysctl node!
[+] Reallocating content of 'write8_selinux' with controlled data.[DONE]
[+] Overwriting 0xffffff903a772ffc with 0x0...[DONE]
[+] Node write8_inode, pid 10824, kaddr ffffffe4e3d18c00
[+] Replaced sendmmsg dangling reference
[+] Replaced sendmmsg dangling reference
[+] Node write8_selinux, pid 11452, kaddr ffffffe58324c400
[+] Replaced sendmmsg dangling reference
[+] Replaced sendmmsg dangling reference
[+] Node write8_sysctl, pid 11338, kaddr ffffffe4e3c05980
[+] Replaced sendmmsg dangling reference
[+] Replaced sendmmsg dangling reference
[+] Cleaned up sendmsg threads
[+] epitem.next = ffffffe5cd6e3b20
[+] epitem.prev = ffffffe5cd6e3bd0
[+] Launching privileged shell
root_by_cve-2020-0041:/data/local/tmp #

これでrootを取得しAdawayやTitaniumBackupが利用できるようになりました。必要に応じてMagiskManagerをインストールし、MagiskHideを有効化しておくとよいでしょう。

ただし、一度再起動するとroot取得の効果は失われますので、temproot を取得し magisk-start.sh を実行する手順は必要に応じて毎回実行するようにしてください。(magisk-setup.sh は不要です。)

おまけ: TAとpersistのバックアップ

今後bootloaderをunlockするなどに備えて、端末固有で復旧不能なTreamAreaやpersist領域のバックアップを取っておきます。

  1. adb shell内からsuを実行します
    • su
  2. 各種領域を吸い出します
    • dd if=/dev/block/by-name/TA of=/data/local/tmp/TA.img
    • dd if=/dev/block/by-name/persist of=/data/local/tmp/persist.img
  3. adb pullできるようにします
    •  chown shell:shell /data/local/tmp/TA.img /data/local/tmp/persist.img
  4. exit を 2 回実行して adb shellを抜けます
  5. ファイルを PC に転送します
    • adb pull /data/local/tmp/TA.img
    • adb pull /data/local/tmp/persist.img
得られてたファイルは重要なものですので大切に保存しておきます。端末固有情報が入っているため、他人に渡してはいけません。

最後に

Linuxカーネルの脆弱性をつくことでroot権限を取得する方法を紹介しました、

既に最新のファームウェアは使えなくなっていますが、修正されたのは2020年3月以降のファームウェアなので、今のところ大きな不便はないです。Xperia独自の機能はそのまま使えるため、メインの端末として使うにはbootloaderをunlockするよりも、Xperia本来のの良さを生かせて良いのではないかと思います。

またbootloaderをunlockする場合においても、事前にTA領域をバックアップする方法が確立されたことにはとても意義があります。bootloaderをrelockすることでXperiaの独自機能が再び使えるようになるとの話もありますが、unlock時にはDRM鍵は確実に消去されており、またbootloaderをunlockしたことが記録として残ってしまうため、事前にTA領域をバックアップしておくことは非常に重要になってきます。なので、bootloaderをunlockする場合においても是非一度今回紹介した手順を役立ててもらえればと思います。

いろいろ遊べるようになった割に投げ売りでコスパも良かったので、遊べる普段使い端末としてだいぶ満足度は高まりました。


コメント

このブログの人気の投稿

国産キャリア版Xperia 1 (802SO) のbootloaderをunlockしてrootを取得する

Synology ds918+ に 2.5Gbps / 5Gbps の USB LAN を接続する