Ok, ecco cosa ho trovato sul codice sandboxing con Chrome.
Prima di tutto, devi andare get the chromium source code. Questo è grande, e ci vorrà un po 'per ottenere, ma non ho ancora trovato alcuna scorciatoia affidabile per verificare che ancora risultati utilizzabili. Alo, è molto importante seguire le istruzioni su quella pagina MOLTO CLOSAMENTE. L'equipaggio di Google sa quello che stanno facendo e non è appassionato di passi inutili. Tutto su quella pagina è necessario. Sì. Qualunque cosa.
Ora, una volta ottenuto il codice sorgente, non è necessario crearlo nella sua interezza (che può richiedere ore!) Per utilizzare la sandbox.Invece sono stati abbastanza carini da darti una soluzione sandbox separata (che si trova nella cartella sandbox) che può essere costruita autonomamente. Costruisci questo progetto e assicurati che tutto compili. Se lo fa, bene! In caso contrario, non hai seguito i passaggi nella pagina di creazione, vero? Abbassa la testa per la vergogna e vai a farlo davvero stavolta. Non ti preoccupare, aspetterò ...
Ora che tutto ha costruito il tuo principale punto di interesse è il progetto sandbox_poc ("poc" = Proof of Concept). Questo progetto è fondamentalmente un involucro della GUI minimale attorno a una sandbox che lancerà una DLL arbitraria in un determinato punto di ingresso in un ambiente sandbox. Mostra tutti i passaggi necessari per la creazione e l'utilizzo di una sandbox e rappresenta il miglior riferimento che hai. Riferiscilo spesso!
Come si guarda attraverso il codice, probabilmente si noterà che il codice in realtà è sandboxes stesso. Questo è molto comune con tutti gli esempi di sandbox, e according to this thread (che potrebbe essere obsoleto) è probabilmente l'unico modo di funzionare per sandbox al momento. Il thread descrive come teoricamente si potrebbe sandbox un processo separato, ma non l'ho provato. Per sicurezza, però, avere un'app self-calling è il metodo "noto bene".
sandbox_proc include un gran numero di librerie statiche, ma sembrano essere principalmente per l'interfaccia utente di esempio che hanno creato. Gli unici che ho trovato che sembrano essere richiesto per un sandbox minimo sono:
sandbox.lib base.lib dbghelp.lib
C'è un'altra dipendenza che non è del tutto evidente dalla guardando il progetto, però, ed è quello che mi sono coinvolti sulla più lunga. Quando hai creato la soluzione sandbox, uno dei file di output dovrebbe essere "wowhelper.exe
". Anche se non è mai menzionato da nessuna parte, questo file deve essere copiato nella stessa directory dell'eseguibile che si sta facendo sandboxing! Se non lo è, i tentativi di sandbox del codice falliranno sempre con un errore generico di "file non trovato". Questo può essere molto frustrante se non sai cosa sta succedendo! Ora, sto sviluppando su Windows 7 a 64 bit, che potrebbe avere qualcosa a che fare con il requisito di wowhelper (WOW è un acronimo comune per le app di interoperabilità tra 16/32/64 bit), ma non ho un buon modo di testarlo proprio adesso. Per favore fatemi sapere se qualcun altro lo scopre di più!
Quindi questo è tutto l'ambiente, ecco un po 'di codice per farti andare! Si noti che sebbene io utilizzi wcout nel processo figlio qui, non è possibile vedere alcun output della console durante l'esecuzione nella sandbox. Qualsiasi cosa del genere deve essere comunicata al processo genitore tramite 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);
}
}
Speriamo che sia sufficiente per ottenere qualsiasi altro codificatore curioso sandboxing! In bocca al lupo!
Solo FYI: Ho finalmente ottenuto una sandbox in esecuzione (dopo un sacco di sperimentazione), e dopo aver elaborato un nodo o due posterò i miei risultati qui. – Toji
Si prega di postarli :) –
Siamo spiacenti, ancora lavorando su di esso. L'ultima cosa che voglio fare è pubblicare qualcosa di fuorviante o rotto. Sto ancora programmando di pubblicarlo, comunque. Grazie per l'interesse! – Toji