« タイトルでシリーズ名や巻数を推定する | メイン | 羽々斬をGitHubに移動 »

2015年11月06日

吉里吉里Z 開発:: 吉里吉里2/Zに脆弱性があると言う話

    

TYPE-MOON 製の複数のゲーム製品における OS コマンドインジェクションの脆弱性

ニュースサイトによっては間違っている内容など書かれていたりするので、何が問題で具体的にどういうことかを説明してみようと思います。

一言で言えば、「吉里吉里2(Z)は、セーブデータの中にTJS2スクリプトを入れて実行できる。」と言うことです。
また、TJS2 スクリプトは任意の実行プログラムを実行することが出来ます ( System.shellExecute、厳密には TJS2 ではなく吉里吉里の機能 )。

この2つによって「OS コマンドインジェクションの脆弱性」があると言われているようです。
普通にゲームをプレイしていれば何も問題ないわけですが、ネットで拾ってきたセーブデータに差し替えたら予期しない結果になるかもしれないと言うことです。
これを脆弱性と言うか、対応をとるかについては開発者の意見は様々ですが、「まあデータはデータとしてだけ読み書きできる方がいいよね」と言うのはおおむね一致した見解のようです。
ネット上でのセーブデータ交換がどの程度行われているかわかりませんが、やっている人がいるのは事実です。

以上がこの脆弱性の詳細ですが、吉里吉里Zでの対応はどうするかについて――
データ読み込み専用のメソッドを追加することにします。
具体的にはDictionary/Array に loadStruct メソッドを追加します。
saveStruct と対称になるようにして、データのみの読み込みだとわかりやすくします。
ただ、最初はバイナリモードで書き出したデータファイルのみの読み込みのみ対応します。
バイナリデータは、通常のスクリプトのバイトコードとフォーマットから完全に分離していて読み込みも内部的に別となっているため、呼び出し口さえ追加すれば対応できます。
その他テキスト系の読み込みはパーサが共通のため少し対応に時間がかかります。
また、対応するのなら同時にテキストモードでの読み込み速度の改善なども行いたいところです。

本体での対策以外に対策が可能かどうか?
プラグイン作れば可能ですし、TJS2で文法チェックだけするのでも防げます。
吉里吉里2/Zを使ったゲーム全てにこの脆弱性があるわけではなく、対策を行っているゲームも存在するようです。

追記
吉里吉里Z スナップショットにバイナリモードで書き出したデータのみ loadStruct で読み込めるものを追加。

追記
W.Deeさんより
System.shellExecute = null;
を実行して、このメソッドを使えなくすると言う対策もあると言うことなので追記。


投稿者 Takenori : 2015年11月06日 17:09




comments powered by Disqus
Total : Today : Yesterday : なかのひと