La dangerosité des programmes SUID

Bonjour , J’écris ce billet pour vous expliquer pourquoi est-ce que donner les permissions SUID à un programme est dangereux pour votre système linux .

hacker1

Introduction

Dans les systèmes Unix le  système de permissions est trés utilisé , il permet de définir qui peut modifier quoi ? Qui peut éxécuter quoi ?

Il existe dans le noyau Linux des permissions particulières  comme le SETUID , le SETGID,Le STICKY BIT , nous allons nous concentrer seulement sur la permission SETUID

Permission SETUID

En théorie , lorsque un programme est SETUID il permet d’etre éxécute par n’importe quel utilisateur avec les droits de son proprietaire  .

Prenons le cas suivant comme exemple : Bob est administrateur d’un système il détient les droits root , il a donné les permissions SUID a son outil  nommé ‘updater’ qui permet de mettre à jour son système sans avoir les droits root , Mary quant à  elle a trouvé une erreur de configuration dans le programme ‘updater’ qui lui permet de faire des commandes root alors que  normalement elle n’a pas le droit .

Exemple

pour l’exemple on crée un nouveau utilisateur avec des droits restreints :

root@kali:~# adduser hacker

regardons quel est le shell par défault grace à la variable $SHELL:

root@kali:~# echo $SHELL

maintenant on créé un simple programme qui ouvre un shell bash

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/types.h>
   #include <unistd.h>

   int main()
   {
   setuid(0);
   system("/bin/bash");
   return 0;
   }

nous le compilons avec gcc :

root@kali:~# gcc root.c -o gotroot

maintenant nous faisons de l’utilisateur ‘root’ son propriétaire et lui donnons les droits SUID ;

root@kali:~# chown root:root gotroot ; chmod 4755 gotroot

nous nous connectons avec le compte ‘hacker’

root@kali:~#  su hacker

nous recherchons des programmes SUID  :

hacker@kali:~$ find / -user root -perm -4000 2>/dev/null

nous trouvons /tmp/gotroot

nous l’éxécutons

hacker@kali:~$/ tmp/gotroot
root@kali:~# whoami
root

Conclusion

Ainsi  donner les droits SUID à un programme dont on ne connait pas l’utilisation et dangereux . meme un programme verifié peut avoir des vulnérabilités du style injection de commandes ou dépassement de tampons et si’ils sont SUID une personne malveillante pourrait injecter un shellcode ou autre et obtenir l’accés root .

EDIT : pour des raisons de securité le SUID fonctionne que pour les programmes compilés et pas pour ceux qui sont intérpretés (le programme est lancé avec les droits de celui  qui le lance et pas celui qui le possède) : http://unix.stackexchange.com/questions/130906/why-does-setuid-not-work