3.5 KiB
title | date | tags | categories | mathjax | ||||
---|---|---|---|---|---|---|---|---|
Sécurité système : passage dans le noyau | 2023-11-16 |
|
|
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 pourprintk()
;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
ouvfs_open
... VFS utilise aussi un cache en mémoire; - Les systèmes de fichiers comme
ext2_file_read_iter
. Nous verrons en TDunlock_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
).
-
On parle bien ici en proportion du nombre de lignes de code ↩︎