1 ポイント 投稿者 GN⁺ 2024-08-08 | 1件のコメント | WhatsAppで共有
  • Create-A-Park の保存ファイルにおける gap name 処理の strcpy バッファオーバーフローが、original Xbox、Xbox 360、PS2、GameCube など複数プラットフォームの保存ファイルおよびネットワークエクスプロイトにつながった
  • THPS4 original Xbox 版では、31文字制限の文字列が境界チェックなしで 32 バイトのスタックバッファにコピーされ、return address を上書きできたほか、保存ファイルヘッダーと実行可能なデータセグメントを使ってシェルコードを実行した
  • THPS3 では同じ入力がスタックではなくヒープを破壊するため、カスタム allocator と vtable 経路を経る ROP チェーンが必要であり、THUG 1・2 の Xbox 版では stack cookie のため gap name 経路は塞がれていた
  • THPS4 のマルチプレイヤーでは、悪意あるホストが park ファイルをクライアントに送信して リモートコード実行 と非同期ファイル転送を行えたほか、転送中に明らかになったネットワークのメモリリークはエクスプロイト内の hot patch で回避した
  • Xbox 360 の Tony Hawk’s American Wasteland でも gap name オーバーフローによって ROP 実行が可能だが、完全な hypervisor コード実行が可能になるのは 4548 kernel の system call handler バグと組み合わせた場合に限られ、ソースとパッチ済み保存ファイルは GitHub で公開されている

出発点: gap name と strcpy

  • 2016 年、original Xbox 向けの新しい保存ファイルハックのバグを探していた過程で、Tony Hawk’s Pro Skater 4 の custom park 保存ファイルが分析対象となった
  • THPS4 の Create-A-Park 機能では、プレイヤーが自分で skate park を作成し、ジャンプ区間である gap に名前を付けられる
    • gap name は最大 31 文字と null terminator で構成されるユーザー指定文字列である
    • この文字列が strcpy のような関数で処理されると、メモリ破壊の primitive になり得る
  • gap name を長い 0x41 の繰り返し文字列に置き換えた悪意ある保存ファイルを Xbox にコピーして読み込むと、コンソールがクラッシュし、instruction pointer が 0x41414141 に設定された
    • これは gap name がスタックにコピーされ、return address まで上書きされたことを示す兆候である
  • IDA で分析した結果、保存ファイルの gap リストを走査しながら、save_file_gap_datagap_name をスタック上の gap_description gapDescstrcpy でコピーしていた
    • 境界チェックがないため、null terminator に到達するまでコピーが続く
    • 該当するゲームバージョンは stack cookie なしでコンパイルされており、スタックデータと return address を上書きできた

original Xbox THPS4: 実行可能領域へシェルコードを移す

  • original Xbox には最近のデバイスのように任意データの実行を防ぐハードウェア DEP はないが、後期カーネルとゲームには一部 soft DEP が存在する
    • コードセグメントの selector アドレスを変更し、特定アドレス以下のみ実行可能にする方式である
    • スタックと、保存ファイルが入っているヒープ割り当ては実行可能領域の外にある
  • ゲーム実行ファイルの read-write データセグメントは実行可能領域内にあるため、コードをそこへコピーしてから実行する戦略が使われた
  • park 名は保存ファイルヘッダー内にあり、プレイヤーが保存ファイルを選択すると UI 表示のため、ヘッダーの先頭 136 バイト が実行ファイルのデータセグメント内の struct にコピーされる
    • ヘッダー全体を自由に書き換えられるわけではないが、小さな memcpy スタブを置くには十分な空間がある
  • THPS4 original Xbox エクスプロイトの流れ
    • 保存ファイル読み込み後、「Start Game」を押す前に、先頭 136 バイトが実行ファイルのデータセグメントへコピーされる
    • 「Start Game」を押すと、悪意ある gap name がスタックへコピーされ、return address がシェルコードのコピースタブのアドレスで上書きされる
    • 関数のリターン時にコピースタブへジャンプし、保存ファイルバッファ内の大きな payload を実行可能なデータセグメントへコピーする
    • コピー後、payload へジャンプして 任意コード実行 を得る

署名回避と habibi key

  • original Xbox でコード実行を得た後は、署名検証を無効化して unsigned executable を実行する必要がある
  • payload は既存の 007 Agent Under Fire softmod installer 保存ファイルの payload をベースに構成された
    • カーネル関数とデータのアドレスを見つけ、実行ファイルの署名検証に使われる RSA public key のアドレスを探す
    • machine state register の write protection を無効化し、RSA public key を habibi key にパッチする
    • 保存ファイルに含まれる補助実行ファイルを起動し、テスト中は nyan cat 実行ファイルが使われた
  • habibi key pair は、2000 年代初頭に original Xbox Linux hacking group が作成したとみられる RSA キーである
    • カーネルの RSA 署名検証自体を常に通過させるのではなく、public key を自分たちの鍵に置き換えて Linux loader を実行する方式だった
    • これはその保存ファイルで pirated content を実行させないための選択だったが、その後ほかのグループが永続的ハック導入用の exploit ファイルを公開した
  • habibi public key modulus が Microsoft RSA public key と 4 バイト差 しかない点は興味深い
    • exponent は 3 に変わるはずにも思えるが、既存の shell code payload は exponent を変更していない
    • 正確にどのように動作しているのかははっきりしていない
  • habibi key 方式が選ばれたのは、複数の Xbox kernel バージョンとの互換性のためである
    • 署名検証関数を常に true にパッチするには、kernel バージョンごとの instruction pattern matching が必要になる
    • habibi key は見つけやすいメモリに 4 バイト patch を当てるだけで済む

派生分析: THPS3、THUG、THAW

  • Tony Hawk’s Pro Skater 3

    • THPS3にもCreate-A-Parkとgap nameはあったが、悪意あるセーブファイルをロードした直後にはクラッシュしない
    • ゲーム内でskateは可能で、「quit game」を選ぶとコンソールがクラッシュする
    • gap nameはスタックではなくヒープにコピーされ、オーバーフローが次のヒープ割り当てのallocation headerを上書きする
    • 次のallocationがfreeされると、headerのpointerがcleanup routine function pointerのあるvtableへつながる
    • THPS3はTHPS4のようにセーブファイルヘッダーを実行可能なデータセグメントへコピーせず、セーブファイルのデータも実行不可能なヒープメモリ上にあった
    • pAllocOwner pointerを上書きしてcleanup function pointerのロード位置を制御し、stack pivotでセーブファイルメモリ上のROP chainを使う
    • ROP chainは数個のgadgetだけでヒープ上のシェルコードを実行可能なデータセグメントへコピーし、そこへジャンプする
    • その後はTHPS4向けの汎用「hack xbox kernel」payloadと同様に、habibi keyのパッチ適用とunsigned executableの実行を行う
  • Tony Hawk’s Underground 1 & 2

    • THUGでgap nameをfuzzingすると、access violationの代わりにBuffer overrun detected!メッセージとともにfull bug checkが発生した
    • 実行ファイルにはstack cookieチェックが存在する
    • stack cookieはreturn addressの前に置かれるランダム値で、関数の返却前に値が変わっていないか確認する
    • return addressを上書きするにはcookieの値を知る必要があるが、gap name経路ではこれをleakする方法がない
    • gap name bufferの後ろとstack cookieの前には破壊可能な変数があったが、すぐにゲームコードによって上書きされ、exploitには役立たなかった
    • SEH exploitationも検討されたが、stack cookieチェック前に残っているコードで例外を起こす方法がなく、その時点でSEH chainをたどるexception handlerも登録されていない
    • THUG2もXbox版では同じ理由でgap nameベースのexploitが不可能である
    • ただし、別のstrcpyバグとヒープベースでexploit可能なバグは存在する
    • PlayStation 2、PC、そしておそらくGameCube版はstack cookieなしでコンパイルされており、gap name bufferでexploit可能である
  • Tony Hawk’s American Wasteland

    • THAWはTHUG 1・2の後の作品なのでstack cookieがあると予想されたが、Xbox版はstack cookieなしでコンパイルされていた
    • gap name buffer overflowに脆弱で、exploitはTHPS4とほぼ同じように構成される

THPS4ネットワークRCE: セーブファイルなしでクライアントをハック

  • セーブファイルexploitにはメモリーカードが必要だったため、より参入障壁の低い攻撃面としてマルチプレイヤーLANゲームが選ばれた
    • Create-A-Parkで作成したparkをLAN multiplayerで使うと、hostがセーブファイルをネットワーク経由で送り、clientがそれをロードする
    • 悪意あるparkファイルを送ればclient consoleをハックできるという仮説が立てられた
  • hostが自分自身をハックしないよう、ゲーム実行ファイルを修正してstrcpyバグを防ぎ、追加関数用のcode segmentも加えた
  • 当初はclientがhostに接続して正常にskateできたが、payloadは実行されず、buffer overflowもトリガーされなかった
    • clientメモリ上のpark fileデータがexploitファイルと異なる形に変形されていた
    • hostがpark fileをロードした後、メモリ上で再保存し、その結果をclientへ送っていたため、exploitデータが壊れていた
  • そのfunction callをNOP化すると、clientは悪意あるpark fileを受け取ってcompromiseされ、LEDの色が変わった
  • ネットワーク経路ではセーブファイルヘッダーがデータセグメントへコピーされないため、THPS4ローカルexploitのシェルコードコピースタブは使えない
    • THPS3に似たROP chainでシェルコードを実行可能メモリへコピーする

THUGソースコードの発見とネットワークコードの活用

  • ネットワーク経由で補助payload executableをclientへ渡す必要があったが、ローカルのセーブファイルexploitのようにsave game folderへファイルを一緒に入れることはできなかった
  • burned CDやローカルネットワークアドレスからexecutableをロードする方法も検討されたが、採用されなかった
    • Xbox winsock implementationはデフォルトでsecure socket connectionを使用しており、Python scriptでXbox security layerを再現する必要があった
  • park save file関連の資料を探していたところ、Sk4Ed_Dead文字列の検索でGitHub上のthugリポジトリを発見した
    • homebrew toolではなく、Tony Hawk’s Undergroundの完全なゲームソースコードだと判明した
    • THPS4そのものではないが、コードベースは十分に似ており、networking codeやhook作成に活用できた
  • ソースコードにはpark file loading codeとstrcpyバグのある正確なlineが含まれていた
    • Visual Studio project fileを再構成し、いくつかのcompiler errorを修正することで、最終ゲームアセットで動作するビルドを作成できた
    • 最終版と完全に同じではないが、非常に近いコードに見える
  • 目標は単なるRCEを超え、matchに接続したconsoleから静かにRCEを取得し、unsigned codeの実行を可能にしたうえで、ゲーム中に補助executableを転送する形へ変わった

実行復帰と非同期ファイル転送

  • clientがゲームを続けてプレイしている間にpayload転送を進めるには、shell code実行後のゲーム実行フローの復旧が必要だった
  • ROP chainはstack pivot前に既存のstack pointerを保存し、shell code実行後に後で復元するよう変更された
    • その後、shell codeを実行可能メモリへコピーしてジャンプする
  • ゲームのnetworking systemはmessage IDとhandler functionを登録し、受信メッセージのIDに対応するhandlerを呼び出す構造である
  • 未使用のmessage IDを登録して、簡単なファイル転送プロトコルを実装した
    • clientが接続すると、MSG_ID_PAYLOAD_REQUESTをhostへ送り、転送を開始する
    • hostはMSG_ID_PAYLOAD_DATAメッセージでpayloadデータを送る
    • clientがPAYLOAD_MSG_ID_ENDを受け取ると転送完了となる

15年前のメモリリークとhot patch

  • ファイル転送中にclient consoleがnull pointer dereferenceでクラッシュした
  • network data allocatorがNULLを返し、networking memory poolのfree byteが0になった
  • THUGソースコードにはmessage data bufferをfreeするコードがあったが、THPS4のshipped buildにはその修正が入っていなかった
    • stream_descp_data bufferがメッセージごとに解放されず、networking memory poolが枯渇した
    • 通常のmultiplayer playでは、長時間とどまらない限り問題にならなかった可能性がある
  • exploitはclient codeをhookし、p_desc->p_data bufferを正しいfree functionで解放するようhot patchした
  • hot patch後、hostとclient console間でファイル転送が成功し、clientはnyan-cat executableを実行した
    • tunneling appを使って、離れた地域にいる友人のconsoleでも同じexploitをリモートでテストした

最終的な original Xbox ネットワーク exploit の流れ

  • client が悪意ある host console に接続し、ネットワーク経由で「Hack Xbox」park file を受け取る
  • client が park file を parse する際に buffer overflow が発生し、スタック上の return address が上書きされて ROP chain が始動する
  • ROP chain は完全な shell code payload を実行可能なメモリ領域にコピーしてジャンプする
  • shell code はゲームプレイに戻る前に必要な hook と patch を設定し、player を match に spawn させる
  • player がゲーム内で skate している間に、host は executable file を client に送信し、client はそれを HDD に保存する
  • ファイル転送が完了すると、shell code は client kernel を habibi key 使用状態に patch し、転送済みの secondary executable を boot する
  • LED の色を変えなければ、ユーザーは別の application が突然 boot するまで進行状況に気づきにくい

Xbox 360: THAW と 4548 kernel

  • Xbox 360 向け Tony Hawk’s American Wasteland も gap name buffer overflow に脆弱である
  • 目標は新しい kernel version で console を exploit することだったが、新たな hypervisor bug なしでは不可能だった
  • その代わり、THAW の strcpy bug と既知の 4548 kernel system call handler bug を組み合わせることで、Xbox 360 初の software-only exploit を作ることができた
  • Xbox 360 の既存の King Kong hack は modified shader file を使って kernel memory に arbitrary write を行い、system call handler bug を exploit していた
    • この方法では、modified King Kong disc を使うために console を開けて DVD drive firmware を改変する必要があった
    • game save bug は ROP chain を開始する別の entry point になり得る

Xbox 360 保存ファイル署名と開発 console の役割

  • Xbox 360 の game save file は console ごとに固有の RSA key pair で署名される
    • 各 console の key store には game save の署名に使われる cryptographic key がある
  • 他の console で保存ファイルを検証できるのは、RSA public key が save file header に含まれているためである
    • この public key 自体は Microsoft だけが保有する別の RSA key pair で署名されている
    • 任意の public key を header に入れて通過させることはできない
  • 任意に改変した save file を別の console で使うには、いずれか 1 台の Xbox 360 console の復号済み key store が必要になる
  • Xbox 360 hacking の出発点は development console と SDK の流出だった
    • 実行コードは暗号化されていたため、外部から code を inspect できなければ bug を見つけられなかった
    • development console と SDK は executable code の decrypt、boot chain、hypervisor、game code の reverse engineering に必要な情報を提供した

4548 system call handler bug

  • Xbox 360 には hypervisor real mode と kernel mode がある
    • hypervisor real mode は最も privileged な mode である
    • kernel mode では OS と game が実行される
  • CPU には L2 cache の隣に memory encryption と hashing を担当する cryptography unit がある
    • kernel mode では hypervisor page は encrypted + hashed な状態に見え、任意に上書きすると hypervisor アクセス時に console が halt する
  • real mode では 64-bit physical address の上位 32 ビットが encryption と hashing の制御に使われる
    • 0x80000000.00000000 mask を適用すると、encryption と hashing を無視した memory access が可能になる
    • kernel mode が hypervisor に physical address を渡せる箇所では、上位 32 ビットを必ず clear しなければならない
  • 正常な system call handler は slwi 命令で system call ordinal を左に 2 ビット shift し、結果の上位 32 ビットを捨てて 32-bit offset だけを使う
  • 4548 kernel の system call handler は slwi ではなく sldi を使う
    • sldi は 64-bit で動作するため、r0 の上位 32 ビットも table index offset の計算に反映される
    • ordinal range check は r0 の下位 32 ビットにしか適用されない
    • たとえば 0x20000000.0000003F は range check を通過しつつ 0x80000000.000000FC offset を生成し、unprotected memory access を誘発できる
  • この変更は developer の意図的な修正というより、compiler bug だった可能性が高いと見られている

Xbox 360 exploit の構成

  • カーネルモードで暗号化されたハイパーバイザメモリビューを上書きすると通常はコンソールが停止するが、システムコールハンドラに上位の保護ビットが設定されたアドレスから関数ポインタを読み込ませると、フォールトなしで上書きした値を読ませることができる
  • exploit の段階
    • shell code をメモリにロードし、physical address を取得する
    • カーネルメモリマネージャ変数を変更し、暗号化されたハイパーバイザメモリビューを書き込み可能なアドレス範囲として露出させる
    • ハイパーバイザのシステムコール関数ポインタを mtctr r4; bctr 命令列のアドレスで上書きする
    • r0 に悪意のある ordinal を入れ、r4 には shell code の physical address に 0x80000000.00000000 マスクを OR した値を入れる
    • system call 命令を実行し、ハイパーバイザが上書きされた関数ポインタを読み込んで mtctr r4; bctr を通じて shell code にジャンプするようにする
  • THAW のセーブファイル exploit は PowerPC ROP chain を使用する
    • Ida-Sploiter の IDA plugin を修正し、PowerPC gadget 検索をサポートするようにした
    • exploit 全体は 24 個の ROP gadget で構成される
  • THAW Xbox 360 の全体フロー
    • gap name buffer overflow で return address を最初の ROP gadget に上書きする
    • stack pointer をセーブバッファ内の ROP chain に pivot する
    • MmAllocatePhysicalMemoryEx でハイパーバイザ shell code 用の physical memory を割り当てる
    • memcpy で shell code をコピーし、MmGetPhysicalAddress で physical address を取得する
    • 暗号化されたハイパーバイザメモリビューを書き込み可能に mapping する
    • system call function address を mtctr r4; bctr シーケンスで上書きする
    • 悪意のある system call ordinal と shell code の physical address で syscall を実行する
    • ハイパーバイザコード実行を取得した後、LED color を変更し、実行ファイルの RSA signature check をパッチする
    • カーネルモードの ROP chain に戻り、ObCreateSymbolicLink で HDD folder を mapping し、XLaunchNewImage で unsigned secondary payload を実行する
  • この方式ではどの Xbox 360 OS version でも THAW の strcpy バグから ROP 実行を得られるが、完全なハイパーバイザコード実行が可能なのは 4548 kernel でのみである
    • 新しいハイパーバイザ bug が見つかれば、この entry point と組み合わせてより新しい kernel version にも適用できる

2024年の公開と追加プラットフォームへの移植

  • 2024 年に Tony Hawk exploit が整理されて公開された
  • 同じ strcpy bug は Tony Hawk シリーズの 5 つの iteration と複数の console・handheld platform に存在する
  • PlayStation 2

    • THPS4 の network RCE exploit が PlayStation 2 版に移植された
    • PCSX2 や別の console を使い、THPS4 disc さえあれば network 経由で console を hack できる
    • exploit は network 経由で uLaunchElf を転送し、転送完了時に実行する
    • その後、USB stick など別の media から FreeMcBoot または FreeHDBoot installer をロードできる
    • PS2 の save game exploit は有用性が低い
    • memory card にファイルをコピーする方法があるなら、そのまま FreeMcBoot をインストールすればよい
    • FreeMcBoot memory card は Amazon で 15 ドルで購入でき、phat console と network adapter では FreeHDBoot を使うこともできる
  • GameCube

    • THPS4 の save game exploit が GameCube 版に移植された
    • network RCE や他の save game exploit 版は移植されていない
    • GameCube memory card にファイルをコピーするのは簡単ではなく、事前に hack 済みの save file が入った memory card が eBay で 50 ドル以上で販売されてきた
    • GameCube 版の Tony Hawk game には network support がないため、network adapter があっても network exploit は使えない
    • すでに複数の game save exploit があり、永続的なソフトウェア hack もないため、多くのユーザーは modchip を選ぶ
  • Windows

    • THUG PRO 向けの game save exploit も作られ、7 年前に bug report は送られていたが、当時は修正に関心がなかった
    • Windows では exploit が提供する価値がないため公開していない
    • PC 向け Tony Hawk game には同じ strcpy bug があり、exploit 可能である
    • network play には exploit 可能な別の strcpy bug もある
    • ASLR を強制適用し、Administrator として実行しないことを推奨する

公開資料

  • 完全な source code とパッチ済み game save files は GitHub で公開されている
  • 1 つの strcpy bug が複数プラットフォームでセーブファイル exploit、network RCE、Xbox 360 の software-only exploit entry point につながった

1件のコメント

 
GN⁺ 2024-08-08
Hacker News の意見
  • Habibi キーでさらに興味深いのは、公開鍵のモジュラスが Microsoft の RSA 公開鍵と4バイトしか違わないこと
    ランダムな 2048 ビット整数は、些細に因数分解できる可能性がそれなりにあり、実際の確率は分からないが、おおよそ 2^-32 程度だと見積もれる
    おそらく公開モジュラスの 4 バイトをランダムに変更するかインクリメントし、1 ミリ秒ほど因数分解を試して、成功したら止めるようなコードを書いたのだろう
    その結果、公開モジュラスには小さな因数が多く含まれている可能性が高い。RSA モジュラスは通常、正確に 2 つの素数の積だが、e と互いに素でさえあれば、因数がもっと多くても数学的には依然として動作する

    • ランダムな 2048 ビット整数から始めて、下位バイトを変えて 3 で割り切れるようにすればよい。公開鍵だけを扱うので簡単で、公開鍵が 3 で割り切れれば、フェルマーの小定理を使ってあり得る秘密鍵候補の大半を飛ばせるため、必要な計算量が数桁減る
      運よく RSA 実装が正確に 2 つの素因数だけを使う方式なら、すでに片方の因数が 3 だと分かっているので、公開鍵を 3 で割ってもう一方の素因数を得ればよい
      Wikipedia によれば、RSA 公開鍵の構造は N が大きな半素数で、e が φ(N) と互いに素である必要があり、N を因数分解した者は秘密鍵を得られる。Xbox ハッキングの文脈では、N を素数 3 で割り切れるようにすれば、もう一方の素数は N/3 なので、因数分解に成功したことになる
      Habibi キーで署名するコードは https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f... にある。最後の 4 バイトを 0x89、0x9c、0x90、0x6b に変更してから 3 で割り、その値で適切な秘密鍵を生成している
    • 私が共著した論文がこの問題を扱っている。破損した実際の公開鍵、ここでも 2048 ビットだった鍵に対応する秘密鍵を生成できるかがテーマだった
      応用は、rowhammer で公開鍵を破損させた後、その因数分解を利用して新しい対応秘密鍵を作るというもの。SSH と GPG キーで動作し、実用性のために、鍵が入っているページの内容を知っているといった仮定を置いている
      利用可能な計算時間ごとの経験的成功率は Figure 7 にあり、解析的な扱いは第 3 章、実際の方法の説明は第 4.4 章にある
      https://www.usenix.org/system/files/conference/usenixsecurit...
    • 確率は 2^-32 よりはるかに、はるかに、はるかに大きい。小さな素数で割れるだけ割り続け、その後に残った値に Miller–Rabin のような高速な素数判定をかければよい
      例えば 2 から 499 までの素数で割ってみて、値が 1 になれば成功、そうでなければ Miller–Rabin を 20 回回すコードで、ランダムな 2048 ビット整数を完全に因数分解するのに、私の環境ではだいたい 100 回ほどで済んだ
    • 中国剰余定理の実装は、重複因数があると失敗する
  • この成果がどれほど常軌を逸しているか、表現するのが難しいほどだ
    Tony Hawk ゲームの公園名で Xbox 360 をソフトモッドし、24 段階の ROP チェーンまで使っている点がすごい
    ハイパーバイザーへの短い哀悼、簡潔で実用的な分析、すぐに思い浮かべた x360 ボットネットまで合わさって、史上級の Xbox 360 ノスタルジー直撃弾のように感じる

  • 「運がよければ strcpy だろう」というくだりが面白い。本来は strncpy であるべきだったはずだが、安全装備の擁護で有名な Tony Hawk なら、より安全な文字列コピーと結び付けられることを望んだかもしれない

    • 正しい方法は memcpy を使い、対象バッファと元バッファのサイズをどちらも把握していること
      元データが対象に収まらない場合、切り詰めてよいのか、処理全体を中止すべきなのか、対象バッファを再確保すべきなのかといった、アプリケーション固有の対応が必要になる。strncpy はほぼ常に間違ったことをする
    • strncpy はより安全ではない。n に達すると終端されていない文字列を作るからだ
      基本的に strncpy はほとんど使うべきではなく、struct dirent { unsigned short inode; char name[14]; }; のような固定長フィールド用だ
      そのような場合でも、パディングバイトは nul より空白であるべきことの方が多く、strncpy は標準ライブラリに入るべきではなかった
    • Windows C/C++ 開発なら strsafe.h の関数群を使える([https://learn.microsoft.com/en-us/windows/win32/api/strsafe/](https://learn.microsoft.com/en-us/windows/win32/api/strsafe/))
      C/C++ を使うとき、標準 C 関数より使いやすかった。バッファが小さすぎる、整数オーバーフローが起きるといったよくある失敗ケースを処理してくれ、すべての関数が失敗コードを返すのでエラー確認もしやすかった
      この場合は strcpy より StringCchCopyW()StringCbCopyW() の方がよい選択だ
    • Tony Hawk が昔、車で走っていてスケートボーダーを見かけると「オーリーしてみて」と叫び、成功したら新しいヘルメットをあげていたと読んだことがある
  • このエクスプロイトが THUG PRO にも適用されるというのは少し残念だ
    Tony Hawk シリーズの競技シーンは、THPS1+2 リメイクという一時的な例外を除けば、ほぼ 20 年にわたって死んでいたが、この Mod は今でもプレイされている
    Mod 自体ももう 10 年以上前のもので、元の開発者たちは離れたようなので、Ryan が報告したときに誰も直そうとしなかった理由は説明がつく。だが今では、この Mod は PC 全体の権限奪取リスクのため使いにくくなっている
    この記事が、Mod にパッチを当てる意思のある人に届くとよい

    • 時間があったら試してみたいくらい面白そうだった。以前時間があったときには、THUG1 のソースコードを Windows でほぼプレイ可能にしたこともある
      そのソースはコンソール版向けだけで、Windows 向けにコンパイルするという想定は Xbox Windows ではなくツール用という意味だったため、多くの部分がまったく違う動作をしていた
  • “So what's the habibi key?”というテキストの前にあるセクション見出しアイコンのように見えるものは、実はクリックして展開する HTML details 領域なので、興味があれば押してみるべき
    気になるのは、Habibi キーが Linux コンソールグループで海賊版コンテンツの利用を防ぐために独占的に使われていたという話が正しいなら、対応する秘密鍵がどこで、いつ、どのように公開または流出したのかという点
    筆者は Microsoft キーと Habibi キーの4バイト差をパッチして、「署名されていない」実行ファイル、実際には Habibi 秘密鍵で署名された実行ファイルを実行しているので、秘密鍵を手に入れていたのは明らかに見える

    • Habibi キーは Microsoft キーを3で割り切れるようにパッチして生成するため、実際には因数分解が非常に簡単
      秘密鍵は公開鍵から些細な手順で復元できるので、公開されたり流出したりするものは特になかった
      基本的には、もともと 007: Agent Under Fire のセーブファイルハックの中に埋め込まれていた小さな暗号 CTF で、そのセーブファイルハック自体もかなり難読化された CTF に近かった。海賊版利用者に痛い目を見せる意図と、他のリバースエンジニアへの挑戦の両方があったように思う
  • 本当に見事。PSX のデコンパイルを少しやってきたが、そこにも似たようなものが多い
    興味深いことに、memmove のようなものは SDK ライブラリ[0]としてリンクされるが、strcpy は BIOS が提供する関数
    その後の SDK バージョンではこれをライブラリ版にパッチできたが、1997年時点でもまだそうはなっていなかった
    0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...

    • 昔のコンソールゲームを C+SDL2 と OpenGL 2.1 で再実装した版を見てみたい
      いまや N64 ゲームがデコンパイラを通じて PC に移植されているので期待してしまう
      「そのゲームにはもともと PC 版があるじゃないか」という反応もあり得るが、N64 ゲームを再コンパイルして、エフェクトをシェーダーではなく純粋なテクスチャやより単純なエフェクトに置き換えれば、2009年の低価格ネットブックのような遅い機器でも、ほぼどこでも動かせる
      Super Mario 64 を 3DFX API に移植した事例もある。N64 のフレームバッファに複雑にアクセスするゲームでは、そのマイクロコードを模倣するために OpenGL 3.3 が必要になるだろうが、エンジンが Pentium III 以降の機器で非常に高速に動く状況なら、残りは GL 2.1 アクセラレーションで動かし、一部だけをソフトウェアで模倣するのも難しくない
  • こういう種類のエクスプロイト分析はさまざまな形でたくさん読んできたし、今後さらに100本読めるならもっと嬉しい

  • コンソール開発における誤ったセキュリティ思考を示す良い例のように見える
    「セーブデータは自分たちだけが使えるのだから、自分たちが書いたものだけをパースすればよい」という考えはコンソール界隈ではよくあるが、人為的に作ったセーブデータを人々が用意できるという点で根本的に間違っている
    これとは別に、コンソールがユーザーを敵扱いすべきではないが、いずれにせよそうするなら、ゲームもその立場に合ったセキュリティ思考を持つ必要がある

    • 今ではある程度現実になっている。現在のコンソールはすべてセーブファイルを暗号化して署名し、アカウントに紐づけており、大半は Xbox は分からないが、セーブファイルをコンソールと有料クラウドストレージ以外にはコピーできないようにしている
    • 一般的なコンピュータなら「コンソールがユーザーを敵扱いすべきではない」という言葉に100%同意するが、コンソールは少し違って感じる
      ユーザーにできることを制限しなければ、オンラインゲームの不正行為をどう防げるのか分からない
  • Tony Hawk を擁護すると、彼はプロスケーターであってセキュリティアナリストではない
    90年代末から2000年代初頭にキーボードの前で過ごした限られた時間は、バッファオーバーランを監査するためではなく、やがて象徴的なシリーズとなるゲームで 900 McTwist が自然に感じられるようにするために使われたのだろう

  • 子どものころに聞いた伝説を確認する機会ができた。720を初めて成功させた人は Tony Hawk だったのか?

    • https://en.wikipedia.org/wiki/Aerial_(skateboarding)によると、「720、つまり空中で2回転するトリックはスケートボードで最も珍しいトリックの一つで、1985年に Tony Hawk が初めて成功させ、計画していたものではなかった」とされている
      おそらく「記録上初」という意味だろうが、誰かがすでにやっていたなら言いふらしていた可能性が高いし、それをやってのけるような人はどうせプロスケーターだった可能性が高い