2010년 7월 14일에 Struts2, webwork를 사용하는 웹 서버에 remote command 실행을 통해서 jvm을 종료시키게 하는 보안 공격을 오픈했다.
(참조 : http://sebug.net/exploit/19954/)
Webwork및 Stuts2 MVC Framework를 사용하는 서비스에서 아래와 같이 ParametersInterceptor를 사용하는 경우에 생길 숭 ㅣㅆ다.
<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]+
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 |