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!
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
Por favor publíquelos :) –
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