Использование песочницы Google Chrome [закрыто]
Существует несколько ресурсов, которые объясняют, как работает песочница в Chrome и что она делает для защиты пользователей от вредоносного кода.
Chromium блог
документация разработчика Chromium
песочница FAQ
Это здорово, и мне нравится ОС-ориентированный дизайн, который они имеют на месте (что-то вроде "ОС, вероятно, знает, как защитить себя лучше, чем мы, поэтому мы позволяем ей" подход.) Они также упоминают в нескольких местах, что песочница сам по себе он был разработан так, чтобы не зависеть от Chrome, но вместо этого более или менее автономно, так что теоретически любой процесс может быть изолирован, пока архитектура программы совместима (изолированный код должен работать как собственный процесс как потомок не изолированного родителя.)
У меня просто есть приложение, дизайн которого делает его зрелым для песочницы, и смог заставить Родительский/дочерний процесс работать с ним. У меня есть код хрома И... понятия не имею, что делать дальше.
Кто-нибудь там на самом деле что-нибудь с этим сделал? Есть ли какие-либо ресурсы, которые документируют его использование или API? Я бы предположил, что это должно быть довольно просто, но я не знаю, с чего начать.
EDIT: моя находка ниже в ответах!
2 ответов:
Итак, вот что я нашел о песочнице code with Chrome.
Во-первых, вам нужно будет пойти получить исходный код chromium. Это большой , и займет некоторое время, чтобы получить, но я еще не нашел никаких надежных ярлыков для проверки, которые все еще дают полезные результаты. Алос, очень важно, чтобы ты очень внимательно следовал инструкциям на этой странице. Команда Google знает, что делает, и не стремится к бесполезным шагам. Все, что есть на этой странице, необходимо. Да. Всё.
Теперь, как только вы получите исходный код, вам не нужно будет создавать chrome целиком (что может занять несколько часов!) использовать песочницу. Вместо этого они были достаточно милы, чтобы дать вам отдельное решение для песочницы (найденное в папке песочницы), которое можно построить автономно. Создайте этот проект и убедитесь, что все компилируется. Если это так, отлично! Если это не так, вы не выполнили шаги на странице сборки, не так ли? Повесьте голову от стыда и на этот раз сделайте это по-настоящему. Не беспокойся, Я подожду...
Теперь, когда все построено, ваш главный интерес - это проект sandbox_poc ("poc" = доказательство концепции). Этот проект в основном представляет собой минимальную оболочку GUI вокруг песочницы, которая запустит произвольную библиотеку dll в заданной точке входа в изолированной среде. Он показывает все необходимые шаги для создания и использования песочницы, а также является лучшим справочником, который у вас есть. Обращайтесь к нему почаще!
Когда вы просматриваете код, вы, вероятно, заметите, что код это на самом деле песочницы-это само собой. Это очень распространено во всех примерах песочницы, и согласно этому потоку (который может быть устаревшим), возможно, является единственным работающим способом песочницы на данный момент. Поток описывает, как теоретически можно изолировать отдельный процесс, но я не пробовал его. Однако, чтобы быть в безопасности, наличие самозванного приложения - это "известный хороший" метод.
Sandbox_proc включает в себя большое количество статических библиотек, но они, по-видимому, в основном предназначены для примера пользовательского интерфейса, который они имеют. построенный. Единственные, которые я нашел, которые, кажется, необходимы для минимальной песочницы:
Есть еще одна зависимость, которая не совсем очевидна при взгляде на проект, и это то, на чем я задержался дольше всего. При создании песочницы один из выходных файлов должен быть "sandbox.lib base.lib dbghelp.libwowhelper.exe". Хотя он нигде не упоминается, этот файл должен быть скопирован в тот же каталог, что и исполняемый файл, который вы используете в песочнице! Если это не так, ваши попытки изолировать ваш код будут всегда происходит сбой с общей ошибкой "файл не найден". Это может быть очень неприятно, если вы не знаете, что происходит! Теперь я разрабатываю Windows 7 64bit, что может иметь какое-то отношение к требованию wowhelper (WOW-это распространенная аббревиатура для приложений взаимодействия между 16/32/64bit), но у меня нет хорошего способа проверить это прямо сейчас. Пожалуйста, дайте мне знать, если кто-нибудь еще узнает больше!Итак, это все, что касается окружающей среды, вот немного кода smaple, чтобы вы начали! Обратите внимание, что хотя я использую wcout в дочернем процессе здесь, вы не можете увидеть вывод консоли при запуске в песочнице. Что-то подобное должно быть доведено до сведения родительского процесса через МПК.
#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 Ссылка. Нас интересует вот что:
Песочница: проект песочницы, который пытается предотвратить изменение системы взломанным рендером.
Спелеология вокруг этого кода и поиск ссылок на API в части рендеринга Chromium может помочь.
Средство визуализации: код для подпроцесса на каждой вкладке. Это встраивает WebKit и переговоры с браузером для ввода-вывода
Посмотрите вокруг, вы, вероятно, можете увидеть, как Google сами используют свою песочницу, я ожидаю, что это будет что-то похожее на
//Lets start up the sandbox, I'm using the Chrome Blog example TargetPolicy::SetTokenLevel() TargetPolicy::SetJobLevel() TargetPolicy::SetIntegrityLevel() TargetPolicy::SetDesktop()Обычно это подход, который я использую при встрече с новой базой кода, проверяя, как она вызывается.
Comments