Okej, oto co znalazłem na temat kodu sandboxingu w Chrome.
Po pierwsze, musisz przejść get the chromium source code. To jest duży, a to zajmie trochę czasu, ale muszę jeszcze znaleźć wszelkie wiarygodne skróty do kasy, które wciąż dają użyteczne wyniki. Alos, bardzo ważne jest, abyś postępował zgodnie z instrukcjami na tej stronie BARDZO ZAMKNIĘTE. Załoga Google wie, co robi i nie jest chętna do bezużytecznych kroków. Wszystko na tej stronie jest konieczne. Tak. Wszystko.
Teraz, gdy już zdobędziemy źródło, nie trzeba już budować go w całości (co może zająć wiele godzin!), Aby korzystać z piaskownicy.Zamiast tego byli na tyle mili, aby dać ci oddzielne rozwiązanie do piaskownicy (znalezione w folderze sandbox), które można zbudować samodzielnie. Zbuduj ten projekt i upewnij się, że wszystko się kompiluje. Jeśli tak, to świetnie! Jeśli nie, nie wykonałeś kroków na stronie kompilacji, prawda? Zawieś głowę ze wstydem i idź w tej chwili. Nie martw się, poczekam ...
Teraz, gdy wszystko zbudowaliśmy twój główny punkt zainteresowania, to projekt sandbox_poc ("poc" = Proof of Concept). Ten projekt jest w zasadzie minimalnym opakowaniem GUI wokół piaskownicy, który uruchomi dowolną bibliotekę dll w danym punkcie wejścia w środowisku piaskownicy. Pokazuje wszystkie wymagane kroki tworzenia i używania piaskownicy i jest najlepszym źródłem informacji. Odnoszą się do niego często!
Podczas przeglądania kodu prawdopodobnie zauważysz, że kod to faktycznie piaskownice jest sam w sobie. Jest to bardzo powszechne w przypadku wszystkich przykładów piaskownicy, a according to this thread (które może być nieaktualne) jest prawdopodobnie jedynym sposobem na piaskownicę w tej chwili. Wątek opisuje, w jaki sposób teoretycznie można by piaskować osobny proces, ale go nie wypróbowałem. Jednak, aby być bezpiecznym, posiadanie własnej aplikacji to metoda "znana dobra".
sandbox_proc zawiera wiele statycznych bibliotek, ale wydaje się, że są to najczęściej przykładowy interfejs użytkownika, który zbudowali. Jedynymi Odkryłam, że wydają się być konieczne dla minimalnej piaskownicy to:
sandbox.lib base.lib dbghelp.lib
Jest inny dependancy że nie jest do końca oczywiste, patrząc na projekt, choć i to właśnie złapany na najdłużej. Po zbudowaniu rozwiązania piaskownicy jednym z plików wyjściowych powinien być "wowhelper.exe
". Chociaż nigdzie się go nie wspomina, plik ten musi zostać skopiowany do tego samego katalogu, co plik wykonywalny, który piaskownicą! Jeśli tak nie jest, twoje próby piaskowania kodu zawsze zawodzą w przypadku ogólnego błędu "nie znaleziono pliku". To może być bardzo frustrujące, jeśli nie wiesz, co się dzieje! Teraz pracuję na systemie Windows 7 64bit, co może mieć coś wspólnego z wymaganiem wowhelper (WOW jest popularnym akronimem dla aplikacji interop między 16/32/64bit), ale nie mam dobrego sposobu na testowanie tego teraz. Daj mi znać, jeśli ktokolwiek dowie się więcej!
To wszystko, co dotyczy środowiska, oto mały fragment kodu, który sprawi, że zaczniesz działać! Należy pamiętać, że chociaż używam programu wcout w procesie potomnym, nie można wyświetlić żadnego wyjścia konsoli podczas działania w piaskownicy. Coś takiego musi zostać przekazane do procesu nadrzędnego za pośrednictwem 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);
}
}
Mam nadzieję, że to wystarczy, aby uzyskać inne ciekawe piaskowanie dla programistów! Powodzenia!
Po prostu: W końcu dostałem działającą piaskownicę (po DUŻYCH eksperymentach), a po tym jak wymyślę supeł lub dwa, opublikuję moje wyniki tutaj. – Toji
Proszę je przesłać :) –
Przepraszam, wciąż nad tym pracuję. Ostatnią rzeczą, którą chcę zrobić, jest opublikowanie czegoś mylącego lub zepsutego. Nadal planuję to opublikować. Dzięki za zainteresowanie! – Toji