2009-10-19 3 views
37

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

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

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

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

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

РЕДАКТОРА: Мое обнаружение ниже в ответах!

+0

Just FYI: Наконец-то я получил песочницу (после нескольких экспериментов), и после того, как я выработаю излом или два, я опубликую свои результаты здесь. – Toji

+0

Пожалуйста, разместите их :) –

+0

Извините, все еще работаю над этим. Последнее, что я хочу сделать, это опубликовать что-то вводящее в заблуждение или сломанное. Тем не менее, я все еще планирую его опубликовать. Спасибо за интерес! – Toji

ответ

29

Хорошо, вот что я нашел о песочнице с 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); 
    } 
} 

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

+2

Просматривая ресурсы о библиотеке песочницы chrome в течение нескольких часов, это единственное, что я действительно нашел полезным. Большое вам спасибо за то, что нашли время поделиться этим! – HFLW

+1

У меня был такой же опыт, прежде чем писать это несколько лет назад. Надеюсь, это по-прежнему актуально! – Toji

+0

Я искал что-то похожее на это сам, и это, безусловно, кажется единственной достойной информацией по этому вопросу, и я уверен, что вы испытали то же самое, но я просмотрел буквально несколько сотен веб-страниц об этом. Я дам этот шанс, большое спасибо за помощь и время, потраченное, чтобы написать это –

2

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

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

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

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

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

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

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

+0

Спасибо за подсказку. Хотя по сути я и делал это в то время, когда я задавал этот вопрос, это, безусловно, хороший совет для кого-то в подобной ситуации. – Toji

+0

На самом деле нет другого ответа, если ваша идея «научиться чему-то пользоваться» - это прочитать весь источник от a до z. Это ... не очень хорошая идея. –

+2

Как правило, у вас есть роскошь смотреть пример программы и, тем не менее, иметь возможность перекрестно ссылаться на документацию API. Здесь примеры кода тонкие, а документация не существует. Я работал хуже, но немного разочаровывает то, что в этом случае формальных справочных материалов так мало. Мне было интересно, не замечал ли я кого-либо. – Toji

 Смежные вопросы

  • Нет связанных вопросов^_^