¿Cuál es la promesa de OpenBSD en resumen?

18

¿Puede alguien describir, para un no programador, pero una persona de TI, qué es compromiso ?

Ej .: hay un programa, ej .: "xterm". ¿Cómo puede la promesa hacerla más segura? ¿Se compromete dentro del código de los programas o fuera del sistema operativo?

¿Dónde está la promesa? ¿Está en el código de los programas? ¿O el sistema operativo tiene una lista de binarios que solo pueden invocar llamadas de sistema xy?

Peter
fuente

Respuestas:

13

¿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)
..........
Mahoma
fuente
5

Un programa normalmente utiliza solo un cierto conjunto de llamadas al sistema o a la biblioteca. Con pledgeusted puede restringir el conjunto de llamadas permitidas del sistema a solo este conjunto. Por ejemplo, si un programa no necesita leer la base de datos de contraseñas, puede prohibir llamar a la getpwnam()función.

¿Cómo es esto útil? Es una línea adicional de defensa contra vulnerabilidades. Si el programa contiene un error, alguien podría usar explotar el error para alterar el flujo de ejecución del programa o inyectar algún código adicional en el proceso. El error puede ser, por ejemplo, un error de desbordamiento del búfer en una red que enfrenta el demonio, que el atacante puede activar enviando al programa más datos de los que puede manejar, posiblemente organizando que el programa lea y envíe el contenido del /etc/passwdarchivo a través del red.

Johan Myréen
fuente
4

Su programa "se compromete" a usar solo la funcionalidad {A, B, C}

Si un pirata informático puede inyectar código en su proceso prometido e intentar la funcionalidad D, entonces el sistema operativo bloquea su programa

Por ejemplo, supongamos que tiene un servidor NTP. Se ha comprometido a usar solo la funcionalidad DNS y CLOCK. Pero tiene una falla que permite la ejecución remota de código. Hacker le pide que ESCRIBA EL ARCHIVO. Pero pledgedetectará esto y apagará el programa y registrará el error

Neil McGuigan
fuente