Quel est l'engagement d'OpenBSD en bref?

18

Quelqu'un peut-il décrire, pour un non-programmeur, mais un informaticien, ce qu'est l' engagement ?

Ex.: Il existe un programme, ex.: "Xterm". Comment l'engagement peut-il le rendre plus sûr? Il s'engage à l'intérieur du code du programme, ou à l'extérieur dans le système d'exploitation lui-même?

Où est l'engagement? Est-ce dans le code des programmes? ou le système d'exploitation a-t-il une liste de binaires qui ne peuvent invoquer que les appels système xy?

Peter
la source

Réponses:

13

Qu'est-ce que le gage?

pledge est un appel système.

Faire appel pledgeà un programme, c'est promettre que le programme n'utilisera que certaines ressources.

Une autre façon de dire est de limiter le fonctionnement d'un programme à ses besoins, par exemple,

"Je m'engage à ne pas utiliser d'autres ports sauf port 63"
"Je m'engage à ne pas utiliser d'autre appel système sauf lseek()et fork()"

Comment cela rend-il un programme plus sûr?

Il limite le fonctionnement d'un programme. Exemple:

  • Vous avez écrit un programme nommé xyzqui n'a besoin que de l' readappel système.
  • Ensuite, vous ajoutez pledgeà utiliser uniquement, readmais rien d'autre.
  • Puis un utilisateur malveillant a découvert que dans votre programme il y a une vulnérabilité par laquelle on peut invoquer un rootshell.
  • L'exploitation de votre programme pour ouvrir un rootshell aura pour conséquence que le noyau tuera le processus avec SIGABRT(qui ne peut pas être capturé / ignoré) et générera un journal (que vous pouvez trouver avec dmesg).

Cela se produit car avant d'exécuter d'autres codes de votre programme, il faut d'abord pledgene pas utiliser autre chose qu'un readappel système. Mais l'ouverture du rootshell appellera plusieurs autres appels système, ce qui est interdit car il a déjà promis de ne pas en utiliser d'autre mais read.

Où est Pledge?

C'est généralement dans un programme. Utilisation depuis la page de manuel d' OpenBSD 6.5 :

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

Exemple de code: Exemple de code de catcommande de cat.c

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
Mohammed
la source
5

Un programme utilise normalement uniquement un certain ensemble d'appels système ou de bibliothèque. Avec, pledgevous pouvez restreindre l'ensemble des appels système autorisés à cet ensemble uniquement. Par exemple, si un programme n'a pas besoin de lire la base de données de mots de passe, vous pouvez interdire d'appeler la getpwnam()fonction.

Comment est-ce utile? Il s'agit d'une ligne de défense supplémentaire contre les vulnérabilités. Si le programme contient un bogue, quelqu'un pourrait être en mesure d'exploiter le bogue pour modifier le flux d'exécution du programme ou injecter du code supplémentaire dans le processus. Le bogue peut être, par exemple, une erreur de dépassement de tampon dans un démon face au réseau, que l'attaquant peut déclencher en envoyant au programme plus de données qu'il ne peut en gérer, ce qui peut éventuellement permettre au programme de lire et d'envoyer le contenu du /etc/passwdfichier sur le réseau.

Johan Myréen
la source
4

Votre programme "s'engage" à n'utiliser que les fonctionnalités {A, B, C}

Si un pirate informatique pouvait injecter du code dans votre processus promis et tenter la fonctionnalité D, le système d'exploitation bloque votre programme

Par exemple, supposons que vous ayez un serveur NTP. Il s'est engagé à n'utiliser que les fonctionnalités DNS et CLOCK. Mais il a une faille qui permet l'exécution de code à distance. Hacker lui demande d'ECRIRE UN FICHIER. Mais pledgeva détecter cela et arrêter le programme et enregistrer l'erreur

Neil McGuigan
la source