% Renforcement de la sécurité d’un lecteur vidéo multiplate-forme par séparation des privilèges % Alexandre Janniaux % 19 septembre 2018 ## VideoLabs, VLC Logo videolabs ## Présentation de l'entreprise - Créée en 2012 - Sponsorise le développement de VLC - Propose des prestations en : - systèmes embarqués - pipeline vidéo - multimédia en général - Composée d'une quinzaine d'employés ## Présentation du stage + Principalement de la recherche (4 mois) + Utilisation d'une API d'encodage matériel + Optimisation d'un moteur de rendu pour la VR + Réalisation d'un prototype VLC multiprocessus ## Sandboxing - Besoin d'isolation mémoire - Besoin de règles par processus - Besoin de définir les possibilités pour chaque bout de l'application ## Conteneurs Flatpack Docker ## Fined Grained sandboxing Google Chrome ## Objectifs de la sandbox - être désactivable au démarrage - définir des zones de privilège et d'accès - ne pas réécrire les modules ## Mécanismes de sandboxing sous Linux - Linux capabilites - Seccomp - Linux namespaces - cgroups ## Mécanismes de sandboxing sous Windows - Integrity level - AppContainer - DACL ## Conception de la sandbox - Réalisation d'un prototype indépendant - Intégration dans VLC - Choix du modèle ## Modèles de sandbox : orchestrateur Orchestrateur ## Modèles de sandbox : broker Orchestrateur ## Premier prototype - Créer les processus - Établir la communication entre eux - Modèle orchestrateur Logo NGINX Manipulation de l'interface SCM et de la mémoire partagée ## Modification des variables - Répartition de l'arbre de variables sur plusieurs processus - Très bon test pour la communication interprocessus - Devenu gênant dans la suite ## Deadlock version 1 ## Intégration d'une boucle événementielle boucle événementielle ## Deadlock version 2 ## Sandbox cycle XKCD ## Objets proxy - un identifiant - `proxy_SendMsgReply(proxy, msg, &cookie)` Création de proxy ## Description de l'API /* Début du processus */ sandbox = vlc_sandbox_Init(&(const struct vlc_sandbox_cfg) { /* parameters and policy */ }); vlc_sandbox_Start(sandbox); ## Démarrage des processus /* vlc_sandbox_Init */ const char psz_zygote[] = "--sandbox-zygote="; const char psz_worker[] = "--sandbox-worker="; for(int i=0; i< cfg->argc; ++i) { if(!strncmp(cfg->argv[i], psz_zygote, strlen(psz_zygote))) { // it's a zygote } else if(!strncmp( cfg->argv[i], psz_worker, strlen(psz_worker))) { // it's a worker } } ## Architecture du projet ## Méthode avec les modules de VLC - Pattern proxy - Générer de faux modules se comportant comme les vrais à IPC près ## Méthode avec les objets de libvlccore - Pattern strategy sur l'architecture de VLC - Implémenter le pattern proxy ## Protocole de communication ------------------------------------------------------------ | ID d'étage | ID de requête | ID de RPC | Paramètres RPC | ------------------------------------------------------------ + À qui envoyer ? + Comment répondre ? + Que faire ? ## Passage de ressources entre processus block_t *block = block_Alloc(size); + Très peu flexible + Devrait être amené à changer pour Windows ## Passage de ressources entre processus producteur-consommateur en mémoire partagée ## Passage de ressources sous Linux - On utilise `memfd_create` dans `block_Alloc` - Utilisation totalement transparente Mais plus coûteux que le modèle précédent ## Limitations du travail actuel sous Windows ## Gestion des ressources sous Windows BOOL WINAPI DuplicateHandle( _In_ HANDLE hSourceProcessHandle, _In_ HANDLE hSourceHandle, _In_ HANDLE hTargetProcessHandle, _Out_ LPHANDLE lpTargetHandle, _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ DWORD dwOptions ); `SourceProcess` et `TargetProcess` doivent avoir `PROCESS_DUP_HANDLE` ## Gestion des droits sous Windows : Jobs - Gestion des limitations de ressources dans les processus - `JOB_OBJECT_ULIMIT_HANDLES` - `UserHandleGrantAccess` Malheureusement... ## Gestion des droits sous Windows : Jobs - Un user handle est un objet de l'interface, pas un objet système - Les jobs ne sont pas une fonctionnalité de sécurité On peut faire le parallèle entre les Jobs et cgroups, avec un esprit Windows (i.e. GUI) ## Gestion des droits sous Windows : ACL + PACL, DACL, ACE, SecurityDescriptor, Tokens... ## Construction avec des ACL # Conclusion + pattern reproductible + difficultés à déboguer + différences de paradigmes # Questions