Em resumo, o que é o compromisso do OpenBSD?

15

Alguém pode, por favor, descrever, para um não-programador, mas pessoa de TI, o que promete ?

Ex .: existe um programa, ex .: "xterm". Como o compromisso pode torná-lo mais seguro? Ele se compromete dentro do código do programa ou fora do próprio sistema operacional?

Onde está o compromisso? Está no código dos programas? ou o sistema operacional tem uma lista de binários que só podem invocar xy syscalls?

    
por Peter 10.12.2017 / 15:28

3 respostas

9

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 except lseek() and 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 system-call.
  • Em seguida, você adiciona pledge para usar apenas read , 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 com SIGABRT (que não pode ser capturado / ignorado) e gerar um log (que você pode encontrar com dmesg ).

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)
..........
    
por 15.12.2017 / 23:08
6

Normalmente, um programa faz uso de apenas um determinado conjunto de chamadas do sistema ou da biblioteca. Com pledge , você pode restringir o conjunto de chamadas permitidas ao sistema somente para esse conjunto. Por exemplo, se um programa não precisar ler o banco de dados de senha, você poderá proibir a chamada da função getpwnam() .

Como isso é útil? É uma linha extra de defesa contra vulnerabilidades. Se o programa contiver um bug, alguém poderá usar o bug para alterar o fluxo de execução do programa ou injetar algum código extra no processo. O erro pode ser, por exemplo, um erro de estouro de buffer em um daemon voltado para a rede, que o invasor pode acionar enviando mais dados ao programa do que ele pode manipular, possivelmente organizando o programa para ler e enviar o conteúdo do /etc/passwd arquivo pela rede.

    
por 10.12.2017 / 16:51
3

Seu programa "promete" usar somente a funcionalidade {A, B, C}

Se um hacker pode injetar código no seu processo prometido e tentar a funcionalidade D, então o sistema operacional trava o seu programa

Por exemplo, digamos que você tenha um servidor NTP. Ele se comprometeu a usar apenas a funcionalidade DNS e CLOCK. Mas tem uma falha que permite a execução remota de código. Hacker pede para WRITE FILE. Mas pledge irá detectar isso e desligar o programa e registrar o erro

    
por 12.12.2017 / 20:35