Possible Remote Code Execution attack when using the Struts REST plugin with XStream handler to handle XML payloads
Who should read this

All Struts 2 developers and users

Impact of vulnerability

A RCE attack is possible when using the Struts REST plugin with XStream handler to deserialise XML requests

Maximum security rating

Critical

Recommendation

Upgrade to Struts 2.5.13

Affected Software

Struts 2.5 - Struts 2.5.12

Reporter

Man Yue Mo <mmo at semmle dot com> (lgtm.com / Semmle). More information on the lgtm.com blog: https://lgtm.com/blog

CVE Identifier

CVE-2017-9805

Problem
The REST Plugin is using a XStreamHandler with an instance of XStream for deserialization without any type filtering and this can lead to Remote Code Execution when deserializing XML payloads.

Solution

Upgrade to Apache Struts version 2.5.13.

Backward compatibility
It is possible that some REST actions stop working because of applied default restrictions on available classes. In such case please investigate the new interfaces that was introduced to allow define class restrictions per action, those interfaces are:

org.apache.struts2.rest.handler.AllowedClasses
org.apache.struts2.rest.handler.AllowedClassNames
org.apache.struts2.rest.handler.XStreamPermissionProvider
Workaround
No workaround is possible, the best option is to remove the Struts REST plugin when not used or limit it to server normal pages and JSONs only:

<constant name="struts.action.extension" value="xhtml,,json" />

저작자 표시 비영리 변경 금지
신고
블로그 이미지

Ryansecurity Ryansecurity

Life is fun security story

Tag apache

Apache Struts에서 임의 코드 실행이 가능한 취약점이 발견 [1]
o 취약한 버전을 사용 중인 서버의 담당자는 악성코드 감염 등의 위험이 있으므로 아래 해결 방안에 따른 조치 권고


□ 내용
o Struts2에서 제공하는 웹 애플리케이션 Showcase의 SaveGangsterAction 페이지에서 ActionMessages.class를 통해 특정
입력 값을 처리할 때 원격 코드 실행을 가능하게 하는 취약점(CVE-2017-9791)


□ 영향을 받는 제품 및 버전
o Apache Struts 2.3.x 버전에서 Struts1 플러그인을 사용하는 경우
※ Apache Struts2는 Struts 1의 Action을 사용하기 위해 Struts1 플러그인 기본 제공


□ 해결 방안
o 취약점에 영향을 받지 않는 버전으로 업데이트 수행
- Apache Struts 2.5.10.1 버전 [2]
o SaveGangsterAction.java에서 ActionMessage.class에 메시지를 전달할 때 값을 직접 전달하는 대신 리소스 키를 사용하도록
소스코드 변경 후 컴파일
※ SaveGangsterAction.java 파일 경로 : showcase가 설치된 폴더 하위의 \src\org\apache\struts2\integration
\SaveGangsterAction.java (설치 환경에 따라 경로 확인 필요)

기존 소스 코드 messages.add("msg", new ActionMessage("Gangster " + gform.getName() + " was added"));
변경 소스 코드 messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));
o 보안규칙(2종) : 우회 취약경로(/struts2-showcase/integration/saveGangster.action)에 대한 추가 차단
※ 보안규칙은 각 기관 환경에 맞춰 검토 후 적용 필요
alert tcp any any -> any any (content:"/saveGangster.action"; nocase; content:"HTTP/1."; distance:0;)
alert tcp any any -> any any (content:"/struts2-showcase"; nocase; content:"HTTP/1."; distance:0;)




[참고사이트]
[1] https://cwiki.apache.org/confluence/display/WW/S2-048
[2] https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.10.1

저작자 표시 비영리 변경 금지
신고
블로그 이미지

Ryansecurity Ryansecurity

Life is fun security story

Tag apache

티스토리 툴바