https://a.storyblok.com/f/270183/1368x665/72fccf48d3/26mar_dev-blog_sim-swap-burner.jpg

Evita el fraude en la adquisición de cuentas con Vonage SIM Swap Insight

Tiempo de lectura: 7 minutos

Introducción

Todos tenemos cuentas empresariales y personales registradas en varios sitios web y aplicaciones en línea. La apropiación de cuentas se produce cuando los atacantes secuestran las cuentas utilizando credenciales robadas, intercambios de SIM o suplantación de identidad. En esta publicación del blog, demostraré cómo usar Vonage SIM Swap Insight para verificar los Numbers de teléfono durante el inicio de sesión. Incluso si el secuestrador tiene la combinación correcta de credenciales de usuario y contraseña, tendremos una verificación adicional de SIM Swap.

Requisitos previos

Código fuente

Nota: Compruebe que su proveedor de servicios de comunicación y su país sean compatibles con esta lista.

¿Qué es el fraude SIM Swap?

Puede que utilices, o conozcas a alguien que utilice, su teléfono para autenticar su identidad en varias cuentas, como un banco o las redes sociales.

El fraude de intercambio de SIM se produce cuando un actor malintencionado se hace pasar por una víctima y convence a un operador de redes móviles para que vincule el número de teléfono de la víctima a una nueva tarjeta SIM. Los actores maliciosos suelen persuadir a los operadores de telecomunicaciones mediante ingeniería social, utilizando información personal obtenida a través de phishing o filtraciones de datos. A continuación, el agresor intercepta la entrega de la nueva tarjeta SIM o activa la eSIM, haciéndose con el control del número de la víctima.

Piense en lo que puede hacer este malhechor: interceptar mensajes SMS, restablecer contraseñas, hacer y recibir llamadas telefónicas, acceder a cuentas protegidas por autenticación de dos factores y mucho más.

Crear una aplicación de Vonage

Ahora que entendemos qué es SIM Swap, vamos a crear la aplicación de Vonage para hacer uso de Vonage SIM Swap Insight y nuestra solución de aplicación web de demostración.

  • Para crear una aplicación, vaya a la sección Crear una aplicación en el panel de Vonage y define un nombre para tu aplicación.

  • Si tiene intención de utilizar una API que utilice Webhooks, necesitará una clave privada. Haga clic en "Generar clave pública y privada"; la descarga debería iniciarse automáticamente. Guárdela de forma segura; esta clave no puede volver a descargarse si se pierde. Seguirá la convención de nomenclatura private_<id de su aplicación>.key. Esta clave puede utilizarse ahora para autenticar llamadas a la API. Nota: La clave no funcionará hasta que se guarde la aplicación.

  • Elija las funciones que necesite (por ejemplo, Voice, Messages, RTC, etc.) y proporcione los webhooks necesarios (por ejemplo, URL de eventos, URL de respuestas o URL de mensajes entrantes). Estos se describirán en el tutorial.

  • Para guardar e implementar, haz clic en "Generar nueva aplicación" para finalizar la configuración. Tu aplicación ahora está lista para usar con las API de Vonage.

Seleccione la capacidad de registro de red

Cuando se trabaja con las funciones basadas en red de las API de Identity Insights, existen dos entornos diferentes:

  • El entorno de producción devuelve datos en directo de los Operadores admitidos en algunos países. El acceso al entorno de producción requiere la aprobación de los Operadores móviles. Puede obtener información sobre cómo solicitar acceso.

  • El Playground es un entorno de pruebas seguro y controlado en el que las llamadas a la API sólo devuelven datos en tiempo real a un pequeño grupo de números de teléfono permitidos. No requiere la aprobación de los operadores de red. Además, el Playground proporciona acceso al Operador virtualun operador simulado que genera respuestas falsas pero deterministas.

En el paso de creación de la aplicación, active la función "Registro de red", seleccione "Playground" y haga clic para crear la aplicación en la parte inferior derecha de la página.

Network Registry capability on the dashboard, you can choose two access types: playground or production.Network Registry Capability

Actualizar el archivo de variables de entorno

Cópielo del archivo .env.ejemploy cree un nuevo archivo .env para su proyecto, y añada las variables de entorno en el siguiente fragmento de código.

# .env

VONAGE_APPLICATION_ID=your_application_id
VONAGE_PRIVATE_KEY=Paste the private key file you just downloaded into your project directory, then provide the path to it in this field (e.g., ./private_your-app-id-here.key)
PERIOD=300

Nota de Michael para una explicación del uso de variables de entorno en Node.js.

Instalar las dependencias

En el archivo package.json del proyectoencontrarás las siguientes dependencias: Vonage Identity Insights SDK para Node.js, Vonage Auth SDK para Node.js, SDK de servidor de Vonage para Node.js, dotenv, expressy nodemon. Todos pueden instalarse con una sola orden desde la línea de comandos.

npm install 

El archivo Server.js

El archivo archivo server.js maneja el registro y el inicio de sesión del usuario, y agrega SIM Swap Insight de la API Vonage Identity Insights para detectar fraudes de SIM Swap. El servidor se ejecuta en el puerto 3000.

Necesitamos las dependencias que ha instalado, como se describe en la sección "Instalar las dependencias" de esta entrada del blog.

require("dotenv").config();
const path = require("path");
const express = require("express");
const { IdentityInsights } = require("@vonage/identity-insights");
const fs = require("fs");

Inicializamos Express y lo configuramos para servir archivos estáticos desde la carpeta pública.

const app = express();
app.use(express.json());
app.use(express.static("public"));

Creamos una variable de usuario inicializada a un valor vacío que se rellenará una vez que el usuario se registre en la página web. Estos datos de usuario no son persistentes, por lo que cada vez que se detiene el servidor, la información se borra.

const users = {};

Inicialización y configuración

Cargamos tres variables de entorno: VONAGE_APPLICATION_ID, VONAGE_CLAVE_PRIVADAy PERIODO (que especifica el número de horas que se comprobarán los eventos de intercambio de SIM). A continuación, realizamos un paso de arranque para verificar que el ID de la aplicación y la clave privada están configurados; si no es así, el servidor sale. En caso contrario, lee la clave privada de la ruta del archivo o de la variable de entorno e inicializa la aplicación identityClient con ambos valores.

if (!APPLICATION_ID || !PRIVATE_KEY) {
 console.error('VONAGE_APPLICATION_ID or VONAGE_PRIVATE_KEY not set');
 process.exit(1);
}

const keyContent = fs.existsSync(PRIVATE_KEY)
 ? fs.readFileSync(PRIVATE_KEY, 'utf8')
 : PRIVATE_KEY;

if (!keyContent) {
 console.error('INVALID private key. Check if the file exists or the environment variable is correctly set');
 process.exit(1);
}

const identityClient = new IdentityInsights({
 applicationId: APPLICATION_ID,
 privateKey: keyContent,
});

Función de detección de cambio de SIM

En checkSimSwapConIdentidadInsights() es una función asíncrona que consulta la API Identity Insights de Vonage para obtener información sobre el intercambio de SIM. Acepta un número de teléfono y un período (en horas), luego envía una solicitud con múltiples perspectivas habilitadas: formato, originalCarrier, operador actualy simSwap.

Para el propósito de esta entrada de blog, los pasaremos todos como objetos vacíos y sólo utilizaremos SIM Swap Insight. La dirección periodo se convierte en un número entero antes de ser enviado a la API.

Si la comprobación de intercambio de SIM devuelve verdadero (lo que significa que se ha producido un intercambio de SIM en el periodo especificado), se bloquea el inicio de sesión. Si una llamada a la API falla, la API registra una advertencia pero permite que la aplicación continúe.

async function checkSimSwapWithIdentityInsights(phoneNumber, period) {
 try {
   const resp = await identityClient.getIdentityInsights({
     phoneNumber: phoneNumber,
     purpose: 'FraudPreventionAndDetection',
     insights: {
       format: {},
       originalCarrier: {},
       currentCarrier: {},
       simSwap: {
         period: parseInt(period)
       }
     }
   });

   return resp.insights?.simSwap?.isSwapped === true;
 } catch (error) {
   console.warn('Identity Insights SDK call failed:', error && error.message);
 }
}

Rutas y puntos finales

El servidor tiene cuatro rutas principales. La primera sirve a index.htmldonde los usuarios pueden iniciar sesión o registrarse, y la segunda sirve a main.htmlla página de bienvenida tras la autenticación.

app.get("/", (_req, res) => {
 res.sendFile(path.join(__dirname, "views/index.html"));
});

app.get("/main", (_req, res) => {
 res.sendFile(path.join(__dirname, "views/main.html"));
});

En /registro gestiona el registro de nuevos usuarios con comprobaciones de validación. Se asegura de que el nombre de usuario no exista ya y evita que el mismo número de teléfono se registre en varias cuentas. Si el registro es válido, se almacena en el directorio usuarios de los usuarios.

app.post("/register", (req, res) => {
 const { username, password, phoneNumber } = req.body;

 if (users[username]) {
   return res
     .status(400)
     .json({ message: "Sorry, this username already exists." });
 }

 const phoneExists = Object.values(users).some(
   (user) => user.phoneNumber === phoneNumber
 );

 if (phoneExists) {
   return res.status(400).json({
     message: "This phone number is associated with another account.",
   });
 }

 users[username] = { username, password, phoneNumber };
 res.json({ message: "Registration success!" });
});

En /login es asíncrono y gestiona la autenticación con protección SIM swap. Primero verifica que el nombre de usuario exista en el sistema y valida que la contraseña coincida. Sólo cuando se superan ambas comprobaciones se llama a la función de detección de intercambio de SIM con el periodo configurado.

app.post("/login", async (req, res) => {
 try {
   const { username, password } = req.body;
   const user = users[username];

   if (!user) {
     return res.status(404).json({ message: "Not Found" });
   }

   console.log("Attempting SIM swap check on phone number:", user.phoneNumber);

   if (user.password !== password) {
     return res
       .status(401)
       .json({ message: "This is an invalid username or password" });
   }

   const simSwapped = await checkSimSwapWithIdentityInsights(user.phoneNumber, PERIOD);

   if (simSwapped) {
     return res
       .status(401)
       .json({ message: "SIM Swap: true", simSwapped: true });
   }

   res.json({ message: "Success" });
 } catch (err) {
   console.error("Login error:", err);

   if (err.response && err.response.text) {
     const body = await err.response.text();
     console.error("Vonage SIM Swap API response:", body);
   }

   res.status(500).json({ message: "Internal Server Error" });
 }
});

En este tutorial, comprobamos la existencia de posibles cuentas desechables. También quería mencionar que SIM Swap Insight proporciona verificación en tiempo real de la fecha de activación de una tarjeta SIM en la red móvil a través de UE y EE.UU..

También puede consultar la página Página de referencia de Identity Insights (SIM Swap) Insightque incluye la especificación OpenAPI.

Página index.html

La página de contenido de index.html permite crear un nuevo usuario e introducir un nombre de usuario, una contraseña y un número de teléfono. Añadiremos una comprobación para asegurarnos de que no se añade el mismo número de teléfono a dos cuentas diferentes como primer paso para reducir el riesgo de crear cuentas duplicadas con el mismo número de teléfono. A continuación, puedes iniciar sesión con las credenciales que has creado.

El archivo client.js

La información que añadimos a la página HTML se pasará al archivo archivo client.js una vez enviado el formulario. Éste enviará los datos al archivo server.js para gestionar las comprobaciones de registro, inicio de sesión y cambio de SIM. Si el inicio de sesión se realiza correctamente, el usuario será redirigido a /main.html.

Véalo en acción

Ejecute el archivo JavaScript del servidor para inicializar la aplicación web.

npm run start:dev

Pruébalo creando un nuevo usuario e iniciando sesión. Puede utilizar el Operadora virtualHay 10 números de teléfono disponibles para la prueba: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488, y +990123499.

Cada uno de estos Numbers de prueba tiene un valor "latest_sim_swap_at". Puede utilizar ese número de horas como valor de la variable de entorno period para probar un escenario de intercambio de SIM verdadero o falso.

Si dispone de Registro de red y un número de teléfono de un CSP aceptado, puede seleccionar la opción de producción en el cuadro de mandos y probarla con el número de teléfono real, estableciendo la variable de entorno periodo para detectar un intercambio de SIM.

Empiece a utilizar Identity Insights

Dentro del panel de control de Vonage, puedes encontrar el Campo de juegos de información sobre identidadque te permite experimentar no solo con SIM Swap Insight, como se muestra en esta publicación del blog, sino también con otras perspectivas. Ingresa un número de teléfono, selecciona los puntos de datos relevantes y recibe las perspectivas solicitadas.

Puedes encontrar dos modos de prueba: "Demo", que te permite elegir entre un conjunto de números de teléfono predefinidos para experimentar con la API mediante ejemplos simulados, además de "Live", en el que puedes elegir tu aplicación y números de teléfono de prueba para probar interacciones reales basadas en las funciones compatibles.

Conclusión

Enhorabuena, ha llegado al final de este tutorial. Nos hemos centrado en SIM Swap Insight, pero hay muchas otras perspectivas disponibles para explorar. Visite el Zona de juegos de Identity Insights y aprenda a recopilar más información.

Compartir:

https://a.storyblok.com/f/270183/400x400/3f6b0c045f/amanda-cavallaro.png
Amanda CavallaroDefensor del Desarrollador