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