[PSVITA] Factory firmwareのバージョンを下げる事が出来る mincg がリリース

2019/11/06 20:12 PS Vita 5
SKGleba氏が、VitaのFactory firmware(工場出荷時点での初期FW,ダウングレードの限界点)の値を含むデータを
扱う事が出来る mincg v1.0 をリリースしていました。

ここ最近いろいろあって記事を書いてませんでしたが、流石にこのリリースは見過ごせないので記事にします。
記事執筆時点では一人でも多くの方の協力(mincgでダンプしたデータをSKGleba氏に提供)が必要です。



記事執筆時点でVitaの最新FWは3.73であり、3.73でもハックであるHENkakuを使用する事は可能です。
HENkakuは電源を切るまで有効な一時的なハックであり、電源を入れた時点でHENkakuが有効になるEnsoは
3.60/3.65でのみ使用可能です。つまり3.67以上のVitaの場合、Ensoを使用したいならダウングレードを行う
必要があります。ダウングレードはmodoruというHomebrewで実現可能です。
(ここでEnsoを挙げているのは、ダウングレードする目的として一番分かりやすい例であるためです。)
しかしながらダウングレードの限界点としてFactory firmwareが存在します。これはハードコードされており
かつ本体毎に固有の2つ鍵で暗号化されたバージョン情報です。仮にそれが3.67の場合、そのVitaではそこが
ダウングレードの限界です。しかし、ついにFactory firmwareを変更出来るHomebrew/ツールの登場です。
(SKGleba氏はFactory firmwareをminfwと書いているので以降私もそう書きます)

mincgはTeamMoleculeが発見したsecond_loaderのexploitであるmoth exploitの実装もとい実現です。
moth exploitの概要はwikiに掲載されています。
https://wiki.henkaku.xyz/vita/Vulnerabilities#moth_exploit
minfwを含むデータはVitaの本体毎に固有の情報があるIdStorageに存在します。それの復号に本体毎に固有の
2つの鍵(仮にAとB)が使用されます。second_loaderはまずIdStorageから取得したデータ(blob)をAで復号し、
RSAで検証します。その後、Bで復号される事でminfwのバージョン値が出てきます。
バージョン値は4バイトの値で、例えば3.60なら03600000、3.65なら03650000となります。
しかしどうもいずれの復号処理においてもパディングのチェックはしていないらしく、それが原因となり別の
本体のminfwを含むデータ(別の本体のAで復号された状態)を目的の本体のAで復号出来るように暗号化して
フラッシュする事で、データの移植が可能になるのだそうです。
しかし別の本体のデータですから、当然ながら目的の本体のBでは復号出来ず、復号しようとすると滅茶苦茶な
値が出てきます。ただし、稀に「その本体の元々のminfwよりも下がってしまう」という事も起こり得ます。
それを狙えばminfwを下げる事は実現出来る、というのがmoth exploitです。
(だから表現としては実装よりも実現の方が良いのかなと…)

mincgはHomeberwとPCのツールに分かれます。Homebrewはダンプとフラッシュに使用します。
ツールはダンプの検証とフラッシュ用データの作成に使用します。ダンプの検証は、別の本体のダンプを自身の
Aで復号出来るよう暗号化してAとBで復号した時に出てくる滅茶苦茶な値の検証です。
ツールの検証で狙うバージョン値は00996000~03650000(0.996~3.65)です。
Vitaのブートローダーは起動時に本体毎に固有のハードコードされたデータを復号してハンドシェイクに用いる
鍵を設定するそうですが、minfwが0.996未満の場合には通常とは異なる値が設定されてしまい、それが原因で
Vitaが起動しなくなるそうです。(つまりブリック。) 最低値が0.996なのはそれが理由です。
https://twitter.com/skgleba/status/1191826801535979520
(Darthsternie氏のVitaが犠牲となりこの問題が発覚した。Darthsternie氏に感謝)
3.65が最大値なのはEnsoを考慮してです。

出てくる滅茶苦茶な値は4バイトなので範囲は00000000~FFFFFFFFです。
そこから00996000~03650000を狙うわけなので、別の本体のダンプが多ければ多いほどヒットする確率は
高くなります。確率を上げるためにも一人でも多くの方のダンプ提供が必要です。提供しても良いという方は
ダンプ後にSKGleba氏にメールで送ってください。(skgleba@gmail.com)
本体のモデルやminfwに関わらず、全てのVitaのダンプが役に立ちます。
提供データは一定の数毎にGitHubにアップされると思われます。

●注意
  • 自己責任で作業を行ってください。何が起きても私や開発者は責任を負いません。
  • 元のminfwが3.61以上の場合、下げたとしても、3.60未満にはダウングレードしないでください。
    これは、FWの動作に関わるハードウェアの変更が行われている事があるためです。
    readmeにはそう書かれています。これは1000/1100と2000とTVのモデル間の変更だけはありません。
    同じモデルでのハードウェアのマイナーチェンジも含んだ話です。
    (3.60以上が良いのは、おそらく3.60リリース以降はそういう変更が確認されてないから……?)
  • 元のminfwが3.60以下の場合、下げたとしても、元のminfw未満にはダウングレードしないでください。
    理由は上と同じです。つまりmincgでminfwを下げる意味があるのはminfwが3.61以上の場合のみです。
  • 3.74以上がリリースされた場合、アップデートしないでください。
    moth exploitが対策される可能性があります。



●用意するもの
master.zipは最新のソースコードです。ツールのファイルはソースコードと一緒にアップされています。
以下に書く手順はWindows環境向けです。ご了承ください。
(ダンプ・提供だけが目的の場合、作業は手順8で終了です)


●手順
  1. mincg.vpk をDLし、VitaShellでインストールする
  2. mincgを起動する
    mincg_20191106_1.jpg
  3. ×ボタンを押してSMI(minfwの情報を含むデータ)をダンプする
    (ダンプは一瞬で終わる。10秒後にmincgは自動で閉じる。自分で閉じても良い) mincg_20191106_2.jpg
  4. mincg-master.zip をDL、解凍する (必要なのはpctoolフォルダ内の物のみ)
  5. "/pctool/windows/" 内にあるファイルを "/pctool/" にコピー
  6. VitaShellを起動し、FTP或いはUSBでPCと接続
  7. "ux0:data/" にある以下の5つのSMIと付くファイルをPCのpctoolフォルダにコピー
    (XXXXXXXXの部分は本体毎に異なります)
    • XXXXXXXX_SMI_DECRYPTED.SMI
    • XXXXXXXX_SMI_HEADER.SMI_HDR
    • XXXXXXXX_SMI_KEYS.SMI_KEY
    • XXXXXXXX_SMI_NOUTER.SMI_e1
    • XXXXXXXX_SMI_RAW.SMI_e2
  8. (任意)
    5つのファイルをzipで圧縮して skgleba@gmail.com に送信
  9. コマンドプロンプトを起動する
  10. cdコマンドでpctoolフォルダに移動する
  11. 以下のように実行する (XXXXXXXX部分は自分のファイルに合わせる)
    mincg.exe XXXXXXXX_SMI_KEYS.SMI_KEY
  12. 検証でヒットせず終了した場合は "END: no min fw lower than 03.6500.01 and higher than 00.9960.00"
    と表示される。その場合は諦める (提供データが増えた時に再挑戦)
    ヒットした場合(minfwを0.996~3.65に収められた場合)は以下のように表示される
    mincg_20191107_1.jpg
    (dataフォルダとkeyフォルダにあるのは提供データで、keyフォルダ内は検証処理のために連番になっている)
    過去にダンプを提供した事がありかつそのminfwが3.65以下である場合、自分の物なので鍵が一致し正常な値が
    出てヒット扱いになってしまうが、ツールは全提供データに対して検証を行い、次の作業ではヒットした中から
    好きなminfwを選択させるため、自分の提供データがヒットしたとしても問題は無い(それを選ばなければ良い)
    (自分の提供データのヒットは、表示されたメッセージのSMI_e1ファイルの名前とminfwから判別可能)
  13. 結果としてヒットしたminfwが添字(左の数字)と共に表示される
    mincg_20191107_2.jpg
    ここで、自分のVitaのminfwが下がる物の添字を入力してEnter (複数ある場合はどれでも好きな物を)
    (そうする事で、フラッシュ用のTSMI.SMIファイルが作成される)
  14. "ux0:data/" にTSMI.SMIファイルをコピー
  15. mincgを起動する
  16. (readmeには書かれていないが、念の為)
    □ボタンを押してログを作成し、VitaShellで "ux0:data/mincg.log" を確認する
    下の方の "FW_CHK:" の値が自分の選択したminfwならOK
    (これはVitaにコピーしたTSMI.SMIファイルが破損したりしていないかを確認する作業)
    (TSMI.SMIファイルが無い場合はファイルの代わりにVita側の情報が参照されログが作成される)
  17. mincgを起動する
  18. ○ボタンを押してTSMI.SMIファイルをフラッシュ
    完了すると5秒後に自動で再起動される
  19. ダウングレードを試みる
    (3.71~3.73の場合は必ずmodoru v2.1を使用する。3.70以下の場合はv1.0でも良い)



という事で、まだまだ提供されている数が少ないので確率は低いですが、minfwを下げる事が可能になりました。
かなり荒業ではあると思いますが、これはすごい事です。Vitaシーンの開発者に感謝!

時間が取れたら他にも記事を書きたいとは思っていますが、まだ少し厳しい感じです。
ではまたそのうち。

▼コメント


オットコヌシ・ママリン 2019/11/06 22:04
ロウアーFW見つかってよかったですね!
おめでとうございます。

私は残念ながら見つかりませんでした(笑)
なので、ダンプだけ送ってまた様子を見ようと思っています。
詳しい解説ありがとうございました。
特に不自由なく解説通りにできましたよ♡
オットコヌシ・ママリン 2019/11/07 04:20
追記失礼します。
先ほどダンプファイルの送信に返信をもらえまして、
だいたい3/256の確率なので、ラッキーが出るまで頑張って!
という趣旨の内容でした(笑)
毎日サンプルはアップロードしてるから、そのうち安定すると思うということも仰ってました。
参考になればと思ってシェアさせてもらいました。
a 2019/11/08 03:15
解説記事ありがとうございます。
管理人さんは、実際に改変したSMIをフラッシュしたり初期FWより下に下げてみたりしましたか?

自分は、初期FW3.30のPSTVに"00.A6B7.E2"のSMIをフラッシュして、1つ下のFW3.18へのダウングレードを試みたのですが
「このFWはこのシステムには適用できない」旨のエラーが出てダメでした。1つ下くらいなら行けると思ったのですがTVが特殊なんですかね。

ちなみに、元々のSMIデータに戻したい場合は、mincgでダンプした際のXXXXXXXX_SMI_RAW.SMI_e2をTSMI.SMIにリネームして書き戻せばokですよね
(試してみたところ、それで元の初期FWに戻ったので大丈夫なはず)

https://imgur.com/a/OrjdEFi
管理人 kood 2019/11/08 15:30
>>aさん
私は手順の確認のためにSMIのフラッシュまでしか試してませんでした。minfw3.67以上のVitaを持っていませんし、なにより
Discordで開発者の皆さんがダウングレード出来る前提で話を進めていたので、出来るんだろうなあと…
私も元々のminfwが3.30のTVで先程試しましたが、同様のエラーが発生しました。
Githubにこの件のissueが投稿されていましたが、readmeにある以下の文と共に閉じられていました。
「You should NOT downgrade below 3.60 there may be some hardware differences on lower firmwares」
私はこれを単に1000/1100と2000とTVのモデル間の違いを指していて3.60未満がダメなのはHENkaku関連の事だろうとしか
思っていなかったのですが、どうやらこの文は同じモデルでも注意しろ的な意味を含んでいるっぽいです。
3.60と書かれているのは「Vitaのハックが活発になったのは3.60からで、その時から生産終了までFWに関連するハードウェア
の変更は確認されてないけど、3.60リリースより前は知らん」という事なのだと思います。おそらく。
issueが閉じられたのを見るに、SKGleba氏は3.60未満へのダウングレードはサポートしないつもりなのでしょうね。
元のデータに戻したい場合はSMI_e2のフラッシュでOKだと思います。
a 2019/11/08 20:35
>>管理人さん

わざわざ検証して頂きスミマセン。たった今そのIssue見ましたがまったく同じ状況ですね。
しかもその方Vita2000の方はブリックさせてしまったようで...
自分は多分ブリックまではしないだろうと思いながら試してみたのですが、軽率だったかも知れません。

と言いつつ、もっとサンプルが集まって自分の所有するもう1個のVita(初期FW1.05)でも、1.04以下の値がヒットしたら多分試すかもですが(笑)


▼コメントを投稿












※「英数字90%以上」のコメントを規制中です。コメントを投稿する際は日本語でお願いします。
※確認ボタンを押すと投稿確認フォームに移ります。投稿確認フォームの送信ボタンを押してください。
※確認フォームにある「メールアドレス」に入力された内容は管理人のみ確認可能です。空欄で構いません。
※確認フォームにある「タイトル」「パスワード」は当ブログでは使用していません。空欄で構いません。
※確認フォームにある「URL」は名前のリンクとして機能します。空欄で構いません。
※確認フォームには非公開コメントのチェック項目がありますが、非公開コメントは受け付けていません。
メールフォームより連絡頂ければメールにてお返事致します。