On Mon, Jun 06, 2011 at 06:15:08AM +0100, Ben Hutchings wrote: >This patch should provide the necessary kernel version check, but I >haven't tested it. > >Ben. > >--- vsftpd-2.3.2.orig/sysdeputil.c >+++ vsftpd-2.3.2/sysdeputil.c >@@ -25,6 +25,11 @@ > #define _LARGEFILE64_SOURCE 1 > #endif > >+#ifdef __linux__ >+ #include <stdio.h> >+ #include <sys/utsname.h> >+#endif >+ > /* For INT_MAX */ > #include <limits.h> > >@@ -1261,11 +1266,36 @@ > #endif > } > >+#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE >+/* On Linux versions <2.6.35, netns cleanup may be so slow that >+ * creating a netns per connection allows a remote denial-of-service. >+ * We therefore do not use CLONE_NEWNET on these versions. >+ */ >+static int >+vsf_sysutil_netns_cleanup_is_fast(void) >+{ >+#ifdef __linux__ >+ struct utsname utsname; >+ int r1, r2, r3 = 0; >+ return (uname(&utsname) == 0 && >+ sscanf(utsname.release, "%d.%d.%d", &r1, &r2, &r3) >= 2 && >+ ((r1 << 16) | (r2 << 8) | r3) >= ((2 << 16) | (6 << 8) | 35)); >+#else >+ /* Assume any other kernel that has the feature don't have this problem */ >+ return 1; >+#endif >+} >+#endif >+ > int > vsf_sysutil_fork_isolate_all_failok() > { > #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE >- static int cloneflags_work = 1; >+ static int cloneflags_work = -1; >+ if (cloneflags_work < 0) >+ { >+ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); >+ } > if (cloneflags_work) > { > int ret = syscall(__NR_clone, >@@ -1311,7 +1341,11 @@ > vsf_sysutil_fork_newnet() > { > #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE >- static int cloneflags_work = 1; >+ static int cloneflags_work = -1; >+ if (cloneflags_work < 0) >+ { >+ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); >+ } > if (cloneflags_work) > { > int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL);
This simple patch seems to work just fine for me, and has stopped a severe DOS here. Daniel: any chance of a stable-security update for this please? -- Steve McIntyre, Cambridge, UK. st...@einval.com You raise the blade, you make the change... You re-arrange me 'til I'm sane... -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org