O que é promessa?
pledge
é uma chamada do sistema.
Chamar pledge
um 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
xyz
que precisa apenas da read
chamada do sistema.
- Então você adiciona
pledge
para usar apenas, read
mas nada mais.
- Em seguida, um usuário mal-intencionado descobriu que no seu programa há uma vulnerabilidade pela qual se pode invocar um
root
shell.
- A exploração do seu programa para abrir um
root
shell 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 pledge
não use outra coisa senão a read
chamada do sistema. Mas o root
shell 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 cat
comando de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........