Descripción
Un ataque Cross-Site Tracing (XST) combina Cross-site Scripting (XSS) con los métodos HTTP TRACE o TRACK. Según el RFC 2616, “TRACE permite al cliente ver qué se está recibiendo en el otro extremo de la cadena de la petición y usar esos datos con fines de prueba o diagnóstico”. El método TRACK funciona igual, pero es específico del servidor web Microsoft IIS. Mediante XST, un atacante puede robar las cookies de un usuario aun cuando tengan la bandera “HttpOnly” activada, o exponer su encabezado Authorization.
El método TRACE, aunque parezca inofensivo, puede aprovecharse en algunos escenarios para robar las credenciales de usuarios legítimos. Esta técnica fue descubierta por Jeremiah Grossman en 2003, como una forma de eludir la bandera HttpOnly que Microsoft introdujo en Internet Explorer 6 SP1 para impedir que JavaScript accediera a las cookies. De hecho, uno de los patrones de ataque más recurrentes en Cross-Site Scripting consiste en leer el objeto document.cookie y enviarlo a un servidor controlado por el atacante para secuestrar la sesión de la víctima. Marcar una cookie como HttpOnly impide ese acceso desde JavaScript y, por tanto, su envío a un tercero. Sin embargo, el método TRACE permite sortear esa protección y obtener la cookie incluso en ese escenario.
Hoy los navegadores modernos impiden enviar solicitudes TRACE desde JavaScript; aun así, se han descubierto otras vías para lanzarlas desde el navegador, por ejemplo mediante Java.
Ejemplos
Ejemplo con cURL desde la línea de comandos para enviar una petición TRACE a un servidor web local (localhost) que tiene TRACE habilitado. Observa cómo el servidor responde con la misma petición que recibió.
$ curl -X TRACE 127.0.0.1
TRACE / HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Host: 127.0.0.1
Accept: */*En este ejemplo, observa cómo enviamos un encabezado Cookie con la petición y éste también aparece en la respuesta del servidor web.
$ curl -X TRACE -H "Cookie: name=value" 127.0.0.1
TRACE / HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Host: 127.0.0.1
Accept: */*
Cookie: name=valueEn este ejemplo el método TRACE está deshabilitado; observa cómo recibimos un error en lugar del eco de la petición.
$ curl -X TRACE 127.0.0.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>Ejemplo de una petición TRACE mediante XMLHttpRequest en JavaScript. En Firefox 19.0.2 no funciona y devuelve el error “Illegal Value”; en Google Chrome 25.0.1364.172 tampoco, devolviendo “Uncaught Error: SecurityError: DOM Exception 18”. Esto se debe a que los navegadores modernos bloquean el método TRACE en XMLHttpRequest precisamente para mitigar los ataques XST.
<script>
var xmlhttp = new XMLHttpRequest()
var url = 'http://127.0.0.1/'
xmlhttp.withCredentials = true // send cookie header
xmlhttp.open('TRACE', url, false)
xmlhttp.send()
</script>Remediación
Apache
En Apache 1.3.34, 2.0.55 y versiones posteriores, establece la directiva TraceEnable en “off” dentro del archivo de configuración principal y reinicia el servicio. Consulta TraceEnable para más detalles.
TraceEnable off