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é
xyz
qui n'a besoin que de l' read
appel système.
- Ensuite, vous ajoutez
pledge
à utiliser uniquement, read
mais 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
root
shell.
- L'exploitation de votre programme pour ouvrir un
root
shell 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 pledge
ne pas utiliser autre chose qu'un read
appel système. Mais l'ouverture du root
shell 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 cat
commande de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........