remote stack overflow in memcached-1.1.11

Brad Fitzpatrick brad@danga.com
Thu, 22 Jul 2004 12:54:15 -0700 (PDT)


Fix committed.  Thanks!

To calm any fears for others:  I don't really consider this a security
problem, considering memcached makes no attempt to authorize clients.  If
you have a public-facing memcached server, you have bigger problems.

More than anything, I consider this a robustness problem.  It's quite
legit (although perhaps odd) to have 250-length keys, and all the
memcached functionality should work (including the stats commands) when
using such length keys.

If other want the fix, I just did this:

$ cvs diff -r1.21 -r1.22 items.c
Index: items.c
===================================================================
RCS file: /home/cvspub/wcmtools/memcached/items.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- items.c     31 Mar 2004 05:01:51 -0000      1.21
+++ items.c     22 Jul 2004 19:49:51 -0000      1.22
@@ -1,5 +1,5 @@
 /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/* $Id: items.c,v 1.21 2004/03/31 05:01:51 avva Exp $ */
+/* $Id: items.c,v 1.22 2004/07/22 19:49:51 bradfitz Exp $ */

 #include <sys/types.h>
 #include <sys/stat.h>
@@ -214,7 +214,7 @@
     item *it;
     int len;
     int shown = 0;
-    char temp[256];
+    char temp[512];

     if (slabs_clsid > LARGEST_ID) return 0;
     it = heads[slabs_clsid];


- Brad



On Thu, 22 Jul 2004, Andrei Nigmatulin wrote:

> Hello,
>
> Just found generic stack overflow in memcached, it's easy reproducable:
>
> > telnet localhost 11211
> Trying 127.0.0.1...
> Connected to localhost.
> Escape character is '^]'.
> add
> qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 0 0 0
> STORED
> stats cachedump 9 100000
> Connection closed by foreign host.
>
> memcached daemon dies with segmentation fault message.
>
> The bug lays here:
>
> char *item_cachedump(unsigned int slabs_clsid, unsigned int limit,
> unsigned int *bytes) {
> ...
>     char temp[256];
> ...
>         sprintf(temp, "ITEM %s [%u b; %lu s]\r\n", ITEM_key(it),
> it->nbytes - 2, it->time);
>
> While maximum key length is 250 bytes it is possible to overflow stack
> variable temp and may be even execute arbitrary code (not checked at
> this moment)
>
> --
> Andrei Nigmatulin
> GPG PUB KEY 6449830D
>
>