CSIRTCV

Está usted visitando una publicación en la hemeroteca de CSIRT-CV.
Para acceder al portal y contenido actual, visite https://www.csirtcv.gva.es

04/06/2013

Actualització de seguretat per a Apache Struts

Una nova actualització de seguretat per al Projecte Apache Struts soluciona dues vulnerabilitats que podrien aprofitar-se per a executar codi remot en el servidor. Ja va haver-hi un intent de solucionar estes fallades en la versió immediatament anterior, encara que no es van arribar a cobrir tots els possibles vectors d’atac.

Risc: Mitjà

Una nova actualització de seguretat per al Projecte Apache Struts soluciona dues vulnerabilitats que podrien aprofitar-se per a executar codi remot en el servidor. Ja va haver-hi un intent de solucionar estes fallades en la versió immediatament anterior, encara que no es van arribar a cobrir tots els possibles vectors d’atac.

Struts en un entorn de treball de codi obert per al desenvolupament d'Aplicacions web a Java EE amb el patró MVC (Model Vista Controlador). Desenvolupat per l'Apache Software Foundation, en un primer moment formava part del Projecte Jakarta, i es va convertir en projecte independent en 2005. La versió 1 d'Struts va arribar al final del seu cicle de vida el passat abril, i la versió 2 és l’única suportada des de llavors.

L’actualització de seguretat soluciona dos fallades, amb identificadors CVE 2013-2115-i CVE 2013-1966-, que podrien ser aprofitats per a executar codi arbitrari en el servidor. Anteriorment, s’havia publicat el butlletí S2-013 que solucionava estes vulnerabilitats, però no en tots els vectors d’atac possibles, els quals han sigut publicats per l’investigador Jon Passki, de Coverity.

Struts utilitza el llenguatge OGNL (Object-Graph Navigation Language), un llenguatge d’expressions de codi obert per a Java. Els llenguatges d’expressions són utilitzats per a manejar propietats d’objectes Java de forma més senzilla, com la crida a mètodes, a més de conversió entre elements HTTP i objectes Java. Estos llenguatges solen ser vulnerables a avaluació doble. Quan s’avalua una expressió OGNL, el seu contingut es pot tornar a avaluar com una altra expressió OGNL independent.

En la configuració d'Struts es definix com arreplegar les crides a les accions quan estes no estan definides (en general, Struts permet l’ús de comodins per a capturar les crides a les accions):

 <action name="*" class="tutorial2.example.ExampleSupport">

1.   <result>/example/{1}.jsp</result>

2. </action>

Injectant codi OGNL entre els caràcters ${} (o %{}), i usant-lo com a nom d’acció, Struts avalua tant el contenidor ${} com el seu contingut, que pot ser, al seu torn, codi OGNL com el vist anteriorment. Per exemple:

http://127.0.0.1:8080/struts2-blank/example/$%7B%23context['xwork.methodaccessor.denymethodexecution']=%21%28%23_memberAccess['allowStaticMethod

Access']=true%29,%28@java.lang.Runtime@getRuntime%28%29%29.exec%28'touch%20aaa'%29.waitFor%28%29%7D.action/

Noteu que la URL acaba en .action. Este exemple canvia els valors dels camps xwork.methodaccessor.denymethodexecution i allowStaticMethodAccess, que són els que prevenen l’execució de codi remot.

L’arrel del problema radica en diverses crides encadenades a diversos mètodes de processament, des d'Struts ResultSupport.conditionalParse a TextparseUtil.translateVariables, que al seu torn crida OgnltextParser.evaluate, en què s’avalua el codi OGNL intern.

 Hi ha un problema semblant en els mètodes HttpHeaderResult.execute i DefaultUrlHelper.translateVariable. Per exemple, en una configuració vulnerable  podem definir que els accessos a l’acció HelloWorld incloguen el paràmetre missatge:

 <s:url id="url" action="HelloWorld">

 <s:param name="request_locale"><s:property vaig valorar="message"/></s:param>

</s:url>

En accedir a un servidor amb una petició els paràmetres dels quals estiguen especialment manipulats, es pot injectar codi OGNL en l’etiqueta param, que serà avaluada. Per exemple:

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

Este codi serà usat com un paràmetre en una etiqueta s:url o s:a, que serà, al seu torn, avaluat com a OGNL i, finalment, executat. Este mètode és semblant al demostrat en el butlletí, amb la diferència que en este s’utilitza includeParam per a definir què es fa amb els paràmetres de la petició.

Sistemes Afectats:

Totes les versions d'Struts anteriors a 2.3.14.2 són vulnerables, per la qual cosa es recomana la instal·lació del pedaç com més prompte millor. 

Referències:

CVE-2013-2115,CVE-2013-1966

Solució:

Aplicar l'actualització del fabricatn el més prompte possible.

Notes:

S2-014

 http://struts.apache.org/release/2.3.x/docs/s2-014.html

Struts 2 Remote Code Execution via OGNL Double Evaluation
https://communities.coverity.com/blogs/security/2013/05/29/struts2-remote-code-execution-via-ognl-injection

 

Font: Hispasec una-al-día

CSIRT-CV