2009-10-19 29 views
37

Chrome'da sanal alanın nasıl çalıştığını ve kullanıcıları kötü amaçlı kodlardan korumak için neler yaptığını açıklayan birçok kaynak var. harika ve onlar biraz muhtemelen bizden daha iyi kendini güvenceye bilen bir "OS (yerinde var OS merkezli tasarım gibiGoogle Chrome Sandbox'ın Kullanımı

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

, bu yüzden “yaklaşım” a izin veriyoruz. Ayrıca, çeşitli yerlerde, sandbox'ın kendisinin Chrome'a ​​bağımlı olmayacak şekilde tasarlandığını, bunun yerine programın mimarisi olduğu sürece teorik olarak herhangi bir işlemin korumalı hale getirilebileceğini söyledi. uyumlu (korumalı kod, korumalı olmayan bir üst öğenin alt öğesi olarak kendi işlemi olarak çalıştırılmalıdır.)

Tasarımının, onu kum havuzuna hazır hale getirdiğini ve bununla çalışan bir ebeveyn/çocuk süreci elde edebildiğini gösteren bir uygulamaya sahip olacağım. Chromium kodunu aldım ve ... sonra ne yapacağımı bilmiyorum.

Buralarda birileri aslında herhangi bir şeyle kumlanmış mı? Kullanımını veya API'lerini belgeleyen herhangi bir kaynak var mı? Oldukça basit olması gerektiğini düşünürdüm, ama nereden başlayacağımı bilemiyorum.

DÜZENLEME: Bulguları cevaplarımda bulabilirsiniz!

+0

Bilginize: Sonunda bir kum havuzu (deney lot sonra) çalıştıran kazanılmış ve burada benim bulguları göndeririz Ben bir dolaşmayı ya da iki işe sonra gelmiş. – Toji

+0

Lütfen onları gönderin :) –

+0

Üzgünüz, hala üzerinde çalışıyor. Yapmak istediğim son şey yanıltıcı veya kırık bir şey göndermek. Yine de yayınlamayı planlıyorum. İlginiz için teşekkürler! – Toji

cevap

29

Tamam, burada Chrome ile korumalı alan koduyla ilgili bulduğum şey.

İlk önce, get the chromium source code'a gitmeniz gerekecek. Bu büyük, ve almak için biraz zaman alacaktır, ama hala kullanılabilir sonuçlar hala layout ödeme için herhangi bir güvenilir kısayol bulmak için henüz. Alos, bu sayfadaki talimatları takip etmenizin çok önemli olduğunu ÇOK KAPALI. Google ekibi ne yaptığını biliyor ve işe yaramaz adımlara meraklı değil. Bu sayfadaki her şey gerekli. Evet. Her şey.

Şimdi, kaynağı aldığınızda, sandbox'ı kullanmak için aslında bütünüyle (saatlerce sürebilir!) Krom yapmak zorunda değilsiniz.Bunun yerine size, bağımsız olarak oluşturulabilen ayrı bir sanal alan çözümü (sandbox klasöründe bulunur) vermek için yeterince iyiydiler. Bu projeyi oluşturun ve her şeyin derlendiğinden emin olun. Eğer yaparsa, harika! Yapmazsa, yapı sayfasındaki adımları izlemediniz, değil mi? Kafanı utançta tut ve aslında bu sefer git.

Artık her şey ilgi ana noktasını inşa etti ... bekleyeceğim, Üzülmeyin sandbox_poc projesi ("poc" Kavramın = Kanıtı) 'dir. Bu proje temel olarak, korumalı bir ortamda belirli bir giriş noktasında keyfi bir dll başlatan bir sanal alan etrafında minimum bir GUI sarmalayıcısıdır. Bir sanal alan oluşturmak ve kullanmak için gereken tüm adımları gösterir ve sahip olduğunuz en iyi referans hakkındadır. Sık sık bakın! Eğer kod bakarken

muhtemelen aslında kum havuzu kod kendisi olduğunu göreceksiniz. Bu, tüm sanal alan örnekleriyle çok yaygındır ve according to this thread (güncel olmayabilir) muhtemelen şu anda sandbox'ın çalıştığı tek çalışma şeklidir. Konu, kişinin teorik olarak ayrı bir işlemi nasıl kısıtlayacağını anlatıyor, ancak denemedim. Sadece güvenli olmak için, kendi kendine çağrı yapan bir uygulama olması "bilinen iyi" yöntemidir.

sandbox_proc pek çok statik kütüphanelerini içerir, ancak bunlar çoğunlukla onlar inşa ettik örnek UI için görünmektedir.

sandbox.lib base.lib dbghelp.lib 

olsa projeye bakarak tamamen belli değil başka dependancy var ve ben en uzun üzerinde yakalandılar ne: minimal kum havuzu için gerekli gibi görünüyor buldum sadece olanlardır. Korumalı alan çözümünü oluşturduğunuzda, çıktı dosyalarından biri "wowhelper.exe" olmalıdır. Herhangi bir yerde asla belirtilmese de, bu dosya, korumalı olduğunuz yürütülebilir dosyayla aynı dizine kopyalanmalıdır! Değilse, kodunuzu sanallaştırmaya yönelik girişimleriniz her zaman genel bir "dosya bulunamadı" hatasıyla başarısız olur. Ne olduğunu bilmiyorsanız, bu çok sinir bozucu olabilir! Şimdi, (WOW 16/32/64bit arasındaki birlikte çalışma uygulamaları için ortak bir kısaltmadır) wowhelper şartı ile bir ilgisi olabilir, Windows 7 64bit geliştiriyorum ama test iyi bir yol olmadığını şimdi. Lütfen başka bir şey öğrenirse bana haber verin!

Ve buda çevre şeyler, burada smaple kod biraz olacak sizin bu! Burada çocuk işleminde wcout kullanmamıza rağmen, sanal alanda çalışırken herhangi bir konsol çıkışı göremediğini lütfen unutmayın. Bunun gibi herhangi bir şey, IPC yoluyla ana sürece iletilmelidir.

#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); 
    } 
} 

Diğer tüm meraklı kodlayıcıları kum havuzuna almak için bu kadarı yeterli! İyi şanslar!

+2

Saatlerce kromun sandbox kütüphanesiyle ilgili kaynakları inceledikten sonra, aslında yararlı bulduğum tek şey bu. Paylaşmak için zaman ayırdığınız için çok teşekkür ederim! – HFLW

+1

Birkaç yıl önce bunu yazmadan önce aynı deneyimi yaşadım. Umarım hala uygun olur! – Toji

+0

Bu kendime benzer bir şey arıyorum ve bu kesinlikle konuyla ilgili sadece iyi bilgiler gibi görünüyor ve eminim aynı şeyi deneyimlediğinize inanıyorum, ama bununla ilgili birkaç yüz web sayfasına baktım. Bunu bir şut vereceğim, yardım için çok teşekkürler ve bunu yazmak için harcanan zaman –

2

Tam olarak ne tür bir yanıt istediğinizi emin değilim ... Yapmanız gereken ilk şey, Chrome Kaynak Kodunu reference denetlemektir. ne bizi ilgilendiren şu:

sandbox: Sistemi değiştirmesini saldırıya uğramış bir renderer önlemeye çalışır sanal projesi. Bu kodun etrafında spelunking yapmak ve Chromium'un Rendering kısmında API referanslarını aramak yardımcı olabilir.

renderer: Her sekmedeki alt işlemin kodu. Bu, WebKit'i yerleştirir ve G/Ç için tarayıcıya konuşur. Google kendileri sandbox'ı nasıl kullandıklarını

git oradan bak, muhtemelen, ben Genellikle bu

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

benzer bir şey olacak bekliyoruz görebileceğiniz yeni bir toplantı sırasında kullandığım yaklaşımdır kod tabanı, nasıl çağrıldığını kontrol edin.

+0

Bahşiş için teşekkürler. Her ne kadar aslında soruyu sorduğumda zaten yaptığım şey olmasına rağmen, benzer bir durumdaki herkes için kesinlikle iyi bir tavsiye. – Toji

+0

"Bir şeyi nasıl kullanacağınızı öğrenmek" fikriniz, tüm kaynağı a'dan z'ye okumak değilse, başka bir cevap yoktur. Hangisi ... iyi bir fikir değil. –

+2

Tipik olarak örnek bir programa bakma lüksüne sahipsiniz ve API dökümantasyonu ile referans olarak geçebilirsiniz. Burada kod örnekleri ince ve belgeler mevcut değil. Daha da kötüsüyle çalıştım, ama bu durumda resmi referans materyali konusunda çok az şey olduğu küçük bir düşünce. Çoğunluğa baktığımı merak ediyordum. – Toji