what_is_sandboxing.tex 5.2 KB

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