summaryrefslogtreecommitdiffstats
path: root/chrome/test/security_tests
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 23:55:29 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 23:55:29 +0000
commit09911bf300f1a419907a9412154760efd0b7abc3 (patch)
treef131325fb4e2ad12c6d3504ab75b16dd92facfed /chrome/test/security_tests
parent586acc5fe142f498261f52c66862fa417c3d52d2 (diff)
downloadchromium_src-09911bf300f1a419907a9412154760efd0b7abc3.zip
chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.gz
chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.bz2
Add chrome to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test/security_tests')
-rw-r--r--chrome/test/security_tests/SConscript91
-rw-r--r--chrome/test/security_tests/ipc_security_tests.cc217
-rw-r--r--chrome/test/security_tests/ipc_security_tests.h39
-rw-r--r--chrome/test/security_tests/security_tests.cc87
-rw-r--r--chrome/test/security_tests/security_tests.vcproj169
5 files changed, 603 insertions, 0 deletions
diff --git a/chrome/test/security_tests/SConscript b/chrome/test/security_tests/SConscript
new file mode 100644
index 0000000..39300c8
--- /dev/null
+++ b/chrome/test/security_tests/SConscript
@@ -0,0 +1,91 @@
+# Copyright 2008, Google 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:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * 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.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+# OWNER OR 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.
+
+Import('env')
+
+env = env.Clone()
+
+
+env.Prepend(
+ CPPPATH = [
+ '#/..',
+ ],
+ LINKFLAGS = [
+ '/INCREMENTAL',
+
+ '/MANIFEST',
+ '/DELAYLOAD:"dwmapi.dll"',
+ '/DELAYLOAD:"uxtheme.dll"',
+ '/MACHINE:X86',
+ '/FIXED:No',
+
+ '/safeseh',
+ '/dynamicbase',
+ '/ignore:4199',
+ '/nxcompat',
+
+ '/DEBUG',
+ ],
+ LIBS = [
+ 'wininet.lib',
+ 'version.lib',
+ 'msimg32.lib',
+ 'ws2_32.lib',
+ 'usp10.lib',
+ 'psapi.lib',
+ 'kernel32.lib',
+ 'user32.lib',
+ 'gdi32.lib',
+ 'winspool.lib',
+ 'comdlg32.lib',
+ 'advapi32.lib',
+ 'shell32.lib',
+ 'ole32.lib',
+ 'oleaut32.lib',
+ 'uuid.lib',
+ 'odbc32.lib',
+ 'odbccp32.lib',
+
+ 'DelayImp.lib',
+ ],
+)
+
+#/MANIFESTFILE:"C:\src\trunk-vs\chrome\Debug\obj\test_chrome_plugin\test_chrome_plugin.dll.intermediate.manifest"
+#/PDB:"c:\src\trunk-vs\chrome\Debug\test_chrome_plugin.pdb"
+
+input_files = [
+ 'ipc_security_tests.cc',
+ 'security_tests.cc',
+ '$SANDBOX_DIR/tests/validation_tests/commands${OBJSUFFIX}',
+]
+
+dll = env.SharedLibrary('security_tests', input_files)
+
+i = env.Install('$TARGET_ROOT', dll)
+env.Alias('chrome', i)
diff --git a/chrome/test/security_tests/ipc_security_tests.cc b/chrome/test/security_tests/ipc_security_tests.cc
new file mode 100644
index 0000000..e85e09b
--- /dev/null
+++ b/chrome/test/security_tests/ipc_security_tests.cc
@@ -0,0 +1,217 @@
+// Copyright 2008, Google 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:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR 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.
+
+#include <windows.h>
+#include <string>
+#include <sstream>
+
+#include "chrome/test/security_tests/ipc_security_tests.h"
+
+namespace {
+
+// Debug output messages prefix.
+const char kODSMgPrefix[] = "[security] ";
+// Format of the Chrome browser pipe for plugins.
+const wchar_t kChromePluginPipeFmt[] = L"\\\\.\\pipe\\chrome.%s.p%d";
+// Size for the in/out pipe buffers.
+const int kBufferSize = 1024;
+
+// Define the next symbol if you want to have tracing of errors.
+#ifdef PIPE_SECURITY_DBG
+// Generic debug output function.
+void ODSMessageGLE(const char* txt) {
+ DWORD gle = ::GetLastError();
+ std::ostringstream oss;
+ oss << kODSMgPrefix << txt << " 0x" << std::hex << gle;
+ ::OutputDebugStringA(oss.str().c_str());
+}
+#else
+void ODSMessageGLE(const char* txt) {
+}
+#endif
+
+// Retrieves the renderer pipe name from the command line. Returns true if the
+// name was found.
+bool PipeNameFromCommandLine(std::wstring* pipe_name) {
+ std::wstring cl(::GetCommandLineW());
+ const wchar_t key_name[] = L"--channel";
+ std::wstring::size_type pos = cl.find(key_name, 0);
+ if (std::wstring::npos == pos) {
+ return false;
+ }
+ pos = cl.find(L"=", pos);
+ if (std::wstring::npos == pos) {
+ return false;
+ }
+ ++pos;
+ size_t dst = cl.length() - pos;
+ if (dst <4) {
+ return false;
+ }
+ for (; dst != 0; --dst) {
+ if (!isspace(cl[pos])) {
+ break;
+ }
+ ++pos;
+ }
+ if (0 == dst) {
+ return false;
+ }
+ std::wstring::size_type pos2 = pos;
+ for (; dst != 0; --dst) {
+ if (isspace(cl[pos2])) {
+ break;
+ }
+ ++pos2;
+ }
+ *pipe_name = cl.substr(pos, pos2);
+ return true;
+}
+
+// Extracts the browser process id and the channel id given the renderer
+// pipe name.
+bool InfoFromPipeName(const std::wstring& pipe_name, std::wstring* parent_id,
+ std::wstring* channel_id) {
+ std::wstring::size_type pos = pipe_name.find(L".", 0);
+ if (std::wstring::npos == pos) {
+ return false;
+ }
+ *parent_id = pipe_name.substr(0, pos);
+ *channel_id = pipe_name.substr(pos + 1);
+ return true;
+}
+
+// Creates a server pipe, in byte mode.
+HANDLE MakeServerPipeBase(const wchar_t* pipe_name) {
+ HANDLE pipe = ::CreateNamedPipeW(pipe_name, PIPE_ACCESS_DUPLEX,
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 3,
+ kBufferSize, kBufferSize, 5000, NULL);
+ if (INVALID_HANDLE_VALUE == pipe) {
+ ODSMessageGLE("pipe creation failed");
+ }
+ return pipe;
+}
+
+// Creates a chrome plugin server pipe.
+HANDLE MakeServerPluginPipe(const std::wstring& prefix, int channel) {
+ wchar_t pipe_name[MAX_PATH];
+ swprintf_s(pipe_name, kChromePluginPipeFmt, prefix.c_str(), channel);
+ return MakeServerPipeBase(pipe_name);
+}
+
+struct Context {
+ HANDLE pipe;
+ Context(HANDLE arg_pipe) : pipe(arg_pipe) {
+ }
+};
+
+// This function is called from a thread that has a security context that is
+// higher than the renderer security context. This can be the plugin security
+// context or the browser security context.
+void DoEvilThings(Context* context) {
+ // To make the test fail we simply trigger a breakpoint in the renderer.
+ ::DisconnectNamedPipe(context->pipe);
+ __debugbreak();
+}
+
+// This is a pipe server thread routine.
+DWORD WINAPI PipeServerProc(void* thread_param) {
+ if (NULL == thread_param) {
+ return 0;
+ }
+ Context* context = static_cast<Context*>(thread_param);
+ HANDLE server_pipe = context->pipe;
+
+ char buffer[4];
+ DWORD bytes_read = 0;
+
+ for (;;) {
+ // The next call blocks until a connection is made.
+ if (!::ConnectNamedPipe(server_pipe, NULL)) {
+ if (GetLastError() != ERROR_PIPE_CONNECTED) {
+ ODSMessageGLE("== connect named pipe failed ==");
+ continue;
+ }
+ }
+ // return value of ReadFile is unimportant.
+ ::ReadFile(server_pipe, buffer, 1, &bytes_read, NULL);
+ if (::ImpersonateNamedPipeClient(server_pipe)) {
+ ODSMessageGLE("impersonation obtained");
+ DoEvilThings(context);
+ break;
+ } else {
+ ODSMessageGLE("impersonation failed");
+ }
+ ::DisconnectNamedPipe(server_pipe);
+ }
+ delete context;
+ return 0;
+}
+} // namespace
+
+// Implements a pipe impersonation attack resulting on a privilege elevation on
+// the chrome pipe-based IPC.
+// When a web-page that has a plug-in is loaded, chrome will do the following
+// steps:
+// 1) Creates a server pipe with name 'chrome.<pid>.p<n>'. Initially n = 1.
+// 2) Launches chrome with command line --type=plugin --channel=<pid>.p<n>
+// 3) The new (plugin) process connects to the pipe and sends a 'hello'
+// message.
+// The attack creates another server pipe with the same name before step one
+// so when the plugin connects it connects to the renderer instead. Once the
+// connection is acepted and at least a byte is read from the pipe, the
+// renderer can impersonate the plugin process which has a more relaxed
+// security context (privilege elevation).
+//
+// Note that the attack can also be peformed after step 1. In this case we need
+// another thread which used to connect to the existing server pipe so the
+// plugin does not connect to chrome but to our pipe.
+bool PipeImpersonationAttack() {
+ std::wstring pipe_name;
+ if (!PipeNameFromCommandLine(&pipe_name)) {
+ return false;
+ }
+ std::wstring parent_id;
+ std::wstring channel_id;
+ if (!InfoFromPipeName(pipe_name, &parent_id, &channel_id)) {
+ return false;
+ }
+ HANDLE plugin_pipe = MakeServerPluginPipe(parent_id, 1);
+ if (INVALID_HANDLE_VALUE == plugin_pipe) {
+ return true;
+ }
+
+ HANDLE thread = ::CreateThread(NULL, 0, PipeServerProc,
+ new Context(plugin_pipe), 0, NULL);
+ if (NULL == thread) {
+ return false;
+ }
+ ::CloseHandle(thread);
+ return true;
+}
diff --git a/chrome/test/security_tests/ipc_security_tests.h b/chrome/test/security_tests/ipc_security_tests.h
new file mode 100644
index 0000000..8706570
--- /dev/null
+++ b/chrome/test/security_tests/ipc_security_tests.h
@@ -0,0 +1,39 @@
+// Copyright 2008, Google 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:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR 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.
+
+#ifndef CHROME_TEST_SECURITY_TESTS_IPC_SECURITY_TESTS_H__
+#define CHROME_TEST_SECURITY_TESTS_IPC_SECURITY_TESTS_H__
+
+// Impersonates a chrome server pipe. See the implementation for details.
+// Returns false if the attack could not be set. If it returns true then
+// it spawns a thread that will terminate the renderer if the attack is
+// successful.
+bool PipeImpersonationAttack();
+
+#endif // CHROME_TEST_SECURITY_TESTS_IPC_SECURITY_TESTS_H__
diff --git a/chrome/test/security_tests/security_tests.cc b/chrome/test/security_tests/security_tests.cc
new file mode 100644
index 0000000..e86df13
--- /dev/null
+++ b/chrome/test/security_tests/security_tests.cc
@@ -0,0 +1,87 @@
+// Copyright 2008, Google 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:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR 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.
+
+#include <windows.h>
+#include <string>
+
+#define TEST_INJECTION_DLL
+#include "chrome/test/injection_test_dll.h"
+#include "chrome/test/security_tests/ipc_security_tests.h"
+#include "sandbox/tests/common/controller.h"
+#include "sandbox/tests/validation_tests/commands.h"
+
+#define SECURITY_CHECK(x) (*test_count)++; \
+ if (SBOX_TEST_DENIED != x) { \
+ return FALSE; \
+ };
+
+BOOL APIENTRY DllMain(HMODULE module, DWORD ul_reason_for_call,
+ LPVOID lpReserved) {
+ return TRUE;
+}
+
+// Runs the security tests of sandbox for the renderer process.
+// If a test fails, the return value is FALSE and test_count contains the
+// number of tests executed, including the failing test.
+BOOL __declspec(dllexport) __cdecl RunRendererTests(int *test_count) {
+ using namespace sandbox;
+ *test_count = 0;
+ SECURITY_CHECK(TestOpenReadFile(L"%SystemDrive%"));
+ SECURITY_CHECK(TestOpenReadFile(L"%SystemRoot%"));
+ SECURITY_CHECK(TestOpenReadFile(L"%ProgramFiles%"));
+ SECURITY_CHECK(TestOpenReadFile(L"%SystemRoot%\\System32"));
+ SECURITY_CHECK(TestOpenReadFile(L"%SystemRoot%\\explorer.exe"));
+ SECURITY_CHECK(TestOpenReadFile(L"%SystemRoot%\\Cursors\\arrow_i.cur"));
+ SECURITY_CHECK(TestOpenReadFile(L"%AllUsersProfile%"));
+ SECURITY_CHECK(TestOpenReadFile(L"%Temp%"));
+ SECURITY_CHECK(TestOpenReadFile(L"%AppData%"));
+ SECURITY_CHECK(TestOpenKey(HKEY_LOCAL_MACHINE, L""));
+ SECURITY_CHECK(TestOpenKey(HKEY_CURRENT_USER, L""));
+ SECURITY_CHECK(TestOpenKey(HKEY_USERS, L""));
+ SECURITY_CHECK(TestOpenKey(HKEY_LOCAL_MACHINE,
+ L"Software\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon"));
+ // Test below run on a separate thread because they cannot block the
+ // renderer process. Therefore they do not return a meaningful value.
+ PipeImpersonationAttack();
+ return TRUE;
+}
+
+// Runs the security tests of sandbox for the plugin process.
+// If a test fails, the return value is FALSE and test_count contains the
+// number of tests executed, including the failing test.
+BOOL __declspec(dllexport) __cdecl RunPluginTests(int *test_count) {
+ using namespace sandbox;
+ *test_count = 0;
+ SECURITY_CHECK(TestOpenWriteFile(L"%SystemRoot%"));
+ SECURITY_CHECK(TestOpenWriteFile(L"%ProgramFiles%"));
+ SECURITY_CHECK(TestOpenWriteFile(L"%SystemRoot%\\System32"));
+ SECURITY_CHECK(TestOpenWriteFile(L"%SystemRoot%\\explorer.exe"));
+ SECURITY_CHECK(TestOpenWriteFile(L"%SystemRoot%\\Cursors\\arrow_i.cur"));
+ return TRUE;
+}
diff --git a/chrome/test/security_tests/security_tests.vcproj b/chrome/test/security_tests/security_tests.vcproj
new file mode 100644
index 0000000..1149b68
--- /dev/null
+++ b/chrome/test/security_tests/security_tests.vcproj
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="security_tests"
+ ProjectGUID="{E750512D-FC7C-4C98-BF04-0A0DAF882055}"
+ RootNamespace="security_tests"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\debug.vsprops"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\release.vsprops"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\..\sandbox\tests\validation_tests\commands.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\sandbox\tests\validation_tests\commands.h"
+ >
+ </File>
+ <File
+ RelativePath="..\injection_test_dll.h"
+ >
+ </File>
+ <File
+ RelativePath=".\ipc_security_tests.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\ipc_security_tests.h"
+ >
+ </File>
+ <File
+ RelativePath=".\security_tests.cc"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>