Использование песочницы Google Chrome [закрыто]

есть несколько ресурсов, которые объясняют, как песочницы в Chrome работает и что она делает для защиты пользователей от вредоносного кода.

Chromium Blog
Документация Разработчика Chromium
песочнице часто задаваемые вопросы

Это здорово, и мне нравится ОС-ориентированный дизайн, который они имеют на месте (несколько "ОС, вероятно, знает, как обеспечить себя лучше, чем мы, поэтому мы позволяем ему" подход.) Они также упоминают в нескольких местах, что сама песочница была разработана, чтобы не зависеть от Chrome, а вместо этого более или менее автономным, так что теоретически любой процесс может быть изолирован до тех пор, пока архитектура программы совместима (изолированный код должен работать как свой собственный процесс в качестве потомка не изолированного родителя.)

У меня просто есть приложение, дизайн которого делает его зрелым для песочницы, и смог заставить Родительский/дочерний процесс работать с ним. У меня есть код Chromium и... понятия не имею, что делать дальше.

кто-нибудь там на самом деле песочница что-нибудь с этим еще? Есть ли какие-либо ресурсы, которые документируют его использование или API? Я бы предположил, что это должно быть довольно просто, но я не знаю, с чего начать.

EDIT: моя находка ниже в ответах!

2 ответов


хорошо, вот что я нашел о коде песочницы с Chrome.

во-первых, вам нужно пойти получить исходный код chromium. Это большой, и займет некоторое время, чтобы получить, но я еще не нашел надежных ярлыков для проверки, что все еще yeild полезные результаты. Алос, очень важно, чтобы вы очень внимательно следовали инструкциям на этой странице. Команда Google знает, что делает, и не увлекается бесполезными шагами. Все на этом страница необходима. Да. Всё.

Теперь, как только вы получите источник, Вам на самом деле не нужно строить chrome целиком (что может занять несколько часов!) использовать песочницу. Вместо этого они были достаточно хороши, чтобы дать вам отдельное решение песочницы (найдено в папке песочницы), которое может создавать автономные. Построить этот проект и убедитесь, что все компилируется. Если это так, отлично! Если это не так, вы не выполнили шаги на странице сборки, не так ли? Опусти голову от стыда и иди. сделать это в этот раз. Не волнуйся, я подожду...

Теперь, когда все построено, ваша главная достопримечательность - проект sandbox_poc ("poc" = доказательство концепции). Этот проект в основном является минимальной оболочкой GUI вокруг песочницы, которая запустит произвольную dll в заданной точке входа в изолированной среде. Он показывает все необходимые шаги для создания и использования песочницы и является лучшей ссылкой, которую вы получили. Обращайтесь к нему почаще!

как вы смотрите через код вы, вероятно, заметите, что код на самом деле песочницы сам по себе. Это очень распространено во всех примерах sandbox, и по этой теме (который может быть устаревшим), возможно, единственный рабочий способ песочницы на данный момент. Поток описывает, как теоретически можно изолировать отдельный процесс, но я его не пробовал. Однако, чтобы быть в безопасности, наличие самозваного приложения является" известным хорошим " методом.

sandbox_proc включает в себя множество статических библиотек, но они появляются в основном на примере ИП, который они построили. Единственные, которые я нашел, которые, похоже, требуются для минимальной песочницы:

sandbox.lib base.lib dbghelp.lib

есть еще одна зависимость, которая не совсем очевидна из-за просмотра проекта, хотя, и это то, что я попал в самую длинную. При построении решения песочницы один из выходных файлов должен быть"wowhelper.exe". Хотя он нигде не упоминается, этот файл должен быть скопирован в тот же каталог, что и исполняемый файл изолирование! Если это не так, ваши попытки изолировать ваш код всегда будут терпеть неудачу с общей ошибкой "файл не найден". Это может быть очень неприятно, если вы не знаете, что происходит! Теперь я разрабатываю Windows 7 64bit, что может иметь какое-то отношение к требованию wowhelper (WOW-это общая аббревиатура для приложений взаимодействия между 16/32/64bit), но у меня нет хорошего способа тестирования этого прямо сейчас. Пожалуйста, дайте мне знать, если кто-нибудь узнает больше!

Так что это все окружающая среда материал, вот немного кода smaple, чтобы вы пошли! Обратите внимание, что, хотя я использую 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);
    }
}

надеюсь, этого достаточно, чтобы получить любые другие любопытные кодеры песочницы! Удачи!


Я не уверен, какой именно ответ вы хотите... Первое, что вам нужно сделать, это проверить исходный код Chrome ссылка. Нас интересует вот что:--4-->

песочница: проект песочницы, который пытается предотвратить взломанный рендерер от изменения системы.

Spelunking вокруг этого кода и поиск ссылок API в части рендеринга Chromium может помочь.

отображения: код для подпроцесс на каждой вкладке. Это встраивает WebKit и разговаривает с браузером для ввода-вывода

пойдите посмотрите вокруг, вы, вероятно, можете увидеть, как Google сами используют свою песочницу, я ожидаю, что это будет что-то похожее на

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

обычно это подход, который я использую при встрече с новой базой кода, проверьте, как она вызывается.