TRACE
Uso
Una solicitud TRACE es una herramienta de diagnóstico para inspeccionar la cadena de solicitud entre un cliente y el servidor de origen. El servidor responde con 200 e incluye en el cuerpo de la respuesta el mensaje de solicitud recibido. Un formato reconocido es Content-Type message/http. El cuerpo de la respuesta contiene una copia del mensaje de solicitud tal como se recibió, excluyendo los campos que el servidor considera sensibles, lo que permite compararlo con la solicitud original.
Propiedades
Las solicitudes TRACE no llevan cuerpo. Los clientes son responsables de no incluir campos sensibles, como credenciales o cookies, en las solicitudes TRACE, ya que la respuesta reflejada expone todas las cabeceras recibidas.
Microsoft IIS admitió históricamente TRACK como alias propietario de TRACE. Ambos están sujetos a la misma vulnerabilidad XST y ambos deben deshabilitarse en producción.
Detección de intermediarios
Cuando una solicitud atraviesa proxies o pasarelas, cada intermediario añade una entrada a la cabecera Via indicando la versión del protocolo utilizada para el reenvío. Comparar la solicitud original con la copia reflejada revela las cabeceras añadidas, modificadas o eliminadas en cada salto.
La cabecera Max-Forwards limita hasta dónde viaja una solicitud TRACE. Fijar este valor en cero hace que responda el primer proxy, lo que resulta útil para aislar un intermediario concreto en una cadena de varios saltos. Decrementar el contador en cada salto evita bucles de reenvío infinitos.
Seguridad y XST
El rastreo entre sitios (Cross-Site Tracing, XST) es un vector de ataque que aprovecha TRACE para capturar cabeceras HTTP, incluidos tokens de autenticación y valores de cookies. Un script malicioso envía una solicitud TRACE al servidor de destino, y la respuesta reflejada expone cabeceras que de otro modo no serían accesibles para el script.
Nota
La mayoría de los servidores en producción deshabilitan TRACE para prevenir los ataques XST. Servidores web como Apache y Nginx deshabilitan TRACE de forma predeterminada. Los navegadores también bloquean TRACE. El WHATWG Fetch Standard incluye TRACE entre los métodos prohibidos, lo que impide que JavaScript emita solicitudes TRACE. Deshabilitar TRACE en el servidor sigue siendo una medida de fortalecimiento recomendada para todos los servidores expuestos a internet.
Ejemplo
Una solicitud TRACE al recurso raíz. El servidor refleja la solicitud original en el cuerpo de la respuesta e incluye una cabecera Via que muestra que la solicitud pasó por dos servidores proxy.
Solicitud
TRACE / HTTP/1.1
Host: example.com
Respuesta
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 91
Via: 1.1 proxy1.example.re, 1.1 proxy2.example.re
TRACE / HTTP/1.1
Host: example.com
Via: 1.1 proxy1.example.re, 1.1 proxy2.example.re
La cabecera Via enumera proxy1.example.re y proxy2.example.re como intermediarios. Ambos reenviaron la solicitud usando HTTP/1.1. Cada intermediario debe añadir una entrada Via a las solicitudes reenviadas, por lo que el cuerpo reflejado incluye el campo Via acumulado que añadieron los dos proxies.
CORS
TRACE es un método prohibido por CORS. Los navegadores bloquean todos los intentos de enviar TRACE mediante API del navegador como fetch() y XMLHttpRequest.
Cómo deshabilitar TRACE
Apache deshabilita TRACE con TraceEnable Off en la configuración del servidor. nginx no admite TRACE de forma predeterminada, así que no hace falta ninguna acción. IIS requiere eliminar TRACE (y TRACK) de los verbos permitidos en el filtrado de solicitudes (Request Filtering). Caddy no admite TRACE de forma predeterminada.
OWASP recomienda deshabilitar TRACE en todos los servidores de producción. Los escáneres de seguridad señalan TRACE habilitado como una vulnerabilidad aunque los navegadores modernos bloqueen las solicitudes TRACE mediante el Fetch Standard, que lo incluye entre los métodos prohibidos.
Deshabilitar TRACE en el nivel del servidor sigue siendo la defensa principal frente a XST, porque los clientes HTTP y los scripts que no son navegadores no están sujetos a las restricciones del Fetch Standard.