blob: 651fdad1650dcdb884f99eb8c4becfab3a7dba91 [file] [log] [blame]
/*
* Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*!
* @header WebKit Mac Sandbox
*
* This header provides an *EXPERIMENTAL* API for NPAPI plug-ins that wish
* to reduce their runtime privileges. When entering the sandbox, adopting
* plug-ins specify a whitelist of files they wish to have available for
* reading and writing. Plug-ins that need to have access to arbitrary files,
* such as to enable user-initiated file uploads or downloads, can invoke
* native Cocoa APIs, which will automatically grant permissions to the plug-in.
*
*
* Security characteristics
*
* Sandboxed plug-in's local file access is restricted to the union of:
*
* 1. The file whitelist specified by the plug-in when entering the sandbox.
* 2. Any files obtained at runtime through the secure Open and Save dialogs.
* 3. Any files that were open before entering the sandbox.
*
* Implementation may additionally choose to restrict the creation of IPC
* channels or the use of other security-sensitive system resources, such as
* the ability to spawn additional processes. However, any such resources
* acquired before entry into the sandbox are guaranteed to remain available
* within it. For example, plug-ins are free to spawn a trusted broker process
* before entering the sandbox and to establish an IPC channel with it. The
* channel will remain available within the sandbox even if the implementation
* is highly restrictive and allows neither process creation nor IPC channel
* establishment.
*/
#ifndef npapi_sandbox_h
#define npapi_sandbox_h
#ifdef __cplusplus
extern "C" {
#endif
/*!
* @constant WKNVSandboxFunctions
* Use this constant with NPN_GetValue to get a pointer to WKNSandboxFunctions
* structure, which contains pointers to sandboxing functions.
*/
#define WKNVSandboxFunctions 74659
/*!
* Version of WKNSandboxFunctions structure that is returned by NPN_GetValue.
*/
#define WKNVSandboxFunctionsVersionCurrent 1
/*!
* @function WKN_EnterSandbox
* Requests that the plug-in instance be placed in a sandbox.
*
* @param readOnlyPaths
* NULL-terminated C array of paths to files and directories that the plug-in
* wishes to have available in the sandbox for read-only access. Any
* directories in this array will automatically extend the sandbox to encompass
* all their files and subdirectories, meaning that they will be available
* through OS level file access functions for reading.
*
* @param readWritePaths
* NULL-terminated C array of paths to files and directories that the plug-in
* wishes to have available in the sandbox for both reading and writing.
* Typically, this array will include paths to the plug-in's local caches, a
* directory for temporary files, and any configuration files which are not
* security sensitive, in that they are not consulted when determining the
* lists of paths to pass to this function during plug-in instantiation.
* Any directories in this array will automatically extend the sandbox to
* encompass all their files and subdirectories, meaning that they will be
* available through OS level file access functions for reading and writing.
*
* @result
* Places the plug-in instance in a sandbox. The sandbox allows read-only access
* to paths specified by `readOnlyPaths` and read-write access to
* `readWritePaths`. If the same path appears in both `readOnlyPaths` and
* `readWritePaths`, access to that path will be read-only. No other filesystem
* access is available except as expressly permitted by the user through
* NSOpenPanel and NSSavePanel invocations. Returns NPERR_NO_ERROR when the
* navigator has successfully placed the plug-in in a sandbox and
* NPERR_GENERIC_ERROR if the the plug-in instance was already placed in a sandbox
* with a prior call to this function. If entering sandbox fails for any other reason,
* the process is terminated.
* Note that either or both `readOnlyPaths` and `readWritePaths` may be NULL.
*
* @discussion
* This function should be called as early as possible during plug-in
* instantiation and ALWAYS before any untrusted code has run. Generally, the
* only things that the plug-in should do before entering the sandbox are to
* determine the paths to pass in as `readOnlyPaths` and `readWritePaths`, and
* to establish any IPC channels to be used from the sandbox. In cases where
* the plug-in must parse its configuration files to determine any needed local
* resources (such as files to preload), it should do so and then immediately
* call this function. If configuration files do not influence the paths that
* the plug-in will pass as part of `readOnlyPaths` and `readWritePaths`, the
* plug-in should enter the sandbox first and only then process configuration
* files and deal with normal startup tasks.
*
* Very close attention must be paid to weeding out security-sensitive files
* from the `readWritePaths` list. If the plug-in instance reads a configuration
* file at startup to determine which additional files it will place in the
* `readWritePaths` list to this call, then that configuration file MUST NOT be
* in the `readWritePaths` itself. Otherwise, should the plug-in become
* compromised, it can trivially escape its sandbox the next time it is
* instantiated by writing arbitrary paths (or just "/") into this writable
* configuration file.
*
* Note that after a plug-in instance enters the sandbox, any native calls that
* it makes which refer to arbitrary paths on disk will only work if the paths are
* available within the sandbox, either statically through `readOnlyPaths` and
* `readWritePaths`, or dynamically through Cocoa APIs.
* However, NPAPI calls (such as e.g. NPN_PostURL with the file parameter set to TRUE)
* can access files that navigator policies allow, which is usually an entirely
* different set for remote and for local Web pages.
*/
typedef NPError (*WKN_EnterSandboxProcPtr)(const char *readOnlyPaths[], const char *readWritePaths[]);
/*!
* @function WKN_FileStopAccessing
* Requests that the navigator revoke the plug-in's access to the given path.
*
* @param path
* Required. A path that was previously returned from NSOpenPanel or NSSavePanel.
*
* @result
* Returns NPERR_NO_ERROR, or NPERR_GENERIC_ERROR if the requesting plug-in
* instance is not in a sandbox.
*
* @discussion
* Whenever file access is provided to a plug-in instance through a
* Cocoa API, navigator should be notfied when it is no longer needed.
* This will cause subsequent open(2) calls on any of the revoked files to fail,
* but by design no attempt is made to invalidate existing file descriptors.
* plug-in writers are strongly encouraged to keep files open for as short a period
* of time as possible, and to always call this function when objects representing
* the returned files go out of scope or are otherwise destroyed.
*/
typedef NPError (*WKN_FileStopAccessingProcPtr)(const char* path);
typedef struct _WKNSandboxFunctions {
uint16_t size;
uint16_t version;
WKN_EnterSandboxProcPtr enterSandbox;
WKN_FileStopAccessingProcPtr fileStopAccessing;
} WKNSandboxFunctions;
#ifdef __cplusplus
}
#endif
#endif // npapi_sandbox_h