¿Qué es el compromiso?
pledge
Es una llamada al sistema.
Llamando pledge
en 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
xyz
que solo necesita la read
llamada al sistema.
- Luego agrega
pledge
solo para usar, read
pero nada más.
- Luego, un usuario malintencionado descubrió que en su programa hay una vulnerabilidad por la cual se puede invocar un
root
shell.
- La explotación de su programa para abrir un
root
shell 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 pledge
no debe usar nada más que la read
llamada al sistema. Pero abrir root
shell 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 cat
comando 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)
..........