iOSのSHSH2を取得する

SHSHとは

SHSHについてはThe iPhone Wikiが最も詳しい。

SHSH, or “Signed Hash” is a 1024-bit RSA signature that is verified by the bootloader before execution of an image is permitted.

https://www.theiphonewiki.com/wiki/SHSH

要するに、SHSHとはブートローダによって検証された1024bitのRSA証明書である。

Appleは最新のファームウェア以外のアップデートを禁じており、復元の際にはAppleのサーバへ認証を行わなければいけない。

その際に、最新以外のファームウェアで復元しようとした場合にはAppleからリジェクトされてブートローダが復元を拒否するという仕組みである。

これを回避するためにはBootROMの脆弱性が必要となる。

これは3GSで発見された24Kpwnの他、iPhone4で発見されたLimera1nなどがあたる。iPhone4S以降、新たなBootROM脆弱性は見つかっていない。

SHSHは何かというと、Appleがまだファームウェアの復元を認めているうちにAppleが復元を許可したときの署名されたハッシュを保存して置いたものである。

復元の際には偽の認証サーバをコンピュータ上に立て、あたかもAppleが復元を許可したかのようにSHSHをデバイスに送れば復元が受理されるという仕組みである。

そもそも初期では復元にSHSHは必要とされておらず、どんなバージョンにでも任意に復元することができた。

SHSHが取り入れられ始めたのはiOS3の頃で、ちょうどiPhone3GSが発売された頃である。

初期のSHSHはこのように至極単純な仕組みであったため、簡単にエミュレートサーバを立ててダウングレードすることができた。

当初のエミュレートサーバとしてはTinyUmbrellaなどが有名だろうか。

しかし、この単純なエミュレートサーバによるダウングレード法はiOS5から封じられることになる。

APTicket

APTickets (short for Application Processor Ticket[1]) are the new type of SHSH blobs, used by iOS 5.0 and newer. The client (iBSS/LLB/iBoot/BootROM) generates a random string (nonce), then iTunes and the device sends the request for blob signing and the server returns the data, just like the original SHSH protocol.

https://www.theiphonewiki.com/wiki/APTicket

iOS5では復元の際にAppleに認証を求める際に送るデータにブートロムが生成したランダムな文字列が加えられようになった。

これにより、例えばブートロムが文字列として”abcde”というデータを加えて認証を要求したときのSHSHを保存してその内容が”edcba”だったとする。

しかし、これを保存していたとしても実際に復元したいときにブートロムが”fajka”という文字列を生成して認証要求をすると、保存していたSHSHと一致しないため復元が拒否されてしまう。

このAPTicketによるダウングレード防止策は当初は効果を発揮したが、初期のAPTicketは実装に問題があったためすぐにダウングレード方法が登場してしまった。

iOS6以降はAPTicketのフォーマットが変わったためそのままではダウングレードできなくなっている

SHSHを保存する利点

iOS6でダウングレードが封じられて以降、長らくSHSHの出番はアリませんでした。BootROM脆弱性が見つからなかったことがその理由の最たるものでしょう。

一時期はSHSHは使いみちのないコレクターズアイテムのように揶揄されていた時期もありました。

では、SHSHを保存する意味とは一体何なのでしょうか?

ダウングレードにはSHSHが必要不可欠である

これは絶対に変わらない普遍の真理です。一時期、SHSHなしでダウングレードする手法が存在しましたが、それは一時的に署名チェックをバイパスしている似すぎず、再起動するとブートロムが署名を拒否するので起動しなくなるという根本的問題がありました。

24Kpwnは非常に強力なBootROM脆弱性だったため、SHSHなしで任意の復元ができましたが、先ほどから述べているように新たなBootROM脆弱性は見つかっておらず、今後も見つかる見込みは薄いためSHSHは復元には必要不可欠と言い切って良いでしょう。

tsschecker

SHSH保存ツールとして最も有名なのはtsscheckerでしょう。

一時期、SHSHを保存するツールが乱立し、Aで取得したSHSHはBと互換性がないとか、Aで取得したSHSHではCという復元ツールでは使用できないとかそういった問題がありましたが、現在ではtsscheckerに一本化されているのでこれさえ導入しておけば問題ありません。

最新版はGitHubで公開されており、これを用いることで全てのデバイスでSHSHを取得できます。

使い方

tsscheckerを利用するのに必要なのは三つの情報です。

どれか一つでも間違っていると正しいSHSHを保存することができません。

  1. デバイスID
  2. デバイスモデル情報
  3. ECID
// iPad Pro 9.7
tsschecker -d iPad6,4 --boardconfig J128AP -e 10704428F10226 -i 12.1.3 -s
// iPhone8
tsschecker -d iPhone10,1 --boardconfig D20AP -e 1849483045483A -i 12.1.3 -s

ECIDとかの調べ方については割愛します。

iOSを復元する

使いみちのなかったSHSHですが、futurerestoreがリリースされてから一気に使いみちが生まれました。

futurerestoreとは簡単にいえばダウングレードするためのiTunesではない非正規ツールといったところでしょうか。

SHSHの有効性を調べる

昔のtsscheckerにはバグがあり、正しく取得できない場合がありました。

SHSHが実際に使えるものなのかどうかはimg4toolで調べることができます。

// SHSHの有効性を調べるコマンド
img4tool -v BuildManifest.plist -s "SHSH2 File"

BundleManifest.plistはipswファイルを解凍することで得られます。

img4tool

file is valid!と表示されており、有効であることがわかります。

復元してみた

やりたかったのですが、SHSHを保存していなかったためできず…

いや、ほんとコレクターズアイテムだと思ってiOS9くらいから全然取得してなかったんですよ。

Cydia Eraserもあるし、復元よりも手っ取り早かったですし。