2009-10-19 22 views
37

Istnieje wiele zasobów, które wyjaśniają, jak działa sandbox w Chrome i co robi, aby chronić użytkowników przed złośliwym kodem.Korzystanie z piaskownicy Google Chrome

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

To świetnie, a ja lubię OS-centric projektowanie że mają na swoim miejscu (w pewnym sensie „OS zapewne wie, w jaki sposób zabezpieczyć się lepiej niż my, więc W pewnym miejscu wspomina się również, że sama piaskownica została zaprojektowana tak, aby nie była zależna od Chrome, ale raczej mniej lub bardziej autonomicznie, tak aby teoretycznie każdy proces mógł być piaskowany, o ile architektura programu jest zgodny (kod obszaru izolowanego musi być uruchamiany jako proces własny jako element potomny niebędącego piaskownicą elementem nadrzędnym).

Po prostu mam aplikację, której konstrukcja sprawia, że ​​jest dojrzała do piaskownicy i była w stanie uzyskać z nią proces nadrzędny/podrzędny. Mam kod Chromium i ... nie mam pojęcia, co dalej robić.

Czy ktoś tam jeszcze piaskował coś z tym? Czy są jakieś zasoby, które dokumentują jego użycie lub interfejsy API? Wyobrażam sobie, że powinno to być całkiem proste, ale nie mam pojęcia, od czego zacząć.

EDYCJA: Moje znalezisko poniżej w odpowiedziach!

+0

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

+0

Proszę je przesłać :) –

+0

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

Odpowiedz

29

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!

+2

Po godzinnym przeglądaniu zasobów dotyczących biblioteki piaskownicy chromu, jest to jedyna rzecz, która naprawdę mi się przydała. Dziękuję bardzo za poświęcenie czasu, aby to udostępnić! – HFLW

+1

Miałem to samo doświadczenie, zanim napisałem to kilka lat temu. Mam nadzieję, że nadal ma znaczenie! – Toji

+0

Szukam czegoś podobnego do mnie, a to z pewnością wydaje się być jedyną przyzwoitą informacją na ten temat i jestem pewien, że doświadczyłeś tego samego, ale przyjrzałem się dosłownie kilkuset stronom internetowym na ten temat. Dam to zdjęcie, wielkie dzięki za pomoc i czas poświęcony na napisanie tego –

2

Nie wiem dokładnie, jakiego rodzaju odpowiedzi chcesz ... Najpierw sprawdź kod źródłowy Chrome reference. Co nas interesuje, to:

sandbox: Projekt piaskownicy, który próbuje zapobiec modyfikowaniu systemu przez zmodyfikowany renderer.

Rozwiązywanie problemów związanych z tym kodem i poszukiwanie referencji interfejsu API w części Renderowanie Chromium może pomóc.

renderer: Kod podprocesu w każdej zakładce. To osadza WebKit i rozmawia z przeglądarką dla I/O.

Go rozejrzeć się tam, prawdopodobnie można zobaczyć, jak Google sami wykorzystując swoją piaskownicę, spodziewam się, że będzie to coś podobnego do

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

Generalnie jest to podejście używam przy spotkaniu nowy podstawa kodu, sprawdź, jak zostanie wywołana.

+0

Dzięki za cynk. Chociaż w zasadzie to, co robiłem w tamtym czasie, zadałem pytanie, to z pewnością dobra rada dla każdego w podobnej sytuacji. – Toji

+0

Naprawdę nie ma innej odpowiedzi, chyba że twój pomysł "uczenia się, jak używać czegoś", to czytanie całego źródła od a do z. To ... nie jest dobry pomysł. –

+2

Zazwyczaj masz luksus spoglądania na przykładowy program i możliwość odniesienia go do dokumentacji API. Tutaj próbki kodu są wąskie, a dokumentacja nie istnieje. Pracowałem z gorszymi, ale to trochę przygnębiające, że w tym przypadku jest tak niewiele formalnych materiałów referencyjnych. Najczęściej zastanawiałem się, czy nie przeoczyłem żadnego. – Toji

Powiązane problemy