¿Qué es el fraude de tarifas y cómo lo limita Bird?

El fraude de tarifas consiste en que un atacante marca números que pagan a su dueño a través del sistema telefónico de otra persona: Bird rechaza esos tipos de números directamente, y la lista de países permitidos acota lo que una credencial robada aún puede alcanzar.

El fraude telefónico suele pagar al atacante directamente, sin un comprador ni un rescate de por medio. No se roba ni se cifra nada, así que las señales habituales de una brecha están ausentes. La pérdida aparece como gasto en llamadas.

Eso define la defensa. No puedes detectarlo buscando algo inusual en el contenido de una llamada. Los controles giran en torno a adónde pueden ir las llamadas, cuántas puede haber y cuánto pueden costar.

¿Por qué vale la pena defenderse de esto si mi sistema está protegido?

Porque el valor de un compromiso es inmediato y la ventana es corta.

Una credencial SIP robada, o un puerto abierto en una PBX, el sistema telefónico empresarial que enruta las llamadas de una empresa, genera beneficios en cuanto se usa. El incentivo del atacante es marcar todo lo posible antes de que alguien se dé cuenta. Los destinos que más pagan son los que un negocio normal nunca llama.

Ese último punto es lo que hace que una lista de permitidos sea eficaz y no simplemente ordenada. La mayoría de las empresas llaman a un conjunto pequeño y estable de países. Un atacante necesita un conjunto específico y diferente. Cualquier cosa que fuerce a ambos a solaparse le cuesta al atacante todo su modelo de negocio.

¿Cómo funcionan los controles de destino?

Cada país está habilitado para tu espacio de trabajo o no, y las llamadas solo llegan a los que activaste.

Dos cosas distintas deciden qué puedes hacer con un país, y confundirlas es la confusión habitual:

  • Disponibilidad indica si el país es tuyo para habilitar. Available significa que Bird puede realizar llamadas allí desde tu cuenta. Not supported significa que no puede, y restaurarlo requiere una conversación con soporte.
  • Tu interruptor indica si un país disponible está activado. El cambio se aplica desde el momento en que lo haces.

Que un país esté disponible no te dice nada sobre si las llamadas lo están alcanzando en este momento. Eso es el interruptor, y es el control que operas tú.

Algunos países llevan una marca de alto riesgo, que refleja tanto sus tarifas como su exposición al fraude. Esos son los destinos que un atacante intenta alcanzar. Mantenlos desactivados a menos que el negocio realmente los llame, y comprueba cuánto cuesta una llamada allí antes de habilitar uno. La página de destinos de voz lista cada país con su disponibilidad y estado de activación, y precios de voz contiene las tarifas.

Una llamada rechazada por este motivo se rechaza con destination_not_enabled. La solución es activar ese país, no reintentar.

La disponibilidad se aplica al país en su conjunto. Un número específico dentro de un país habilitado puede seguir siendo inalcanzable. Eso se rechaza como no_route_found.

no_route_found cubre más de una causa. Bird clasifica el número que marcaste antes de consultar tu configuración de destinos. Rechaza un tipo que no enruta. Tarifa premium es el que importa aquí: números cuya terminación paga al propietario, que es lo que un atacante marca. Los rangos de coste compartido y número personal dividen el cargo de la llamada o la reenvían a otra línea. Los números no geográficos no pertenecen al código de área de ningún país. Los tres se rechazan de la misma forma. Esos rechazos son deliberados. Alcanzan los números que un atacante quiere, porque un rango premium dentro de un país que habilitaste nunca pasa la clasificación. Un número que genuinamente es inalcanzable reporta el mismo código, así que comprueba el tipo del número que marcaste antes de abrir un ticket.

¿Qué limita un ataque dentro de un país que sí permito?

Tres topes, cada uno de los cuales rechaza una llamada por sí solo.

Motivo de rechazoEl tope que alcanzó
daily_spend_exceededTope de gasto diario en voz de tu organización
concurrent_calls_exceededTantas llamadas en curso como permite la cuenta
calls_per_second_exceededLlamadas nuevas realizadas más rápido de lo que permite la cuenta
insufficient_balanceEl saldo no cubría la llamada, así que se rechazó de entrada

El tope de gasto se comporta más como un control antifraude, porque está denominado en lo que el atacante realmente se lleva. Además se aplica en una ruta diferente a la de los otros dos. Se reinicia al inicio del siguiente día UTC, así que una ráfaga que lo alcance queda contenida hasta entonces en lugar de simplemente ralentizada. También es el que no existe hasta que lo configuras: una organización sin tope diario de voz configurado no tiene tope de gasto aplicado en absoluto.

Los otros dos se comportan de dos maneras que cambian cómo puedes confiar en ellos.

Se comprueban en orden, no juntos. El tope de llamadas concurrentes se evalúa primero y responde de inmediato, así que una llamada que supera ambos topes reporta concurrent_calls_exceeded y nunca menciona la tasa de marcación. Eso importa para el diagnóstico, no para la defensa. Un marcador de campaña puede alcanzar calls_per_second_exceeded sin estar cerca del tope de concurrencia. Comprueba cuál recibiste realmente antes de cambiar una configuración, porque tienen soluciones distintas y subir el incorrecto no hace nada.

Un tope cuya propia comprobación no puede completarse admite la llamada. Si el conteo de concurrencia o el limitador de tasa no pueden evaluarse, la llamada pasa en lugar de rechazarse. Así que estos topes acotan la operación normal de forma fiable, pero no son una garantía bajo cualquier condición. Esa es otra razón por la que la lista de destinos importa: es la capa que no depende de una consulta en vivo.

insufficient_balance actúa como un control sin estar diseñado como tal. El saldo limita cuánto fraude puede acumular un compromiso. Una recarga automática grande elimina ese límite, lo que convierte el monto de recarga en una decisión antifraude además de una de conveniencia.

¿Quién puede enviar llamadas a mi trunk en primer lugar?

Solo las direcciones en la lista de IP permitidas del trunk, las claves API que permite y las credenciales de sesión que ha emitido pueden enviarle llamadas.

Un trunk SIP decide quién puede enviarle llamadas, y una llamada desde cualquier otro origen se rechaza con source_not_allowed antes de que se ejecute cualquier lógica de destino. Las llamadas salientes también se verifican contra tus identificadores de llamada verificados, así que una llamada que presenta un número no verificado para el espacio de trabajo se rechaza con caller_id_not_verified en lugar de realizarse.

Vale la pena auditar ambos con la misma frecuencia que tu lista de destinos, porque una lista de permitidos permisiva deshace todo lo demás. Trunks SIP cubre la lista de IP permitidas, la autenticación por clave API y las credenciales de sesión, y identificadores de llamada cubre la verificación.

¿Qué debo hacer concretamente?

  1. Habilita los países a los que llamas y ninguno más, y trata la lista como algo que revisar en vez de algo que configurar una sola vez. Un país habilitado para una campaña hace dos años es una exposición permanente.
  2. Establece el límite de gasto diario de tu espacio de trabajo, y ajústalo para que notes cuando se alcance, no para que nunca se active. Cada espacio de trabajo empieza con un límite predeterminado; cámbialo en Voice → Spend limit, hasta el máximo de tu organización. Un límite que nunca se activa no es un control.
  3. Restringe la lista de permitidos del trunk, ya que todo lo anterior solo importa para las llamadas que llegaron hasta ahí.
  4. Vigila los propios motivos de rechazo. Una racha repentina de destination_not_enabled o calls_per_second_exceeded es el aspecto de un ataque cuando los controles están funcionando. No son ruido para filtrar de tus logs; son la alerta.

Destinos de voz cubre cómo habilitar y deshabilitar países, y el registro de llamadas lista cada motivo de rechazo con su solución.

En resumen

  1. Al atacante le paga el destino, no tú.

    Comprometen un sistema telefónico y marcan números de los que obtienen ingresos, así que el coste recae en tu cuenta mientras el beneficio recae en la suya.

  2. Los países están desactivados hasta que los actives.

    Un destino tiene que estar habilitado para que las llamadas lo alcancen, así que el radio de impacto de un compromiso es la lista que habilitaste, no el mundo entero.

  3. Disponibilidad y tu interruptor son cosas distintas.

    La disponibilidad indica si un país es tuyo para habilitar. Tu interruptor indica si está activado. Un país puede estar disponible y desactivado.

  4. Cada tope rechaza una llamada por sí solo.

    El gasto diario, las llamadas simultáneas y las llamadas por segundo detienen una llamada cada uno por separado. Cada espacio de trabajo tiene un límite de gasto diario, que puedes cambiar en Voice → Spend limit. Se restablece al inicio del siguiente día UTC.

Construye sobre la misma red.

Obtén una clave API de prueba de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

Tu próxima idea. Lista para conectar.