lunes, 3 de junio de 2013

Actualización de seguridad para Apache Struts

Una nueva actualización de seguridad para el proyecto Apache Struts soluciona dos vulnerabilidades que podrían aprovecharse para ejecutar código remoto en el servidor. Ya hubo un intento de solucionar estos fallos en la versión inmediatamente anterior, aunque no se llegaron a cubrir todos los posibles vectores de ataque.

Struts en un entorno de trabajo de código abierto para el desarrollo de aplicaciones web en Java EE bajo el patrón MVC (Modelo Vista Controlador). Desarrollado por la Apache Software Foundation, en un primer momento formaba parte del proyecto Jakarta, convirtiéndose en proyecto independiente en 2005. La versión 1 de Struts llegó al final de su ciclo de vida el pasado abril, siendo la versión 2 la única soportada desde entonces.

La actualización de seguridad soluciona dos fallos, con identificadores CVE-2013-2115 y CVE-2013-1966, que podrían ser aprovechados para ejecutar código arbitrario en el servidor. Anteriormente se había publicado el boletín S2-013 que solucionaba estas vulnerabilidades, pero no en todos los vectores de ataque posibles, los cuales han sido publicados por el investigador Jon Passki, de Coverity.

Struts utiliza el lenguaje OGNL (Object-Graph Navigation Language), un lenguaje de expresiones de código abierto para Java. Los lenguajes de expresiones son utilizados para manejar propiedades de objetos Java de forma más sencilla, como la llamada a métodos, además de conversión entre elementos HTTP y objetos Java. Estos lenguajes suelen ser vulnerables a evaluación doble. Cuando se evalúa una expresión OGNL, su contenido se puede volver a evaluar como otra expresión OGNL independiente.

En la configuración de Struts se define como recoger las llamadas a las acciones cuando estas no están definidas (en general, Struts permite el uso de comodines para capturar las llamadas a las acciones):

<action name="*" class="tutorial2.example.ExampleSupport">
1.   <result>/example/{1}.jsp</result>
2. </action>

Inyectando código OGNL entre los caracteres ${} (o %{}), y usándolo como nombre de acción, Struts evalúa tanto el contenedor ${} como su contenido, que puede ser a su vez código OGNL como el visto anteriormente. Por ejemplo:

http://127.0.0.1:8080/struts2-blank/example/$%7B%23context['xwork.MethodAccessor.denyMethodExecution']=%21%28%23_memberAccess['allowStaticMethodAccess']=true%29,%28@java.lang.Runtime@getRuntime%28%29%29.exec%28'touch%20aaa'%29.waitFor%28%29%7D.action/

Nótese que la URL termina en .action. Este ejemplo cambia los valores de los campos xwork.MethodAccessor.denyMethodExecution y allowStaticMethodAccess, que son los que previenen la ejecución de código remoto.

La raíz del problema radica en varias llamadas encadenadas a varios métodos de procesamiento, desde StrutsResultSupport.conditionalParse a TextParseUtil.translateVariables, que a su vez llama a OgnlTextParser.evaluate, donde se evalúa el código OGNL interno.

Existe un problema similar en los métodos HttpHeaderResult.execute y DefaultUrlHelper.translateVariable. Por ejemplo, en una configuración vulnerable  podemos definir que los accesos a la acción HelloWorld incluyan el parámetro mensaje:

<s:url id="url" action="HelloWorld">
 <s:param name="request_locale"><s:property value="message"/></s:param>
</s:url>

Al acceder a un servidor con una petición cuyos parámetros estén especialmente manipulados, se pueden inyectar código OGNL en la etiqueta param, que será evaluada. Por ejemplo:

http://localhost:8080/struts2-blank/example/HelloWorld.action?message=${%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Runtime@getRuntime().exec('calc')}

Este código será usado como un parámetro en una etiqueta s:url o s:a, que será a su vez evaluado como OGNL y finalmente ejecutado. Este método es similar al demostrado en el boletín, con la diferencia de que en este se utiliza includeParam para definir que se hace con los parámetros de la petición.

Todas las versiones de Struts anteriores a 2.3.14.2 son vulnerables, por lo que se recomienda la instalación del parche lo antes posible.

Más información:

S2-014

Struts 2 Remote Code Execution via OGNL Double Evaluation




Francisco López

No hay comentarios:

Publicar un comentario en la entrada