ゲームの最速クリアを目指す動画(RTA)では、よく理解を超えた謎のバグを利用してありえないクリアタイムを叩き出すことがあります。

実はこの特殊なバグは、専門的な情報分野でもかなり注目に値するものだったようです。

イギリスのブリストル大学(UoB)で行われたスーパーマリオシリーズを対象にした研究により、RTA走者のバグを利用しようとする情熱が、一般のソフトウェアのセキュリティーを向上させたり、バグから守ってくれる可能性が示されました。

研究では4本のレトロなスーパーマリオ(初代、3、ワールド、64)のバグ技が調べられており、一般的なソフトウェアのバグとの関連性が調べられました。

結果、既存の分類に属さない7種類のバグが含まれていたことが判明します。

研究内容の詳細は2024年4月23日にプレプリントサーバーである『arXiv』にて「スーパーマリオ・イン・ザ・ペニシャス・キングダム:古いゲームのグリッジ分類(Super Mario in the Pernicious Kingdoms: Classifying glitches in old games)」とのタイトルで公開されました。

RTA走者の工夫が未来のソフトウェアを守ってくれる

40年以上前のゲームのRTAで、現在でも記録更新が続いています。
40年以上前のゲームのRTAで、現在でも記録更新が続いています。 / Credit:任天堂 . スーパーマリオブラザーズ

ネットに投稿されているゲームプレイ動画ではしばしば、一般人にはなかなか真似できない「スーパープレイ」がみられます。

特にゲームをどれだけ早くクリアできるかを競うRTA(リアルタイムアタック)は人気が高く、自分が何時間もかけて攻略したゲームを一瞬でクリアする様子は、ある種の爽快感や感動、そしてときには笑いも提供してくれます。

一方、RTA業界には手段を問わないルール無用の部門が存在します。

この部門ではゲームプログラムのバグを利用することで、ゲーム開始から数秒~数十秒でエンディング画面に到達するなど、一般の人々には理解不能な方法でのスピードクリアを実現させています。

ルール無用のスピードクリアは、スーパープレイを期待して動画を訪れた人々にとっては拍子抜けかもしれませんが、使用されているハッキング技術は極めて高度となっています。

さらに技術の切磋琢磨は現代でも続いており、次々に最新記録が塗り替えられています。

またスピードランが目的でなくとも、新たなバグ技の発見はスーパーマリオを愛する人々の間で素早く共有されていきます。

そこで今回、ブリストル大学の研究者たちは、任天堂スーパーマリオで発見されたバグ技をスピードランで使われるものを中心に、学術的に分析することにしました。

バグ利用者たちの魔法のような技術を解析することで、現代のソフトウェア開発における脆弱性やバグの理解に役立つ可能性があったからです。

調査にあたっては初代の「スーパーマリオブラザーズ(1985年)」、「スーパーマリオブラザーズ3(1988年)」、「スーパーマリオワールド(1990年)」、「スーパーマリオ64(1996年)」でのバグ技が調べられました。

どれも古い時代のソフトですが、今でもスピードランの記録更新が活発に行われています。

上から初代、3、ワールド、64となっています。Dateは記録の更新日時です。
上から初代、3、ワールド、64となっています。Dateは記録の更新日時です。 / Credit:Llewellyn Forward et al . Super Mario in the Pernicious Kingdoms: Classifying glitches in old games . arXiv(2024)

上の表は現在の記録保持者とタイム、そしてタイムの更新された日時などを示しています。

表を見るとスーパーマリオワールドでは2020年に、41秒という驚異的な記録が建てられたことがわかります。

研究者たちが、これらのゲームのバグを調べたところ、さまざまなカテゴリにわかれた237件のバグ利用がみつかりました。

研究者たちはこれらバグを、ソフトウェアにおけるセキュリティー上の問題を分類するために使われる「共通脆弱性タイプ一覧(CWE)」と比較してみました。

以下項目と簡単な説明の日本語約です。7PK1:入力の検証と表現(検証と表現の問題を含む、入力を信頼することによって引き起こされる問題。この王国はバッファオーバーフローを含む。) 7PK2: API の乱用(API を正しく使用せず、API の前提に違反することによって引き起こされる問題。) 7PK3: セキュリティ機能(暗号とアクセス制御の問題。) 7PK4: 時間と状態(同時実行の問題と、オブジェクトの状態が操作される順序によって引き起こされる問題。) 7PK5: エラー(APIの乱用と似ていますが、プログラマーが例外をどのように扱うかに特化しています。) 7PK6: コード品質(不正なコードによる予測不可能な動作。) 7PK7: カプセル化(異なるソフトウェアコンポーネントがどのように相互作用するかによって生じるエラー。) 7PK*: 環境(ソフトウェアがソフトウェア以外のもの(例えば、ハードウェア、設定ファイルなど)とどのように相互作用するかによって生じるエラー。)
以下項目と簡単な説明の日本語約です。7PK1:入力の検証と表現(検証と表現の問題を含む、入力を信頼することによって引き起こされる問題。この王国はバッファオーバーフローを含む。) 7PK2: API の乱用(API を正しく使用せず、API の前提に違反することによって引き起こされる問題。) 7PK3: セキュリティ機能(暗号とアクセス制御の問題。) 7PK4: 時間と状態(同時実行の問題と、オブジェクトの状態が操作される順序によって引き起こされる問題。) 7PK5: エラー(APIの乱用と似ていますが、プログラマーが例外をどのように扱うかに特化しています。) 7PK6: コード品質(不正なコードによる予測不可能な動作。) 7PK7: カプセル化(異なるソフトウェアコンポーネントがどのように相互作用するかによって生じるエラー。) 7PK*: 環境(ソフトウェアがソフトウェア以外のもの(例えば、ハードウェア、設定ファイルなど)とどのように相互作用するかによって生じるエラー。) / Credit:Llewellyn Forward et al . Super Mario in the Pernicious Kingdoms: Classifying glitches in old games . arXiv(2024)

するとほとんどのバグが既存の分類法で原理が認識できることがわかりました。

分類されたものの中には、初代スーパーマリオブラザーズでみられた「目に見えないツタ」やスーパーマリオブラザーズ3でみられた「水上歩行」や「土管に入ったマリオが土管から出ると同時に死亡する現象」「秘密のエンディング」、またスーパーマリオ64でみられた「ウサギを使った壁抜け」や「クッパの炎を破壊することで起こる無限コイン」「平行世界の作成」などが含まれていました。

一見すると魔法のようにみえる技術の多くは、一般的なソフトウェアでもみられるバグと同じ原理に基づいていたわけです。

たとえば全体の45%を占める最も多く確認されたバグは「時間と状態(7PK4)」に分類されるものでした。

このバグでは異なる動きの同時実行によって引き起こされる問題であり、オブジェクトの操作される順序に問題が起こることが原因となっています。

初代スーパーマリオブラザーズでみられた「目に見えないツタ」や「スーパーマリオブラザーズ3でみられた「水上歩行」、スーパーマリオ64でみられた「ウサギを使った壁抜け」はここに分類されました。

また2番目に多くバグが分類されたのは「例外処理メカニズムのエラー(7PK5)」となっていました。

ゲーム開発とエラーは切り離せない問題であり、どんなに努力しても完全になくすことはできません。

ですがエラーが起こるたびにゲームがクラッシュしていては、商品にはなりません。

そこでゲーム開発ではエラーに直面してもゲームが続けられるようにし、後の処理で修正する方法がとられています。

たとえばあるステージで、キャラがあり得ない異常外見になってしまったとしても、次ステージの仕切り直しで正常な姿に戻る場合です。

バグ利用者たちはこの仕組みを利用することで、ゲームの進行自体を止めることなく異常な結果を引き起こすことができるのです。

たとえば先に上げたように「土管に入ったマリオが土管から出ると同時に死亡する現象」という正常な進行と異常な結果があらわれるのも、このタイプのエラー対応が原因となっています。

しかし最も興味深かったのは、既存の分類法では識別できない7種類のバグでした。

以下項目名とその簡単な説明。エンティティの制限(有限の数しかスペースがないのに要素をロードしようとする。) 適切な条件再チェックの失敗(2つのオブジェクトが相互作用しているときに条件を再チェックせず、奇妙な動作につながる。) 状態の終了が早すぎる(オブジェクトの状態遷移を完了させるべきなのに、そのオブジェクトが状態遷移を終了してしまう。) 正しいが意外な動作(ゲームの動作が意外だが、意図したプログラミングと一致している。) 不正な状態の不適切な修正(例外を修正しようとして、ゲームが新しいエラーを作った。) 不正な動作の共有(2つのオブジェクトが異なる動作をするはずなのに、動作を共有している。) 不正な境界定義(ゲーム内のオブジェクトの境界が不適切に指定されている。)
以下項目名とその簡単な説明。エンティティの制限(有限の数しかスペースがないのに要素をロードしようとする。) 適切な条件再チェックの失敗(2つのオブジェクトが相互作用しているときに条件を再チェックせず、奇妙な動作につながる。) 状態の終了が早すぎる(オブジェクトの状態遷移を完了させるべきなのに、そのオブジェクトが状態遷移を終了してしまう。) 正しいが意外な動作(ゲームの動作が意外だが、意図したプログラミングと一致している。) 不正な状態の不適切な修正(例外を修正しようとして、ゲームが新しいエラーを作った。) 不正な動作の共有(2つのオブジェクトが異なる動作をするはずなのに、動作を共有している。) 不正な境界定義(ゲーム内のオブジェクトの境界が不適切に指定されている。) / Credit:Llewellyn Forward et al . Super Mario in the Pernicious Kingdoms: Classifying glitches in old games . arXiv(2024)

研究者たちがこの7種類のバグを調べたところ、いくつかは従来のソフトウェアのバグに類似しているものも存在することが明らかになりました。

たとえば不適切な共有動作(Incorrectly Shared Behavior)は、異なる2つのオブジェクトが誤って共有ベースから継承されてしまうという、一般的なソフトにみられるエラーに似ています。

またコンディションの適切な再チェックの失敗(Failure to Appropriately Recheck Condition)」と「ステートの早すぎる終了(State Exit Too Early)」は制御フローの問題に似ています。

さらに「不正な状態を不適切に修正(Improper Correction of Illegal State)」も一般的なソフトにみられるバグと共通しています。

そのため研究者たちは、スピードラン分野などのバグ利用者たちの活動は、一般的なソフトのセキュリティー向上やバグ改善に役立つ可能性があると述べています。