La Brecha de Qantas: 5.7 Millones de Registros Expuestos por una Integración de Terceros
Qantas no fue hackeada — lo fue un sistema conectado. 5.7M registros de clientes quedaron expuestos por un tercero integrado con Salesforce. Aquí lo que deben auditar los desarrolladores.
Enrique Alvarez
Security Engineer
Los sistemas de Qantas no fueron hackeados. Su código estaba bien. Sus servidores estaban bien. Sus bases de datos internas nunca fueron tocadas.
Y aun así, 5.7 millones de registros de clientes quedaron expuestos — nombres, correos, teléfonos, números de cuenta de frequent flyer. Todo accesible.
La razón: un tercero con acceso conectado a Salesforce fue comprometido. Ese tercero tenía más acceso del que necesitaba. Los atacantes lo usaron. Y los datos de los clientes de Qantas salieron por una puerta que Qantas no controlaba.
Esta es la historia de la brecha seguridad integración terceros que más debería preocuparte como developer. No porque Qantas sea tu empresa — sino porque probablemente tú también tienes esa puerta abierta.
Qué pasó exactamente
En mayo de 2025, Qantas notificó a sus clientes que datos personales habían sido expuestos. El origen no fue un ataque a su infraestructura central. Fue un proveedor externo que manejaba ciertos procesos de negocio con acceso a Salesforce — la plataforma CRM que Qantas usa para gestionar datos de clientes.
El tercero fue comprometido. Los atacantes usaron el acceso que ese proveedor tenía configurado para moverse hacia los datos. El resultado: información de aproximadamente 5.7 millones de personas quedó en manos equivocadas.
Lo que sabemos de los datos expuestos:
- Nombres completos
- Direcciones de correo electrónico
- Números de teléfono
- Números de cuenta Qantas Frequent Flyer
- Fechas de nacimiento en algunos casos
Lo que no fue comprometido, según Qantas: datos de pasaporte, información de tarjetas de crédito, contraseñas de cuentas, o datos de itinerarios de vuelo.
La distinción importa. Qantas mantuvo segmentados sus datos más sensibles. Eso limitó el daño — pero no lo eliminó.
El mecanismo exacto del ataque al tercero no fue divulgado públicamente. Lo que quedó claro: el proveedor tenía un nivel de acceso a los datos de Salesforce que excedía lo que necesitaba para sus funciones específicas. Cuando fue comprometido, ese acceso sobrante fue el que se explotó.
El problema: no controlas la postura de seguridad de tus integraciones
Aquí está el punto que la mayoría de análisis de esta brecha no mencionan directamente.
Cuando conectas tu app a un servicio externo — Salesforce, HubSpot, Stripe, Resend, lo que sea — no solo estás usando una API. Estás delegando acceso. Le estás diciendo a ese servicio: "Puedes leer y/o escribir estos datos en mi nombre."
El problema es que una vez que delegas ese acceso, no controlas cómo ese servicio protege las credenciales que le entregaste. No controlas sus prácticas de seguridad internas. No sabes si tiene MFA habilitado, si rota sus tokens, si sus empleados tienen acceso innecesario a los datos que maneja para ti.
Heredas su superficie de ataque.
Si tu integración de Salesforce usa un usuario de API con acceso completo a todos los objetos, y ese usuario es comprometido desde el lado del proveedor, los atacantes ven lo mismo que ese usuario. Si le diste acceso de administrador "porque era más fácil configurarlo así", los atacantes tienen acceso de administrador.
Esto no es teórico. Es exactamente lo que pasó con Qantas.
La misma dinámica aplica a cualquier integración SaaS que estés usando hoy. El problema de la brecha datos Qantas 2025 Salesforce no fue exclusivo de Qantas — es estructural a cómo se construyen las integraciones cuando la conveniencia gana sobre el mínimo privilegio. Según el Verizon Data Breach Investigations Report, las brechas que involucran terceros siguen en aumento año tras año, y en la mayoría de los casos el vector inicial fue acceso sobreprovisioned.
Qué significa "mínimo privilegio" en la práctica
El principio es simple: cada integración debería tener exactamente los permisos que necesita para hacer su trabajo. Ni uno más.
En la práctica, esto es lo que suele pasar:
// MAL: Scope completo — porque venía por defecto y "funcionó"
// Si este token es comprometido, el atacante lee y escribe todo en Salesforce
const salesforceConfig = {
scope: "api refresh_token full",
clientId: process.env.SF_CLIENT_ID,
clientSecret: process.env.SF_CLIENT_SECRET,
}// BIEN: Mínimo privilegio — solo lectura en los objetos específicos que necesitas
// Si este token es comprometido, el daño está contenido a contactos en lectura
const salesforceConfig = {
scope: "api:Contacts:read api:Accounts:read refresh_token",
clientId: process.env.SF_CLIENT_ID,
clientSecret: process.env.SF_CLIENT_SECRET,
}La diferencia puede parecer pequeña. En producción, es la diferencia entre un atacante que puede leer un subconjunto de contactos y uno que puede modificar, exportar o eliminar todo tu CRM.
El mismo principio aplica con Stripe. La mayoría de developers conecta la clave secreta completa a integraciones que solo necesitan leer información de cobros:
// MAL: Clave secreta completa para una integración que solo necesita leer cobros
// Esta clave puede crear cargos, emitir reembolsos, acceder a datos completos de clientes
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)
// BIEN: Clave restringida creada directamente en el panel de Stripe
// Panel → API Keys → Crear clave restringida → solo charges:read
// Aunque esta clave sea comprometida, no puede crear ni modificar nada
const stripe = new Stripe(process.env.STRIPE_RESTRICTED_KEY_CHARGES_READ)Stripe te permite crear claves restringidas en su panel en menos de dos minutos. La mayoría de los developers nunca lo hace porque la clave secreta "funciona para todo". Esos dos minutos extra son exactamente el margen de contención que necesitas si algo sale mal.
Una auditoría de 5 pasos para developers que usan Salesforce, Stripe, HubSpot u otras integraciones SaaS
No necesitas un equipo de seguridad para hacer esto. Necesitas una tarde y acceso a tus paneles.
Paso 1: Lista cada servicio de terceros con acceso a tus datos
Literalmente, abre un documento y escribe cada integración activa. Salesforce, Stripe, HubSpot, Resend, SendGrid, Intercom, Mixpanel — todo. Incluye servicios que "solo leen". Leer los datos de tus usuarios es suficiente para que una brecha sea grave.
Paso 2: Verifica que cada uno tiene el mínimo scope necesario
Para cada integración de la lista, revisa qué permisos tiene configurados. Esta tabla es una referencia rápida de lo que suele estar sobredimensionado:
| Integración | Scope típico por defecto | Lo que realmente necesitas | Riesgo si comprometido |
|---|---|---|---|
| Salesforce | Acceso API completo | Lectura en objetos específicos | Todos los datos de Salesforce |
| Stripe | Clave secreta completa | Clave restringida, permisos específicos | Datos de pago, registros de clientes |
| HubSpot | Todos los scopes CRM | Lectura de contactos, pipeline específico | Datos CRM, info de contacto |
| Resend / SendGrid | Acceso completo de envío | Solo dominios verificados | Phishing desde tu dominio |
Si tu integración tiene más acceso del que está en la columna "lo que realmente necesitas", eso es una acción directa — no para "revisar después".
Paso 3: Verifica que no hay credenciales hardcodeadas en tu repo
Las API keys de terceros no deben aparecer en tu código. Deben vivir en variables de entorno y nunca ser commiteadas. Si en algún momento pusheaste una API key de Salesforce, Stripe, o HubSpot a tu repo — aunque la hayas borrado después — esa clave debe ser revocada y reemplazada ahora.
Un escaneo rápido puede revelar lo que creías haber eliminado:
# Buscar credenciales de integraciones hardcodeadas en el repo
# Esto incluye claves de Stripe, SendGrid, Slack, y otros patrones comunes
grep -r "sk_live\|SG\.\|xoxb-\|SALESFORCE\|hubspot" . \
--include="*.ts" --include="*.js" --include="*.env*" \
--exclude-dir=node_modulesEsto revisa el código actual. El historial de git es otro problema — un commit de hace seis meses puede tener una clave que borraste del código pero que sigue accesible en el historial. Data Hogo escanea tu repo buscando exactamente esto — incluyendo el historial de commits, no solo el estado actual del código.
Paso 4: Confirma que sabrías si un tercero accede a datos inesperadamente
Revisa si tus integraciones generan logs de actividad. Salesforce tiene audit logs de acceso API. Stripe tiene event logs. Si un tercero empieza a leer datos fuera de su patrón normal — por ejemplo, exportando contactos masivamente a las 3am — ¿tienes alertas configuradas para eso?
Si la respuesta es no, es momento de configurar al menos una alerta básica de volumen de acceso. La detección temprana no evita la brecha, pero limita radicalmente cuántos datos salen.
Paso 5: Confirma que puedes revocar acceso de cada integración en menos de 5 minutos
Entra ahora mismo a cada panel (Salesforce, Stripe, HubSpot) y localiza dónde se revocan las credenciales o los accesos OAuth. Si tardas más de cinco minutos en encontrarlo, tardas demasiado en un escenario de incidente real.
La velocidad de revocación importa. Cuanto más tiempo un token comprometido sigue activo, más datos pueden ser exfiltrados. Si tu proceso de revocación requiere abrir un ticket, escalar a alguien, o esperar un ciclo de deploy — eso es un problema de arquitectura que vale la pena resolver ahora.
Lo que Qantas hizo bien (y lo que cambiaría el resultado)
Vale la pena dar crédito donde corresponde. Qantas tenía segmentados sus datos más sensibles — pasaportes, tarjetas de crédito, contraseñas — de manera que no quedaron expuestos en esta brecha. Eso es arquitectura de datos correcta y limitó materialmente el daño.
Lo que habría cambiado el resultado: que el tercero comprometido tuviera acceso restringido solo a los datos estrictamente necesarios para sus funciones. Si el scope de su integración con Salesforce hubiera estado acotado a los objetos específicos que necesitaba operar, en lugar de un acceso API más amplio, los 5.7 millones de registros no habrían sido accesibles aunque el proveedor fuera comprometido.
El OWASP Top 10 A05: Security Misconfiguration cubre exactamente esto: permisos más amplios de lo necesario en sistemas conectados es una mala configuración, no un error de código. Y las malas configuraciones son consistentemente más fáciles de explotar que los bugs de lógica.
La buena noticia: de los cinco pasos de auditoría de arriba, cuatro son cambios de configuración — no de código. No requieren un sprint. Requieren una tarde.
TL;DR
- Qantas no fue hackeada directamente — un proveedor de terceros con acceso a Salesforce fue comprometido, exponiendo datos de 5.7 millones de clientes.
- Los datos expuestos incluyen nombres, correos, teléfonos y números de frequent flyer. Datos financieros y de pasaportes no fueron comprometidos.
- El mecanismo: el tercero tenía acceso más amplio del necesario. Cuando fue vulnerado, ese acceso sobrante fue explotado.
- Cada integración que agregas a tu app es superficie de ataque heredada — si ese tercero es comprometido, tus datos de usuarios quedan expuestos aunque tu propio código sea impecable.
- Mínimo privilegio no es opcional: usa scopes específicos en Salesforce, claves restringidas en Stripe, permisos limitados en HubSpot y SendGrid.
- Audita tus integraciones ahora: lista quién tiene acceso, verifica los scopes, asegúrate de poder revocar en menos de 5 minutos.
- Escanea tu repo para confirmar que ninguna API key de terceros está hardcodeada — incluyendo en el historial de commits.