FactorioのLuaセキュリティ脆弱性の分析
Factorioとは何か?
- Factorioは工場を自動化してロケットを作り、惑星から脱出するゲーム
- 3,500,000本以上が販売されており、セキュリティ研究者にとって魅力的な標的となっている
ゲームにおけるLuaの使われ方
- Luaはゲームロジックの実装や、Modとカスタムマップの作成に使われる
- Modコミュニティは非常に活発で、数千のModが存在する
- Alien Biomes Modは551Kダウンロードを記録している
Luaインタプリタのネットワーク露出
- Factorioのマルチプレイヤーモードは決定的ロックステップを用いてクライアントを同期する
- あるプレイヤーがLuaコードを実行すると、他のプレイヤーも同じコードを実行しなければならない
- これにより、悪意あるLuaコードをネットワーク経由で実行できる可能性が生まれる
一般的なエクスプロイト経路
- 悪意あるマップを配布するFactorioサーバーをホストする
- クライアントがサーバーに接続すると、マップをダウンロードしてLuaコードを実行する
- Lua実装の弱点を利用して偽オブジェクトを生成する
- メモリリークやメモリ破壊を通じてプログラムの動作を変更する
- こうした強力なプリミティブを利用してコード実行を得る
Luaバイトコードの危険性
- Luaはインタプリタ言語であり、書かれたコードをそのまま実行するのではなくバイトコードへコンパイルする
- バイトコードを直接実行できる場合、不正なバイトコードの実行によってメモリを漏えいさせたり破壊したりできる
バイトコード検証器
- Lua開発者は悪意あるバイトコードからインタプリタを保護するためにバイトコード検証器を実装したが、繰り返し回避可能であることが判明し、Lua 5.2で削除された
- Factorio開発者は独自のバイトコード検証器を実装したが、一部のオフバイワン問題により完全ではない
偽オブジェクトの生成
- 偽オブジェクトを生成することで、インタプリタのあらゆる機能を活用できる
- 文字列を使って任意のデータを漏えいさせ、配列を使って任意のメモリに書き込める
- ネイティブ関数を呼び出せれば実行フローを制御できる
アドレス漏えい
- Luaのprint関数はアドレスを漏えいさせる可能性がある
- Factorioでは削除されているため、型混同を利用してアドレスを漏えいさせる方法が使われる
TValuesの理解
- Luaは動的言語であり、変数の型は実行時に変更されうる
- 内部的にはLuaはTValue構造体を使ってオブジェクトを表現する
- TValueは型(
tt_)と値(value_)の属性を持つ
FORLOOPによる型混同
- FORLOOP opcodeはループの初期値を数値として扱うため、型混同を引き起こす可能性がある
- これによりアドレスを漏えいさせることができる
IEEE 754倍精度
- 倍精度は符号、指数、仮数で構成される
- Luaは整数を表現しないため、53ビットまでは精度を失わずにアドレスを漏えいさせられる
偽オブジェクトの探索
- UpvalueとClosureを理解することで、偽オブジェクトを探索できる
- Upvalueは外側の関数の変数にアクセスできるようにする
- バイトコードを変更してUpvalueのインデックスを変えれば、偽オブジェクトを探索できる
GN⁺の見解
- この記事は動的言語のセキュリティ脆弱性を理解するうえで非常に有用
- Factorioのような人気ゲームで起こりうるセキュリティ問題をうまく説明している
- Luaのような言語を使う他のプロジェクトにも同様の脆弱性が存在する可能性がある
- 新しい技術やオープンソースを採用する際には、セキュリティレビューが不可欠
- 類似した機能を持つ他のプロジェクトとしてMinecraftのModdingシステムがある
まだコメントはありません。