安全なSchemeインタプリタ

 提出を自動化したら採点も自動化したい。人というのは怠惰な生き物なのでそう思うわけです。しかし、送られてきたプログラムをそのまま実行する訳にはいかない。バグで無限ループに陥るぐらいならともかく、攻撃コードが入っていたりした場合を考えると防御は必須だ。安全に採点を行うためのアイデアはいくつか考えてある。

  1. UML等の仮想化技術を使い、VM上で実行する。
  2. chrootを使って、大事なファイルはいじれないようにする。(この方法だとネットワーク経由でなんかされたりしそうでちょっとイヤ)
  3. 安全とわかっている関数以外は使えないように制限する。

 なにをして欲しくないかというと、ファイルの読み書きとネットワークへのアクセスだ。1,3ならその点は大丈夫。2ではネットワークへのアクセスは遮断できないのではないかと思うので、この時点で候補は1と3。
 1はちょっとおおげさ過ぎるように感じるので、そうなると取れる選択肢は3となる。3の実装にはブラックリスト方式とホワイトリスト方式が考えられるが、これは明らかにホワイトリスト方式で実装するべきだ。ただ、具体的にはどうやればよいのだろうか。readで読み込んで、ホワイトリストになくってかつそのファイルでも定義されていないようなシンボルが見付かるかどうかチェックする、とかでよいのだろうか。でも、この方法だとたぶんstring->symbolされるとおしまいだ。string->symbol自体は有害な関数ではないので禁止したくないんだけど。
 evalを上書きして、ホワイトリストに登録されているシンボルかもしくは自分でシンボルテーブルに登録したシンボル以外が出てきたらエラー、ぐらいでいいのかな。なんか穴がありそうな気もするけど、とりあえずそれでやってみよう。