Che cos'è Pledge?
pledge è una chiamata di sistema.
Chiamare pledgeun 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
xyzche necessita solo della readchiamata di sistema.
- Quindi aggiungi
pledgesolo per usare readma nient'altro.
- Quindi un utente malintenzionato ha scoperto che nel tuo programma esiste una vulnerabilità per cui si può invocare una
rootshell.
- Sfruttando il tuo programma per aprire una
rootshell, 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 pledgenon usare altro che una readchiamata di sistema. Ma l'apertura della rootshell 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 catcomando da cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........