### DESCRIPTION
An exploitable memory corruption vulnerability exists in the handling of the MXIT protocol in Pidgin. Specially crafted MXIT MultiMX message sent via the server can result in an out-of-bounds write leading to memory disclosure and code execution.
### CVSSv3 SCORE
8.1 CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
### TESTED VERSIONS
Pidgin 2.10.11
### PRODUCT URLs
https://www.pidgin.im/
### DETAILS
The function multimxmessagereceived defined in mxit/multimx.c will be called when a message is received from a MultiMX room. This message will be parsed and it will check if the message is coming from a particular user (if it contains a nickname) or from the system.
If the received message starts with a `<` then a nickname is embedded and the server will search for a corresponding `>`. The code to handle is at lines 358-374:
```
354 if (msg[0] == '<') {
        /* Message contains embedded nickname - must be from contact */
        unsigned int i;
        for (i = 1; i < strlen(msg); i++) {     
            /* search for end of nickname */
            if (msg[i] == '>') {
                msg[i] = '\0';
                g_free(mx->from);
                mx->from = g_strdup(&msg[1]);
367             msg = &msg[i+2];        /* skip '>' and newline */
                break;
            }
        }
        /* now do markup processing on the message */
        mx->chatid = multimx->chatid;
374     mxit_parse_markup(mx, msg, strlen(msg), msgtype, msgflags);
```
If a message only contains a nickname followed by a NULL, then msg at line 367 will point out of bounds of the string.
This string is subsequently processed for markup at line 374. The mxitparsemarkup function allows for a number of scenarios to exploit this out-of-bounds access vulnerability. If the out-of-bounds data contains some user-controlled values, then the attacker can direct the markup down a number of paths. This can include an information leak where the markup contains a directive to download an emoticon string or a command to download an image (MXITCMDIMAGE), both will send data from the string back via a URL request.
Another avenue of attack is to perform an out-of-bounds write which could potentially lead to code execution. The string being parsed is written to at multiple locations, including at line 578 in mxit/formcmds.c:
```
    start = message + 2;
    end = strstr(start, ":");
    if (end) {
        /* end of a command found */
578     *end = '\0';        /* terminate command string */
And line 864 of of markup.c:
    ch = strstr( &message[i + 1], "$" );
    if ( ch ) {
        /* end found */
864     *ch = '\0';
```
### TIMELINE
* 2016-04-13 - Vendor Notification 
* 2016-06-21 - Public Disclosure 
                       
                       
        
          
暂无评论