safe Base

ReferenceTOPKeywords

解説

安全なTclは信用できないTclスクリプトを安全に実行するため、かつそのようなスクリプトの潜在的に危険的な機能への間接的なアクセスを提供するメカニズムです。

Safe Baseは信用できないTclスクリプトが、ホストアプリケーションを害せないことを保証します。 Safe Baseは完全性やプライバシー攻撃を防ぎます。 信用できないTclスクリプトによるホストアプリケーションやコンピューターの状態を悪用することを妨げます。 信用できないスクリプトからのホストコンピュータやホストアプリケーションに保存されている情報をいかなる方法での漏洩を妨げます。

Safe Baseはマスターインタープリタが、安全な制限されたインタ プリタを作成することを認めます。source, load, file, encodingそしてexitコマンドへの定義済みの別名セットを提供します。 オートロードやパッケージメカニズムの利用も可能です。

いかなるファイルシステム構造の知識も、安全なインタープリタには漏れません。 なぜなら、トークンを含む仮想化されたパスにしかアクセスしないからです。 安全なインタープリタがファイルをsourceすることを要求すると、sourceするファイル名の一部として仮想パスの中でトークンを使用します。 マスタインタープリタは、そのトークンを実際のディレクトリ名にクリアに変換し、要求された操作を実行します(セキュリティ参照)。以下で言及するコマンドのオプションフラグを使うことで異なるセキュリティレベルが選択できます。

Safe Baseによってマスタインタープリタで提供された全てのコマンドは safe ネームスペースに常駐します。

コマンド

以下のコマンドがマスタインタープリタで提供されます。

::safe::interpCreate ?slave? ?options...?
::safe::interpInit slave ?options...?
::safe::interpConfigure slave ?options...?
::safe::interpDelete slave
::safe::interpFindInAccessPath slave directory
::safe::interpAddToAccessPath slave directory
::safe::setLogCmd ?cmd arg...?
::safe::interpCreate ?slave? ?options ...?
安全なインタープリタを作成し、セクションALIASESで述べた別名をインストールし、提供されたoptionsで指定されたオートロードとパッケージメカニズムを初期 化します。 選択的な引数の記述は以下の OPTIONSセクションを参照します。 slave 引数が省略されると、名前は生成されます。 ::safe::interpCreateは常にインタープリタ名を返します。

::safe::interpInit slave ?options ...?
このコマンドは、安全なインタープリタを作成しないことを除いてinterpCreateと同じです。slave ::interp create -safeのような他の方法で作成されていなければなりません。

::safe::interpConfigure slave ?options ...?
options が与えられないと、指定された安全なインタープリタのすべてのオプションの設定を、オプションとそのslave に対する現在値のリストとして返します。1つの追加の引数が提供されると、これは2つ要素 namevalue を含むリストを返します。ここで、name はオプションのフルネームで、valueslave に対するそのオプションの現在値です。2つ以上の引数が提供されたら、これは安全なインタープリタを再構成し、提供された各オプションのみを変更します。(オプション参照)

使用例
# Create a new interp with the same configuration as "$i0" :
set i1 [eval safe::interpCreate [safe::interpConfigure $i0]]
# Get the current deleteHook
set dh [safe::interpConfigure $i0  -del]
# Change (only) the statics loading ok attribute of an interp
# and its deleteHook (leaving the rest unchanged) :
safe::interpConfigure $i0  -delete {foo bar} -statics 0 ;

::safe::interpDelete slave 
安全なインタープリタを削除し、対応するマスタインタープリタのデー タ構造を片付けます。このインタープリタに deleteHook スクリプトが指定されていると、インタープリタが削除される前に追加的な引数としてのインタープリタ名とともに評価されます。

::safe::interpFindInAccessPath slave directory
本コマンドは安全なインタープリタの現在の仮想アクセスパスにおける実ディレクトリdirectory のトークンを見つけて返します。ディレクトリが見つからないとエラーが生成されます。使用例
$slave eval [list set tk_library [::safe::interpFindInAccessPath $name $tk_library]]
::safe::interpAddToAccessPath slave directory
本コマンドは、directory をこのマスタ内の安全なインタープリタのために維持されている仮想パスに追加します。 そして安全なインタープリタで、そのディレクトリのファイルへアクセスできるトークンを返します。 ディレクトリが既に仮想パスに含まれていると、ディレクトリを仮想パスに再び追加することなく、トークンを返すだけです。使用例
 
$slave eval [list set tk_library [::safe::interpAddToAccessPath $name $tk_library]]

::safe::setLogCmd ?cmd arg ...?
本コマンドは、安全なインタープリタに興味のあるライフサイクルイベントが起こったときに、呼び出されるスクリプトをインストールします。 引数なしで呼び出されると、現在インストールされているスクリプトを返します。 1つの空文字列の引数で呼び出されると、現在のインストールされているスクリプトは削除され、ログの記録は停止されます。 スクリプトは追加的な引数、興味のあるイベントを記述する文字列で呼び出されます。主な目的は安全なインタープリタ のデバッグを助けることです。この機能を使うと、安全なインタープリタが基本的なエラーメッセージしか得られませんが、これで完全なエラーメッセージを得ることができます。 これは安全なインタープリタが、失敗や他の実ディレクトリ名のような敏感な情報を含んでいるイベントに関するメッセージを見ることを防止します。
使用例
::safe::setLogCmd puts stderr

以下は安全なインタープリタが、その仮想アクセスパス内に見つからないファイルをsourceしようとするサンプルセッションの出力です。 安全なインタープリタはファ イルが見つからなかったことを示すエラーメッセージだけを受け取ることにご注目ください。

NOTICE for slave interp10 : Created
NOTICE for slave interp10 : Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
NOTICE for slave interp10 : auto_path in interp10 has been set to {$p(:0:)}
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or directory

オプション

以下のオプションは::safe::interpCreate::safe::interpInit、そして::safe::interpConfigureに共用されます。 あらゆるオプション名は、混乱にならない限り、短縮できます。オプション名は大文字小文字を区別 しません。

-accessPath directoryList
-statics boolean
-noStatics
-nested boolean
-nestedLoadOk
-deleteHook script
-accessPath directoryList
このオプションは、安全なインタープリタがファイルをsourceloadできるディレクトリのリストを設定します。 このオプションが指定されない場合、あるいは空のリストとして与えられる場合、安全なインタープリタはオートローディングにそのマスタ と同じディレクトリを使います。仮想パス、トークンとアクセス制御の詳細はセキュリティを参照してください。

-statics boolean 
このオプションは、安全なインタープリタが、静的にリンクされたパッケージを(load {} Tkのように)ロードすることを認められるかどうかを明示します。 デフォルト値はtrueで、安全なインタープリタは静的にリンクされたパッケージをロードすることを許可されることを意味します。

-noStatics
このオプションは-statics falseの便利的な短縮です。従って、安全なインタープリタは静的にリンクされたパッケージをロードすることを許可されないことを意味します。

-nested boolean 
このオプションは、安全なインタープリタがパッケージを自分のサブインタープリタにロードすることを許されるかどうかを明示します。 デフォルト値はfalseで、 安全なインタープリタがパッケージを自分のサブインタープリタにロードすることを許可されないことを意味します。

-nestedLoadOk
このオプションは-nested true の便利的な短縮です。 従って、安全なインタープリタがパッケージを自分のサブインタープリタにロードすることを許可することを意味します。

-deleteHook script
このオプションに空でないscript が与えられと、マスタで追加的な引数としての安全なインタープリタ名とともに、安全なインタープリタが削除される直前に評価されます。 空の値が与えられると、安全なインタープリタのあらゆる現在インストールされている削除フックスクリプトが、削除されます。デフォルト値 ( {} )は、あらゆる削除コールバックを提供しないことを意味します。

別名

以下の別名が安全なインタープリタに提供されます。

source fileName
load fileName
file ?subCmd args...?
encoding ?subCmd args...?
exit
source fileName
要求されたファイル及びTclのソースファイルは見つかれば、安全なインタープリタにsourceされます。 source別名は安全なインタープリタの仮想パス内のディレクトリからのみファイルをsourceできます。 source別名はsourceされるファイルが見つけられるディレクトリ を指示するために、安全なインタープリタにその仮想パス内のトークン名の1つを使用することを要求します。 正当なファイル名に対する制限についてはセキュリティを参照してください。

load fileName
要求されたファイル及び共有オブジェクトファイルは見つかれば、動的に安全なインタープリタにロードされます。 ファイル名は、うまく見つかるように安全なインタープリタの仮想パスで言及されるトークン名を含んでいなければなりません。 その上、共有オブジェクトファイルは安全なエントリポイントを含んでいなければなりません。(loadで詳解しています。)

file ?subCmd args ...?
file別名はfileコマンドのサブコマンドの安全なサブセットへのアクセスを提供します。 認められているサブコマンドはdirname, joinextension, root, tailpathname, splitです。 これらについてはfileを参照してください。

encoding ?subCmd args ...?
encoding 別名は encodingコマンドのサブコマンドの安全なサブセットへのアクセスを提供します。 これはシステムエンコーディングの設定を許可しませんが、systemを含む全ての他のサブコマンドが現在のエンコーディングをチェックすることを可能にします。
exit
呼び出しインタープリタは削除され、その処理は停止するが、このインタープリタが存在していたTclプロセスは終了しません。

セキュリティ

Safe Baseは悪戯や禁断なサービス攻撃を完全に防止することを望みません。 これらの攻撃の形はアプリケーションやユーザーが一時的に有用な作業を行うためにコンピューターを使用することを妨げます。 例えばすべての利用可能なCPUタイムやスクリーンを消費します。 これらの攻撃は悪戯ではあるが、Safe Baseが防止している完全性やプライバシ攻撃よりは、一般的で重要ではないと考えられます。

安全なインタープリタで利用可能なコマンドは、 interpマニュアルページで定義されている安全なセットに加え、source, load, exit、そしてfileencoding の安全なサブセットへの間接的な別名です。 安全なインタープリタは、コードをオートロードでき、 パッケージをロードすることも要求できます。

これらのコマンドのいくつかがローカルファイルシステムにアクセスするので、そのディレクトリ構造に関する情報の漏れの可能性があります。 これを防止するため、安全なインタープリタで引数としてファイル名をとるコマンドは実ディレクトリ名の代わりにトークンを用います。 これらのトークンは、例えばマスタインタープリタによって仲介されるファイルのソースの要求のとき、実ディレクトリ名に翻訳されます。 ::safe::interpCreateによって作成されるか ::safe::interpInit によって初期化された各安全なインタープリタに対して、この仮想パスシステムはマスタインタープリタに維持され、パスは安全なインタープリタのアクセス可能なトークンをローカルファイルシステム上の実パス名前にマップします。 従って、安全なインタープリタが、それを実行しているホストのファイルシステムの構造に関する情報を得ることを防止します。 スレーブに供給されるsourceload別名への唯一の正当なファイル名引数は [file join token filename] (即ち、固有のファイルパスフォーマットを使っているとき、 Unixでのtoken/filename、Windows上のtoken\filename、そして Mac上のtoken :filename )のようなフォーマットのパスです。ここで、token accessPath リストのディレクトリのうちの1つを示し、filename がそのディレクトリ ( サブディレクトリ へアクセスが不可)にある1つのファイルです。

トークンは安全なインタープリタにおいてファイルをsourceあるいはロードすることに利用されるとき、そのトークンはチェックされ、 ソースかロードされるファイルはファイルシステムに位置する実のパス名に変換されます。 安全なインタープリタは、そのファイルがファイルシステムに格納される実際のパス名に関する知識を決して得られません。

安全なインタープリタによるsource可能なファイルのセットに、偶然に含まれてしまった敏感なファイルからの潜在的な情報の漏洩を更に防止するために、source別名は以下の条件を満たすファイルへのアクセスを制限します。 ファイル名が14文字以下であり、ただ1つのドットを含み、拡張子.tclを持つまたはtclIndexと呼ばれます。

最初のアクセスパスリストの各要素は、スレーブのauto_pathに設定されるトークンを割り当てられて、そのリストの1番目の要素はそのスレーブのtcl_libraryとして設定されます。

アクセスパス引数が与えられていない場合、あるいは空リストであると、デフォルトの動作はスレーブにそのマスタがアクセスできるのと同じパッケージにアクセスさせることになります。 更に厳密に言うと、Safe_Init入口を提供するTcl ( 定義によって、それがスレーブインタプリンタで実行するので危険の可能性がない)とC拡張で書かれたパッケージのみです。そのため、マスタのauto_pathはスレーブアクセスパスを構成するために使われます。 スレーブがTclライブラリファイル ( オートローディングメカニズムそのものを含む ) を成功にロードするため、スレーブアクセスパスにあるtcl_libraryは、必要ならば、最初の位 置に追加されるか、移動されます。 従って、スレーブtcl_libraryはマスタのと同じです。しかし、その実のパスがまだスレーブには見えません。 オートローディングがスレーブにしても、マスタにしても、デフォルトの場合と同じ動作をするように、マスタauto_pathにおける各ディレクトリの最初レベルのサブディレクトリはスレーブアクセスパスにも( もし既に含まれなければ)追加されます。このデフォルトメカニズムに頼らないで、 -accessPathフラグでディレクトリリストを明示的に指定することでサブディレクトリが決して検索されないように、より制限されたパスを指定することができます。

accessPathが最初の作成または初期化 (即ち、interpConfigure -accessPath list を通じで)されるとき、auto_resetは、そのauto_indexを新しいトークンリストと同期させるため、安全なインタープリタにおいて自動的に評価されます。

参照

interp, library, load, package, source, unknown

キーワード

alias, auto-loading, auto_mkindex, load, master interpreter, safe interpreter, slave interpreter, source


Copyright © 1995-1996 Sun Microsystems, Inc. Copyright © 1995-1997 Roger E. Critchlow Jr.