safe.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:15k
- '"
- '" Copyright (c) 1995-1996 Sun Microsystems, Inc.
- '"
- '" See the file "license.terms" for information on usage and redistribution
- '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- '"
- '" RCS: @(#) $Id: safe.n,v 1.4.2.1 2004/10/27 14:23:58 dkf Exp $
- '"
- .so man.macros
- .TH "Safe Tcl" n 8.0 Tcl "Tcl Built-In Commands"
- .BS
- '" Note: do not modify the .SH NAME line immediately below!
- .SH NAME
- Safe Base - A mechanism for creating and manipulating safe interpreters.
- .SH SYNOPSIS
- fB::safe::interpCreatefR ?fIslavefR? ?fIoptions...fR?
- .sp
- fB::safe::interpInitfR fIslavefR ?fIoptions...fR?
- .sp
- fB::safe::interpConfigurefR fIslavefR ?fIoptions...fR?
- .sp
- fB::safe::interpDeletefR fIslavefR
- .sp
- fB::safe::interpAddToAccessPathfR fIslavefR fIdirectoryfR
- .sp
- fB::safe::interpFindInAccessPathfR fIslavefR fIdirectoryfR
- .sp
- fB::safe::setLogCmdfR ?fIcmd arg...fR?
- .SH OPTIONS
- .PP
- ?fB-accessPathfR fIpathListfR?
- ?fB-staticsfR fIbooleanfR? ?fB-noStaticsfR?
- ?fB-nestedfR fIbooleanfR? ?fB-nestedLoadOkfR?
- ?fB-deleteHookfR fIscriptfR?
- .BE
- .SH DESCRIPTION
- Safe Tcl is a mechanism for executing untrusted Tcl scripts
- safely and for providing mediated access by such scripts to
- potentially dangerous functionality.
- .PP
- The Safe Base ensures that untrusted Tcl scripts cannot harm the
- hosting application.
- The Safe Base prevents integrity and privacy attacks. Untrusted Tcl
- scripts are prevented from corrupting the state of the hosting
- application or computer. Untrusted scripts are also prevented from
- disclosing information stored on the hosting computer or in the
- hosting application to any party.
- .PP
- The Safe Base allows a master interpreter to create safe, restricted
- interpreters that contain a set of predefined aliases for the fBsourcefR,
- fBloadfR, fBfilefR, fBencodingfR, and fBexitfR commands and
- are able to use the auto-loading and package mechanisms.
- .PP
- No knowledge of the file system structure is leaked to the
- safe interpreter, because it has access only to a virtualized path
- containing tokens. When the safe interpreter requests to source a file, it
- uses the token in the virtual path as part of the file name to source; the
- master interpreter transparently
- translates the token into a real directory name and executes the
- requested operation (see the section fBSECURITYfR below for details).
- Different levels of security can be selected by using the optional flags
- of the commands described below.
- .PP
- All commands provided in the master interpreter by the Safe Base reside in
- the fBsafefR namespace:
- .SH COMMANDS
- The following commands are provided in the master interpreter:
- .TP
- fB::safe::interpCreatefR ?fIslavefR? ?fIoptions...fR?
- Creates a safe interpreter, installs the aliases described in the section
- fBALIASESfR and initializes the auto-loading and package mechanism as
- specified by the supplied fBoptionsfR.
- See the fBOPTIONSfR section below for a description of the
- optional arguments.
- If the fIslavefR argument is omitted, a name will be generated.
- fB::safe::interpCreatefR always returns the interpreter name.
- .TP
- fB::safe::interpInitfR fIslavefR ?fIoptions...fR?
- This command is similar to fBinterpCreatefR except it that does not
- create the safe interpreter. fIslavefR must have been created by some
- other means, like fBinterp create -safefR.
- .TP
- fB::safe::interpConfigurefR fIslavefR ?fIoptions...fR?
- If no fIoptionsfR are given, returns the settings for all options for the
- named safe interpreter as a list of options and their current values
- for that fIslavefR.
- If a single additional argument is provided,
- it will return a list of 2 elements fInamefR and fIvaluefR where
- fInamefR is the full name of that option and fIvaluefR the current value
- for that option and the fIslavefR.
- If more than two additional arguments are provided, it will reconfigure the
- safe interpreter and change each and only the provided options.
- See the section on fBOPTIONSfR below for options description.
- Example of use:
- .RS
- .CS
- # 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 ;
- .CE
- .RE
- .TP
- fB::safe::interpDeletefR fIslavefR
- Deletes the safe interpreter and cleans up the corresponding
- master interpreter data structures.
- If a fIdeleteHookfR script was specified for this interpreter it is
- evaluated before the interpreter is deleted, with the name of the
- interpreter as an additional argument.
- .TP
- fB::safe::interpFindInAccessPathfR fIslavefR fIdirectoryfR
- This command finds and returns the token for the real directory
- fIdirectoryfR in the safe interpreter's current virtual access path.
- It generates an error if the directory is not found.
- Example of use:
- .RS
- .CS
- $slave eval [list set tk_library [::safe::interpFindInAccessPath $name $tk_library]]
- .CE
- .RE
- .TP
- fB::safe::interpAddToAccessPathfR fIslavefR fIdirectoryfR
- This command adds fIdirectoryfR to the virtual path maintained for the
- safe interpreter in the master, and returns the token that can be used in
- the safe interpreter to obtain access to files in that directory.
- If the directory is already in the virtual path, it only returns the token
- without adding the directory to the virtual path again.
- Example of use:
- .RS
- .CS
- $slave eval [list set tk_library [::safe::interpAddToAccessPath $name $tk_library]]
- .CE
- .RE
- .TP
- fB::safe::setLogCmdfR ?fIcmd arg...fR?
- This command installs a script that will be called when interesting
- life cycle events occur for a safe interpreter.
- When called with no arguments, it returns the currently installed script.
- When called with one argument, an empty string, the currently installed
- script is removed and logging is turned off.
- The script will be invoked with one additional argument, a string
- describing the event of interest.
- The main purpose is to help in debugging safe interpreters.
- Using this facility you can get complete error messages while the safe
- interpreter gets only generic error messages.
- This prevents a safe interpreter from seeing messages about failures
- and other events that might contain sensitive information such as real
- directory names.
- .RS
- Example of use:
- .CS
- ::safe::setLogCmd puts stderr
- .CE
- Below is the output of a sample session in which a safe interpreter
- attempted to source a file not found in its virtual access path.
- Note that the safe interpreter only received an error message saying that
- the file was not found:
- .CS
- 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
- .CE
- .RE
- .SH OPTIONS
- The following options are common to
- fB::safe::interpCreatefR, fB::safe::interpInitfR,
- and fB::safe::interpConfigurefR.
- Any option name can be abbreviated to its minimal
- non-ambiguous name.
- Option names are not case sensitive.
- .TP
- fB-accessPathfR fIdirectoryListfR
- This option sets the list of directories from which the safe interpreter
- can fBsourcefR and fBloadfR files.
- If this option is not specified, or if it is given as the
- empty list, the safe interpreter will use the same directories as its
- master for auto-loading.
- See the section fBSECURITYfR below for more detail about virtual paths,
- tokens and access control.
- .TP
- fB-staticsfR fIbooleanfR
- This option specifies if the safe interpreter will be allowed
- to load statically linked packages (like fBload {} TkfR).
- The default value is fBtruefR :
- safe interpreters are allowed to load statically linked packages.
- .TP
- fB-noStaticsfR
- This option is a convenience shortcut for fB-statics falsefR and
- thus specifies that the safe interpreter will not be allowed
- to load statically linked packages.
- .TP
- fB-nestedfR fIbooleanfR
- This option specifies if the safe interpreter will be allowed
- to load packages into its own sub-interpreters.
- The default value is fBfalsefR :
- safe interpreters are not allowed to load packages into
- their own sub-interpreters.
- .TP
- fB-nestedLoadOkfR
- This option is a convenience shortcut for fB-nested truefR and
- thus specifies the safe interpreter will be allowed
- to load packages into its own sub-interpreters.
- .TP
- fB-deleteHookfR fIscriptfR
- When this option is given a non-empty fIscriptfR, it will be
- evaluated in the master with the name of
- the safe interpreter as an additional argument
- just before actually deleting the safe interpreter.
- Giving an empty value removes any currently installed deletion hook
- script for that safe interpreter.
- The default value (fB{}fR) is not to have any deletion call back.
- .SH ALIASES
- The following aliases are provided in a safe interpreter:
- .TP
- fBsourcefR fIfileNamefR
- The requested file, a Tcl source file, is sourced into the safe interpreter
- if it is found.
- The fBsourcefR alias can only source files from directories in
- the virtual path for the safe interpreter. The fBsourcefR alias requires
- the safe interpreter to
- use one of the token names in its virtual path to denote the directory in
- which the file to be sourced can be found.
- See the section on fBSECURITYfR for more discussion of restrictions on
- valid filenames.
- .TP
- fBloadfR fIfileNamefR
- The requested file, a shared object file, is dynamically loaded into the
- safe interpreter if it is found.
- The filename must contain a token name mentioned in the virtual path for
- the safe interpreter for it to be found successfully.
- Additionally, the shared object file must contain a safe entry point; see
- the manual page for the fBloadfR command for more details.
- .TP
- fBfilefR ?fIsubCmd args...fR?
- The fBfilefR alias provides access to a safe subset of the subcommands of
- the fBfilefR command; it allows only fBdirnamefR, fBjoinfR,
- fBextensionfR, fBrootfR, fBtailfR, fBpathnamefR and fBsplitfR
- subcommands. For more details on what these subcommands do see the manual
- page for the fBfilefR command.
- .TP
- fBencodingfR ?fIsubCmd args...fR?
- The fBencodingfR alias provides access to a safe subset of the
- subcommands of the fBencodingfR command; it disallows setting of
- the system encoding, but allows all other subcommands including
- fBsystemfR to check the current encoding.
- .TP
- fBexitfR
- The calling interpreter is deleted and its computation is stopped, but the
- Tcl process in which this interpreter exists is not terminated.
- .SH SECURITY
- The Safe Base does not attempt to completely prevent annoyance and
- denial of service attacks. These forms of attack prevent the
- application or user from temporarily using the computer to perform
- useful work, for example by consuming all available CPU time or
- all available screen real estate.
- These attacks, while aggravating, are deemed to be of lesser importance
- in general than integrity and privacy attacks that the Safe Base
- is to prevent.
- .PP
- The commands available in a safe interpreter, in addition to
- the safe set as defined in fBinterpfR manual page, are mediated aliases
- for fBsourcefR, fBloadfR, fBexitfR, and safe subsets of
- fBfilefR and fBencodingfR. The safe interpreter can also auto-load
- code and it can request that packages be loaded.
- .PP
- Because some of these commands access the local file system, there is a
- potential for information leakage about its directory structure.
- To prevent this, commands that take file names as arguments in a safe
- interpreter use tokens instead of the real directory names.
- These tokens are translated to the real directory name while a request to,
- e.g., source a file is mediated by the master interpreter.
- This virtual path system is maintained in the master interpreter for each safe
- interpreter created by fB::safe::interpCreatefR or initialized by
- fB::safe::interpInitfR and
- the path maps tokens accessible in the safe interpreter into real path
- names on the local file system thus preventing safe interpreters
- from gaining knowledge about the
- structure of the file system of the host on which the interpreter is
- executing.
- The only valid file names arguments
- for the fBsourcefR and fBloadfR aliases provided to the slave
- are path in the form of
- fB[file join fRfItoken filenamefRfB]fR (i.e. when using the
- native file path formats: fItokenfRfB/fRfIfilenamefR
- on Unix, fItokenfRfB\fIfilenamefR on Windows,
- and fItokenfRfB:fRfIfilenamefR on the Mac),
- where fItokenfR is representing one of the directories
- of the fIaccessPathfR list and fIfilenamefR is
- one file in that directory (no sub directories access are allowed).
- .PP
- When a token is used in a safe interpreter in a request to source or
- load a file, the token is checked and
- translated to a real path name and the file to be
- sourced or loaded is located on the file system.
- The safe interpreter never gains knowledge of the actual path name under
- which the file is stored on the file system.
- .PP
- To further prevent potential information leakage from sensitive files that
- are accidentally included in the set of files that can be sourced by a safe
- interpreter, the fBsourcefR alias restricts access to files
- meeting the following constraints: the file name must
- fourteen characters or shorter, must not contain more than one dot ("fB.fR"),
- must end up with the extension fB.tclfR or be called fBtclIndexfR.
- .PP
- Each element of the initial access path
- list will be assigned a token that will be set in
- the slave fBauto_pathfR and the first element of that list will be set as
- the fBtcl_libraryfR for that slave.
- .PP
- If the access path argument is not given or is the empty list,
- the default behavior is to let the slave access the same packages
- as the master has access to (Or to be more precise:
- only packages written in Tcl (which by definition can't be dangerous
- as they run in the slave interpreter) and C extensions that
- provides a Safe_Init entry point). For that purpose, the master's
- fBauto_pathfR will be used to construct the slave access path.
- In order that the slave successfully loads the Tcl library files
- (which includes the auto-loading mechanism itself) the fBtcl_libraryfR will be
- added or moved to the first position if necessary, in the
- slave access path, so the slave
- fBtcl_libraryfR will be the same as the master's (its real
- path will still be invisible to the slave though).
- In order that auto-loading works the same for the slave and
- the master in this by default case, the first-level
- sub directories of each directory in the master fBauto_pathfR will
- also be added (if not already included) to the slave access path.
- You can always specify a more
- restrictive path for which sub directories will never be searched by
- explicitly specifying your directory list with the fB-accessPathfR flag
- instead of relying on this default mechanism.
- .PP
- When the fIaccessPathfR is changed after the first creation or
- initialization (i.e. through fBinterpConfigure -accessPath fRfIlistfR),
- an fBauto_resetfR is automatically evaluated in the safe interpreter
- to synchronize its fBauto_indexfR with the new token list.
- .SH "SEE ALSO"
- interp(n), library(n), load(n), package(n), source(n), unknown(n)
-
- .SH KEYWORDS
- alias, auto-loading, auto_mkindex, load, master interpreter, safe
- interpreter, slave interpreter, source