[Devel] [PATCH] [OpenVZ kernel] Fix for a possible DoS attack via forced umount of a Lustre filesystem from inside a container
Dawid Golunski
golunski at onet.eu
Fri Apr 3 08:07:01 PDT 2009
BACKGROUND
Lustre filesystem can be easily instructed to stopped when -f
parameter is provided on umount command.
As we can read in the lustre documentation:
To stop a server:
$ umount -f /mnt/test/ost0 The '-f' flag means "force"; force the
server to stop WITHOUT RECOVERY.
Although it is a handy feature that might be used when dealing with
unresponsive lustre server, it creates a
possibility of carrying out a DOS attack by a malicious user.
The problem is only real if we have a hosting server running OpenVZ
and a group of containers (used by outside users)
mounting the same lustre filesystem. In such setup one of the users
can type:
umount -f /mnt/shared/lustre/fs
inside a container which will cause the lustre filesystem to stop
without any warning, preventing all the other containers
that use the same filesystem from reading data.
Such event gets logged to /var/log/messsages as:
kernel: Lustre: setting import lustre-server-MDT0000_UUID INACTIVE by
administrator request
Important: the above is also likely to happen when one of the
containers gets stopped since a lot of linux distributions,
as a part of of shutdown process, run umount -f command on the
filesystems found in /etc/mtab file.
PATCH
I attach a patch bellow that addresses the issue. It is for the newest
OpenVZ kernel (2.6.18-92.1.18.el5.028stab060.2).
The patch prevents users from running umount -f command on lustre
filesystems inside container. If umount -f gets run inside
a container, -f option will get removed and a standard, not forced
umount will be performed (writing an appropriate alert message
to the logs). If umount -f gets run on the host server it will work as
expected - forcing a lustre filesystem to stop.
Best Regards,
Dawid Golunski
--- linux-2.6.18.i686/fs/namespace.c 2009-03-26 11:09:57.000000000 +0000
+++ linux-2.6.18.i686-lustre-umount-patch/fs/namespace.c 2009-03-27
01:41:49.000000000 +0000
@@ -728,10 +728,15 @@ asmlinkage long sys_umount(char __user *
if (!check_mnt(nd.mnt))
goto dput_and_out;
+
+ if (!memcmp(nd.mnt->mnt_sb->s_type->name, "lustre", 6) && !
ve_is_super(get_exec_env()) && (flags & MNT_FORCE)) {
+ printk(KERN_ALERT "Forced umount of lustre fs is not allowed inside
container (%d). Overriding MNT_FORCE flag.\n", get_exec_env()->veid);
+ flags &= (~MNT_FORCE);
+ }
+
retval = -EPERM;
if (!capable(CAP_VE_SYS_ADMIN))
goto dput_and_out;
-
retval = do_umount(nd.mnt, flags);
dput_and_out:
path_release_on_umount(&nd);
More information about the Devel
mailing list