¿Qué es el compromiso?
pledge Es una llamada al sistema.
Llamando pledgeen un programa es prometer que el programa utilizará solamente ciertos recursos.
Otra forma de decir es limitar el funcionamiento de un programa a sus necesidades, por ejemplo,
"Me comprometo a no usar ningún otro puerto excepto port 63"
"Me comprometo a no usar ninguna otra llamada al sistema excepto lseek()y fork()"
¿Cómo hace que un programa sea más seguro?
Limita la operación de un programa. Ejemplo:
- Usted escribió un programa llamado
xyzque solo necesita la readllamada al sistema.
- Luego agrega
pledgesolo para usar, readpero nada más.
- Luego, un usuario malintencionado descubrió que en su programa hay una vulnerabilidad por la cual se puede invocar un
rootshell.
- La explotación de su programa para abrir un
rootshell dará como resultado que el núcleo va a matar el proceso con SIGABRT(que no puede ser capturado / ignorada) y generar un registro (que se puede encontrar con dmesg).
Ocurre porque antes de ejecutar otros códigos de su programa, primero pledgeno debe usar nada más que la readllamada al sistema. Pero abrir rootshell llamará a otras llamadas al sistema, lo cual está prohibido porque ya prometió no usar otro, pero read.
¿Dónde está Pledge?
Suele estar en un programa. Uso de la página de manual de OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Código de ejemplo: Código de catcomando de ejemplo de cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........