\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}.
