Was ist das Versprechen von OpenBSD?

18

Kann jemand bitte beschreiben, was ein Versprechen für einen Nicht-Programmierer, aber eine IT-Person ist ?

Bsp .: Es gibt ein Programm, Bsp .: "xterm". Wie kann das Versprechen die Sicherheit erhöhen? Es verpfändet sich innerhalb des Programmcodes oder außerhalb im Betriebssystem selbst?

Wo ist das Versprechen? Liegt es im Programmcode; oder hat das Betriebssystem eine Liste von Binärdateien, die nur xy-Syscalls aufrufen können?

Peter
quelle

Antworten:

13

Was ist ein Versprechen?

pledge ist ein Systemaufruf.

Das Aufrufen pledgeeines Programms soll versprechen, dass das Programm nur bestimmte Ressourcen verwendet.

Eine andere Art zu sagen ist, den Betrieb eines Programms auf seine Bedürfnisse zu beschränken, zB

"Ich verspreche, keine anderen Ports zu verwenden, außer port 63"
"Ich verspreche, keine anderen Systemaufrufe zu verwenden, außer lseek()und fork()"

Wie macht es ein Programm sicherer?

Es schränkt den Betrieb eines Programms ein. Beispiel:

  • Sie haben ein Programm namens geschrieben xyz, das nur den readSystemaufruf benötigt .
  • Dann fügst du pledgenur noch readnichts anderes hinzu.
  • Dann stellte ein böswilliger Benutzer fest, dass in Ihrem Programm eine Sicherheitslücke besteht, durch die eine rootShell aufgerufen werden kann .
  • Wenn Sie Ihr Programm ausnutzen, um eine rootShell zu öffnen, bricht der Kernel den Prozess mit SIGABRT(der nicht abgefangen / ignoriert werden kann) ab und generiert ein Protokoll (das Sie mit finden können dmesg).

Dies liegt daran, dass Sie vor dem Ausführen anderer Codes Ihres Programms zunächst pledgenichts anderes als den readSystemaufruf verwenden müssen. Das Öffnen der rootShell ruft jedoch mehrere andere Systemaufrufe auf, was verboten ist, da es bereits versprochen hat, keine anderen zu verwenden read.

Wo ist Versprechen?

Es ist normalerweise in einem Programm. Verwendung von OpenBSD 6.5-Manpage :

#include <unistd.h>

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

Beispielcode: Beispielcode eines catBefehls aus cat.c

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

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

Ein Programm verwendet normalerweise nur einen bestimmten Satz von System- oder Bibliotheksaufrufen. Mit können pledgeSie die Menge der zulässigen Systemaufrufe auf diese Menge beschränken. Wenn ein Programm beispielsweise die Kennwortdatenbank nicht lesen muss, können Sie das Aufrufen der getpwnam()Funktion verbieten .

Wie ist das nützlich? Es ist eine zusätzliche Verteidigungslinie gegen Schwachstellen. Wenn das Programm einen Fehler enthält, kann möglicherweise jemand den Fehler ausnutzen, um den Ausführungsfluss des Programms zu ändern oder zusätzlichen Code in den Prozess einzufügen. Der Fehler kann beispielsweise ein Pufferüberlauffehler in einem dem Netzwerk zugewandten Daemon sein, den der Angreifer auslösen kann, indem er dem Programm mehr Daten sendet, als er verarbeiten kann, und möglicherweise veranlasst, dass das Programm den Inhalt der /etc/passwdDatei über das Internet liest und sendet Netzwerk.

Johan Myréen
quelle
4

Ihr Programm "verspricht", nur die Funktionen {A, B, C} zu verwenden.

Wenn ein Hacker Code in Ihren zugesagten Prozess einschleusen und die Funktionalität D testen könnte, stürzt das Betriebssystem Ihr Programm ab

Angenommen, Sie haben einen NTP-Server. Es wurde zugesagt, nur DNS- und CLOCK-Funktionen zu verwenden. Es hat jedoch einen Fehler, der die Ausführung von Remote-Code ermöglicht. Hacker fordert es auf, DATEI ZU SCHREIBEN. Aber pledgewird dies erkennen und das Programm herunterfahren und den Fehler protokollieren

Neil McGuigan
quelle