PostMessage Sin Verificar Origen
Handlers de window.addEventListener('message') que procesan mensajes sin verificar event.origin, permitiendo que cualquier sitio web envíe comandos al handler de mensajes de tu app.
Cómo Funciona
postMessage se usa para comunicación cross-origin entre iframes. Cuando escuchas mensajes sin verificar el origen, cualquier página en internet puede enviar un mensaje a tu ventana (si pueden obtener una referencia via popup o iframe). Si tu handler realiza acciones basadas en los datos del mensaje, el atacante controla esas acciones.
// MAL: sin verificar origen — cualquier sitio puede enviar mensajes
window.addEventListener('message', (event) => {
if (event.data.type === 'navigate') {
window.location.href = event.data.url; // open redirect via postMessage
}
});// BIEN: verifica el origen antes de procesar
window.addEventListener('message', (event) => {
if (event.origin !== 'https://padre-confiable.com') return;
if (event.data.type === 'navigate') {
const allowed = ['/dashboard', '/configuracion'];
if (allowed.includes(event.data.url)) window.location.href = event.data.url;
}
});Ejemplo Real
Las vulnerabilidades de bypass de origen en postMessage se han encontrado en widgets de pago, popups de OAuth y widgets de chat. Los atacantes pueden redirigir usuarios, robar tokens pasados via postMessage o disparar acciones en el frame embebido. HackerOne tiene cientos de reportes para esta clase.
Cómo Prevenirlo
- Siempre verifica event.origin contra una allowlist hardcodeada antes de procesar cualquier mensaje
- Valida la estructura y contenido de event.data — no confíes en él ciegamente
- Usa un protocolo/sistema de tipos de mensajes específico e ignora tipos de mensajes desconocidos
- Al enviar mensajes, siempre especifica el parámetro targetOrigin (nunca uses '*')
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
XSS Basado en DOM
highScripts maliciosos ejecutados al leer datos controlados por el atacante de la URL o APIs del navegador y escribirlos en el DOM usando sinks peligrosos como innerHTML o document.write.
XSS Almacenado
highContenido provisto por el usuario guardado en la base de datos sin sanitizar y renderizado en el navegador como HTML, permitiendo inyección de scripts persistente que se ejecuta para cada usuario que ve el contenido.
Clickjacking Avanzado
mediumAusencia de los headers X-Frame-Options y CSP frame-ancestors, combinada con sin lógica de frame-busting en el cliente, dejando la app completamente embebible en iframes maliciosos.
Iframe Sin Atributo Sandbox
mediumContenido de terceros o generado por el usuario cargado en un iframe sin el atributo sandbox, permitiendo que ese contenido ejecute scripts, acceda a cookies del padre y navegue el frame de nivel superior.