| Index: sandbox/linux/seccomp/securemem.h
|
| ===================================================================
|
| --- sandbox/linux/seccomp/securemem.h (revision 57969)
|
| +++ sandbox/linux/seccomp/securemem.h (working copy)
|
| @@ -1,205 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef SECURE_MEM_H__
|
| -#define SECURE_MEM_H__
|
| -
|
| -#include <stdlib.h>
|
| -#include "linux_syscall_support.h"
|
| -
|
| -namespace playground {
|
| -
|
| -class SecureMem {
|
| - public:
|
| - // Each thread is associated with two memory pages (i.e. 8192 bytes). This
|
| - // memory is fully accessible by the trusted process, but in the trusted
|
| - // thread and the sandboxed thread, the first page is only mapped PROT_READ,
|
| - // and the second one is PROT_READ|PROT_WRITE.
|
| - //
|
| - // The first page can be modified by the trusted process and this is the
|
| - // main mechanism how it communicates with the trusted thread. After each
|
| - // update, it updates the "sequence" number. The trusted process must
|
| - // check the "sequence" number has the expected value, and only then can
|
| - // it trust the data in this page.
|
| - typedef struct Args {
|
| - union {
|
| - struct {
|
| - union {
|
| - struct {
|
| - struct Args* self;
|
| - long sequence;
|
| - long callType;
|
| - long syscallNum;
|
| - void* arg1;
|
| - void* arg2;
|
| - void* arg3;
|
| - void* arg4;
|
| - void* arg5;
|
| - void* arg6;
|
| -
|
| - // Used by clone() to allow return from the syscall wrapper.
|
| - void* ret;
|
| - #if defined(__x86_64__)
|
| - void* rbp;
|
| - void* rbx;
|
| - void* rcx;
|
| - void* rdx;
|
| - void* rsi;
|
| - void* rdi;
|
| - void* r8;
|
| - void* r9;
|
| - void* r10;
|
| - void* r11;
|
| - void* r12;
|
| - void* r13;
|
| - void* r14;
|
| - void* r15;
|
| - #elif defined(__i386__)
|
| - void* ebp;
|
| - void* edi;
|
| - void* esi;
|
| - void* edx;
|
| - void* ecx;
|
| - void* ebx;
|
| - #else
|
| - #error Unsupported target platform
|
| - #endif
|
| -
|
| - // Used by clone() to set up data for the new thread.
|
| - struct Args* newSecureMem;
|
| - int processFdPub;
|
| - int cloneFdPub;
|
| -
|
| - // Set to non-zero, if in debugging mode
|
| - int allowAllSystemCalls;
|
| -
|
| - // The most recent SysV SHM identifier returned by
|
| - // shmget(IPC_PRIVATE)
|
| - int shmId;
|
| -
|
| - // The following entries make up the sandboxed thread's TLS
|
| - long long cookie;
|
| - long long threadId;
|
| - long long threadFdPub;
|
| - } __attribute__((packed));
|
| - char header[512];
|
| - };
|
| - // Used for calls such as open() and stat().
|
| - char pathname[4096 - 512];
|
| - } __attribute__((packed));
|
| - char securePage[4096];
|
| - };
|
| - union {
|
| - struct {
|
| - // This scratch space is used by the trusted thread to read parameters
|
| - // for unrestricted system calls.
|
| - int tmpSyscallNum;
|
| - void* tmpArg1;
|
| - void* tmpArg2;
|
| - void* tmpArg3;
|
| - void* tmpArg4;
|
| - void* tmpArg5;
|
| - void* tmpArg6;
|
| - void* tmpReturnValue;
|
| -
|
| - // Scratch space used to return the result of a rdtsc instruction
|
| - int rdtscpEax;
|
| - int rdtscpEdx;
|
| - int rdtscpEcx;
|
| -
|
| - // We often have long sequences of calls to gettimeofday(). This is
|
| - // needlessly expensive. Coalesce them into a single call.
|
| - int lastSyscallNum;
|
| - int gettimeofdayCounter;
|
| -
|
| - // For debugging purposes, we want to be able to log messages. This can
|
| - // result in additional system calls. Make sure that we don't trigger
|
| - // logging of those recursive calls.
|
| - int recursionLevel;
|
| -
|
| - // Computing the signal mask is expensive. Keep a cached copy.
|
| - kernel_sigset_t signalMask;
|
| -
|
| - // Keep track of whether we are in a SEGV handler
|
| - int inSegvHandler;
|
| - } __attribute__((packed));
|
| - char scratchPage[4096];
|
| - };
|
| - } __attribute__((packed)) Args;
|
| -
|
| - // Allows the trusted process to check whether the parent process still
|
| - // exists. If it doesn't, kill the trusted process.
|
| - static void dieIfParentDied(int parentProc);
|
| -
|
| - // The trusted process received a system call that it intends to deny.
|
| - static void abandonSystemCall(int fd, int err);
|
| -
|
| - // Acquires the syscall_mutex_ prior to making changes to the parameters in
|
| - // the secure memory page. Used by calls such as exit(), clone(), open(),
|
| - // socketcall(), and stat().
|
| - // After locking the mutex, it is no longer valid to abandon the system
|
| - // call!
|
| - static void lockSystemCall(int parentProc, Args* mem);
|
| -
|
| - // Sends a system call to the trusted thread. If "locked" is true, the
|
| - // caller must first call lockSystemCall() and must also provide
|
| - // "parentProc". In locked mode, sendSystemCall() won't return until the
|
| - // trusted thread has completed processing.
|
| - // Use sparingly as it serializes the operation of the trusted process.
|
| - static void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum);
|
| - }
|
| - template<class T1> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1);
|
| - }
|
| - template<class T1, class T2> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1, T2 arg2) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1, (void*)arg2);
|
| - }
|
| - template<class T1, class T2, class T3> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1, T2 arg2, T3 arg3) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1, (void*)arg2, (void*)arg3);
|
| - }
|
| - template<class T1, class T2, class T3, class T4> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1, (void*)arg2, (void*)arg3, (void*)arg4);
|
| - }
|
| - template<class T1, class T2, class T3, class T4, class T5> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1, T2 arg2, T3 arg3, T4 arg4,
|
| - T5 arg5) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1, (void*)arg2, (void*)arg3, (void*)arg4,
|
| - (void*)arg5);
|
| - }
|
| - template<class T1, class T2, class T3, class T4, class T5, class T6> static
|
| - void sendSystemCall(int fd, bool locked, int parentProc, Args* mem,
|
| - int syscallNum, T1 arg1, T2 arg2, T3 arg3, T4 arg4,
|
| - T5 arg5, T6 arg6) {
|
| - sendSystemCallInternal(fd, locked, parentProc, mem, syscallNum,
|
| - (void*)arg1, (void*)arg2, (void*)arg3, (void*)arg4,
|
| - (void*)arg5, (void*)arg6);
|
| - }
|
| -
|
| - private:
|
| - static void sendSystemCallInternal(int fd, bool locked, int parentProc,
|
| - Args* mem, int syscallNum, void* arg1 = 0,
|
| - void* arg2 = 0, void* arg3 = 0,
|
| - void* arg4 = 0, void* arg5 = 0,
|
| - void* arg6 = 0);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -#endif // SECURE_MEM_H__
|
|
|