safe(3tcl) | Tcl Built-In Commands | safe(3tcl) |
Safe - 用來建立和操縱安全直譯器的機制。
::safe::interpCreate ?slave? ?options...?
::safe::interpInit slave ?options...?
::safe::interpConfigure slave ?options...?
::safe::interpDelete slave
::safe::interpAddToAccessPath slave directory
::safe::interpFindInAccessPath slave directory
::safe::setLogCmd ?cmd arg...?
?-accessPath pathList? ?-statics boolean? ?-noStatics? ?-nested boolean? ?-nestedLoadOk? ?-deleteHook script?
Safe Tcl 是一種機制,用於安全的執行不可信任的 Tcl 指令碼,併為有潛在危險功能的指令碼提供訪問中介。
Safe Base 確保不可信任的 Tcl 指令碼不能損壞宿主應用。Safe Base 防止完整性和隱私攻擊。防止不可信任的 Tcl 指令碼敗壞宿主應用或計算機的狀況。防止不可信任的指令碼把儲存在宿主主機或宿主應用中的資訊洩露給任何人群。
Safe Base 允許一個主直譯器建立安全、受限制的直譯器,它包括為 source, load, file, encoding, 和 exit 命令預定義的一系列別名,並可以使用自動裝載和包機制。
不向安全直譯器透露檔案系統的任何東西,它只能訪問包含記號(token)的虛擬的路徑。當安全直譯器請求 source(載入)一個檔案的時候,它使用在虛擬路徑中的記號作為要 source 的檔名的一部分;主直譯器透明的把這個記號轉換成一個實際的路徑名並執行所要求的操作 (詳情參見下面的 SECURITY 安全 章節). 可以使用下面描述的命令標誌來選擇不同的安全級別。
Safe Base 在主直譯器中提供的所有命令駐留在 safe 名字空間中:
在主直譯器中提供了下列命令:
::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。任何選項都可縮寫為它的最小的無歧義的名字。選項的名字是大小寫不敏感的。
在安全直譯器中提供了下列別名:
Safe Base 不嘗試完全的防止煩惱(annoyance)和拒絕服務攻擊。這些形式的攻擊妨礙應用或使用者臨時的使用計算機來完成有用的工作,例如消耗所有可利用的 CPU 時間或所有可利用的螢幕 real estate。這些攻擊儘管很惡劣,但一般不如 Safe Base 主要防護的完整性和隱私攻擊那麼重要。
除了在 interp 手冊頁中定義的安全命令集之外,在安全直譯器中可獲得的命令還包括給 source、load、exit 的作為中介的(mediate)別名以及 file 和 encoding 命令的安全子集。安全直譯器還可以自動裝載程式碼並可以請求裝載包。
因為這些命令中的一些命令訪問本地檔案系統,存在著對它的目錄結構的潛在的資訊洩露。為了防止這個問題,接受檔名作為引數的命令在安全直譯器中使用記號來替代真實的目錄名。在主直譯器中介一個要求例如 source 一個檔案的時候,把這些記號轉換成實際路徑名。在主直譯器中維護這個虛擬路徑系統,針對每個用 ::safe::interpCreate 建立的或用 ::safe::interpInit 初始化的安全直譯器,這個路徑把在安全直譯器中可訪問的記號對映成在本地檔案系統上的真實路徑名,這樣就防止了安全直譯器去獲取關於這個直譯器在其上執行的主機的檔案系統結構的知識。可以提供給從直譯器中的 source 和 load 別名的有效的檔名引數只能是下面這種形式的路徑: [file join token filename] (比如,在使用本地檔案路徑格式的時候: 在 Unix 上是 token/filename,在 Windows 上是 token\filename,在 Mac 上是 token:filename ),這裡的 token 表示 accessPath 列表中的一個目錄而 filename 是在這個目錄中一個檔案(不允許訪問子目錄)。
在一個安全直譯器中,當在要 source 或裝載一個檔案的一個請求中使用一個記號的時候,檢查這個記號並把它轉換成真實路徑名,並在檔案系統上定位要被 source 或裝載的檔案。安全直譯器不能獲取關於檔案系統上在其下儲存這個檔案的實際路徑名的知識。
為了進一步防止潛在的對偶然的包括在可以被安全直譯器 source 的檔案集中的敏 感檔案的資訊洩露,限制 source 別名為訪問滿足下列約束的檔案: 檔名 必須是十四個字元或更短,必須不包含多於一個的點(“.”),不許終止於擴 展 .tcl 或是被呼叫的 tclIndex。
初始的訪問路徑列表中的每個元素將分配一個記號,它們將被設定在從直譯器的 auto_path 中並且這個列表的第一個元素將被設定為這個從直譯器的 tcl_library。
如果未給出訪問路徑引數或者是一個空列表,預設的行為是讓從直譯器訪問的包與主直譯器已經訪問了的包相同(更精確的描述: 只允許用 Tcl 寫成的包(因為它們將在從直譯器中執行所以不可能是危險的)和提供 Safe_Init 入口點的 C 擴充套件)。為此,用主直譯器的 auto_path 來構造從直譯器的訪問路徑。為了從直譯器能成功的裝載 Tcl 庫檔案(它自身包括自動裝載機制),如果需要的話,把 tcl_library 增加或移動到在從直譯器的訪問路徑中的第一個的位置上,這樣從直譯器的 tcl_library 將與主直譯器的相同(它的真實路徑對從直譯器仍是不可見的)。為了使自動裝載對於從直譯器和主直譯器在預設的情況下以相同的方式工作,在主直譯器 auto_path 中的每個目錄的第一層子目錄將被新增(如果未曾包含的話)到從直譯器的訪問路徑中。你總是可以透過顯式的使用 -accessPath 標誌指定你的目錄列表,而不是依賴於這個預設機制,來指定一個更受限制的路徑,它的子目錄永遠不能被查詢。
在首次建立或初始化(例如透過 interpConfigure -accessPath list)之後變更 accessPath 的時候,將在安全直譯器中自動的求值 auto_reset 來使它的 auto_index 與新的記號列表同步。
interp(n), library(n), load(n), package(n), source(n), unknown(n)
alias, auto-loading, auto_mkindex, load, master interpreter, safe interpreter, slave interpreter, source
寒蟬退士
2001/11/07
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
8.0 | Tcl |