O que é o compromisso?
pledge é uma chamada do sistema.
Chamar pledge em um programa é prometer que o programa usará apenas determinados recursos.
Outra maneira de dizer é limitar o funcionamento de um programa às suas necessidades, por exemplo,
"I pledge not to use any other ports except
port 63"
"I pledge not to use any other system-call exceptlseek()andfork()"
Como isso torna um programa mais seguro?
Limita a operação de um programa. Exemplo:
- Você escreveu um programa chamado
xyzque precisa apenas dareadsystem-call. - Em seguida, você adiciona
pledgepara usar apenasread, mas nada mais. - Em seguida, um usuário mal-intencionado descobriu que em seu programa há uma vulnerabilidade pela qual é possível invocar um
rootshell. - Explorar seu programa para abrir um
rootshell resultará em que o kernel irá eliminar o processo comSIGABRT(que não pode ser capturado / ignorado) e gerar um log (que você pode encontrar comdmesg).
Isso acontece porque, antes de executar outros códigos do programa, primeiro pledge não usa nada além de read chamada do sistema. Mas abrir root shell irá chamar várias outras chamadas de sistema, o que é proibido porque já prometeu não usar nenhuma outra, mas read .
Onde está o compromisso?
Geralmente é em um programa. Uso:
#include <unistd.h>
int pledge(const char *promises, const char *paths[]);
Código de exemplo: Exemplo de código do comando cat de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........