2010년 7월 14일에 Struts2, webwork를 사용하는 웹 서버에 remote command 실행을 통해서 jvm을 종료시키게 하는 보안 공격을 오픈했다.
(참조 : http://sebug.net/exploit/19954/)

Webwork및 Stuts2 MVC Framework를 사용하는 서비스에서 아래와 같이 ParametersInterceptor를 사용하는 경우에 생길 숭 ㅣㅆ다.
<include file="webwork-default.xml" />
<interceptor-ref name="params" />


위의 링크에 있듯 아래와 같이 OGNL 문법을 이용하면, JVM이 exit 된다.


http://mydomain/MyStruts.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.den
yMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRunti
me()))=1


잘못된 OGNL 문법이 ParamtersInterceptor에 전달되어 JVM 종료를 실행하도록 하는 것이다.

Struts2에서는 확인하고 ParametersInterceptor.java를 수정하였다.

http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?r1=956389&r2=956388&pathrev=956389


+

/**
  * <!-- START SNIPPET: description -->
@@ -134,7 +134,8 @@ public class ParametersInterceptor exten
     Set<Pattern> acceptParams = Collections.emptySet();
     static boolean devMode = false;

-    private String acceptedParamNames = "[[\\p{Graph}\\s]&&[^,#:=]]*";
+    // Allowed names of parameters
+    private String acceptedParamNames = "[a-zA-Z0-9\\.\\]\\[_'\\s]+";
     private Pattern acceptedPattern = Pattern.compile(acceptedParamNames);

     private ValueStackFactory valueStackFactory;



원래 ParametersInterceptor.java의 소스에서의 param 패턴을 분석해보자  
(http://download-llnw.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html)

[원래 소스]

[[\\p{Graph}\\s]&&[^,#:=]]*


1)  \p{Graph}  
     A visible character: [\p{Alnum}\p{Punct}]
     alphanumeric character && Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

 2) \s
    A whitespace character: [ \t\n\x0B\f\r]

3) &&
    Any letter except an uppercase letter (subtraction)

4) [^,#:=]

이렇게 나눠볼 수 있을 것이다.

읽어보면 space와 숫자문자와 ^,#:= 를 제외한 특수문자의 셋(zero or more time) parameter로 지원한다.


[수정된 소스] ; 언뜻 보면 [ ] 때문에 헛갈린다.

"[a-zA-Z0-9\\.\\]\\[_'\\s]+"
     =>
[a-zA-Z0-9\\.\\]\\[_'\\s]+

1) a-zA-Z0-9

2)\\.

3) \\]

4)\\[

5)
_'\\s]+

이렇게 분석해놔야 조금 이해가 되었다.

General하게 받지 않고, 특정 패턴만 들어오게 했다.

Webwork는 버려진지 오래되어서, 따로 패치는 안될 것 같다. (이래서 Strtus2의 미래가 불안하다. 담당 개발자 사라지면 버려지지 않을까? ) 대신 Struts2로 가서 패치는 했다.


하지만, 여기서 잘 봐야하는 문제는.. 기존의 Webwork 서비스에서는 잘 돌았는데, 패치 버젼 사용 및 위의 내용을 그대로 패치 이후에 문제가 생길 수 있다. 빠질 수 있는 패턴을 고민해야 봐야한다.

특히 특수 문자 쪽으로 봐야하는데..

기존에 파라미터에 - (bar)를 사용하고 있는데, 패치 이후로는 문제를 해결하지 못할 수 있다. 헐... 
Struts2 그냥 믿지 마시라.. 꼼꼼히 살펴볼 것.

-(bar)를 추가해서 적용할 필요가 있다.
"[a-zA-Z0-9\\.\\]\\[_'-\\s]+"

'Web service' 카테고리의 다른 글

Pro Spring 2.5 소스 코드  (0) 2010.09.25
REST 설명  (0) 2010.09.16
browser에서 request header를 수정할 수 있는 법  (0) 2010.08.24
구글 Closure  (0) 2010.08.24
[보안] SQL Injection 공격 막기 - 아파치 모듈 이용  (0) 2010.08.18
Posted by '김용환'
,