2009-10-19 26 views
37

Existen varios recursos que explican cómo funciona Sandbox en Chrome y qué hace para proteger a los usuarios de códigos maliciosos.Uso de Google Chrome Sandbox

Chromium Blog
Chromium Developer Documentation
Sandbox FAQ

Eso está muy bien, y me gusta el diseño de sistemas operativos centrados en que tienen en su lugar (algo así como un "El sistema operativo probablemente sabe cómo asegurar en sí mejor que nosotros, por lo dejamos que "se acerque". También mencionan en varios lugares que el sandbox en sí mismo fue diseñado para no depender de Chrome, sino más o menos independiente, de modo que teóricamente cualquier proceso podría ser protegido siempre que la arquitectura del programa sea compatible (el código de espacio aislado debe ejecutarse como su propio proceso como un elemento secundario de un elemento primario no protegido)

Tengo una aplicación cuyo diseño lo hace maduro para el recinto de seguridad, y fue capaz de lograr que un proceso padre/hijo trabajase con él. Tengo el código de Chromium y ... no tengo idea de qué hacer a continuación.

¿Alguien ha hecho algo con este tema todavía? ¿Hay algún recurso que documente su uso o API? Me imagino que debería ser bastante simple, pero no sé por dónde empezar.

EDIT: Mi hallazgo debajo en las respuestas!

+0

Solo para FYI: finalmente he conseguido una caja de arena en funcionamiento (después de MUCHA experimentación), y después de resolver un par de cosas, publicaré mis hallazgos aquí. – Toji

+0

Por favor publíquelos :) –

+0

Lo siento, todavía estoy trabajando en ello. Lo último que quiero hacer es publicar algo engañoso o roto. Aún así, estoy planeando publicarlo. Gracias por el interés! – Toji

Respuesta

29

Bien, entonces esto es lo que encontré sobre el código de sandboxing con Chrome.

En primer lugar, tendrás que ir get the chromium source code. Esto es grande, y tardará un poco en llegar, pero todavía no he encontrado ningún atajo confiable para pagar que todavía pueda generar resultados utilizables. Alos, es muy importante que sigas las instrucciones en esa página MUY CERCA. El equipo de Google sabe lo que hacen y no están interesados ​​en pasos inútiles. Todo en esa página es necesario. Sí. Todo.

Ahora, una vez que obtenga la fuente, no tiene que construir Chrome en su totalidad (¡lo que puede llevar horas!) Para usar la caja de arena.En su lugar, han sido lo suficientemente buenos como para proporcionarle una solución de espacio aislado (que se encuentra en la carpeta de la zona de pruebas) que puede construir de forma autónoma. Construya este proyecto y asegúrese de que todo compila. Si lo hace, ¡genial! Si no lo hace, no siguió los pasos en la página de compilación, ¿verdad? Cuelga tu cabeza con vergüenza y vete a hacerlo esta vez. No se preocupe, esperaré ...

Ahora que todo ha construido su principal punto de interés es el proyecto sandbox_poc ("poc" = Prueba de concepto). Este proyecto es básicamente un envoltorio GUI mínimo alrededor de un sandbox que lanzará un dll arbitrario en un punto de entrada dado en un entorno de espacio aislado. Muestra todos los pasos necesarios para crear y usar un sandbox, y se trata de la mejor referencia que tiene. ¡Remítalo a menudo!

Al mirar a través del código probablemente notarás que el código que en realidad contiene es en sí mismo. Esto es muy común con todos los ejemplos de la caja de arena, y according to this thread (que puede estar desactualizado) es posiblemente la única forma de trabajo para la caja de arena en este momento. El hilo describe cómo uno teóricamente salvaguarda un proceso separado, pero no lo he intentado. Sin embargo, para estar seguro, tener una aplicación de auto llamada es el método del "bien conocido".

sandbox_proc incluye una gran cantidad de bibliotecas estáticas, pero parecen ser principalmente para la interfaz de usuario de muestra que han creado. Los únicos que he encontrado que parecen ser necesarios para una caja de arena mínimos son:

sandbox.lib base.lib dbghelp.lib 

Hay otra dependencia que no es del todo evidente al mirar el proyecto, sin embargo, y es lo que me vi envuelto en la más larga. Cuando creó la solución de espacio aislado, uno de los archivos de salida debe ser "wowhelper.exe". Aunque nunca se menciona en ninguna parte, ¡este archivo debe copiarse en el mismo directorio que el ejecutable que está creando! Si no es así, tus intentos de guardar el código siempre fallarán con un error genérico de "archivo no encontrado". ¡Esto puede ser muy frustrante si no sabes lo que está pasando! Ahora, estoy desarrollando en Windows 7 64 bits, que puede tener algo que ver con el requisito de wowhelper (WOW es un acrónimo común para aplicaciones de interoperabilidad entre 16/32 y 64 bits), pero no tengo una buena manera de probar eso. ahora mismo. ¡Por favor avíseme si alguien más se entera más!

¡Así que eso es todo lo relacionado con el medio ambiente, aquí hay un poco de código smaple para que empieces! Tenga en cuenta que aunque utilizo wcout en el proceso secundario aquí, no puede ver ningún resultado de la consola cuando se ejecuta en el entorno limitado. Cualquier cosa así debe ser comunicada al proceso principal a través de 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); 
    } 
} 

Afortunadamente, ¡eso es suficiente para obtener otros codificadores curiosos! ¡Buena suerte!

+2

Después de consultar recursos sobre la biblioteca de sandbox de cromo durante horas, esto es lo único que he encontrado útil. ¡Muchas gracias por tomarse el tiempo de compartir esto! – HFLW

+1

Tuve la misma experiencia antes de escribir esto hace varios años. ¡Espero que todavía sea relevante! – Toji

+0

Estoy buscando algo similar a esto yo mismo y esta ciertamente parece ser la única información decente sobre el tema y estoy seguro de que experimentaste lo mismo, pero he visto literalmente unos cientos de páginas web con respecto a esto. Voy a dar una oportunidad, muchas gracias por la ayuda y el tiempo que tardo en escribir esto –

2

No estoy seguro de qué tipo de respuesta quieres ... Lo primero que debes hacer es consultar el código fuente de Chrome reference. Lo que nos interesa es la siguiente:

caja de arena: El proyecto de recinto de seguridad, que trata de evitar que un procesador de cortado de modificar el sistema.

Esperar alrededor de ese código y buscar referencias de API en la parte de Renderización de Chromium podría ayudar.

renderer: Código para el subproceso en cada pestaña. Esto integra WebKit y habla con el navegador para E/S.

ir a buscar por ahí, es probable que pueda ver cómo Google ellos mismos están usando su caja de arena, espero que va a ser algo similar a

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

Generalmente este es el enfoque que utilizo cuando se reunió un nuevo base de código, verifique cómo se llama.

+0

Gracias por el consejo. Aunque es esencialmente lo que estaba haciendo de todos modos en el momento en que hice la pregunta, sin duda es un buen consejo para cualquier persona en una situación similar. – Toji

+0

Realmente no hay otra respuesta, a menos que su idea de "aprender a usar algo" sea leer toda la fuente de la a la z. Lo cual es ... no es una buena idea. –

+2

Normalmente puede darse el lujo de mirar un programa de ejemplo y poder hacer una referencia cruzada con la documentación de la API. Aquí las muestras de código son escasas y la documentación inexistente. He trabajado peor, pero es un poco desalentador que haya tan poco material de referencia formal en este caso. Me preguntaba sobre todo si estaba pasando por alto alguno. – Toji