밤샘 작업한 내용에 대한 개인적인 메모입니다.
Resin 모든 버전에 적용되는 %3f.jsp 문제 현황 및 원인 설명
-----------------------------------------------------------
- Resin 의 버전 체계
Stable 버전 - 2.1.x (stable 이라는 느낌보다는 old 라는 느낌이 강하나, 여전히 개발이 이루어지고 있으며 국내외에서 활발히 사용되고 있음)
Current 버전 - 3.x (내부적으로 2.1.x 에 비해 매우 많이 달라짐)
- 취약 현황
Resin 2.1.x 는 최신 버전인 2.1.7 은 물론 구버전부터 Snapshot 버전까지 모든 버전이 %3f.jsp 문제를 가짐. 한때 J2EE 환경의 서블릿 컨테이너 모두가 %3f.jsp 버그에 취약한 것으로 보고 되어 CVE에도 등록되고 일괄적인 패치가 이루어짐. 당시 Resin 도 예외는 아니었으나 2002년 경 개발자가 이 문제를 취약점이 아니라고 보고 해당 패치를 제거함.
Resin 3.x 에도 모든 버전에 걸쳐 해당 문제 있음.
- 공격 성공 조건
1. 반드시 존재하는 디렉터리여야 함 (존재하지 않는 디렉터리에 적용 시 404 에러가 나서 취약하지 않은 줄 알고 그냥 지나치기 쉬움)
2. index.html, index.jsp 등의 default index 파일이 없어야 함.
3. Directory Indexing 이 활성화되어 있어야 함.
- 원인 설명
1. 이는 Directory Indexing 을 지원하기 위한 서블릿 컨테이너의 정상적인 feature 이고 보안 취약점이 아님 (그러나 %3f.jsp 같은 비정상적인 URL 요청이 정상적인 Directory browsing 요청으로 해석되어야 하는지는 논란의 요지가 있음).
2. 서블릿 컨테이너 환경 설정에서 Directory Indexing 이 활성화 되어 있는 경우 특정 디렉터리에 대한 요청 시 서블릿 컨테이너는 파일 리스트를 보여줘야 정상임.
3. Apache 등 Web 서버가 요청을 redirect 시켜주는 경우에도 Directory Indexing 이 활성화되어 있는 경우 마찬가지로 파일 리스트를 보여줘야 함.
4. 때문에 /examples/basic/%3f.jsp 와 같은 요청이 파일 목록을 파악할 수 있는 것임.
아파치가 jsp 확장자를 보고 서블릿 컨테이너에 요청을 던지면 /examples/basic/ 에는 index.html, index.jsp 가 없기 때문에 파일 목록을 사용자에게 반환하는 것임(이는 정상적인 기능).
5. Directory Indexing 이 비활성화 되어 있거나, index.html, index.jsp 파일이 있는 경우 공격할 수 없음.
6. 디폴트로 Resin 을 포함한 대부분의 WAS 는 사용자 편의를 위해 Directory Indexing 이 활성화되어 있음.
- 대처 방안
1. 보안 취약점이 아닌 정상적인 feature 이지만, 이를 이용해 공격이 일어나는 것이 현실이므로 대책이 필요함.
2. Resin 2.1.x 과 Resin 3.x의 대처 방안이 다름(환경 설정 파일의 syntax 가 바뀜).
가) Resin 2.1.x 에서 대책
a. resin 환경 설정 파일 (보통 resin.conf) 에서 가상 디렉터리 설정 부분인 "web-app id" 를 찾는다.
b. <directory-servlet>none</directory-servlet> 를 추가한다.
# 가상 디렉터리 전부에 예외 없이 적용해야 함. 참고 자료 : http://www.caucho.com/resin-2.1/ref/app-config.xtp#directory-servlet
나) Resin 3.x 에서 대책
a. resin 환경 설정 파일 (보통 resin.conf) 에서 글로벌 설정 부분인 "web-app-default" 를 찾는다.
b. <servlet servlet-name="directory" servlet-class="com.caucho.servlets.DirectoryServlet"/> 을 다음과 같이 변경 한다. <servlet servlet-name="directory" servlet-class="com.caucho.servlets.DirectoryServlet">
<init enable="false"/> </servlet> 참고 자료 : http://www.caucho.com/resin-3.0/servlet/servlet-library.xtp#DirectoryServlet
# Resin 2.1.x 은 가상 디렉터리 혹은 가상 호스트 설정이 복잡한 경우 실수하기 쉬우므로 예외 없이 전부 적용했는지 철저히 확인해야 함. 또한 컨설팅 완료 후 업무 목적으로 가상 디렉터리나 가상 호스트가 추가되는 경우 취약해지므로 보안 조치 적용이 필요함을 고객에게 반드시 강조하여 주지시켜야 함.
Resin 모든 버전에 적용되는 %3f.jsp 문제 현황 및 원인 설명
-----------------------------------------------------------
- Resin 의 버전 체계
Stable 버전 - 2.1.x (stable 이라는 느낌보다는 old 라는 느낌이 강하나, 여전히 개발이 이루어지고 있으며 국내외에서 활발히 사용되고 있음)
Current 버전 - 3.x (내부적으로 2.1.x 에 비해 매우 많이 달라짐)
- 취약 현황
Resin 2.1.x 는 최신 버전인 2.1.7 은 물론 구버전부터 Snapshot 버전까지 모든 버전이 %3f.jsp 문제를 가짐. 한때 J2EE 환경의 서블릿 컨테이너 모두가 %3f.jsp 버그에 취약한 것으로 보고 되어 CVE에도 등록되고 일괄적인 패치가 이루어짐. 당시 Resin 도 예외는 아니었으나 2002년 경 개발자가 이 문제를 취약점이 아니라고 보고 해당 패치를 제거함.
Resin 3.x 에도 모든 버전에 걸쳐 해당 문제 있음.
- 공격 성공 조건
1. 반드시 존재하는 디렉터리여야 함 (존재하지 않는 디렉터리에 적용 시 404 에러가 나서 취약하지 않은 줄 알고 그냥 지나치기 쉬움)
2. index.html, index.jsp 등의 default index 파일이 없어야 함.
3. Directory Indexing 이 활성화되어 있어야 함.
- 원인 설명
1. 이는 Directory Indexing 을 지원하기 위한 서블릿 컨테이너의 정상적인 feature 이고 보안 취약점이 아님 (그러나 %3f.jsp 같은 비정상적인 URL 요청이 정상적인 Directory browsing 요청으로 해석되어야 하는지는 논란의 요지가 있음).
2. 서블릿 컨테이너 환경 설정에서 Directory Indexing 이 활성화 되어 있는 경우 특정 디렉터리에 대한 요청 시 서블릿 컨테이너는 파일 리스트를 보여줘야 정상임.
3. Apache 등 Web 서버가 요청을 redirect 시켜주는 경우에도 Directory Indexing 이 활성화되어 있는 경우 마찬가지로 파일 리스트를 보여줘야 함.
4. 때문에 /examples/basic/%3f.jsp 와 같은 요청이 파일 목록을 파악할 수 있는 것임.
아파치가 jsp 확장자를 보고 서블릿 컨테이너에 요청을 던지면 /examples/basic/ 에는 index.html, index.jsp 가 없기 때문에 파일 목록을 사용자에게 반환하는 것임(이는 정상적인 기능).
5. Directory Indexing 이 비활성화 되어 있거나, index.html, index.jsp 파일이 있는 경우 공격할 수 없음.
6. 디폴트로 Resin 을 포함한 대부분의 WAS 는 사용자 편의를 위해 Directory Indexing 이 활성화되어 있음.
- 대처 방안
1. 보안 취약점이 아닌 정상적인 feature 이지만, 이를 이용해 공격이 일어나는 것이 현실이므로 대책이 필요함.
2. Resin 2.1.x 과 Resin 3.x의 대처 방안이 다름(환경 설정 파일의 syntax 가 바뀜).
가) Resin 2.1.x 에서 대책
a. resin 환경 설정 파일 (보통 resin.conf) 에서 가상 디렉터리 설정 부분인 "web-app id" 를 찾는다.
b. <directory-servlet>none</directory-servlet> 를 추가한다.
# 가상 디렉터리 전부에 예외 없이 적용해야 함. 참고 자료 : http://www.caucho.com/resin-2.1/ref/app-config.xtp#directory-servlet
나) Resin 3.x 에서 대책
a. resin 환경 설정 파일 (보통 resin.conf) 에서 글로벌 설정 부분인 "web-app-default" 를 찾는다.
b. <servlet servlet-name="directory" servlet-class="com.caucho.servlets.DirectoryServlet"/> 을 다음과 같이 변경 한다. <servlet servlet-name="directory" servlet-class="com.caucho.servlets.DirectoryServlet">
<init enable="false"/> </servlet> 참고 자료 : http://www.caucho.com/resin-3.0/servlet/servlet-library.xtp#DirectoryServlet
# Resin 2.1.x 은 가상 디렉터리 혹은 가상 호스트 설정이 복잡한 경우 실수하기 쉬우므로 예외 없이 전부 적용했는지 철저히 확인해야 함. 또한 컨설팅 완료 후 업무 목적으로 가상 디렉터리나 가상 호스트가 추가되는 경우 취약해지므로 보안 조치 적용이 필요함을 고객에게 반드시 강조하여 주지시켜야 함.



덧글