RTA走者の工夫が未来のソフトウェアを守ってくれる
ネットに投稿されているゲームプレイ動画ではしばしば、一般人にはなかなか真似できない「スーパープレイ」がみられます。
特にゲームをどれだけ早くクリアできるかを競うRTA(リアルタイムアタック)は人気が高く、自分が何時間もかけて攻略したゲームを一瞬でクリアする様子は、ある種の爽快感や感動、そしてときには笑いも提供してくれます。
一方、RTA業界には手段を問わないルール無用の部門が存在します。
この部門ではゲームプログラムのバグを利用することで、ゲーム開始から数秒~数十秒でエンディング画面に到達するなど、一般の人々には理解不能な方法でのスピードクリアを実現させています。
ルール無用のスピードクリアは、スーパープレイを期待して動画を訪れた人々にとっては拍子抜けかもしれませんが、使用されているハッキング技術は極めて高度となっています。
さらに技術の切磋琢磨は現代でも続いており、次々に最新記録が塗り替えられています。
またスピードランが目的でなくとも、新たなバグ技の発見はスーパーマリオを愛する人々の間で素早く共有されていきます。
そこで今回、ブリストル大学の研究者たちは、任天堂スーパーマリオで発見されたバグ技をスピードランで使われるものを中心に、学術的に分析することにしました。
バグ利用者たちの魔法のような技術を解析することで、現代のソフトウェア開発における脆弱性やバグの理解に役立つ可能性があったからです。
調査にあたっては初代の「スーパーマリオブラザーズ(1985年)」、「スーパーマリオブラザーズ3(1988年)」、「スーパーマリオワールド(1990年)」、「スーパーマリオ64(1996年)」でのバグ技が調べられました。
どれも古い時代のソフトですが、今でもスピードランの記録更新が活発に行われています。
上の表は現在の記録保持者とタイム、そしてタイムの更新された日時などを示しています。
表を見るとスーパーマリオワールドでは2020年に、41秒という驚異的な記録が建てられたことがわかります。
研究者たちが、これらのゲームのバグを調べたところ、さまざまなカテゴリにわかれた237件のバグ利用がみつかりました。
研究者たちはこれらバグを、ソフトウェアにおけるセキュリティー上の問題を分類するために使われる「共通脆弱性タイプ一覧(CWE)」と比較してみました。
するとほとんどのバグが既存の分類法で原理が認識できることがわかりました。
分類されたものの中には、初代スーパーマリオブラザーズでみられた「目に見えないツタ」やスーパーマリオブラザーズ3でみられた「水上歩行」や「土管に入ったマリオが土管から出ると同時に死亡する現象」「秘密のエンディング」、またスーパーマリオ64でみられた「ウサギを使った壁抜け」や「クッパの炎を破壊することで起こる無限コイン」「平行世界の作成」などが含まれていました。
一見すると魔法のようにみえる技術の多くは、一般的なソフトウェアでもみられるバグと同じ原理に基づいていたわけです。
たとえば全体の45%を占める最も多く確認されたバグは「時間と状態(7PK4)」に分類されるものでした。
このバグでは異なる動きの同時実行によって引き起こされる問題であり、オブジェクトの操作される順序に問題が起こることが原因となっています。
初代スーパーマリオブラザーズでみられた「目に見えないツタ」や「スーパーマリオブラザーズ3でみられた「水上歩行」、スーパーマリオ64でみられた「ウサギを使った壁抜け」はここに分類されました。
また2番目に多くバグが分類されたのは「例外処理メカニズムのエラー(7PK5)」となっていました。
ゲーム開発とエラーは切り離せない問題であり、どんなに努力しても完全になくすことはできません。
ですがエラーが起こるたびにゲームがクラッシュしていては、商品にはなりません。
そこでゲーム開発ではエラーに直面してもゲームが続けられるようにし、後の処理で修正する方法がとられています。
たとえばあるステージで、キャラがあり得ない異常外見になってしまったとしても、次ステージの仕切り直しで正常な姿に戻る場合です。
バグ利用者たちはこの仕組みを利用することで、ゲームの進行自体を止めることなく異常な結果を引き起こすことができるのです。
たとえば先に上げたように「土管に入ったマリオが土管から出ると同時に死亡する現象」という正常な進行と異常な結果があらわれるのも、このタイプのエラー対応が原因となっています。
しかし最も興味深かったのは、既存の分類法では識別できない7種類のバグでした。
研究者たちがこの7種類のバグを調べたところ、いくつかは従来のソフトウェアのバグに類似しているものも存在することが明らかになりました。
たとえば不適切な共有動作(Incorrectly Shared Behavior)は、異なる2つのオブジェクトが誤って共有ベースから継承されてしまうという、一般的なソフトにみられるエラーに似ています。
またコンディションの適切な再チェックの失敗(Failure to Appropriately Recheck Condition)」と「ステートの早すぎる終了(State Exit Too Early)」は制御フローの問題に似ています。
さらに「不正な状態を不適切に修正(Improper Correction of Illegal State)」も一般的なソフトにみられるバグと共通しています。
そのため研究者たちは、スピードラン分野などのバグ利用者たちの活動は、一般的なソフトのセキュリティー向上やバグ改善に役立つ可能性があると述べています。