代码之家  ›  专栏  ›  技术社区  ›  Toji

使用Google Chrome沙盒[关闭]

  •  38
  • Toji  · 技术社区  · 15 年前

    有几个资源可以解释Chrome中的沙盒是如何工作的,以及它如何保护用户免受恶意代码的攻击。

    Chromium Blog
    Chromium Developer Documentation
    Sandbox FAQ

    这太好了,我喜欢他们已经到位的以操作系统为中心的设计(有点像“操作系统可能比我们更了解如何保护自己,所以我们让它”的方法)。他们在一些地方也提到沙盒本身设计成不依赖Chrome,而是或多或少独立,这样理论上任何进程都可以只要程序的体系结构是兼容的(沙盒代码必须作为非沙盒父进程的子进程运行)。

    我只是碰巧有一个应用程序,它的设计使它适合沙盒化,并且能够让父/子进程处理它。我有铬代码,而且…不知道下一步该做什么。

    有没有人用这个沙盒做过什么?是否有任何资源记录它的使用情况或API?我想应该很简单,但我不知从哪里开始。

    编辑:我在下面的答案中的发现!

    2 回复  |  直到 13 年前
        1
  •  31
  •   Toji    15 年前

    好的,下面是我发现的关于用chrome进行代码沙盒处理的内容。

    首先,你得走了 get the chromium source code . 这是 大的 ,需要一段时间,但我还没有找到任何可靠的快捷方式来签出仍然可用的结果。阿洛斯,非常重要的是你要非常仔细地遵循那一页上的说明。谷歌的工作人员知道他们在做什么,也不热衷于无用的步骤。那一页上的一切都是必要的。对。一切。

    现在,一旦你得到了源代码,你就不需要构建完整的Chrome(这需要几个小时!)使用沙盒。相反,它们已经足够好了,可以为您提供单独的沙盒解决方案(在沙盒文件夹中找到),可以独立构建。构建这个项目并确保所有内容都能编译。如果有,太好了!如果没有,您没有按照构建页面上的步骤操作,是吗?羞愧地低下你的头,这次就去做吧。别担心,我等一下……

    现在,所有的东西都建立了您的主要兴趣点,那就是沙盒POC项目(“POC”=Proof of Concept)。这个项目基本上是围绕沙盒的一个最小的GUI包装器,它将在沙盒环境中的给定入口点启动一个任意的DLL。它显示了创建和使用沙盒所需的所有步骤,并且是关于您拥有的最佳参考的。经常参考!

    在查看代码时,您可能会注意到它实际上是沙盒本身的代码。这在所有沙盒示例中都很常见,并且 according to this thread (可能过时了)可能是目前沙箱的唯一工作方式。线程描述了理论上如何对一个单独的进程进行沙盒处理,但我没有尝试过。不过,为了安全起见,拥有一个自动调用的应用程序是“已知良好”的方法。

    Sandbox_proc包含大量静态lib,但它们似乎主要是针对它们构建的示例用户界面。我发现只有一个似乎是最小沙箱所必需的是:

    sandbox.lib base.lib dbghelp.lib
    

    然而,从这个项目的角度来看,还有另一个不完全明显的依赖性,这也是我最长接触到的。构建沙盒解决方案时,其中一个输出文件应该是“ wowhelper.exe “。尽管从未在任何地方提到过,但必须将此文件复制到与您正在沙盒中的可执行文件相同的目录中!如果不是这样,您尝试沙盒您的代码将总是失败,并出现一般的“找不到文件”错误。如果你不知道发生了什么事情,这会让你很沮丧!现在,我正在开发Windows7 64位,这可能与Wowhelper的要求有关(wow是16/32/64位之间互操作应用程序的常用缩写),但我现在没有一个好的测试方法。如果有人发现更多,请告诉我!

    所以这就是所有的环境问题,这里有一些简单的代码让你去!请注意,虽然我在这里的子进程中使用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);
        }
    }
    

    希望这足以让任何其他好奇的编码人员沙盒!祝你好运!

        2
  •  2
  •   Daniel Goldberg    15 年前

    我不确定你到底想要什么样的答案… 首先要做的是检查chrome源代码 reference . 我们感兴趣的是:

    沙盒:沙盒项目,它试图阻止被黑客攻击的渲染器修改系统。

    围绕这段代码进行深入研究,并在chromium的呈现部分寻找API引用可能会有所帮助。

    渲染器:每个选项卡中的子进程的代码。这将嵌入WebKit并与浏览器进行I/O对话。

    看看那里,你可能会看到谷歌自己是如何使用他们的沙盒的,我希望它会是类似的

    //Lets start up the sandbox, I'm using the Chrome Blog example
    TargetPolicy::SetTokenLevel()
    TargetPolicy::SetJobLevel()
    TargetPolicy::SetIntegrityLevel()
    TargetPolicy::SetDesktop()
    

    通常,这是我在遇到新的代码库时使用的方法,检查如何调用它。