37 votes

Utilisation de la sandbox Google Chrome

Il existe plusieurs ressources qui expliquent comment le sandbox de Chrome fonctionne et ce qu'il fait pour protéger les utilisateurs contre les codes malveillants.

Chrome Blog
Le Chrome De La Documentation Du Développeur
Sandbox FAQ

C'est excellent, et j'aime les OS centré sur la conception qu'ils ont mis en place (un peu de "L'OS sait probablement comment se protéger elle-même mieux que nous, afin de nous laisser" approche.) Ils mentionnent aussi dans plusieurs endroits que le bac à sable lui-même a été conçu pour ne pas être dépendant de google Chrome, mais au lieu de cela plus ou moins autonome, de sorte que, théoriquement, tout le processus pourrait être sandbox aussi longtemps que l'architecture du programme est compatible (bac à sable code doit s'exécuter comme son propre processus comme un enfant d'un non-sandbox parent.)

Je viens tout juste d'avoir une application qui permet mûr pour le bac à sable, et a été en mesure d'obtenir un parent/enfant processus de travail avec elle. J'ai le Chrome code et... n'ai aucune idée de quoi faire.

A quelqu'un là-bas en fait bac à sable n'importe quoi avec cela? Des ressources sont que le document de l'utiliser ou de l'Api? J'imagine que ce doit être assez simple, mais je suis à une perte pour où commencer.

EDIT: Mon trouver ci-dessous les réponses!

30voto

Toji Points 12442

Ok, donc voici ce que j'ai trouvé sur le bac à sable de code avec google Chrome.

Tout d'abord, vous aurez besoin d'aller obtenir le code source de chrome. C'est grand, et prendra un certain temps pour vous, mais je n'ai pas encore trouver toute la fiabilité de raccourcis à la caisse encore le rendement des résultats utilisables. Alos, il est très important que vous suiviez les instructions de la page de TRÈS PRÈS. Le Google de l'équipage sait ce qu'ils font, et ne sont pas désireux sur les étapes inutiles. Tout sur la page en question est nécessaire. Oui. Tout.

Maintenant, une fois que vous obtenez la source, vous n'avez pas fait construire en chrome dans son intégralité (ce qui peut prendre des heures!) pour utiliser le bac à sable. Au lieu de cela, ils ont été assez gentil pour vous donner un distinct solution sandbox (qui se trouve dans le dossier sandbox) qui permet de construire de manière autonome. Construire ce projet et assurez-vous que tout compile. Si elle le fait, la grande! Si ça ne marche pas, vous n'avez pas suivi les étapes indiquées sur la page de création, avez-vous? Accrocher votre tête dans la honte et aller le faire cette fois. Ne vous inquiétez pas, je vais attendre...

Maintenant que tout a construit votre principal point d'intérêt est la sandbox_poc projet ("poc" = la Preuve de Concept). Ce projet est fondamentalement un minimum de GUI wrapper autour d'un bac à sable qui va lancer un arbitraire dll à un point donné dans un environnement de type sandbox. Il montre toutes les étapes requises pour la création et l'utilisation d'un bac à sable, et est sur la meilleure référence que vous avez. Consultez-le souvent!

Comme vous regardez à travers le code, vous remarquerez probablement que le code qu'il fait sandbox est lui-même. C'est très fréquent, avec tous le bac à sable, des exemples, et en fonction de ce fil (qui est peut-être obsolète) est peut-être la seule façon de travailler pour sandbox pour le moment. Le fil décrit la manière dont une théorie, la sandbox d'un processus distinct, mais je n'ai pas essayé. Juste pour être sûr, cependant, avoir une auto-application appelante est le "bien connues" de la méthode.

sandbox_proc comprend un grand nombre de bibliothèques statiques, mais ils semblent être la plupart du temps pour l'INTERFACE utilisateur de l'exemple qu'ils ont construit. Les seuls que j'ai trouvé qui semblent être nécessaires pour un minimum de bac à sable sont:

sandbox.lib base.lib dbghelp.lib

Il y a une autre dépendance qui n'est pas totalement évident en regardant le projet, et c'est ce que je me suis rattrapé sur la plus longue. Lorsque vous avez créé la solution sandbox, un des fichiers de sortie doit être un "wowhelper.exe". Bien qu'il n'est jamais mentionné nulle part, ce fichier doit être copié dans le même répertoire que le fichier exécutable que vous êtes le bac à sable! Si elle ne l'est pas, vos tentatives de sandbox de votre code échouera toujours avec un générique "fichier non trouvé" erreur. Cela peut être très frustrant si vous ne savez pas ce qu'il se passe! Maintenant, je suis le développement sur Windows 7 64 bits, ce qui peut avoir quelque chose à voir avec la wowhelper exigence (WOW est un acronyme commun pour l'interopérabilité des applications entre 16/32/64bit), mais je n'ai pas un bon moyen de tester ce droit maintenant. S'il vous plaît laissez-moi savoir si quelqu'un d'autre le trouve plus!

Donc, c'est tout l'environnement des trucs, voici un peu de smaple code pour démarrer! Veuillez noter que, bien que j'utilise wcout dans le processus de l'enfant ici, vous ne pouvez pas voir toute sortie de la console lors de l'exécution dans le bac à sable. Quelque chose comme ça doit être communiquée au processus parent via 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);
    }
}

J'espère que c'est assez pour obtenir tout autre curieux codeurs "bac à sable"! Bonne chance!

2voto

Daniel Goldberg Points 3395

Je ne sais pas précisément quel genre de réponse que vous voulez... La première chose que vous devez faire est de vérifier le Code Source de Chrome de référence. Ce qui nous intéresse, c'est ceci:

sandbox: Le bac à sable de projet qui tente d'empêcher un piraté convertisseur de modifier le système.

La spéléologie autour de ce code, et la recherche de références API dans le Rendu de la partie de la teneur en Chrome pourrait aider.

moteur de rendu: Code pour la sous-processus dans chaque onglet. Il incorpore WebKit et parle à un navigateur pour les I/O.

Allez y, vous pouvez probablement voir comment Google sont eux-mêmes à l'aide de leur bac à sable, j'attends que ça va être quelque chose de similaire à

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

Généralement, c'est l'approche que j'ai utiliser lors de la réunion d'une nouvelle base de code, vérifier comment il s'appelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X