Qual è l'impegno di OpenBSD in breve?


18

Qualcuno può descrivere, per un non programmatore, ma una persona IT, qual è l' impegno ?

Es .: esiste un programma, es .: "xterm". In che modo l'impegno può renderlo più sicuro? Si impegna all'interno del codice dei programmi o all'esterno del sistema operativo stesso?

Dov'è l'impegno? È nel codice dei programmi; o il sistema operativo ha un elenco di file binari che possono solo invocare syscalls xy?

Risposte:


13

Che cos'è Pledge?

pledge è una chiamata di sistema.

Chiamare pledgeun programma significa promettere che il programma utilizzerà solo determinate risorse.

Un altro modo di dire è limitare il funzionamento di un programma alle sue esigenze, ad es.

"Mi impegno a non utilizzare altre porte tranne port 63"
"Mi impegno a non utilizzare altre chiamate di sistema tranne lseek()e fork()"

In che modo rende un programma più sicuro?

Limita il funzionamento di un programma. Esempio:

  • Hai scritto un programma chiamato xyzche necessita solo della readchiamata di sistema.
  • Quindi aggiungi pledgesolo per usare readma nient'altro.
  • Quindi un utente malintenzionato ha scoperto che nel tuo programma esiste una vulnerabilità per cui si può invocare una rootshell.
  • Sfruttando il tuo programma per aprire una rootshell, il kernel ucciderà il processo con SIGABRT(che non può essere catturato / ignorato) e genererà un registro (che puoi trovare con dmesg).

Succede perché prima di eseguire altri codici del programma, per prima cosa pledgenon usare altro che una readchiamata di sistema. Ma l'apertura della rootshell chiamerà molte altre chiamate di sistema che è vietato perché è già stato promesso di non usarne altri read.

Dov'è Pledge?

Di solito è in un programma. Uso dalla pagina man di OpenBSD 6.5 :

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

Esempio di codice: esempio di codice di catcomando da cat.c

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........

5

Un programma normalmente utilizza solo un determinato set di chiamate di sistema o di libreria. Con pledgeè possibile limitare il set di chiamate di sistema consentite solo a questo set. Ad esempio, se un programma non ha bisogno di leggere il database delle password, è possibile vietare di chiamare la getpwnam()funzione.

Come è utile? È un'ulteriore linea di difesa contro le vulnerabilità. Se il programma contiene un bug, qualcuno potrebbe essere in grado di sfruttare exploit del bug per alterare il flusso di esecuzione del programma o iniettare del codice aggiuntivo nel processo. Il bug può essere, ad esempio, un errore di overflow del buffer in un demone rivolto verso la rete, che l'attaccante può innescare inviando al programma più dati di quanti ne sia in grado di gestire, possibilmente organizzando che il programma legga e invii il contenuto del /etc/passwdfile sul Rete.


4

Il tuo programma "si impegna" a utilizzare solo la funzionalità {A, B, C}

Se un hacker può inserire codice nel processo promesso e tentare la funzionalità D, il sistema operativo si arresta in modo anomalo nel programma

Ad esempio, supponiamo di avere un server NTP. Si è impegnata a utilizzare solo le funzionalità DNS e CLOCK. Ma ha un difetto che consente l'esecuzione di codice in modalità remota. Hacker lo chiede di SCRIVERE FILE. Ma pledgerileverà questo e spegnerà il programma e registrerà l'errore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.