Clickjacking. El fallo invisible que secuestra tu UI
1. El Engaño Visual: ¿Qué es realmente el Clickjacking?
El Clickjacking (también conocido como UI Redress Attack) es una técnica maliciosa en la que un atacante utiliza múltiples capas transparentes u opacas para engañar a un usuario para que haga clic en un botón o enlace de otra página cuando pretendía hacer clic en la página del nivel superior.
Imagina que estás en una página web que promete “Ver fotos exclusivas”. El botón de “Ver Fotos” está ahí, brillante y tentador. Sin embargo, lo que no ves es que el atacante ha cargado, de forma invisible (con opacity: 0), la página de configuración de tu cuenta bancaria o de tu panel de administración de WordPress justo encima. Cuando haces clic en “Ver Fotos”, en realidad estás pulsando “Transferir Fondos” o “Eliminar Usuario”.
La Ilusión del Control
A diferencia del XSS, donde el atacante inyecta scripts, en el Clickjacking el atacante usa tu propio sitio legítimo contra el usuario. El navegador cree que el usuario está interactuando voluntariamente con tu sitio porque, técnicamente, el clic ocurre sobre tu elemento legítimo.
☠️ El Coste del Ataque
- ✕ Transferencias No Autorizadas en apps fintech.
- ✕ Likejacking: Secuestro de interacciones sociales.
- ✕ Aceptación de Términos y Condiciones fraudulentos.
- ✕ Activación de Cámara/Micrófono vía flash/permisos.
🛡️ Blindaje AldeaCode
- ✓ X-Frame-Options para navegadores legacy.
- ✓ CSP frame-ancestors: Control granular de dominios.
- ✓ SameSite Cookies: Defensa en profundidad.
- ✓ Cumplimiento del Principio de Privacidad por Diseño.
2. Los Dos Guardianes: XFO vs. CSP frame-ancestors
Para detener el clickjacking, debemos decirle al navegador: “No permitas que NADIE cargue mi página dentro de un iframe, a menos que yo lo autorice”. Tenemos dos herramientas principales para esto.
X-Frame-Options (El Guardián Clásico)
Introducido hace más de una década, el header X-Frame-Options (XFO) es simple. Solo tiene dos valores que realmente importan hoy:
DENY: Prohíbe totalmente que la página sea embebida, incluso por el mismo sitio. Es la configuración de seguridad máxima por defecto.SAMEORIGIN: Solo las páginas del mismo dominio pueden cargar esta página en un iframe. Útil si tienes una aplicación compleja que usa iframes internos.
Content Security Policy: frame-ancestors (El Sucesor Granular)
XFO tenía un problema: no podías autorizar a un tercero específico (ej. un partner) sin abrir la puerta a todos. frame-ancestors soluciona esto permitiendo una lista blanca de dominios específicos.
IMPORTANTE: Si un navegador detecta ambos headers, frame-ancestors tiene prioridad absoluta segun el estándar CSP Nivel 2.
Anatomía de una Trampa de UI Redressing
La Capa Trampa
Web del atacante con un botón "Ganar iPad".
El Iframe Invisible
Tu web legítima cargada encima con opacity: 0.
El Clic Secuestrado
El usuario clic sobre el iPad, pero el banco recibe el clic.
3. Impacto de Negocio: Más allá de lo Técnico
No implementar protección contra Clickjacking no es solo un descuido técnico. Es una vulnerabilidad de cumplimiento RGPD. La AEPD sanciona duramente la falta de control sobre la integridad de la interacción del usuario.
Si un atacante usa Clickjacking para que tus usuarios “acepten” nuevos términos de privacidad o den consentimiento para ceder sus datos a terceros, ese consentimiento es nulo de pleno derecho. Como empresa, eres responsable de asegurar que el entorno donde se presta el consentimiento es legítimo y no ha sido manipulado.
La Analogía del Contrato Invisible
Es como si un cliente viniera a firmar un contrato a tu oficina, pero tú pusieras un papel en blanco encima de otro contrato diferente mediante un juego de luces. El cliente cree que firma una cosa, pero su firma queda grabada en la otra. En el mundo digital, CSP y XFO son el cristal blindado que impide este truco.
4. Evolución de los Ataques: Cursorjacking y Drag-and-Drop
El ataque clásico de “clic invisible” es el más conocido, pero los atacantes han evolucionado:
- Cursorjacking: El atacante oculta el cursor real del usuario (vía CSS
cursor: none) y dibuja un cursor falso desplazado unos píxeles. El usuario cree que el cursor está sobre un elemento inofensivo, pero el clic real ocurre sobre un botón crítico. - Drag-and-Drop Clickjacking: Trata de engañar al usuario para que arrastre un elemento (que contiene información sensible como tokens de sesión o emails) hacia un campo controlado por el atacante.
frame-ancestorsbloquea este vector al impedir que la página origen sea cargada en un contexto malicioso.
5. Implementación en Frameworks Modernos
Next.js e Integración de Headers
En Next.js, la forma más limpia es usar el archivo next.config.js o un middleware.ts para inyectar estos headers de forma global.
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/(.*)',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none';" }
],
},
]
},
}
El Caso Especial: Sitios de Membresía y Dashboards
Si tu sitio ofrece un “Widget” que tus clientes deben embeber en sus propias webs (como un chat de soporte o un reproductor de video), NO PUEDES usar DENY. Aquí es donde brilla CSP:
Content-Security-Policy: frame-ancestors 'self' https://dominio-cliente.com;
Lista de Verificación de Seguridad UI
6. Preguntas Frecuentes (FAQ) sobre Clickjacking
¿Por qué 'frame-ancestors' es mejor que X-Frame-Options?
Porque permite autorizar múltiples dominios específicos y es parte del estándar moderno CSP. XFO solo permitía uno o ninguno, y su soporte para listas blancas (ALLOW-FROM) era muy deficiente en navegadores antiguos.
¿Qué pasa si uso 'SAMEORIGIN' en lugar de 'DENY'?
Es una opción válida si necesitas embeber partes de tu propia web en iframes internos. Sin embargo, si sufres un ataque XSS en una subpágina, un atacante podría usar ese XSS para realizar un ataque de Clickjacking desde tu propio dominio.
¿Las cookies SameSite ayudan contra el Clickjacking?
Sí, parcialmente. Si tus cookies de sesión son `SameSite=Lax` o `Strict`, no se enviarán cuando tu sitio se cargue dentro de un iframe de un dominio de terceros malicioso. Esto significa que el usuario aparecerá como "no logueado", neutralizando la mayoría de ataques de robo de cuenta.
¿Puedo usar meta tags para X-Frame-Options?
No. El navegador ignora por completo `X-Frame-Options` si se define en un meta tag HTML. Debe ser obligatoriamente un HTTP Header enviado por el servidor.
¿Me protege Cloudflare contra Clickjacking?
Sí, Cloudflare tiene opciones para forzar estos headers automáticamente, pero la mejor práctica es configurarlos siempre en tu origen para no depender de capas externas volátiles.
¿Qué navegadores soportan 'frame-ancestors'?
Todos los navegadores modernos (Chrome, Firefox, Safari, Edge) lo soportan desde hace años. Solo versiones muy antiguas de Internet Explorer dependen exclusivamente de XFO.
¿Es seguro usar Frame Busting scripts en JS?
Es puntero, pero inseguro. Los atacantes pueden usar el atributo `sandbox` en su iframe malicioso para desactivar la ejecución de JS en tu página técnica, haciendo que tu script de protección no se ejecute nunca.
¿Afecta XFO al indexado de Google?
No. Googlebot no utiliza iframes para indexar el contenido principal de una página. Sin embargo, si quieres que tus herramientas se previsualicen en servicios de terceros (como un "Rich Preview" de Slack), podrías necesitar ajustar tu política.