使用谷歌Chrome沙盒
这里有几个资源解释了Chrome中的沙箱是如何工作的以及如何保护用户免受恶意代码的侵害。
铬博客
Chromium开发者文档
沙盒常见问题
这很好,而且我喜欢他们所使用的以操作系统为中心的devise(有些“操作系统可能知道如何保护自己比我们更好,所以我们让它”)。他们还提到在几个地方,沙箱本身被devise成不依赖于Chrome,而是多多lessless的独立,所以只要程序架构是兼容的,理论上任何进程都可以被沙箱化(沙箱代码必须作为它自己的进程非沙盒家长。)
我只是碰巧有一个应用程序,它的devise使得沙盒成熟,并能够得到一个父/子过程使用它。 我有Chromium代码,不知道下一步该怎么做。
有没有人真的用这个沙盒什么呢? 有没有资源logging它的使用情况或API? 我可以想象它应该是非常简单的,但我从哪里开始的损失。
编辑:我的发现下面的答案!
好的,这是我用Chrome发现的沙盒代码。
首先,你需要去获取铬源代码 。 这是很大的 ,将需要一段时间才能得到,但我还没有find任何可靠的捷径来检查,仍然yeild可用的结果。 阿洛斯,这是非常重要的,你非常紧密地按照该页面上的说明。 Google的工作人员知道他们在做什么,并不热衷于无用的步骤。 该页面上的一切都是必要的。 是。 一切。
现在,一旦你获得了源代码,你就不需要整个构buildchrome(这可能需要几个小时!)来使用沙盒。 相反,他们已经足够好,为您提供独立的沙盒解决scheme(可在沙箱文件夹中find)。 build立这个项目,并确保一切编译。 如果确实如此,太棒了! 如果没有,你没有按照生成页面上的步骤,是吗? 羞于垂头,这次真的去做吧。 别担心,我会等的…
现在,一切都build立了你的主要兴趣点是sandbox_poc项目(“poc”=概念certificate)。 这个项目基本上是沙箱周围的一个最小的GUI包装,它将在沙箱环境中的给定入口点启动一个任意的dll。 它显示了创build和使用沙箱所需的所有步骤,并且是您所获得的最佳参考。 经常参考!
当你浏览代码时,你可能会注意到它实际上是沙盒的代码本身。 这在所有的沙箱实例中都是非常常见的, 根据这个线程 (可能已经过时)可能是目前沙箱的唯一工作方式。 线程描述了理论上如何沙箱一个单独的过程,但我没有尝试过。 然而,为了安全起见,有一个自我调用的应用程序是“已知的好”的方法。
sandbox_proc包含许多静态库,但它们似乎主要是针对他们构build的示例UI。 我发现的似乎是最小的沙箱需要的唯一的是:
sandbox.lib base.lib dbghelp.lib
还有另外一个依赖项目,虽然这个项目看起来并不是很明显,但这也是我最长时间被捕的原因。 当您构build沙盒解决scheme时,其中一个输出文件应该是“ wowhelper.exe
”。 尽pipe从来没有提到这个文件,但是这个文件必须被复制到你正在使用的可执行文件所在的目录中。 如果不是这样,那么你的沙箱代码尝试总是会失败,出现一个通用的“文件未find”错误。 如果你不知道发生了什么,这可能是非常令人沮丧的! 现在,我正在开发Windows 7 64位,这可能与wowhelper要求有关(WOW是16/32/64位互操作应用程序的常用缩写),但是我没有一个很好的方法来testing马上。 请让我知道是否有人发现更多!
所以这就是所有的环境的东西,这是一个简单的代码让你走! 请注意,虽然我在这里的subprocess中使用了wcout,但在沙箱中运行时看不到任何控制台输出。 任何类似的东西都需要通过IPC传递给父进程。
#include <sandbox/src/sandbox.h> #include <sandbox/src/sandbox_factory.h> #include <iostream> using namespace std; int RunParent(int argc, wchar_t* argv[], sandbox::BrokerServices* broker_service) { if (0 != broker_service->Init()) { wcout << L"Failed to initialize the BrokerServices object" << endl; return 1; } PROCESS_INFORMATION pi; sandbox::TargetPolicy* policy = broker_service->CreatePolicy(); // Here's where you set the security level of the sandbox. Doing a "goto definition" on any // of these symbols usually gives you a good description of their usage and alternatives. policy->SetJobLevel(sandbox::JOB_LOCKDOWN, 0); policy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, sandbox::USER_LOCKDOWN); policy->SetAlternateDesktop(true); policy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); //Add additional rules here (ie: file access exceptions) like so: policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, sandbox::TargetPolicy::FILES_ALLOW_ANY, "some/file/path"); sandbox::ResultCode result = broker_service->SpawnTarget(argv[0], GetCommandLineW(), policy, &pi); policy->Release(); policy = NULL; if (sandbox::SBOX_ALL_OK != result) { wcout << L"Sandbox failed to launch with the following result: " << result << endl; return 2; } // Just like CreateProcess, you need to close these yourself unless you need to reference them later CloseHandle(pi.hThread); CloseHandle(pi.hProcess); broker_service->WaitForAllTargets(); return 0; } int RunChild(int argc, wchar_t* argv[]) { sandbox::TargetServices* target_service = sandbox::SandboxFactory::GetTargetServices(); if (NULL == target_service) { wcout << L"Failed to retrieve target service" << endl; return 1; } if (sandbox::SBOX_ALL_OK != target_service->Init()) { wcout << L"failed to initialize target service" << endl; return 2; } // Do any "unsafe" initialization code here, sandbox isn't active yet target_service->LowerToken(); // This locks down the sandbox // Any code executed at this point is now sandboxed! TryDoingSomethingBad(); return 0; } int wmain(int argc, wchar_t* argv[]) { sandbox::BrokerServices* broker_service = sandbox::SandboxFactory::GetBrokerServices(); // A non-NULL broker_service means that we are not running the the sandbox, // and are therefore the parent process if(NULL != broker_service) { return RunParent(argc, argv, broker_service); } else { return RunChild(argc, argv); } }
希望这足以让任何其他好奇的编码器沙盒! 祝你好运!
我不确定你想要什么types的答案…你应该做的第一件事是检查Chrome源代码参考 。 我们感兴趣的是:
沙箱:试图防止黑客渲染器修改系统的沙箱项目。
探讨这些代码,并在Chromium的渲染部分寻找API参考可能会有所帮助。
渲染器:每个选项卡中subprocess的代码。 这embeddedWebKit和谈判浏览器的I / O。
去看看那里,你可能会看到谷歌自己是如何使用他们的沙箱,我希望这将是类似的东西
//Lets start up the sandbox, I'm using the Chrome Blog example TargetPolicy::SetTokenLevel() TargetPolicy::SetJobLevel() TargetPolicy::SetIntegrityLevel() TargetPolicy::SetDesktop()
一般来说,这是我遇到一个新的代码库时使用的方法,请检查它是如何被调用的。