Howto: Como ejecutar código arbitrario en Asterisk aprovechando el fallo en 'ast_uri_encode'

Existe un error de desbordamiento de memoria intermedia basado en pila en la función 'ast_uri_encode' de Asterisk. Esta función se encarga de filtrar los datos de un ID de llamada. Debido a un error en la comprobación de la longitud de los datos, un atacante remoto autenticado podría ejecutar código arbitrario a través de un ID especialmente diseñado.

Este es el sumario que David Vossel notificó en la lista de correo 'asterisk-dev':

"Este parche cambia el comportamiento de ast_uri_encode() cuando doreserved está activo. Previamente cuando se activaba doreserved solo un pequeño set de caracteres resevados se codificaban. Este set comprende principalmente los caracteres reservados definidos en el RFC3261 sección 25.1, pero también contenía otros caracteres.
En lugar de 'escapar' solo el set reservado, doreserved ahora 'escapa' todos los caracteres que no se encuentra el el set como se define en el RFC 3261 y el RFC 2396. 

También, la variable 'doreserved' se ha renombrado a 'do_special_char' en un intento de evitar la confusión.

Cuando no se activa doreserve, la lógica anterior de solo codificar los caracteres <= 0X1F y > 0X7f permanece.

En el RFC 3261 y RFC 2396 el set de caracteres no reservados está definido por todos los caracteres alfanuméricos y una pequeña cantidad de caracteres definidos en el set de marcas.
marcas            =  "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")"
no reservados  =  alfanuméricos / marcas

Los cambios producidos en las funcionalidades son que ahora 0x25 ('%') y 0x7f (DEL) son siempre codificados independientemente de si do_special_char está activo."

Para los fanáticos del lenguaje C aquí podéis ver un diff para ver que código se ha estado tocando.

Con lo cual, no voy a continuar desgranando más este tema pero los más ávidos ya podéis haceros una pequeña idea de como fastidiar a un servidor Asterisk sin parchear. Por tanto, no seáis malos y recordad que Asterisk ha solucionado este error en las versiones 'Open Source' 1.4.38.1, 1.4.39.1, 1.6.1.21, 1.6.2.15.1, 1.6.2.16.1, 1.8.1.2 y 1.8.2.2, al igual que en la versión comercial 'Business Edition' C.3.6.2

Referencias:

[1] Hispasec

[2] Lista de correo asterisk-dev

URL para hacer trackback a este post:

http://bytecoders.net/trackback/833
 

Comentarios

Hello To All

Great info! I just found you site on bing, definitely gonna check out your other entries.This page is precious, I totally loved it, I’ll be back for much more!
===========