summaryrefslogtreecommitdiffstats
path: root/contrib/tcl/doc/safe.n
blob: acc50ed7a18e84f50c86661f9917b40ec18e6195 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
'\"
'\" 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.
'\" 
'\" SCCS: @(#) safe.n 1.10 97/03/24 09:21:12
'\" 
.so man.macros
.TH "Safe Tcl" n 7.7 Tcl "Tcl Built-In Commands"
.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
Safe Tcl \- A mechanism for managing security policies.
.SH SYNOPSIS
.nf
\fBtcl_safeCreateInterp\fR \fIslave\fR
.sp
\fBtcl_safeInitInterp\fR \fIslave\fR
.sp
\fBtcl_safeDeleteInterp\fR \fIslave\fR
.sp
\fIpolicy\fB_policyInit\fR \fIslave\fR
.sp
\fIpolicy\fB_policyFinalize\fR \fIslave\fR
.fi
.BE

.SH DESCRIPTION
.PP
This manual entry describes \fBSafe Tcl\fR, a mechanism and collection of
library procedures for managing security policies. \fBSafe Tcl\fR is used
in \fBapplications\fR that want to provide a flexible, extensible safe
hosting environment for untrusted guest scripts, \fBtclets\fR. It
provides a mechanism to ensure that tclets cannot harm the hosting
application, and a way to extend limited degrees of trust to such tclets,
to allow them to have access to unsafe features.
.PP
The content of this manual entry is of interest to four different
audiences: authors of tclets will primarily be interested in the sections
on the \fBSAFE BASE\fR and on \fBUSING SAFE TCL IN TCLETS\fR.
Application authors will find relevant information in the section on
\fBUSING SAFE TCL IN APPLICATIONS\fR. To create a new security
policy, e.g. to enable tclets to have access to a new feature, read the
section on \fBWRITING SECURITY POLICIES\fB. Finally, system administrators
and people installing \fBSafe Tcl\fR will find useful information in the
section on \fBINSTALLING SECURITY POLICIES\fR.
.PP
\fBSecurity policies\fR are collections of procedures, aliases, hidden
commands and variable settings that together implement a controlled way for
an application to allow a tclet to have restricted access to unsafe features.
For a complete description of aliases, hidden commands and how to use
multiple interpreters in an application, see the manual entry for the
\fBinterp\fR command.
.PP
Packaging collections of features into security policies has several
advantages: First, it allows these collections to have names. This
facilitates the formation of a common, agreed upon, understanding of what
features are included in each policy. Second, it enables a reasoned
approach to developing extensions that make restricted features available
to untrusted tclets.
Third, because the feature set is delineated clearly, a security policy can
be subjected to analysis to determine what risks it exposes its user to.
.PP
The \fBSafe Tcl\fR approach to safe execution of untrusted code is further
discussed in \fBThe Safe\-Tcl Security Model\fR
(http://www.sunlabs.com/people/john.ousterhout/SafeTcl.ps).
This paper provides a detailed discussion of the underlying
motivations and philosophy, and compares the \fBSafe Tcl\fR model with
other current efforts.

.SH "SAFE BASE"
.PP
This section describes the environment in which tclets start execution in
an application using \fBSafe Tcl\fR. This environment is known as the
\fBSafe Base\fR, as it provides the basis on which further security
policies are built.
.PP
When a tclet starts execution in an environment using \fBSafe Tcl\fR,
its interpreter will contain aliases for the following commands:
.DS
.ta 1.2i 2.4i 3.6i
\fBexit	file	load	source
tclPkgUnknown\fR
.DE
The \fBexit\fR alias terminates the execution of the
invoking slave.
\fBFile\fR allows access to a subset of the sub\-commands of the full
\fBfile\fR command.
\fBload\fR and \fBsource\fR make extensions available to the tclet in a
controlled manner.
The \fBtclPkgUnknown\fR alias allows the application to interpose on
\fBpackage require\fR invocations by the tclet.
.PP
The following \fBTcl\fR commands are hidden in the Safe Base:
.DS
.ta 1.2i 2.4i 3.6i
\fBcd	exec	exit	fconfigure
file	glob	load	open
pwd	socket	source	vwait\fR
.DE
.PP
A tclet can also request to load packages using \fBpackage require\fR.
Please read the manual page on the \fBpackage\fR and \fBload\fR commands
for a discussion of package loading and special restrictions on loading
into safe interpreters.
.PP
Tclets can use auto-loading to obtain the definitions for procedures as
needed. The auto-loading mechanism in the Safe Base supports tclIndex files
generated by \fBauto_mkindex\fR Version 2 and later.

.SH "USING SAFE TCL IN TCLETS"
.PP
Tclets start executing in the environment described in the previous
section, on the \fBSAFE BASE\fR. If they need access to unsafe features,
tclets can request to use a named security policy by invoking \fBpackage
require\fR with the policy name. If the request is denied by the
application's master interpreter, an error is returned.
A tclet can \fBcatch\fR the error and request to use a different named
policy, until a request is granted.
.PP
A tclet can only use one security policy during its lifetime. Once an
invocation of \fBpackage require\fR to load a security policy succeeds,
Safe Tcl prevents subsequent invocations of \fBpackage require\fR from
succeeding if the requested package is a security policy. There is also no
mechanism for a tclet to stop using a security policy, once it is loaded.
Invocations of \fBpackage require\fR to load other packages unrelated to
security policies will still succeed.
.PP
These restrictions are designed to prevent a tclet from composing security
policies either concurrently or sequentially, in ways not supported or
forseen by the authors of the policies. Allowing such composition would
expose the application to unknown security risks, because a security policy
that is safe in isolation is not necessarily safe when used in conjunction
with other security policies.
For example, a security policy that allows read\-only access to the local
file system can not disclose private data belonging to the application if
it does not have access to network communication commands such as
\fBsocket\fR. However, when used in conjunction with another security
policy that enables the \fBsocket\fR command, this policy is no longer
safe.

.SH "USING SAFE TCL IN APPLICATIONS"
.PP
An application using Safe Tcl is usually structured as one or more unsafe
interpreters in which trusted code belonging to the application is
executed. Each such \fBmaster interpreter\fR controls one or more safe
\fBslave interpreters\fR in which tclets are executed.
Tclets communicate with their master interpreter via the aliases provided
by the Safe Base and via additional mechanisms installed by each security
policy.
This section describes the procedures an application invokes to use Safe
Tcl and to manage slave interpreters.
.PP
An application invokes \fBtcl_safeCreateInterp\fR \fIslave\fR to create a
new slave interpreter; this new interpreter will contain the aliases
provided by the Safe Base. A new command named \fBslave\fR is also created
in the invoking interpreter, to allow the application to manipulate the new
slave interpreter.
.PP
An application can use \fBtcl_safeInitInterp\fR \fIslave\fR to initialize
an existing slave interpreter with the Safe-Tcl security policy mechanism.
This procedure is useful when an application already has a safe slave
interpreter created with \fBinterp create -safe\fR and wishes to enable it
to use security policies.
.PP
An application should invoke \fBtcl_safeDeleteInterp\fR \fIslave\fR to
delete an interpreter previously created by \fBtcl_safeCreateInterp\fR. This
procedure terminates the execution of the tclet in the \fIslave\fR
interpreter and cleans up associated state maintained by the Safe Tcl
mechanism.
.PP
Security policies are installed on the file system of the system on which
the application is executing. Security policies are found in the
\fIpolicies\fR sub-directories of directories mentioned in the
application's \fBauto_path\fR, and in sub-directories of these
\fIpolicies\fR directories.
.PP
Safe Tcl will invoke, on behalf of an application, additional procedures
provided by individual security policies to manage the lifecycle of those
policies. These additional procedures are described in the next section.

.SH "WRITING SECURITY POLICIES"
.PP
Writing a security policy is a complex effort that should not be undertaken
lightly. It involves careful design, exhaustive testing, public review and
analysis and continuous debugging.
In addition to considering what features a security policy should provide,
the implementer has to constantly keep in mind the security risks to which
an application using the policy may be exposed.
Actively considering each feature to see if it can be used to compromise an
application will help to minimize the chance of a security mishap later on.
.PP
A security policy is a Tcl script or a shared library that is loaded into
an unsafe master interpreter.
A security policy consists of two parts: a \fBmanagement\fR part, concerned
with installing the policy into safe slaves and cleaning up after a slave
is destroyed, and a \fBruntime\fR part, concerned with actually
implementing the features of the policy.
.PP
The management part of a security policy consists of two Tcl procedures or
commands, one for installing the security policy features into a safe
slave, and the other for cleaning up any associated state when a slave is
destroyed.
The names of these procedures or commands are \fIpolicy\fB_policyInit\fR
and \fIpolicy\fB_policyFinalize, where \fIpolicy\fR is the name of the
policy as used by the slave interpreter in the \fBpackage require\fR
invocation.
.PP
The policy initialization procedure \fIpolicy\fB_policyInit\fR called in
the master interpreter with one argument, the name of the slave
interpreter, when a slave requests to use the \fIpolicy\fR security policy.
Error returns indicate that the slave was denied permission to use this
policy; the error is propagated back to the slave interpreter. Successful
return indicates that the policy is now available in the requesting slave.
If it decides to allow the slave to use the requested policy,
\fIpolicy\fB_policyInit\fR should install new aliases and command into the
slave, initialize variables both in the master interpreter and in the
slave, and do any other initialization work to make the policy features
available in the slave.
Policy initialization procedures may also perform other tasks, such as
creating policy specific state data for the new slave using this policy.
.PP
Policy initialization procedures should be careful to leave a clean state
in the slave interpreter if a failure occurs during initialization; the
rule is that if an error is returned, no changes in any variables,
procedures or aliases should be detectable in the slave.
For example, if use of a security policy requires creation
of a socket to a remote host at initialization time, and if that host is
not accessible, all aliases created in the slave to use the policy
should be removed. Otherwise, these aliases might open security holes when
used in conjunction with another security policy subsequently requested by
the slave. Without this, a malicious tclet could purposely cause a failure
during initialization in one security policy and compose features provided
by that policy in an unsafe manner with another security policy requested
later.
.PP
When an application invokes \fBtcl_safeDeleteInterp\fR to delete a slave
interpreter, the policy finalization procedure
\fIpolicy\fB_policyFinalize\fR for the policy in use by the slave is called.
It receives one argument, the name of the slave interpreter being deleted.
This procedure should ensure that subsequently if a slave by the
same name is re\-created, the new slave will be able to use this policy.
It may also wish to remove any policy specific state data created by
\fIpolicy\fB_policyInit\fR.
.PP
During initialization, a number of aliases may be created in the slave;
when these aliases are invoke, they cause commands defined in the master to
execute. The runtime part of a security policy consists of implementations
of all the target commands that handle the invocation of aliases in the
slave. Because these commands execute in a trusted interpreter, they have
full access to all the capabilities of Tcl and any extensions loaded into
the master interpreter.
.PP
A security policy must provide a \fBtclIndex\fR file in addition to files
containing Tcl procedures and shared libraries implementing the policy.
To generate a \fBtclIndex\fR file, use the Tcl command \fBauto_mkindex\fR
which is described in the manual page for the Tcl library.

.SH "INSTALLING SECURITY POLICIES"
.PP
Safe Tcl uses a platform dependent mechanism for obtaining the initial
setting for the search path for finding security policies.
On \fBUnix\fR, the environment variable \fBTCL_POLICY_PATH\fR is consulted.
On \fBWin32\fR systems and on \fBMacOS\fR there is currently no mechanism
provided to obtain the initial value; each application should provide its
own mechanism for obtaining the initial search path. Such mechanisms will
be provided shortly.
.PP
The search path is searched in reverse order of the order in which entries
appear. Thus, if two or more policies by the same name occur in the path,
the last policy by that name will be used by Safe Tcl.
This enable system administrators to install system wide security policies
in a centralized directory and then require users to include that directory
as the last component in the search path. Doing so will ensure that system
wide policies are used in preference of policies installed by individual
users.
.PP
To install a policy, create a sub\-directory of one of the directories
mentioned in the policy search path, and copy all the files comprising the
policy into the new directory.
Applications should be able, in most situations, to use the newly available
policy immediately, without having to restart.
If a security policy uses the same name as a regular package, a \fBpackage
require\fR invocation in a slave interpreter will preferentially use the
security policy over the regular package.
However, if a security policy is installed after the first invocation of
\fBpackage require\fR in an application, and a regular package exists by
the same name, the security policy will not be available for use in that
application. In this case you must restart the application for the policy
to become available.

.SH CREDITS
.PP
The security policy mechanism extends and expands on the Safe-Tcl prototype
first implemented by Nathaniel Borenstein and Marshall Rose.

.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, security
policy, safe interpreter, slave interpreter, source
OpenPOWER on IntegriCloud