Хорошо, вот что я нашел о песочнице с Chrome.
Прежде всего, вам нужно пойти get the chromium source code. Это большой, и потребуется некоторое время, чтобы получить, но я еще не нашел надежных ярлыков для проверки, которые все еще пригодны для использования. Алос, очень важно, чтобы вы следовали инструкциям на этой странице ОЧЕНЬ ЗАКРЫТЬ. Команда Google знает, что они делают, и не стремится к бесполезным шагам. Все на этой странице необходимо. Да. Все.
Теперь, когда вы получаете исходный код, вам не нужно создавать хром во всей его полноте (что может занять часы!) Для использования песочницы.Вместо этого они были достаточно хороши, чтобы дать вам отдельное решение для песочницы (находящееся в папке песочницы), которое может создавать автономные. Создайте этот проект и убедитесь, что все скомпилировано. Если да, то здорово! Если это не так, вы не выполнили шаги на странице сборки, не так ли? Повесьте голову в позоре и на самом деле сделайте это на этот раз. Не беспокойтесь, я подожду ...
Теперь, когда все построено, ваша песня представляет собой проект sandbox_poc («poc» = Proof of Concept). Этот проект в основном представляет собой минимальную оболочку GUI вокруг изолированной программной среды, которая запускает произвольную DLL в данной точке входа в изолированной среде. Он показывает все необходимые шаги для создания и использования песочницы, и это лучшая ссылка, которую вы получили. Обратитесь к нему часто!
Как вы просматриваете код, вы, вероятно, заметите, что код, который он фактически представляет собой песочницу, сам по себе. Это очень часто встречается со всеми примерами песочницы, и according to this thread (который может быть устаревшим), возможно, единственный рабочий способ для песочницы на данный момент. В потоке описывается, как теоретически изолировать отдельный процесс, но я его не пробовал. Однако, чтобы быть в безопасности, при использовании самозавершения приложение является «известным хорошим» методом.
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'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);
}
}
Надеюсь, этого достаточно, чтобы получить любые другие любопытные кодеры песочницы! Удачи!
Just FYI: Наконец-то я получил песочницу (после нескольких экспериментов), и после того, как я выработаю излом или два, я опубликую свои результаты здесь. – Toji
Пожалуйста, разместите их :) –
Извините, все еще работаю над этим. Последнее, что я хочу сделать, это опубликовать что-то вводящее в заблуждение или сломанное. Тем не менее, я все еще планирую его опубликовать. Спасибо за интерес! – Toji