cours/content/secu_systeme/4_noyau/index.md

3.5 KiB

title date tags categories mathjax
Sécurité système : passage dans le noyau 2023-11-16
Linux
noyau
Sécurité système
Cours
true

Lors du cours sécurité logicielles, nous voulions devenir root, maintenant nous voulons aller dans le noyau! Sur notre machine cible, nous devons donc devenir root si noue ne le sommes pas déjà et ensuite devenir invisible.

Les objectifs de cette partie du cours sont :

  • Avoir une vision globale de l'architecture du noyau;
  • Comprendre ses mécanismes de protections;
  • Comprendre les mécanismes de transmissions de données;
  • Comprendre les mécanismes fournis par le noyau aux utilisateurs pour leurs protection.

Le noyau

Commençons par regarder l'organisation de son code source, voici les dossiers les plus importants:

  • include/: les fichiers d'entêtes (.h), par exempel celle pour printk();
  • lib/: les différentes bibliothèques comme par exemple les calculs de CRC ou les algorithmes de chiffement.
  • arch/: les codes spécifiques aux architectures spécifiques (x86, x86_54 AARCH64)
  • init/: le code relatif à l'initialisation du noyau (le code lancé dès le démarrage)
  • kernel/: fourre-tout non lié au matériel, [les signaux]({{<ref "progsys/4_les-signaux/index.md">}}) par exemple;
  • mm/: tout ce qui est relatif à la gestion de la mémoire comme les accès, les permissions, la swap etc.
  • block/: code relatif aux périphérique de type block (stockage);
  • fs: code relatif aux systèmes de fichiers;
  • net: code relatif à la gestion du réseau;
  • sound: code relatif à la gestion du son;
  • drivers/: tous les pilotes non présent dans les 4 catégories ci-dessus. C'est ici la partie la plus importante, mais aussi celle avec le plus de bugs1;

Le passage en mode noyau

Lors d'un appel système, nous passons de l'autre côté de la barrière : du mode utilisateur nous passons en mode noyau. malloc() par exemple fait appel à sbrk côté noyau (comme appel système). Les différents composants su mode noyau sont:

  • L'ordonanceur (scheduler);
  • Le hestionnaire de memoire (memory managment);
  • Les pilotes (drivers);
  • VFS pour Virtual Files System: c'est un composant central du noyau (n'oublions pas la philosophie Unix : tout est fichiers). VFS accède ensuite à BlkDev ou NetDev (mais aussi dans le MemoryManager).

Les points d'entrées

Le noyau comporte plusieurs point d'entrées:

  • Demarrage du noyau: start_kernel lorsque le bootloadeur du matériel passe la main au noyau;
  • Les appels système, comme par exemple sys_open, sys_read etc.
  • Les appels au VFS, comme vfs_read ou vfs_open... VFS utilise aussi un cache en mémoire;
  • Les systèmes de fichiers comme ext2_file_read_iter. Nous verrons en TD unlock_ioctl, véritable couteau suisse non factorisé pour certaines actions sur les systèmes de fichiers.
  • Les sockets (réseau ou non) avec entre autres inet_accept, inet_sendmsg

Objets du noyau

Le code source de Linux est écrit en C orienté objets (structs) :

// fichier
struct file * f

// répertoire
struct dentry * d

// socket
struct socket * s

// répertoire ouvert
struct dir_context * d

// inode
struct inode * i

// buffer réseau
struct sk_buf * n

Toutes ces structures peuvent pointer les unes les autres, voir se contenir (il est possible de trouver les conteneurs avec container_of).


  1. On parle bien ici en proportion du nombre de lignes de code ↩︎