보안정보

[CVE-2017-9805] Apache Struts2 REST 플러그인 취약점

침해사고분석팀 2017.09.07

 

개요

 2017년 9월 5일, Java기반의 웹어플리케이션을 개발하는데 사용되는 Apache Struts2에서 원격코드 실행취약점이 발견되었습니다.  웹어플리케이션을 사용하는 기업들의 50%이상이 Struts 프레임워크를 사용중인만큼 지금 발견된 취약점은 그 영향력이 심각하다고 할 수 있습니다. 몇 개월 전에도 치명적인 Struts2 취약점으로 인해서 전세계적으로 큰 이슈가 발생하기도 했습니다.

 

 이번 취약점은 그 심각성때문에 긴급하게 패치가 되었고 또한 사용자들의 업데이트를 위한 기간를 주기위해 2~3주간의 여유를 두고 PoC를 공개하기로 했습니다. 하지만 대략적으로 설명한 취약점의 내용은 보안전문가들의 입장에서는 충분히 취약점을 유추할 수 가 있었습니다. 몇 일전에는 취약점 트리거에 성공하고 PoC를 공개한 해커들도 있었습니다. 따라서 현재 Apache Struts2를 사용중인 사용자는 각별한 주의를 필요로 필요할 것으로 보입니다.

 

분석내역

 CVE-2017-9805 취약점은 사용자로부터 전달받은 XML 페이로드를 제대로 검증하지 않아 발생합니다. 사용자가 XML 형태의 페이로드를 전달하면 <그림 1>과 같이 getHandlerForRequest는 request로 전달받은 XML의 유형을 결정하고 XStreamHandler의 toObject메소드를 호출합니다.

 

<그림 1 - toObject 메소드가 호출되는 과정>

 

toObject 메소드는 <그림 2>와 같이 첫 번째 인자(Reader in)로 사용자의 request에 있는 Body를 전달 받습니다. 이때 전달 받은 페이로드를 역직렬화 하게 되는데 이러한 과정에서 사용자가 전달한 페이로드를 제대로 검증하지 않아 취약점이 발생합니다.

<그림 2 - toObject 메소드>

 

대응방안

1.해당 벤더사의 권고사항을 참조하여 최신버전으로 업데이트한다.
https://struts.apache.org/download.cgi#struts2513

 

2.Struts REST 플러그인을 사용하지 않을경우 삭제한다.

 

3.configuration 파일에 다음 코드를 추가하여 플러그인을 서버 일반 페이지나 JSON으로 제한한다.

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

 

4.당사 IPS에서는 아래의 패턴으로 대응이 가능하다.

[3676] Apache Struts2 XStreamHandler RCE

 

5.SNORT 패턴은 시큐어 캐스트에서 확인할 수 있다.

 

참고

https://lgtm.com/blog/apache_struts_CVE-2017-9805_announcement

https://cwiki.apache.org/confluence/display/WW/S2-052

http://bobao.360.cn/news/detail/4291.html

https://struts.apache.org/docs/s2-052.html

https://access.redhat.com/security/cve/cve-2017-9805