When Random Isn't
- 約10年前の逸話であり、実際のコードは失われているため、正確に覚えていない部分があることをご容赦ください。
- コンピュータセキュリティが好きな人なら誰でも楽しめるように、一部の詳細は単純化しています。
- 14歳のときにWorld of Warcraftを見つけ、夢中になった。
- ゲームのユーザーインターフェースを改変できるアドオンを見つけ、自分で作り始めた。
- Luaプログラミング言語で作られたアドオンは、いくつかの
.luaソースファイルで構成されている。
- ゲームが自分で書いたソースコードを読み込み、実行することに魅了された。
Add-on security
- ユーザーがプログラム可能なアドオンを持てるというのは、ボットを招きかねず悪いアイデアに見えるかもしれない。
- Blizzardが作ったシステムは、任意のプログラミング動作を防ぐためになかなか巧妙だった。
- UI要素の大半は装飾的または情報提供用であり、完全に制限がなかった。
- キャラクターの体力を表示するAPI呼び出しのような情報収集APIには制限がない。
- しかし一部のAPI呼び出しは、公式のBlizzardコードからのみ呼び出せるよう保護されていた。
- ゲーム内で実際の行動を行うことに関わるAPIの大半は保護されていた。
- ワールド座標とカメラの向きを取得するAPIも、ある時点で保護されるようになった。
- 特定の呪文を詠唱するボタンを作りたい場合、クリック時にセキュア環境でコードを実行する特別なボタンを作ることができる。
- こうしたボタンは戦闘中に生成・破棄・移動できず、戦闘中の自動化を防いでいる。
- セキュア環境では、どの呪文を詠唱するかをプログラムで設定できる一方、任意の自動化に必要な情報収集は許可されていない。
A backdoor channel
- 数年後、より「真面目な」プログラミングに興味を持つようになり、World of Warcraftはほとんど遊ばなくなった。
- それでもセキュア環境を無力化したいという考えが頭から離れなかった。
- サードパーティ製ソフトウェアを使う代わりに、技術的に許可された道具だけを使って挑戦として解きたかった。
random関数がセキュア環境で許可された関数一覧に入っていることを見つけ、これを使って情報を密輸する方法を考え出した。
Random number generator woes
randomはCのrand関数を単純にラップしたものだと分かった。
randの実装は単純で弱い線形合同法生成器だった。
- RNGの内部状態をリバースエンジニアリングして情報を伝達する方法を開発した。
Putting it together
- RNGの内部状態をリバースエンジニアリングできるようになったことで、セキュア環境で任意の自動化判断を下せるようになった。
- 非セキュア環境で情報にアクセスして判断を行い、セキュア環境で「ランダムに」選ばれた行動を実行する。
Conclusion
- BlizzardがRNG状態の弱さと共有という問題をいつ修正したのか、あるいは問題として認識していたのかは分からない。
- 数年後に再びコードを試したときには動かなかった。
- 実際には使いたくなかったビデオゲーム上の抜け穴だったが、ランダムに見えるものを操作することには魔法のような魅力があった。
GN⁺の見解
- この記事は、コンピュータセキュリティとプログラミングに関する興味深い事例を提供している。
- ゲーム内でセキュリティを回避する創造的な方法を探る過程は、プログラミング技術の重要性と潜在的な脆弱性への認識を高める。
- RNGの弱点を利用したこの話は、ソフトウェア開発者にとってセキュリティとアルゴリズムの重要性を思い起こさせる教訓的な事例である。
1件のコメント
Hacker Newsの意見
あるユーザーは、数か月前にStackOverflowで「RNG(乱数生成器)の反転」に関する質問に回答したことがあると述べている。このユーザーはJava RNGを攻撃したが、MSVC RNGと同様にLCG(線形合同法)設計を使い、内部状態の切り詰めを出力するため、攻撃手法は非常によく似ている。
別のユーザーは、サーバーが同じRNGを使っているなら、低負荷のサーバー、低いping、RNGの現在状態に対する正確なウィンドウを得る能力、そして経済的変動性の高い別のイベントを素早く発生させられる能力があれば、理論上はこれを悪用できるだろうと推測している。
さらに別のユーザーは、与えられた線形合同RNGはわずか12445種類の異なる数しか生成せず、その後は繰り返すだけだと指摘し、このアルゴリズムにはより良いパラメータを使うのが妥当だと述べている。
あるユーザーは、World of Warcraft(WoW)が自分のプログラミングへの関心の出発点だったと語っている。ゲームがリリースされたとき自分は6歳で、プライベートサーバーが登場したことで、自分自身のNPCを作る方法に興味を持つようになったという。そこからLuaを学び、プライベートサーバーのコアをコンパイルする方法、SVN、パッチの適用方法などを学んだとしている。
ジョン・フォン・ノイマンの引用を共有したユーザーは、乱数生成のあらゆる方法は罪であり、厳密な算術的手続きは乱数を生成する方法ではないと主張している。
あるユーザーは、WoWのオークションハウス用スクリプトを書いたことがあると述べている。このスクリプトはすべてのオークションをスキャンし、過小評価されたアイテムを購入して再出品する機能を持っていた。誰かが価格を下げると、スクリプトは出品を取り消し、それより少し安い価格で再度出品できたという。
Hacker Newsが弱い乱数のせいでハッキングされた事例に触れるユーザーもいる。関連リンクも示している。
「変数が変わらず、定数が定数ではないとき」という表現を使うユーザーもいる。
WoWはプレイしていないが、多くのアドオンがプライベートチャットを通信手段として使っていたと聞いたことがあるというユーザーもいる。方法さえあれば、人は結局それを見つけて使うようになると述べている。
RNGの経済的インセンティブに関連して、実際には何も懸かっていない場合(例:ゲーム)には不完全なRNGでも十分だと述べるユーザーがいる。しかし、お金が懸かっていたりセキュリティが重要だったりする場合(例:暗号資産ウォレットやオンラインカジノ)には、RNGの完全性が非常に重要になるという。