Che cos'è Pledge?
pledge
è una chiamata di sistema.
Chiamare pledge
un programma significa promettere che il programma utilizzerà solo determinate risorse.
Un altro modo di dire è limitare il funzionamento di un programma alle sue esigenze, ad es.
"Mi impegno a non utilizzare altre porte tranne port 63
"
"Mi impegno a non utilizzare altre chiamate di sistema tranne lseek()
e fork()
"
In che modo rende un programma più sicuro?
Limita il funzionamento di un programma. Esempio:
- Hai scritto un programma chiamato
xyz
che necessita solo della read
chiamata di sistema.
- Quindi aggiungi
pledge
solo per usare read
ma nient'altro.
- Quindi un utente malintenzionato ha scoperto che nel tuo programma esiste una vulnerabilità per cui si può invocare una
root
shell.
- Sfruttando il tuo programma per aprire una
root
shell, il kernel ucciderà il processo con SIGABRT
(che non può essere catturato / ignorato) e genererà un registro (che puoi trovare con dmesg
).
Succede perché prima di eseguire altri codici del programma, per prima cosa pledge
non usare altro che una read
chiamata di sistema. Ma l'apertura della root
shell chiamerà molte altre chiamate di sistema che è vietato perché è già stato promesso di non usarne altri read
.
Dov'è Pledge?
Di solito è in un programma. Uso dalla pagina man di OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Esempio di codice: esempio di codice di cat
comando da cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........