Add Linux kernel part
This commit is contained in:
parent
eaf2d3f44c
commit
bfa1fdb2c5
1 changed files with 101 additions and 0 deletions
101
content/secu_systeme/4_noyau/index.md
Normal file
101
content/secu_systeme/4_noyau/index.md
Normal file
|
@ -0,0 +1,101 @@
|
|||
---
|
||||
title: "Sécurité système : passage dans le noyau"
|
||||
date: 2023-11-16
|
||||
tags: ["Linux", "noyau"]
|
||||
categories: ["Sécurité système", "Cours"]
|
||||
mathjax: 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 bugs[^bugs];
|
||||
|
||||
## 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`) :
|
||||
|
||||
```c
|
||||
// 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`).
|
||||
|
||||
|
||||
[^bugs]: On parle bien ici en proportion du nombre de lignes de code
|
Loading…
Add table
Add a link
Reference in a new issue