Cross-Site Tracing, czyli dlaczego warto wyłączyć TRACE w HTTP
Napisał: Patryk Krawaczyński
01/10/2010 w Ataki Internetowe, Bezpieczeństwo Brak komentarzy. (artykuł nr 283, ilość słów: 766)
W
2003 roku firma WhiteHat Security odkryła nową formę ataku, którą nazwano – XST (ang. Cross-Site Tracing). Wykorzystuje ona wywołanie TRACE protokołu HTTP. Wywołanie metody TRACE odpowiada za diagnostykę oraz analizę kanału komunikacyjnego. Dlatego wysłanie zapytania przez klienta do serwera WWW za pomocą metody TRACE będzie zawierać w odpowiedzi serwera wszystkie dane wysłane przez użytkownika np. informacje o ciasteczkach, czy dane autoryzacyjne, które są cenne dla potencjalnego agresora.
Do przeprowadzenia ataku wystarczy, że ofiara odczyta odpowiednio spreparowaną wiadomość e-mail lub stronę internetową, w której umieszczony (lub wstrzyknięty) skrypt JavaScript lub ActiveX, czy animacja Flash zaprogramowana za pomocą ActionScript, (w połączeniu z lukami umożliwiającymi ładowanie danych niezależnie od lokalizacji (ang. Cross-domain Access)) wykryje, że możliwe jest połączenie użytkownika przeglądarki z serwerem za pomocą TRACE. Wówczas wszystkie dane uwierzytelniające mogą zostać zebrane przez złośliwy skrypt (nawet te przesłane z wykorzystaniem protokołu SSL). Atak ten, może zostać także wykorzystany z powodzeniem do obejścia mechanizmu HttpOnly, który powoduje, że ciasteczka z ustawioną tak flagą nie są widziane przez skrypty po stronie przeglądarki, a tylko po stronie skryptu serwera.
W celu wyeliminowania tego zagrożenia w serwerze WWW – Apache, wystarczy wyłączyć obsługę metody TRACE. Na początku upewniamy się, jakie opcje obsługuje nasz serwer WWW ([CR] – oznacza wciśnięcie klawisza ENTER):
root@darkstar:~# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP1.1 [CR][CR] HTTP/1.1 200 OK Date: Wed, 29 Sep 2010 19:19:29 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 0 Connection: close Content-Type: text/html Connection closed by foreign host.
W dozwolonych metodach widnieje TRACE. Sprawdzamy, czy serwer umożliwia jego wykorzystanie:
root@darkstar:~# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. TRACE / HTTP1.1 [CR][CR] HTTP/1.1 200 OK Date: Wed, 29 Sep 2010 19:20:51 GMT Server: Apache Connection: close Content-Type: message/http TRACE / HTTP1.1 Connection closed by foreign host.
Została zwrócona przesłana wartość oraz kod 200, co sugeruje działanie tej metody. Przy przeprowadzaniu testów można wykorzystać zamiast programu telnet narzędzie netcat – (polecenie: nc localhost 80). Jeśli nasz serwer WWW obsługuje wirtualne hosty należy, również dodać linię: Host: strona.pl, co pozwala na odwołanie się do odpowiedniego adresu strony. Wyłączenie metody TRACE można wykonać za pomocą modułu rewrite – dopisując do głównego pliku konfiguracyjnego /etc/httpd/httpd.conf dyrektywy:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_METHOD} ^TRAC(E|K) RewriteRule .* - [F] </IfModule>
W przypadku wykorzystania mod_rewrite każdy wirtualny host, który ma podlegać ochronie przed metodą TRACE musi zawierać w swojej konfiguracji reguły:
RewriteOptions inherit RewriteEngine on
Po wykonaniu zmian należy wykonać ponowny test w celu zbadania poprawności wprowadzonych modyfikacji:
root@darkstar:/etc/httpd# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP1.1 [CR][CR] HTTP/1.1 200 OK Date: Wed, 29 Sep 2010 19:32:01 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 0 Connection: close Content-Type: text/html Connection closed by foreign host.
Opcja TRACE nadal jest w dopuszczonych metodach.
root@darkstar:/etc/httpd# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. TRACE / HTTP1.1 [CR][CR] HTTP/1.1 403 Forbidden Date: Wed, 29 Sep 2010 19:32:11 GMT Server: Apache Content-Length: 202 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access / on this server.</p> </body></html> Connection closed by foreign host.
Lecz jej wykorzystanie nie jest już możliwe. Istnieje, również możliwość całkowitego wyłączenia metody TRACE. Wówczas, każdy wirtualny host bez potrzeby definiowania reguł przepisywania będzie bezpieczny od tej praktyki (zupełne wyłączenie tej metody nie wiąże się z żadnym ograniczeniem funkcjonalności od strony przeglądarek). W tym celu należy dodać poniższą opcję do pliku konfiguracyjnego serwera Apache:
TraceEnable Off
Warto nadmienić, że wcześniej wspomniane reguły przepisywania chroniące przed wywołaniem TRACE szczególnie przydają się w przypadku korzystania z hostingu współdzielonego, gdzie nie posiadamy dostępu do pliku konfiguracyjnego serwera WWW, a jedynie mamy możliwość sterowania wybranymi opcjami tylko za pomocą plików .htaccess. Po globalnym wyłączeniu TRACE serwer powinien reagować następująco:
root@darkstar:/etc/httpd# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP1.1 [CR][CR] HTTP/1.1 200 OK Date: Wed, 29 Sep 2010 19:43:35 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS Content-Length: 0 Connection: close Content-Type: text/html Connection closed by foreign host.
Z dozwolonych metod TRACE zostało już wykluczone, co skutkuje zwracaniem stosownego komunikatu błędu przy próbie użycia tej metody:
root@darkstar:/etc/httpd# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. TRACE / HTTP1.1 [CR][CR] HTTP/1.1 405 Method Not Allowed Date: Wed, 29 Sep 2010 19:43:49 GMT Server: Apache Allow: Content-Length: 223 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>405 Method Not Allowed</title> </head><body> <h1>Method Not Allowed</h1> <p>The requested method TRACE is not allowed for the URL /.</p> </body></html> Connection closed by foreign host.
Wyłączenie tej metody jest na tyle ważne, ze względu na jej aktywność w standardowej konfiguracji wielu serwerów WWW. Oczywiście samo wyłączenie metody TRACE nie zamyka podatności różnych przeglądarek na wycieki danych autoryzacyjnych, czy przekazywanie danych niezależnie od odwiedzanej lokalizacji, a także powstrzymanie ataków phishing skierowanych głównie w czynnik ludzki.
Więcej informacji: Cross-Site Tracing, OWAP