( 1 ) 취약점 정보
2018년 08월 22일 Semmle Security Research Team의 Man Yue Mo 보안연구원에 의해 Apache Struts2 원격실행코드 취약점이 공개됨.
공식 CVE 번호는 CVE-2018-11776 이며 취약한 버전은 Struts2 2.3 ~ 2.3.34 버전과 2.5 ~ 2.5.16 버전임.
포춘지가 선정한 100대 기업 중 65% 이상이 Apache Struts 프레임워크를 사용 중임을 감안하면 공개된 취약점의 파급력은 클 것으로 판단됨.
Apache Struts 는 Java EE 웹 애플리케이션을 개발하기 위한 오픈 소스 프레임워크임.
홈페이지 : https://struts.apache.org/
( 2 ) 취약점 분석
해당 취약점은 Struts 프레임워크의 핵심에서 신뢰할 수 없는 사용자 데이터의 유효성이 충분하지 않아서 발생하며 아래 2가지 조건이 충족되어야 취약점이 발생함.
1. alwaysSelectFullNamespace 플래그 설정이 Struts 구성에서 true 로 설정됨. (널리 사용되는 Struts Convention 플러그인을 사용하는 경우 기본 설정임)
2. Struts 설정 파일은 선택적 namespace 속성을 지정하지 않거나 와일드카드 namespace(e.g. "/*")를 지정하는 <action ...> 태그가 포함되어 있음.
공격자가 HTTP 요청을 통해 악의적인 사용자 지정 namespace 매개 변수 값을 주입하여 원격으로 코드를 실행시킴.
여기서 namespace 란?
Struts 에서 namespace 는 동작 그룹을 뜻함.
같은 이름의 두 동작은 서로 다른 두 개의 namespace 에 존재할 수 있으며 동작이 다름.
예를 들자면 koromoon 이라는 웹 응용 프로그램을 가지고 있다고 가정함.
koromoon.war 을 배포한 후에 아래 예제를 참고바람.
http://localhost:8080/koromoon/index.action
/ 는 namespace 이고 index.action 은 작업임.
http://localhost:8080/koromoon/hacker/analysis.action
hacker 는 namespace 이고 analysis.action 은 작업임.
웹 응용 프로그램에서 namespace 를 지정하지 않고 작업을 사용하거나 /* 와 같은 와일드카드 namespace 를 사용하는 경우 문제가 발생함.
Struts 가 주어진 작업에 대한 namespace 를 찾을 수 없다면 공격자가 지정한 namespace 를 취하여 OGNL 표현식으로 평가하여 웹 어플리케이션에 원격코드실행을 악용할 수 있음.
OGNL(객체 그래프 탐색 언어)은 Apache Struts의 동작을 사용자 정의하는 데 사용되는 강력한 도메인별 언어임.
( 3 ) 패치 내용
패치된 코드를 보면 cleanupNamespaceName 메소드에 화이트리스트 기능을 추가하여 악의적인 코드를 OGNL 형식으로 주입되는걸 방치시킴.
( 4 ) POC 테스트
${(#_memberAccess['allowStaticMethodAccess']=true).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','c',#cmd}:{'bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
( 5 ) 공격 탐지 방법
공개 된 취약점 PoC 코드와 취약점을 이용한 봇넷 코드에서 allowStaticMethodAccess 옵션을 활성화한 후 악의적인 코드 삽입함.
해당 문자열(#_memberAccess["allowStaticMethodAccess"]=true)을 토대로 IDS 탐지패턴 적용함.
alert tcp any any -> any any (msg:"TEST_KOROMOON_S2_057"; content:"allowStaticMethodAccess"; nocase; content:"true"; nocase;)
( 6 ) 대응 방안
최신 버전으로 업데이트
+ Struts 2.3.35 버전으로 업데이트
+ Struts 2.5.17 버전으로 업데이트
( 7 )Reference
https://semmle.com/news/apache-struts-CVE-2018-11776
https://www.secjuice.com/apache-struts2-cve-2018-11776/
https://securityaffairs.co/wordpress/75557/hacking/apache-struts-cve-2018-11776.html
http://blog.nsfocus.net/s2-075-protection-plan/
https://pastebin.com/JsECeuXW
https://github.com/jas502n/St2-057
http://www.freebuf.com/vuls/182097.html
============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.
댓글 없음:
댓글 쓰기