mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\chapter{Restricted Execution \label{restricted}}
 | 
						|
 | 
						|
\begin{notice}[warning]
 | 
						|
   In Python 2.3 these modules have been disabled due to various known
 | 
						|
   and not readily fixable security holes.  The modules are still
 | 
						|
   documented here to help in reading old code that uses the
 | 
						|
   \module{rexec} and \module{Bastion} modules.
 | 
						|
\end{notice}
 | 
						|
 | 
						|
\emph{Restricted execution} is the basic framework in Python that allows
 | 
						|
for the segregation of trusted and untrusted code.  The framework is based on the
 | 
						|
notion that trusted Python code (a \emph{supervisor}) can create a
 | 
						|
``padded cell' (or environment) with limited permissions, and run the
 | 
						|
untrusted code within this cell.  The untrusted code cannot break out
 | 
						|
of its cell, and can only interact with sensitive system resources
 | 
						|
through interfaces defined and managed by the trusted code.  The term
 | 
						|
``restricted execution'' is favored over ``safe-Python''
 | 
						|
since true safety is hard to define, and is determined by the way the
 | 
						|
restricted environment is created.  Note that the restricted
 | 
						|
environments can be nested, with inner cells creating subcells of
 | 
						|
lesser, but never greater, privilege.
 | 
						|
 | 
						|
An interesting aspect of Python's restricted execution model is that
 | 
						|
the interfaces presented to untrusted code usually have the same names
 | 
						|
as those presented to trusted code.  Therefore no special interfaces
 | 
						|
need to be learned to write code designed to run in a restricted
 | 
						|
environment.  And because the exact nature of the padded cell is
 | 
						|
determined by the supervisor, different restrictions can be imposed,
 | 
						|
depending on the application.  For example, it might be deemed
 | 
						|
``safe'' for untrusted code to read any file within a specified
 | 
						|
directory, but never to write a file.  In this case, the supervisor
 | 
						|
may redefine the built-in \function{open()} function so that it raises
 | 
						|
an exception whenever the \var{mode} parameter is \code{'w'}.  It
 | 
						|
might also perform a \cfunction{chroot()}-like operation on the
 | 
						|
\var{filename} parameter, such that root is always relative to some
 | 
						|
safe ``sandbox'' area of the filesystem.  In this case, the untrusted
 | 
						|
code would still see an built-in \function{open()} function in its
 | 
						|
environment, with the same calling interface.  The semantics would be
 | 
						|
identical too, with \exception{IOError}s being raised when the
 | 
						|
supervisor determined that an unallowable parameter is being used.
 | 
						|
 | 
						|
The Python run-time determines whether a particular code block is
 | 
						|
executing in restricted execution mode based on the identity of the
 | 
						|
\code{__builtins__} object in its global variables: if this is (the
 | 
						|
dictionary of) the standard \refmodule[builtin]{__builtin__} module,
 | 
						|
the code is deemed to be unrestricted, else it is deemed to be
 | 
						|
restricted.
 | 
						|
 | 
						|
Python code executing in restricted mode faces a number of limitations
 | 
						|
that are designed to prevent it from escaping from the padded cell.
 | 
						|
For instance, the function object attribute \member{func_globals} and
 | 
						|
the class and instance object attribute \member{__dict__} are
 | 
						|
unavailable.
 | 
						|
 | 
						|
Two modules provide the framework for setting up restricted execution
 | 
						|
environments:
 | 
						|
 | 
						|
\localmoduletable
 | 
						|
 | 
						|
\begin{seealso}
 | 
						|
  \seetitle[http://grail.sourceforge.net/]{Grail Home Page}
 | 
						|
           {Grail, an Internet browser written in Python, uses these
 | 
						|
            modules to support Python applets.  More
 | 
						|
            information on the use of Python's restricted execution
 | 
						|
            mode in Grail is available on the Web site.}
 | 
						|
\end{seealso}
 |