バーチャルキャスト ver 2.0.8a でのVCIに関する変更について

株式会社バーチャルキャスト 取締役CTOの岩城(MIRO)です。

バーチャルキャスト ver 2.0.8a から、VCIの挙動をいくつか変更しました。
事前告知を行わなかった事から、VCI開発者の皆様ならびにVCIユーザーの皆様には大変ご迷惑をおかけしてしまい、申し訳ございません。
この記事で、挙動変更に至った顛末を説明いたします。

何を行ったのか

  • mathなどの標準ライブラリのtableを、VCIのローカル環境ごとに複製するように変更しました
  • math.randomseedmath.randomの元となる乱数をVCIのローカル環境ごとに独立させました
  • getmetatableに文字列を渡したとき、string tableを返していたところを、nilを返すよう修正しました
  • 以下のAPIを利用不可にしました
    • __require_clr_impl
    • _G
    • collectgarbage
    • dofile
    • dynamic
    • dynamic.eval
    • dynamic.prepare
    • load
    • loadsafe
    • loadfile
    • loadfilesafe
    • MOONSHARP
    • package
    • rawget
    • rawset
    • rawequal
    • rawlen
    • string.dump

なぜ変更を行ったのか

先日、VCIに関するセキュリティホールを発見しました。
具体的には以下の通りです。

  • 他のVCIの上で任意の処理を実行できてしまう
  • VCIのシステム自体を停止させ、それ以降VCIが一切動作しない状態を作れてしまう
  • VCIそのもののシステムの解析や、意図しない使い方が出来てしまう
  • 正しく機能しないAPIが公開されてしまっている

これらに対処するためには、

  • 既存のいくつかの処理を変更する
  • バーチャルキャスト公式Wikiに記載はないが、利用出来る状態になっているAPI を利用不可にする

必要がありました。

なぜ事前に告知を行わなかったか

今回の修正は、セキュリティホールに関する問題を対処するためでした。
そのため、事前に告知してしまうと セキュリティホールが存在する事を、対処前に公にする事になってしまう 状況でした。
これは、バーチャルキャストを利用してくださっているユーザーの皆様だけでなく、VCIを制作してくださっているVCI開発者の皆様にも、不利益を与えてしまう状況になりかねません。

一方で、周知せず変更すると、既存のVCIが壊れてしまう可能性があり、そうなるとユーザーの皆様に迷惑をかけてしまいます。
周知することで起きるリスクと、しないことでVCIが壊れるリスクについての議論は複数回にわたって行いました。

最終的に、利用不可にする必要のあるAPIはバーチャルキャスト公式Wikiに記載が無いAPIのため、影響は軽微と判断しました。

結果、私たちの見積もりが甘く、想定以上のVCIの挙動に影響がでてしまい、皆様には多大なご迷惑をおかけしてしまいました。

これから私たちができること

VCIが、バーチャルキャストの基盤となる大切な構成要素であること。そして何よりも、VCI開発者の皆様が、バーチャルキャストを支えるとても大切な存在であると私たちは考えています。
今回、私たちがその大切なVCI開発者の皆様に「安心」を与えられなかった事は事実であり、猛省しております。
もちろん、セキュリティに関しては今後も厳しく対応していきますが、なるべくVCI開発者の皆様の負担にならないよう、快適な開発環境の整備に全力で努めてまいります。

既に、今後のバーチャルキャストの更新によってVCIが利用出来なくなった場合に、そのVCIを利用しているユーザーとVCI開発者の利益を守るための制度設計の検討を開始しております。
検討の結果、どういった対応になるかはまだ分かりませんが、決まり次第速やかに情報発信していきたいと存じます。

さいごに

バーチャルキャスト社は先月3周年を迎えました。ここまでサービスを継続してこられたのも、普段バーチャルキャストを応援してくださっている皆様のおかげです。心から感謝申し上げます。
引き続きバーチャルキャストをよろしくお願いいたします。