ラズパイ使ってWii Uをリカバリー可 USBの脆弱性を利用した新しいexploit UDPIH by GaryOderNichts

GBATempで、GaryOderNichts氏がNintendo Wii UのUSBの脆弱性を利用しRaspberry Pi PicoまたはZeroを使ってUSBデバイスエミュレーションを行いWii Uの起動時に接続することでリカバリーモードを起動させることができるUDPIH v1をリリースしていました。

Wii-U

UDPIHは
USB Descriptor Parsing Is Hard
の略で「USB記述子の解析は難しいぞ」という意味です。しゃれた名称ではなくGaryOderNichts氏の苦労の跡を込めた名称になっています。読み方は”マッドパイ”の頭のmがない感じ」だそうですので、日本語だと「ウッドパイ」のような感じでしょうか。

Wii Uのロゴが表示された後USBマスストレージドライバーとUSBイーサネットドライバーが読み込まれますが、この処理を行うのがIOS-USBモジュールです。

Wii UはARMチップでIOSUと呼ばれる組み込みOSを実行しています。IOSUはメインのPowerPC CPUで処理されないコンポーネントやデバイスドライバーを含む各種モジュールで構成されています。

IOS-USBモジュールはUSBポートに接続するUSBデバイスを処理するために使われます。

USBデバイスを接続すると、そのデバイス記述子(USBバージョンや製品ID、構成記述子など)を読み取りますが、その処理にバグがありコードを実行できるようにした、というのがUDPIHの大まかな概要です。詳細についてはGaryOderNichts氏がブログで解説しています。

ここ数ヶ月にUSBの構成記述子を解析しているときにバグを見つけ、exploitとして使えるようになりました。システム起動直後に無改造Wii Uでコードが実行できることになります。メニューが起動しなくなったWii Uを元に戻すことができるのです。

接続するUSBデバイスは、USBエミュレータとしてラズパイ(Raspberry Pi PicoまたはZero)を使っています。理論的にはRaspberry Pi PicoまたはZero以外のLinuxデバイスでも可能だとは思いますが、現状UDPIHで用意されているのはRaspberry Pi PicoとZeroのものだけです。

Raspberry Pi Pico

1. GitHubのリリースページから最新のudpih.uf2をダウンロードする
2. Raspberry Pi Picoのボード上にあるBOOTSELボタンを押しながらRaspberry Pi PicoをPCに接続する
3. PCがRaspberry Pi PicoをUSBストレージデバイスとして認識したらudpih.uf2をRaspberry Pi Picoにコピーし、完了後接続を解除する

Raspberry Pi Zero

1. Raspberry Pi Zeroを起動し、必要なものをインストールする
sudo apt install build-essential raspberrypi-kernel-headers
2. リポジトリをクローンする
git clone https://github.com/GaryOderNichts/udpih.git
cd udpih

3. GitHubのリリースページから最新のarm_kernel.bin.hをダウンロードし、arm_kernelディレクトリにコピーする
4. カーネルモジュールをビルドする
cd linux
make

5. カーネルモジュールをカーネルにインサートする
sudo insmod udpih.ko
※Raspberry Pi Zeroの場合は起動毎にモジュールのインサートが必要
※Raspberry Pi Zeroの場合はRaspberry Pi Zero自体の電源用とWii Uへ接続用の2本のUSBケーブルが必要

recovery_menu​の起動

リカバリーメニューはGaryOderNichtsがrecovery_menu v0.1としてリリースしています。これを使うことでbrickしてしまったWii Uを復旧させることができます。

1. GitHubのリリースページから最新のrecovery_menuをダウンロードし、FAT32でフォーマットしたSDカードのルートにコピーする
2. SDカードをWii Uに挿入し電源を入れる
3. Wii UのロゴがモニターまたはWii U GamePadに表示されたらRaspberry Pi Pico/ZeroをUSBポートに挿入する。タイミングが重要で、HOMEメニューが表示されてしまった段階ではUDPIHは動作しない
4. 数秒後にリカバリーメニューが起動する

recovery_menu​について

Set Coldboot Title​
Wii Uが起動する現在のタイトルを変更できます。brickしてしまったWii Uの復旧を行えます。

  • Wii U Menu (JPN) – 00050010-10040000
  • Wii U Menu (USA) – 00050010-10040100
  • Wii U Menu (EUR) – 00050010-10040200

​Dump Syslogs​
システムログをSDカードのルートにあるlogsフォルダにダンプします。

Dump OTP + SEEPROM​
OTPとSEEPROMをotp.bin、seeprom.binとしてSDカードのルートにダンプします、

Start wupserver
wupclient.py(要Python)を利用してPCとWii Uを接続するwupserverを起動します

Load Network Configuration​
wupserverに適用するネットワーク設定をSDカードから読み込みます。SDカードのルートにあるnetwork.cfgが設定ファイルです。
有線LANアダプターを使用する場合のnetwork.cfgは
type=eth
無線LANを使用する場合のnetwork.cfgは
type=wifi
ssid=ssidhere
key=wifikeyhere
key_type=WPA2_PSK_AES

です。

Displays DRC Pin​
Wii U GamePadとのペアリングで使うPINコードを表示します。数値は次の記号を表します。
♠ = 0, ♥ = 1, ♦ = 2, ♣ = 3

Install WUP​
SDカードのルートにあるinstallフォルダから署名済みのWUPをインストールします。WUPはサブフォルダにあるとインストールできません。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする