2009-10-19 36 views
37

Có một số tài nguyên ngoài đó giải thích cách hộp cát trong Chrome hoạt động và những gì nó làm để bảo vệ người dùng khỏi mã độc hại.Sử dụng Google Chrome Sandbox

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

Đó là tuyệt vời, và tôi thích thiết kế hệ điều hành trung tâm mà họ có tại chỗ (hơi của một "Hệ điều hành có thể biết làm thế nào để bảo vệ bản thân tốt hơn so với chúng tôi, vì vậy Chúng cũng đề cập đến một số nơi rằng chính hộp cát được thiết kế để không phụ thuộc vào Chrome mà thay vào đó là độc lập nhiều hơn, do đó bất kỳ quá trình lý thuyết nào cũng có thể được sandbox miễn là kiến ​​trúc của chương trình là tương thích (mã hộp cát phải chạy theo quy trình riêng của nó như là con của một phụ huynh không có hộp cát.)

Tôi chỉ xảy ra để có một ứng dụng thiết kế làm cho nó chín muồi cho sandboxing, và đã có thể có được một quá trình cha mẹ/con làm việc với nó. Tôi đã có mã Chromium và ... không biết phải làm gì tiếp theo.

Có ai thực sự đã sandboxed bất kỳ thứ gì với điều này chưa? Có bất kỳ tài nguyên nào ghi lại việc sử dụng hoặc API của nó không? Tôi sẽ tưởng tượng nó sẽ khá đơn giản, nhưng tôi đang thua lỗ để bắt đầu từ đâu.

EDIT: tìm kiếm của tôi bên dưới trong câu trả lời!

+0

Chỉ cần FYI: Cuối cùng tôi đã nhận được một sandbox chạy (sau khi LOTS thử nghiệm), và sau khi tôi làm việc ra một kink hoặc hai tôi sẽ đăng phát hiện của tôi ở đây. – Toji

+0

Hãy đăng chúng :) –

+0

Xin lỗi, vẫn đang làm việc trên đó. Điều cuối cùng tôi muốn làm là đăng một cái gì đó gây hiểu lầm hoặc bị hỏng. Tôi vẫn đang lên kế hoạch đăng nó. Cảm ơn bạn đã quan tâm! – Toji

Trả lời

29

OK, vì vậy, đây là những gì tôi tìm thấy về mã hộp cát với Chrome.

Trước hết, bạn sẽ cần phải đi get the chromium source code. Đây là lớn và sẽ mất một lúc để có được, nhưng tôi vẫn chưa tìm thấy bất kỳ phím tắt đáng tin cậy nào để kiểm tra mà vẫn có kết quả khả dụng. Alos, điều quan trọng là bạn làm theo các hướng dẫn trên trang đó RẤT KẾT THÚC. Các phi hành đoàn Google biết những gì họ đang làm, và không quan tâm đến các bước vô ích. Tất cả mọi thứ trên trang đó là cần thiết. Vâng. Mọi điều.

Bây giờ, khi bạn nhận được nguồn, bạn không thực sự phải tạo chrome toàn bộ (có thể mất hàng giờ!) Để sử dụng hộp cát.Thay vào đó, họ đã đủ tốt để cung cấp cho bạn một giải pháp hộp cát riêng biệt (được tìm thấy trong thư mục hộp cát) có thể xây dựng độc lập. Xây dựng dự án này và đảm bảo mọi thứ biên dịch. Nếu có, tuyệt vời! Nếu không, bạn không làm theo các bước trên trang xây dựng, phải không? Đợi đầu của bạn trong sự xấu hổ và đi thực sự làm điều đó thời gian này. Đừng lo lắng, tôi sẽ đợi ...

Bây giờ mọi thứ đã xây dựng điểm quan tâm chính của bạn là dự án sandbox_poc ("poc" = Proof of Concept). Dự án này về cơ bản là một wrapper GUI tối thiểu xung quanh một sandbox sẽ khởi chạy một dll tùy ý tại một điểm vào cho trước trong một môi trường sandboxed. Nó cho thấy tất cả các bước cần thiết để tạo và sử dụng một sandbox, và là về tài liệu tham khảo tốt nhất mà bạn có. Hãy tham khảo thường xuyên!

Khi bạn xem qua mã, bạn có thể nhận thấy rằng mã thực sự là hộp cát chính nó. Điều này là rất phổ biến với tất cả các ví dụ sandbox và according to this thread (có thể đã lỗi thời) có thể là cách làm việc duy nhất để sandbox vào lúc này. Các chủ đề mô tả cách một trong những lý thuyết sẽ sandbox một quá trình riêng biệt, nhưng tôi đã không thử nó. Chỉ để được an toàn, mặc dù, có một ứng dụng tự gọi là phương pháp "được biết đến" tốt.

sandbox_proc bao gồm nhiều lib tĩnh tuyệt vời, nhưng chúng dường như chủ yếu dành cho giao diện người dùng mẫu mà chúng đã tạo. Những người duy nhất tôi đã tìm thấy rằng dường như được yêu cầu cho một sandbox tối thiểu là:

sandbox.lib base.lib dbghelp.lib 

Có một dependancy đó không phải là hoàn toàn rõ ràng từ nhìn vào dự án mặc dù, và đó là những gì tôi đã bắt kịp trên dài nhất. Khi bạn xây dựng giải pháp hộp cát, một trong các tệp đầu ra phải là "wowhelper.exe". Mặc dù nó không bao giờ được đề cập ở bất cứ đâu, tệp này phải được sao chép vào cùng thư mục với tệp thực thi bạn đang sandboxing! Nếu không, nỗ lực của bạn để sandbox mã của bạn sẽ luôn thất bại với lỗi "không tìm thấy tệp" chung. Điều này có thể rất bực bội nếu bạn không biết điều gì đang xảy ra! Bây giờ, tôi đang phát triển trên Windows 7 64bit, có thể có một cái gì đó để làm với yêu cầu wowhelper (WOW là một từ viết tắt phổ biến cho các ứng dụng interop giữa 16/32/64bit), nhưng tôi không có một cách tốt để kiểm tra ngay bây giờ. Vui lòng cho tôi biết nếu có ai khác tìm hiểu thêm!

Vì vậy, đó là tất cả các công cụ môi trường, đây là một chút mã smaple để giúp bạn đi! Xin lưu ý rằng mặc dù tôi sử dụng wcout trong quá trình con ở đây, bạn không thể thấy bất kỳ đầu ra bàn điều khiển nào khi chạy trong hộp cát. Bất cứ điều gì như thế cần được truyền đạt tới tiến trình cha mẹ thông qua 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); 
    } 
} 

Hy vọng điều đó đủ để có được bất kỳ chương trình mã hóa tò mò nào khác! Chúc may mắn!

+2

Sau khi xem qua tài nguyên về thư viện hộp cát của chrome trong nhiều giờ, đây là điều duy nhất tôi thực sự thấy hữu ích. Cảm ơn bạn rất nhiều vì đã dành thời gian chia sẻ điều này! – HFLW

+1

Tôi đã có kinh nghiệm tương tự trước khi viết điều này lên vài năm trước. Tôi hy vọng nó vẫn có liên quan! – Toji

+0

Tôi đang tìm một thứ tương tự như thế này và điều này chắc chắn có vẻ giống như thông tin duy nhất về chủ đề và tôi chắc chắn bạn đã trải nghiệm điều tương tự, nhưng tôi đã xem xét một vài trăm trang web về vấn đề này. Tôi sẽ thực hiện cú đánh này, cảm ơn rất nhiều vì đã giúp đỡ và dành thời gian để viết bài này –

2

Tôi không chắc chắn chính xác loại câu trả lời bạn muốn ... Điều đầu tiên bạn nên làm là kiểm tra Mã nguồn của Chrome reference. Điều chúng tôi quan tâm là:

sandbox: Dự án sandbox cố gắng ngăn trình kết xuất bị tấn công sửa đổi hệ thống.

Tách xung quanh mã đó và tìm kiếm tham chiếu API trong phần Hiển thị của Chromium có thể hữu ích.

trình kết xuất: Mã cho quy trình con trong mỗi tab. Điều này nhúng WebKit và nói chuyện với trình duyệt cho I/O.

Go nhìn xung quanh ở đó, có lẽ bạn có thể thấy cách mình Google đang sử dụng sandbox của họ, tôi hy vọng nó sẽ là một cái gì đó tương tự như

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

Nói chung đây là cách tiếp cận tôi sử dụng khi đáp ứng một mới mã cơ sở, kiểm tra xem nó được gọi như thế nào.

+0

Cảm ơn lời khuyên. Mặc dù về cơ bản nó là những gì tôi đã làm anyway tại thời điểm tôi hỏi câu hỏi, đó chắc chắn là lời khuyên tốt cho bất cứ ai trong một tình huống tương tự. – Toji

+0

Có thực sự không phải là một câu trả lời, trừ khi ý tưởng của bạn về "học cách sử dụng một cái gì đó" là đọc toàn bộ nguồn từ a đến z. Đó là ... không phải là một ý tưởng hay. –

+2

Thông thường, bạn có sự sang trọng khi xem xét một chương trình mẫu và có thể tham khảo chéo với tài liệu API. Ở đây các mẫu mã là mỏng và tài liệu không tồn tại. Tôi đã làm việc với tồi tệ hơn, nhưng đó là một chút không hài lòng rằng có rất ít trong cách thức của tài liệu tham khảo chính thức trong trường hợp này. Tôi hầu như tự hỏi liệu tôi có nhìn thấy gì không. – Toji

Các vấn đề liên quan