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
xyz
que precisa apenas daread
system-call. - Em seguida, você adiciona
pledge
para 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
root
shell. - Explorar seu programa para abrir um
root
shell 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)
..........