O que é promessa?
pledge é uma chamada do sistema.
Chamar pledgeum programa é prometer que o programa usará apenas determinados recursos.
Outra maneira de dizer é limitar a operação de um programa às suas necessidades, por exemplo,
"Prometo não usar outras portas, exceto port 63"
"Prometo não usar nenhuma outra chamada de sistema, exceto lseek()e fork()"
Como isso torna um programa mais seguro?
Limita a operação de um programa. Exemplo:
- Você escreveu um programa chamado
xyzque precisa apenas da readchamada do sistema.
- Então você adiciona
pledgepara usar apenas, readmas nada mais.
- Em seguida, um usuário mal-intencionado descobriu que no seu programa há uma vulnerabilidade pela qual se pode invocar um
rootshell.
- A exploração do seu programa para abrir um
rootshell resultará em que o kernel interromperá o processo SIGABRT(que não pode ser capturado / ignorado) e gerará um log (com o qual você poderá encontrar dmesg).
Isso acontece porque, antes de executar outros códigos do seu programa, primeiro pledgenão use outra coisa senão a readchamada do sistema. Mas o rootshell de abertura chamará várias outras chamadas de sistema, o que é proibido porque já foi prometido não usar nenhum outro read.
Onde está o Juramento?
É geralmente em um programa. Uso da página do manual do OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Código de exemplo: código de exemplo de catcomando de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........