2005/7/26

変数を使わなければならない理由  VRMスクリプト禅問答
【怎麼生】
たとえばヘッドライトを点灯する際、 (1) Varで変数を宣言して、(2) set で変数に1を入れて、(3) その変数を SetHeadlight に渡す、という手間がかかりますが、どうして直接 SetHeadlight 1 とさせてくれないのですか。I.MAGiCはボクらにいじわるをしているのですか。

【説破】 4.0.1.2
結論から言うと、I.MAGiCの中の人がVRM4スクリプトの脆弱性にかなり気をつかっているからだと思われます。

ある程度以上の自由度と複雑さを持つコンピュータープログラムには、ほぼ確実に「脆弱性」が存在します。脆弱性、というのは、開発者が意図しなかった使われ方によって、ユーザーにとって不利益な何かが起こることを言います。具体的には、悪意のある何者かがVRM4レイアウトに危険なスクリプトを組み込み、それをユーザーに実行させて被害(PCのクラッシュや、個人情報の盗み出しetc...)を及ぼそうとするケースを想定してください。
そんなバカなことがあるはずがない、とお考えの方もいるかも知れません。が、残念ながら現実の世の中には、自身の技術を前向きに使えない馬鹿者と、その馬鹿者の書いたものを理解も出来ないくせに粋がってバラ撒く大馬鹿が溢れており、たとえば Microsoft Office を悪用するマクロウイルスを星の数ほど生み出しています。VRM4はユーザーの絶対数が少ないことから悪意のあるユーザーの攻撃対象になる確率は低いと考えられますが、同時に各種アンチウイルスソフトが悪意のあるVRM4スクリプトの検出に挑む可能性もさらに低いですから、我々はその危険性が少ないにせよ決してゼロではないことは知っておくべきです。

脆弱性と変数宣言の関係を簡単に説明しておきましょう。
まずご理解いただきたいのは、人間がなんらかのプログラムコード(ここではVRM4スクリプト)を書く場合、その記述の可能性は事実上の無限大であり、それを受け入れるソフトウェアがコードの適正を検査するのはとても難しい、という点です。
たとえば SetHeadlight 命令の場合、この命令は車輌オブジェクトのプログラムがライトを点灯すべきか否かを決定するために参照する値を変更する命令です。もしこの命令に自由な値を入れることが可能だとすれば、SetHeadlight 命令はその値になんらかの副作用を起こす危険性がないか、自分自身で判断しなければなりません。
一方、現行仕様のように、(1) Varで変数を宣言して、(2) set で変数に値を入れて、(3) その変数を SetHeadlight 命令に渡すという手順を踏むと、以下の2つの点で安全性が確保されます。第一に、(1)で宣言される変数のメモリ上での位置は車輌オブジェクト等のVRM本来の動作を保障すべき領域と切り離すことができます。第二に、set 命令の入り口で守りを固めてしまえば、VRMオブジェクトに副作用を及ぼす危険な値の直接進入をワンポイントで防ぐことができます。
このように、一見面倒に思われるこの手続きが、意図的なものにせよ偶然のものにせよ、危険なスクリプトの実行からユーザーを守ることになっているのです。決して「いじわる」をしているわけではありません。
ちなみに、しばしば我々を悩ますWindowsの「一般保護違反」と呼ばれるエラーも同じ意図で実装されています。このエラーはWindowsが「怪しげなメモリへのアクセス(正しいかも知れないが、少なくともWindowsは変だと思っている)」に気付いたときに、致命傷に至る前に実行を停止させるべく起こるものです。Microsoftの肩を持つつもりはありませんが、特にWindowsXP以降、この手のエラーがOS自身や他のプログラムの異常終了を誘発するケースが激減したことは評価されるべきだと思います。

閑話休題。
このような防備をもってしても、脆弱性というものは完全にはなくなりません。事実、現行VRM4スクリプトでも、少なくともVRM4ビュワーを意図的に異常終了させるコードは簡単に書くことができます。そこで読者の皆さんに以下の点を意識しておいていただきたいと思います。
まず、来歴が信用できないVRM4レイアウト(誰が作ったかわからない、どこで配布されたかわからない)を軽々しくご自身のPCのVRM4ビュワーで起動することはあまりお奨めできません。その結果、何かとんでもないことが起こったとしても、I.MAGiCを含め誰にもその責任を求めることは不可能であることは知っておいてください。
次に、来歴が信用できるVRM4レイアウト(誰が作った知っている、どこで配布されたかわかる)をご自身のVRM4で実行した際に、ビュワーの異常終了やその他のおかしな現象がおこった場合、まずはそのレイアウトの作者に個人的に連絡してあげてください。ネットVRM界で名前の通ったユーザーが意図的に危険なコードを書くとは思えないので、その現象は作者本人も気付いていないバグによるものと考えるのが筋です。
最後に、VRM4スクリプトになんらかの脆弱性を発見した場合は、I.MAGiCに知らせてあげてください。ただし、必ずしも異常終了=脆弱性ではありませんから、不必要に騒ぐとかえって迷惑になってしまう場合もあります。どうにも妙だが何が問題かわからない、といった現象を発見した場合は、私でよければ解析に協力しますのでメールで連絡してください。

注)本連載で示すVRM4スクリプトや物の考え方をあなたが採用した結果生じる全ての事象については、その責を負い兼ねます。私の書いたものを読むに際しては、常に「コイツは狂人で、でも一部は役に立つことも言っているかも知れない」という程度の心構えで臨んでください。
0

2005/7/31  8:07

投稿者:ghost
補足:KZ氏によると(下記URL参照)システム4.0.2.0から少なくともSetHeadlightについては直値受け入れが可能になる模様。

http://www.angel-feather.serio.jp/cgi/blog/blog.cgi?time=1122726396&id=WhiteWing&mode=&category=1&writer_all=&category_all=

2005/7/25  23:17

投稿者:ghost
↓意味&意図不明也。あ、オレもか。

2005/7/25  22:19

投稿者:某社長
ライトなんか変数にしておけば点けたり消したり出来るでしょ (笑

2005/7/25  19:16

投稿者:ghost
補足:のワリには、SetEventAfterやSetEventTimerのように、直値しか受け入れない命令もあったりして(SetTimerVoltageは変数経由なのにね)不可解ですが。あくまでも個人的な憶測ですが、少なくとも2人の開発者か、あるいはスクリプトのコーディング作業が時間的に2期に分断されていて、それぞれにスクリプトコンパイラの実装ポリシーが異なるような印象を受けてます。気のせいですか、そうですか。

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ