Qu'est-ce que le gage?
pledge est un appel système.
Faire appel pledgeà un programme, c'est promettre que le programme n'utilisera que certaines ressources.
Une autre façon de dire est de limiter le fonctionnement d'un programme à ses besoins, par exemple,
"Je m'engage à ne pas utiliser d'autres ports sauf port 63"
"Je m'engage à ne pas utiliser d'autre appel système sauf lseek()et fork()"
Comment cela rend-il un programme plus sûr?
Il limite le fonctionnement d'un programme. Exemple:
- Vous avez écrit un programme nommé
xyzqui n'a besoin que de l' readappel système.
- Ensuite, vous ajoutez
pledgeà utiliser uniquement, readmais rien d'autre.
- Puis un utilisateur malveillant a découvert que dans votre programme il y a une vulnérabilité par laquelle on peut invoquer un
rootshell.
- L'exploitation de votre programme pour ouvrir un
rootshell aura pour conséquence que le noyau tuera le processus avec SIGABRT(qui ne peut pas être capturé / ignoré) et générera un journal (que vous pouvez trouver avec dmesg).
Cela se produit car avant d'exécuter d'autres codes de votre programme, il faut d'abord pledgene pas utiliser autre chose qu'un readappel système. Mais l'ouverture du rootshell appellera plusieurs autres appels système, ce qui est interdit car il a déjà promis de ne pas en utiliser d'autre mais read.
Où est Pledge?
C'est généralement dans un programme. Utilisation depuis la page de manuel d' OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Exemple de code: Exemple de code de catcommande de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........