Was ist ein Versprechen?
pledge
ist ein Systemaufruf.
Das Aufrufen pledge
eines 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 read
Systemaufruf benötigt .
- Dann fügst du
pledge
nur noch read
nichts anderes hinzu.
- Dann stellte ein böswilliger Benutzer fest, dass in Ihrem Programm eine Sicherheitslücke besteht, durch die eine
root
Shell aufgerufen werden kann .
- Wenn Sie Ihr Programm ausnutzen, um eine
root
Shell 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 pledge
nichts anderes als den read
Systemaufruf verwenden müssen. Das Öffnen der root
Shell 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 cat
Befehls aus cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........