Подтвердить что ты не робот

Использование песочницы Google Chrome

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

Блог Chromium
Документация для разработчиков Chromium
Часто задаваемые вопросы о песочках

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

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

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

EDIT: мои ответы ниже в ответах!

4b9b3361

Ответ 1

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

Прежде всего, вам нужно пойти получить исходный код хрома. Это большой, и потребуется некоторое время, чтобы получить, но я еще не нашел надежных ярлыков для проверки, которые все еще пригодны для использования. Алос, очень важно, чтобы вы следуете инструкциям на этой странице ОЧЕНЬ ЗАКРЫТЬ. Команда Google знает, что они делают, и не стремится к бесполезным шагам. Все на этой странице необходимо. Да. Все.

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

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

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

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

sandbox.lib base.lib dbghelp.lib

Там другая зависимость, которая не совсем очевидна, если посмотреть на проект, и это то, что я догнал дольше всего. Когда вы строите решение для песочницы, один из выходных файлов должен быть "wowhelper.exe". Хотя он никогда нигде не упоминается, этот файл должен быть скопирован в тот же каталог, что и исполняемый файл, который вы выполняете в песочнице! Если это не так, ваши попытки изолировать ваш код всегда будут терпеть неудачу с общей ошибкой "файл не найден". Это может быть очень неприятно, если вы не знаете, что происходит! Теперь я разрабатываю Windows 64-разрядный 64-разрядный, что может иметь какое-то отношение к требованию wowhelper (WOW является общим сокращением для приложений interop между 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 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

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

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

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

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

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

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

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