Qual é a promessa do OpenBSD, em resumo?

18

Alguém pode descrever, para um não programador, mas uma pessoa de TI, o que é uma promessa ?

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

Onde está o compromisso? Está no código do programa; ou o sistema operacional possui uma lista de binários que podem chamar apenas syscalls xy?

Pedro
fonte

Respostas:

13

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)
..........
Maomé
fonte
5

Um programa normalmente utiliza apenas um determinado conjunto de chamadas do sistema ou da biblioteca. Com pledgevocê, você pode restringir o conjunto de chamadas do sistema permitidas apenas a esse conjunto. Por exemplo, se um programa não precisar ler o banco de dados de senhas, você poderá proibir a chamada da getpwnam()função.

Como isso é útil? É uma linha extra de defesa contra vulnerabilidades. Se o programa contiver um bug, alguém poderá explorar 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 ao programa mais dados do que ele pode manipular, possivelmente organizando para que o programa leia e envie o conteúdo do /etc/passwdarquivo pelo rede.

Johan Myréen
fonte
4

Seu programa "compromete-se" a usar apenas a funcionalidade {A, B, C}

Se um hacker puder injetar código no processo prometido e tentar a funcionalidade D, o sistema operacional travará o programa

Por exemplo, digamos que você tenha um servidor NTP. Ele prometeu usar apenas a funcionalidade DNS e RELÓGIO. Mas tem uma falha que permite a execução remota de código. O hacker pede para ESCREVER ARQUIVO. Mas pledgevai detectar isso e desligar o programa e registrar o erro

Neil McGuigan
fonte