2009-10-19 12 views
37

वहां कई संसाधन हैं जो बताते हैं कि क्रोम में सैंडबॉक्स कैसे काम करता है और उपयोगकर्ताओं को दुर्भावनापूर्ण कोड से बचाने के लिए क्या करता है।Google क्रोम सैंडबॉक्स का उपयोग

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

बहुत बढ़िया है, और मैं ओएस केंद्रित डिजाइन वे घर में है (एक "ओएस शायद जानता ही बेहतर हम करते हैं सुरक्षित करने के लिए कैसे के कुछ पसंद है, इसलिए हम इसे "दृष्टिकोण" देते हैं।) वे कई स्थानों पर भी उल्लेख करते हैं कि सैंडबॉक्स स्वयं क्रोम पर निर्भर नहीं होने के लिए डिज़ाइन किया गया था, बल्कि इसके बजाय कम या ज्यादा स्टैंडअलोन था ताकि सैद्धांतिक रूप से किसी भी प्रक्रिया को सैंडबॉक्स किया जा सके जब तक कि कार्यक्रम की वास्तुकला न हो संगत (सैंडबॉक्स कोड को गैर-सैंडबॉक्स वाले माता-पिता के बच्चे के रूप में अपनी प्रक्रिया के रूप में चलाना चाहिए।)

मुझे बस एक ऐसा एप्लिकेशन होता है जिसकी डिज़ाइन इसे सैंडबॉक्सिंग के लिए परिपक्व बनाती है, और इसके साथ काम करने वाले माता-पिता/बाल प्रक्रिया को प्राप्त करने में सक्षम था। मुझे क्रोमियम कोड मिला है और ... पता नहीं है कि आगे क्या करना है।

क्या किसी ने वास्तव में इसके साथ कुछ भी सैंडबॉक्स किया है? क्या कोई संसाधन है जो इसका उपयोग या एपीआई दस्तावेज करता है? मुझे लगता है कि यह बहुत आसान होना चाहिए, लेकिन मुझे कहां से शुरू करना है, इसके लिए मुझे नुकसान हुआ है।

संपादित करें: उत्तर में नीचे मेरी खोज!

+0

बस FYI: मुझे अंत में एक सैंडबॉक्स चल रहा है (प्रयोग के बहुत सारे बाद), और जब मैं एक कंक या दो काम करता हूं तो मैं यहां अपने निष्कर्ष पोस्ट करूंगा। – Toji

+0

कृपया उन्हें पोस्ट करें :) –

+0

क्षमा करें, अभी भी इस पर काम कर रहा है। आखिरी चीज जो मैं करना चाहता हूं वह कुछ भ्रामक या टूटी हुई है। मैं अभी भी इसे पोस्ट करने की योजना बना रहा हूं, हालांकि। ब्याज के लिए धन्यवाद! – Toji

उत्तर

29

ठीक है, तो क्रोम के साथ सैंडबॉक्सिंग कोड के बारे में मुझे यह मिला है।

सबसे पहले, आपको get the chromium source code पर जाना होगा। यह बड़ा है, और इसमें कुछ समय लगेगा, लेकिन मुझे अभी भी चेकआउट के लिए कोई विश्वसनीय शॉर्टकट नहीं मिला है जो अभी भी उपयोग करने योग्य परिणाम हैं। एलोस, यह बहुत महत्वपूर्ण है कि आप उस पृष्ठ पर बहुत से निर्देशों का पालन करें। Google चालक दल जानता है कि वे क्या कर रहे हैं, और बेकार कदमों पर उत्सुक नहीं हैं। उस पृष्ठ पर सबकुछ जरूरी है। हाँ। सब कुछ।

अब, स्रोत मिलने के बाद, आपको वास्तव में सैंडबॉक्स का उपयोग करने के लिए क्रोम बनाने की ज़रूरत नहीं है (जिसमें घंटों लग सकते हैं!)।इसके बजाए वे आपको एक अलग सैंडबॉक्स समाधान (सैंडबॉक्स फ़ोल्डर में पाए गए) देने के लिए काफी अच्छे रहे हैं जो स्टैंडअलोन बना सकते हैं। इस परियोजना को बनाएं और सुनिश्चित करें कि सब कुछ संकलित हो। अगर यह करता है, तो बढ़िया! यदि ऐसा नहीं होता है, तो आपने बिल्ड पेज पर चरणों का पालन नहीं किया है, है ना? अपने सिर को शर्म में लटकाओ और वास्तव में इस बार ऐसा करें। चिंता न करें, मैं इंतजार करूंगा ...

अब सब कुछ आपके ब्याज का मुख्य बिंदु बनाया गया है sandbox_poc प्रोजेक्ट ("poc" = अवधारणा का सबूत)। यह प्रोजेक्ट मूल रूप से एक सैंडबॉक्स के चारों ओर एक न्यूनतम जीयूआई रैपर है जो एक सैंडबॉक्स वाले वातावरण में दिए गए एंट्री पॉइंट पर मनमाने ढंग से डीएल लॉन्च करेगा। यह सैंडबॉक्स बनाने और उपयोग करने के लिए सभी आवश्यक कदम दिखाता है, और यह आपके द्वारा प्राप्त सर्वोत्तम संदर्भ के बारे में है। अक्सर इसका संदर्भ लें!

जैसा कि आप कोड देखते हैं, आपको शायद पता चलेगा कि वास्तव में यह कोड सैंडबॉक्स स्वयं है। यह सभी सैंडबॉक्स उदाहरणों के साथ बहुत आम है, और according to this thread (जो पुराना हो सकता है) इस समय सैंडबॉक्स के लिए संभवतः एकमात्र कामकाजी तरीका है। धागा बताता है कि कैसे सैद्धांतिक रूप से एक अलग प्रक्रिया को सैंडबॉक्स करेगा, लेकिन मैंने कोशिश नहीं की है। बस सुरक्षित होने के लिए, हालांकि, स्वयं-कॉलिंग ऐप रखना "ज्ञात अच्छी" विधि है।

sandbox_proc में बहुत से स्थिर स्थिर libs शामिल हैं, लेकिन वे अधिकतर नमूना यूआई के लिए बने होते हैं जो उन्होंने बनाए हैं। केवल लोगों को मैं पाया है कि एक न्यूनतम सैंडबॉक्स के लिए आवश्यक हो रहे हैं:

sandbox.lib base.lib dbghelp.lib 

एक और dependancy कि हालांकि इस परियोजना को देख से पूरी तरह से स्पष्ट नहीं है नहीं है, और यह क्या मैं सबसे लंबे समय तक पर पकड़ा गया है। जब आपने सैंडबॉक्स समाधान बनाया, आउटपुट फाइलों में से एक "wowhelper.exe" होना चाहिए। यद्यपि इसका कभी भी उल्लेख नहीं किया गया है, लेकिन इस फ़ाइल को निष्पादन योग्य के रूप में उसी निर्देशिका में कॉपी किया जाना चाहिए, जिसे आप सैंडबॉक्सिंग कर रहे हैं! यदि ऐसा नहीं है, तो आपके कोड को सैंडबॉक्स करने के आपके प्रयास हमेशा सामान्य "फ़ाइल नहीं मिली" त्रुटि के साथ असफल हो जाएंगे। यदि आप नहीं जानते कि क्या हो रहा है तो यह बहुत निराशाजनक हो सकता है! अब, मैं विंडोज 7 64 बिट पर विकसित कर रहा हूं, जिसमें वॉशेलर आवश्यकता के साथ कुछ करना हो सकता है (वाह 16/32/64 बिट के बीच इंटरऑप ऐप्स के लिए एक आम संक्षिप्त शब्द है), लेकिन मेरे पास परीक्षण का एक अच्छा तरीका नहीं है अभी। अगर किसी और को पता चला तो कृपया मुझे बताएं!

तो यह सभी पर्यावरण सामग्री है, यहां जाने के लिए यहां एक छोटा सा स्पीपल कोड है! कृपया ध्यान दें कि यद्यपि मैं यहां बाल प्रक्रिया में wcout का उपयोग करता हूं, फिर भी आप sandbox में चलते समय कोई कंसोल आउटपुट नहीं देख सकते हैं। इस तरह की कुछ भी आईपीसी के माध्यम से मूल प्रक्रिया में संवाद करने की जरूरत है।

#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

घंटों के लिए क्रोम की सैंडबॉक्स लाइब्रेरी के बारे में संसाधनों को देखने के बाद, यह एकमात्र चीज है जिसे मैंने वास्तव में उपयोगी पाया है। इसे साझा करने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद! – HFLW

+1

मुझे कई साल पहले इसे लिखने से पहले एक ही अनुभव था। मुझे उम्मीद है कि यह अभी भी प्रासंगिक है! – Toji

+0

मैं इस तरह के लिए कुछ ढूंढ रहा हूं और यह निश्चित रूप से इस विषय पर एकमात्र सभ्य जानकारी जैसा प्रतीत होता है और मुझे यकीन है कि आपने एक ही चीज़ का अनुभव किया है, लेकिन मैंने इसके बारे में सचमुच कुछ सौ वेब पेज देखे हैं। मैं इसे एक शॉट दूंगा, सहायता के लिए बहुत धन्यवाद और इसे लिखने के लिए समय –

2

मुझे यकीन नहीं है कि आप किस प्रकार का उत्तर चाहते हैं ... आपको सबसे पहले जो करना चाहिए वह क्रोम सोर्स कोड reference जांचना है। हमें क्या रूचि है:

सैंडबॉक्स: सैंडबॉक्स प्रोजेक्ट जो सिस्टम को संशोधित करने से हैक किए गए रेंडरर को रोकने की कोशिश करता है।

उस कोड के आसपास स्पेलंकिंग, और क्रोमियम के रेंडरिंग हिस्से में एपीआई संदर्भों की तलाश करने में मदद मिल सकती है।

प्रस्तुतकर्ता: प्रत्येक टैब में उपप्रोसेसर के लिए कोड। यह वेबकिट एम्बेड करता है और I/O के लिए ब्राउज़र से बात करता है।

जाओ वहाँ चारों ओर देखने, तो आप शायद देखते हैं कि कैसे गूगल ने ख़ुद को अपने सैंडबॉक्स का उपयोग कर रहे हैं कर सकते हैं, मैं उम्मीद यह

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

आम तौर पर इस के समान कुछ हो रहा है दृष्टिकोण का उपयोग मैं जब एक नया बैठक है कोड बेस, जांचें कि इसे कैसे कहा जाता है।

+0

टिप के लिए धन्यवाद। यद्यपि यह अनिवार्य रूप से मैं तब भी कर रहा था जब मैंने सवाल पूछा था, वैसे ही किसी भी स्थिति में किसी के लिए यह निश्चित सलाह है। – Toji

+0

वास्तव में कोई दूसरा जवाब नहीं है, जब तक कि "कुछ सीखने का तरीका सीखना" का आपका विचार पूरे स्रोत को ज़ेड से पढ़ना है। कौन सा है ... एक अच्छा विचार नहीं है। –

+2

आमतौर पर आपके पास एक नमूना कार्यक्रम देखने और एपीआई दस्तावेज के साथ संदर्भ पार करने में सक्षम होने की लक्जरी है। यहां कोड नमूने पतले हैं और दस्तावेज मौजूद नहीं हैं। मैंने बदतर के साथ काम किया है, लेकिन यह थोड़ा निराशाजनक है कि इस मामले में औपचारिक संदर्भ सामग्री के रास्ते में बहुत कम है। मैं ज्यादातर सोच रहा था कि क्या मैं किसी को देख रहा था। – Toji

संबंधित मुद्दे