Apache Tomcat 과 Apache httpd 에서 TRACE Method 요청 차단
1. HTTP Method 확인
다음과 같이 확인한다.
curl -i -X OPTIONS http://localhost/
Apache Tomcat 이나 Apache httpd 설치하고 나서 아무것도 하지 않았다면, 순서는 다르겠지만 다음과 같이 4개의 Method 를 허용한다.
Allow: OPTIONS, GET, HEAD, POST
주의할 점은 TRACE 의 경우 Allow 헤더로 반환하지 않는다는 것이다.
1.1. Apache Tomcat 과 TRACE
Apache Tomcat 이 TRACE 를 허용하고 있는지 확인하려면 다음과 같이 한다.
curl -i -X TRACE http://localhost:8080/
Apache Tomcat 의 경우 TRACE 지원 여부에 대해서
server.xml 에서 <Connector> 요소의 allowTrace 속성으로 지정하는데,
기본값이 false 이므로(Apache Tomcat 6.5 ~ Apache Tomcat 10),
allowTrace 속성값이 명시적으로 true 로 하지 않았다면, TRACE 는 지원하지 않고,
HTTP Status 405 – Method Not Allowed 를 돌려준다.
특이한 점은 다음과 같이 Allow 헤더가 OPTIONS 요청과 다르다는 것인데,
DELETE 나 PUT 으로 요청하면, 405 상태코드를 돌려준다.
Allow: HEAD, DELETE, POST, GET, OPTIONS, PUT
Apache Tomcat 에서
DELETE나PUT요청을 처리할 수 있다면, web.xml 에서org.apache.catalina.servlets.DefaultServlet의 readonly 파라미터 값을false로 설정한 것이다.
1.2. Apache httpd 와 TRACE
Apache httpd 는 기본값으로 TRACE 를 허용한다.
curl -i -X TRACE http://localhost/
1.3. PUT 으로 요청한 경우
Apache httpd 에서 PUT 으로 요청하는 명령어는 다음과 같다.
curl -i -X PUT http://localhost/
혹은 Apache Tomcat 이라면 다음과 같다.
curl -i -X PUT http://localhost:8080/
Apache httpd 와 Apache Tomcat 모두 HTTP Status 405 – Method Not Allowed 를 돌려준다.
HTTP Status 405 를 반환한다면, 다른 조치는 필요 없다.
1.4. CONNECT 로 요청한 경우
Apache httpd 에서 CONNECT 로 요청하는 명령어는 다음과 같다.
curl -i -X CONNECT http://localhost/
400 Bad Request 를 반환한다.
Apache Tomcat 이라면 다음과 같다.
curl -i -X CONNECT http://localhost:8080/
HTTP Status 501 – Not Implemented 를 반환한다.
HTTP Status 400 혹은 HTTP Status 501 를 반환한다면, 다른 조치는 필요 없다.
2. TRACE 요청 차단
2.1. Apache httpd
httpd.conf 파일에 다음을 추가한다.
TraceEnable Off
Apache httpd 를 재기동한다.
./apachectl configtest ./apachectl start
2.2. Apache Tomcat
Apache Tomcat 6.5 ~ Apache Tomcat 10 을 설치하고,
뭔가 하지 않았다면,
HTTP Status 405 를 돌려줄 것이다.
curl -i -X TRACE http://localhost:8080/
만약, HTTP Status 405 가 아니라면,
server.xml 에서 <Connector> 요소의 allowTrace 속성이
명시적으로 true 로 되어 있는지 확인해서, false 로 변경한다.
3. HEAD 요청은 차단 할 수 없다.
HTTP Status 403 을 반환하도록 설정해도 마찬가지이다.
4. OPTIONS 요청을 차단하면 CORS 설정과 충돌할 수 있다.
CORS 에서 OPTIONS 요청을 선행하기 때문에, CORS 설정을 할 요량이라면 OPTIONS 요청도 허용해야 한다.
이에 대해서는 MDN 의 교차 출처 리소스 공유 (CORS) 를 참조한다.
OPTIONS 요청은 Allow 헤더를 반환하는 것에 그치기 때문에 차단하는 것이 큰 의미는 없다.
5. 그래도 OPTIONS 요청을 차단하려면
5.1. Apache httpd
5.1.0. 주의사항
https 요청이
mod_jk 나 mod_proxy 로 처리한다면,
Apache Tomcat 등에서 별도로 설정해야 한다.
5.1.1. AllowMethods
Apache HTTP Server Version 2.4 부터 지원한다.
먼저 httpd.conf 에서 LoadModule 부분의 주석을 풀어준다.
LoadModule allowmethods_module modules/mod_allowmethods.so
<Location "/"> AllowMethods GET POST </Location>
이렇게 하면 HTTP Status 405 를 반환한다.
/svn 경로에 대해서는 AllowMethods 설정을 해제하려면 다음과 같다.
<Location "/svn"> AllowMethods reset </Location>
5.1.2. LimitExcept
httpd.conf 에 다음과 같은 내용을 추가한다.
<Location "/"> Require all granted <LimitExcept GET POST> Require all denied </LimitExcept> </Location>
LimitExcept 지시어는 제외한 이라는 의미이고, GET 과 POST 를 제외한 모든 요청을 거부한다.
HTTP Status 403 forbidden 을 반환한다.
Apache HTTP Server Version 2.2 라면 다음과 같이 해야 한다.
<Location "/"> Order allow,deny Allow from all <LimitExcept GET POST> Order deny,allow Deny from all </LimitExcept> </Location>
5.2. Apache Tomcat
web.xml 에 다음과 같은 사항을 추가한다.
<security-constraint> <web-resource-collection> <web-resource-name>unsupported method</web-resource-name> <url-pattern>/*</url-pattern> <http-method>PROPFIND</http-method> <http-method>PROPPATCH</http-method> <http-method>COPY</http-method> <http-method>MOVE</http-method> <http-method>LOCK</http-method> <http-method>UNLOCK</http-method> <http-method>PUT</http-method> <http-method>HEAD</http-method> <http-method>DELETE</http-method> <http-method>OPTIONS</http-method> <http-method>TRACE</http-method> </web-resource-collection> <auth-constraint /> </security-constraint>
HTTP Status 403 forbidden 을 반환한다.
6. TRACE 요청이 허용된 경우의 위험
HTTP TRACE Method 와 관련된 취약점을 XST(Cross-Site Tracing) 취약점이라고 한다.
6.1. XSS(cross-site scripting) 와 결합된 형태
HTTP TRACE Method 의 Response 는 요청 정보를 포함하고 있기 때문에 XMLHttpRequest 를 이용해서 서버에 TRACE 요청을 하고 그 결과를 받아보면 웹브라우저가 자동으로 만들어서 보냈던 요청헤더까지 받아 볼 수 있다.
클라이언트와 서버가 웹브라우저가 자동으로 만들어서 보냈던 요청헤더를 볼 수 있는 것은 당연한 일이다.
다만, XSS(cross-site scripting) 로 XMLHttpRequest 요청이 이루어진다면, document.cookie 로 조회할 수 없는 HttpOnly Cookie 와 같은 것들을 제3자가 알 수 있게 된다.
만약, HTTP Basic Authentication 을 사용한다면, 아이디와 패스워드까지 유출 될 수 있지만, 최근에는 인트라넷에서도 HTTP Basic Authentication 을 사용하는 사례가 거의 없으므로 이른 전제로 하는 것은 위험을 지나치게 부풀린다는 인상을 지울 수 없다.
사용자가 최신 버전의 웹브라우저를 사용하고 있다면, 다른 사이트로 XMLHttpRequest 요청을 할 때, Cookie 정보를 전송하지 않으므로 문제가 생길 여지가 없다.
사용자가 오래된 버전의 웹브라우저를 사용하고 있는 경우에 한해서 가능한 공격방법이지만, TRACE 요청을 막아야 하는 충분한 이유가 된다.
6.2. 가능성이 낮은 형태
Apache HTTP Server 가 그 뒤에 있는 다른 서버와 proxy 통신을 하고, Apache HTTP Server와 다른 서버가 HTTP Basic Authentication 을 하는 매우 특수한 경우에 발생할 수 있는 위험이 있다.
공격자는 TRACE 요청을 통해서 Apache HTTP Server와 다른 서버가 주고받은 정보를 알 수 있는데, 만약 서로가 HTTP Basic Authentication 같은 것으로 인증 정보를 주고 받는다면, 그 정보를 공격자가 탈취할 수 있게 된다.
다만, Apache HTTP Server 의 뒤에 있는 서버는 네트워크 구성이나 iptables 와 같은 방화벽으로 접근을 제어하는 것이 일반적이고, 위와 같은 구성을 한다는 이야기는 들어본 적도 없을 정도로 예외적이기 때문에 가능성 있는 위협이라고 하기에는 무리가 있다.