HexBrain

Ubiquiti Inc. · Report #73491

Buffer Overflow in PHP of the AirMax Products

Validstatus
4upvotes
1 Apr 2016disclosed

How it was found

#Vulnerability The function static int ub_normalize_filename(char* filename) (implemented by the patch 430-smart-post-upload.patch in the file uploadbuffer.c on the SDK.UBNT.v5.5) have the following code:

static int ub_normalize_filename(char* filename)
{

    char *fwd_slash;
    char *back_slash;
    size_t size;
    /**
     *  Some comments removed
     */
    if (filename == 0)
    {
        return -1;
    }
    size = strlen(filename);
    fwd_slash = strrchr(filename, '/');
    back_slash = strrchr(filename, '\\');
    if ((fwd_slash == 0) ||
	(back_slash == 0))
    {
	    /* No slashes or backslashes */
        return 0;
    }
    if ((back_slash - filename == size - 1) ||
	(fwd_slash - filename == size - 1))
    {
        return -1; /* 'Empty filename ???' */
    }
    /* Move file part from last backslash to last forwardslash,
       Copy including ending string \0 */
    memmove(fwd_slash + 1, back_slash + 1, size - (back_slash - filename));
    return 0;
}

Manipulating the filename value of a HTTP POST (like in the report 73480), it's possible to cause a buffer overflow with the following value filename="\asdfasdfasdfasdfsdfgdsfg/a". The Pointers will point to the following locations:

\asdfasdfasdfasdfsdfgdsfg/a\0
^                        ^  ^
-back_slash              |  |
                         |  -End of String
                         |
                         -fwd_slash

The memmove will write to fwd_slash + 1 the content of back_slash + 1 (until the end of the String), what will copy string off the bounds.

\asdfasdfasdfasdfsdfgdsfg/aasdfasdfasdfasdfsdfgdsfg/a
^                          ^
-Init                      |
                           -End of String

#Consequences It's possible to cause a buffer overflow, but it's unlikely the vulnerability to result in a arbitrary code execution (but possible), once it's allocated in a the heap memory (function ub_parse_disposition, file uploadbuffer.c, I think).

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original