12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- \section{Définitions et objectifs du projet}
- Le sandboxing d'une application consiste à isoler l'application du reste du
- système, en totalité ou en partie. L'objectif est de définir un contexte
- restreint d'exécution pour l'application, de façon à limiter son impact
- potentiel sur le reste du système dans le cas où elle serait compromise. Il
- n'est ici pas question de protéger l'application d'une menace extérieure à la
- sandbox mais bien de protéger l'utilisateur final en dernière mesure, et plus
- précisément ses données si l'application venait à être compromise par un
- attaquant.
- %TODO> Sandbox rule no 1: le sable reste dans le bac à sable.
- %TODO: Ajouter image
- Le cas d'une application comme VLC montre les limites d'un sandboxing
- non intrusif, effectué application par application. VLC peut se connecter au
- réseau pour télécharger un flux vidéo, l'enregistrer sur le disque et en même
- temps le décoder et l'afficher en rendu direct via le GPU, sans compter le
- fenêtrage et la rediffusion. Trouver des règles génériques pour toute
- l'application revient à autoriser l'application à faire presque n'importe quoi
- en cas de compromission.
- Il est alors nécessaire de séparer l'application en plusieurs parties isolées.
- D'autant plus que l'on se place dans la pire situation où un bout entier de
- l'application est compromis, il faut alors l'isolation des ressources et
- permissions mais également de la mémoire. La solution naturelle est donc de les
- séparer dans des processus indépendants. Le défi est alors d'apporter cette
- architecture multiprocessus dans VLC, en restant multiplate-forme et en ayant le
- moins d'impact possible sur les perfomances, c'est-à-dire en n'affectant pas les
- capacités de lecture de l'application.
- Afin de relier les parties ainsi séparées, il faudra implémenter un mécanisme de
- communication inter-processus, ou IPC.
- De plus, VLC est composé d'un ensemble de plusieurs centaines de modules
- apportant les fonctionnalités dans l'application, et une base de code appelée
- libvlccore ou bien simplement le core, qui orchestre ces modules et leur fournit
- des opérations communes.
- Il est alors coûteux de devoir trop modifier les modules eux-même lors de
- l'intégration de la sandbox, ceux-ci comptant pour dix fois plus de code que le
- core lui-même. Le côté intrusif de cette sandbox ne devra donc pas détruire le
- modèle actuel de modules mais plutôt venir le compléter.
- Enfin l'implémentation de la sandbox doit pouvoir être désactivable, soit pour
- lire certains formats ne pouvant être lus avec, soit pour faciliter le débogage
- de l'application pendant le développement. La solution doit donc s'allier au
- core de VLC de façon dynamique sans laisser d'ouverture possible.
- La désactivation de la sandbox signifie que les mécanismes nécessaires à son
- utilisation, la séparation des processus et les mécanismes d'isolation ne sont
- pas activés. Cela ne signifie évidemment pas que l'on peut désactiver la
- sandbox \og{}en vol\fg pendant l'exécution du programme. En effet, dans ce dernier
- cas, si un bout de l'application se retrouve corrompu, il ne doit pas être
- capable de s'échapper du cadre que la sandbox a établi au démarrage. Si ce bout
- de code était capable de désactiver la sandbox, on se retrouverait avec la même
- situation que si aucune mesure n'avait été appliquée dès le départ.
- \section{Gestion des droits, permissions, accès, ressources}
- Dans la suite du document, nous allons utiliser plusieurs termes pour désigner
- les ressources ainsi que la façon de détérminer si l'utilisation de la ressource
- est autorisé.
- Parmi ce qu'on a appelé permissions et accès, on va en particulier retrouver:
- \begin{itemize}
- \item Chaque descripteur de fichier, que ce soit un fichier ou un autre
- objet.
- \item Chaque bloc de données, qui sera un descripteur de fichier ou qui sera
- émulé suivant d'autres méthodes.
- \item La permission de demander l'accès à des fichiers.
- \item La permission de créer des sockets réseaux.
- \item La permission de créer des processus.
- \end{itemize}
- On va désigner par \og{}accès\fg{} le fait de pouvoir effectuer des actions de lecture
- et écriture sur la ressource.
- On va désigner par \og{}permissions\fg{} le fait que l'accès à une ressource soit donné
- selon une autorité ambiante, c'est-à-dire typiquement implicite dans
- le processus. Cela signifie généralement que l'ouverture de la ressource est
- soumise à un test des permissions.
- Enfin, on va désigner par \og{}jeton d'accès\fg{} une ressource représentée sous la
- forme d'un objet et dont l'accès peut être transmis par le biais de ce jeton,
- sans pour autant que ce jeton soit forgeable.
- Les jetons d'accès, ou plus couramment \og{}capabilities\fg{}, constituent l'une des
- meilleures méthodes de description des accès et évitent des problématiques comme
- le \og{}confused deputy problem\fg{} \cite{ConfusedDeputy} dans la littérature. La
- comparaison entre l'implémentation Linux et les tentatives d'implémentation sous
- Windows vont révéler ceci dans la suite, Linux permettant bien plus facilement
- de construire ces jetons. Nous tenterons tout particulièrement de concevoir
- de tels objets pour décrire l'API entre nos processus\cite{ObjectsAsCaps}.
|