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)
..........