Why do you remove the ability for the user to specify the username it should 
run as, and instead hardcode it to run as _memcached ?? In addition this patch 
require /var/empty to exists, and I know of a number of platforms that don't 
have a /var/empty directory...

Just my 0.5NOK

Trond


On 20. juli 2010, at 20.54, Loganaden Velvindron wrote:

> Greetings, 
> 
> I've investigated further, and this diff seems to be ok.
> 
> What do you think ?
> 
> //Logan
> C-x-C-c
> 
> diff --git a/memcached.c b/memcached.c
> index 750c8b3..1d56a8f 100644
> --- a/memcached.c
> +++ b/memcached.c
> @@ -22,6 +22,8 @@
>  #include <sys/uio.h>
>  #include <ctype.h>
>  #include <stdarg.h>
> +#include <unistd.h>
> +#include <grp.h>
> 
>  /* some POSIX systems need the following definition
>  * to get mlockall flags out of sys/mman.h.  */
> @@ -4539,22 +4541,6 @@ int main (int argc, char **argv) {
>         }
>     }
> 
> -    /* lose root privileges if we have them */
> -    if (getuid() == 0 || geteuid() == 0) {
> -        if (username == 0 || *username == '\0') {
> -            fprintf(stderr, "can't run as root without the -u switch\n");
> -            exit(EX_USAGE);
> -        }
> -        if ((pw = getpwnam(username)) == 0) {
> -            fprintf(stderr, "can't find the user %s to switch to\n", 
> username);
> -            exit(EX_NOUSER);
> -        }
> -        if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) {
> -            fprintf(stderr, "failed to assume identity of user %s\n", 
> username);
> -            exit(EX_OSERR);
> -        }
> -    }
> -
>     /* Initialize Sasl if -S was specified */
>     if (settings.sasl) {
>         init_sasl();
> @@ -4675,6 +4661,30 @@ int main (int argc, char **argv) {
>     }
> 
>     /* Drop privileges no longer needed */
> +    if (getuid()==0 || geteuid()==0) {
> +       if ((pw=getpwnam("_memcached")) == NULL) {
> +               fprintf(stderr,"user _memcached not found");
> +               exit(EX_NOUSER);
> +       }
> +
> +       if((chroot("/var/empty") == -1)) {
> +               fprintf(stderr,"check permissions on /var/empty");
> +               exit(EX_OSERR);
> +       }
> +
> +       if(chdir("/") == -1) {
> +               fprintf(stderr," Cannot set new root");
> +               exit(EX_OSERR);
> +       }
> +
> +       if(setgroups(1, &pw->pw_gid) ||
> +       setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
> +       setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) {
> +               fprintf(stderr," failed to switch to correct user");
> +               exit(EX_NOUSER);
> +       }
> +
> +       }
>     drop_privileges();
> 
>     /* enter the event loop */
> 
> On Tue, Jul 20, 2010 at 10:53 AM, Loganaden Velvindron <[email protected]> 
> wrote:
> yep it makes sense.
> 
> In this case, could we not remove this part and drop root at the other 
> location
> to gain the jail benefit ?
> 
> 
> 
> //Logan
> C-x-C-c
> 
> On Tue, Jul 20, 2010 at 10:24 AM, dormando <[email protected]> wrote:
> You don't need to run memcached as root to do that, you need to *start* it
> as root.
> 
> If you look just under the setrlimit(RLIMIT_NOFILE code you see that the
> privilege dropping happens.
> 
> So you fire up memcached *from* root, specifying -u memcached pand it will
> do its root-y things and then drop privileges to that user already.
> 
> On Tue, 20 Jul 2010, Loganaden Velvindron wrote:
> 
> > It's useful when you need to run memcached as root (-u root).
> >
> >
> >  if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
> >             fprintf(stderr, "failed to set rlimit for open files. Try 
> > running a$
> >             exit(EX_OSERR);
> >         }
> >
> > for upping rlimit.
> >
> > Once it's done setting rlimit, root privileges are no longer needed.
> >
> > Additionally, it chroots the process to /var/empty. If the attacker somehow
> > succeeds in finding an exploit, he cannot execute commands like /bin/sh, 
> > since
> > he's jailed inside the /var/empty.
> >
> >
> > //Logan
> > C-x-C-c
> > On Tue, Jul 20, 2010 at 2:38 AM, dormando <[email protected]> wrote:
> >
> >       > Greetings,
> >       >
> >       > We are a small company who are increasingly relying on
> >       > memcached for our big projects. We are very pleased with
> >       > its performance.
> >       >
> >       > I've put this patch that
> >       >
> >       > 1) chroots to /var/empty
> >       > 2) change from root to a simple user.
> >       >
> >       > It effectively jails the process once it no longer needs root
> >       > privilege and allows an attacker very little room to play.
> >       >
> >       > The patch has been working fine on our gentoo server for
> >       > quite some time.
> >       >
> >       > Feedback is most welcomed, and we are more than willing to
> >       > improve the patch to fit your standards.
> >
> > I'm a little confused; there is already a method for memcached to drop
> > user privileges, by specifying the -u option? What's the purpose of this
> > that the other function doesn't do?
> >
> >
> >
> >
> > --
> > `` Real men run current !''
> >
> >
> >                                            
> >
> >
> >
> >
> 
> 
> 
> -- 
> `` Real men run current !''
> 
> 
>                                             
> 
> 
> 
> 
> 
> -- 
> `` Real men run current !''
> 
> 
>                                             
> 
> 

Reply via email to