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

Evite fraudes de apropriação de contas com o SIM Swap Insight da Vonage

Tempo de leitura: 7 minutos

Introdução

Todos nós temos contas profissionais e pessoais cadastradas em diversos sites e Applications online. A invasão de contas ocorre quando invasores se apropriam delas usando credenciais roubadas, troca de cartão SIM ou phishing. Nesta postagem do blog, vou demonstrar como usar o Vonage SIM Swap Insight para verificar números de telefone durante o login. Mesmo que o invasor tenha a combinação correta de nome de usuário e senha, teremos uma verificação adicional contra troca de SIM em vigor.

Pré-requisitos

Código-fonte

Observação: Verifique se o seu provedor de serviços de comunicação e o seu país estejam incluídos nesta lista de opções disponíveis.

O que é a fraude por troca de cartão SIM?

Você pode usar — ou conhecer alguém que use — o celular para autenticar sua identidade em várias contas, como as de bancos ou redes sociais. 

A fraude de troca de SIM ocorre quando um agente mal-intencionado se faz passar pela vítima e convence uma operadora de telefonia móvel a vincular o número de telefone da vítima a um novo cartão SIM. Esses agentes mal-intencionados costumam persuadir as operadoras de telecomunicações por meio de engenharia social, utilizando informações pessoais obtidas por meio de phishing ou violações de dados. Em seguida, o invasor intercepta a entrega do novo cartão SIM ou ativa o eSIM, assumindo o controle do número da vítima.

Pense no que esse agente mal-intencionado pode fazer: interceptar mensagens SMS, redefinir senhas, fazer e receber chamadas telefônicas, acessar contas protegidas por autenticação de dois fatores e muito mais.

Criar uma aplicação da Vonage

Agora que já entendemos o que é o SIM Swap, vamos criar o aplicativo da Vonage para utilizar o Vonage SIM Swap Insight e nossa solução de aplicativo web de demonstração.

  • Para criar um aplicativo, acesse a página “Criar um aplicativo” no Painel da Vonage e defina um Nome para a sua Application.

  • Se você pretende usar uma API que utilize Webhooks, precisará de uma chave privada. Clique em “Gerar chave pública e privada”; o download deve iniciar automaticamente. Guarde-a em local seguro; essa chave não poderá ser baixada novamente em caso de perda. Ela seguirá a convenção de nomenclatura private_<seu ID de aplicativo>.key. Agora, essa chave pode ser usada para autenticar chamadas de API. Observação: sua chave não funcionará até que seu aplicativo seja salvo.

  • Escolha os recursos de que você precisa (por exemplo, Voice, Mensagens, RTC etc.) e forneça os webhooks necessários (por exemplo, URLs de eventos, URLs de resposta ou URLs de mensagens recebidas). Esses itens serão descritos no tutorial.

  • Para salvar e implantar, clique em “Gerar novo aplicativo” para finalizar a configuração. Seu aplicativo já está pronto para ser usado com as APIs da Vonage.

Selecione o recurso de registro de rede

Ao trabalhar com os recursos baseados em rede nas APIs do Identity Insights, existem dois ambientes diferentes:

  • O ambiente de produção retorna dados em tempo real das operadoras compatíveis em alguns países. O acesso ao ambiente de produção requer aprovação das operadoras de celular. Você pode saber como solicitar acesso.

  • O Playground é um ambiente de teste seguro e controlado, no qual as chamadas de API retornam dados em tempo real apenas para um pequeno conjunto de números de telefone incluídos na lista de permissões. Ele não requer aprovação das operadoras de rede. Além disso, o Playground oferece acesso ao Operadora Virtual, uma operadora simulada que gera respostas falsas, porém determinísticas. 

Na etapa de criação do aplicativo, ative o recurso “Network Registry”, selecione “Playground” e clique para criar o aplicativo no canto inferior direito da página.

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

Atualizar o arquivo de variáveis de ambiente

Copie-o do arquivo arquivo .env.example, crie um novo arquivo arquivo .env para o seu projeto e adicione as variáveis de ambiente no trecho de código abaixo.

# .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

Observação: Consulte postagem no blog do Michael para obter uma explicação sobre o uso de variáveis de ambiente no Node.js.

Instale as dependências

No arquivo ficheiro package.json, você encontrará as seguintes dependências: SDK do Vonage Identity Insights para Node.js, SDK do Vonage Auth para Node.js, Vonage Server SDK para Node.js, dotenv, expresse nodemon. Todos podem ser instalados com um único comando na linha de comando.

npm install 

O arquivo Server.js

O arquivo server.js cuida do cadastro e do login do usuário e incorpora o SIM Swap Insight da API Vonage Identity Insights para detectar fraudes de troca de SIM. O servidor é executado na porta 3000.

Precisamos das dependências que você instalou, conforme descrito na seção “Instalar as dependências” desta postagem do blog.

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

Inicializamos o Express e o configuramos para servir arquivos estáticos da pasta “public”.

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

Criamos uma variável de usuário inicializada com um valor vazio, que será preenchida assim que o usuário se cadastrar na página da web. Esses dados do usuário não são armazenados de forma permanente; portanto, sempre que você desligar o servidor, as informações serão apagadas.

const users = {};

Inicialização e configuração

Carregamos três variáveis de ambiente: VONAGE_APPLICATION_ID, VONAGE_PRIVATE_KEYe PERIOD (que especifica o número de horas a serem verificadas quanto a eventos de troca de SIM). Em seguida, realizamos uma etapa de inicialização para verificar se o ID do aplicativo e a chave privada estão configurados; caso contrário, o servidor é encerrado. Caso contrário, ele lê a chave privada a partir do caminho do arquivo ou da variável de ambiente e inicializa o identityClient com ambos os 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,
});

Função de detecção de troca de cartão SIM

O função checkSimSwapWithIdentityInsights() é uma função assíncrona que consulta a API do Vonage Identity Insights para obter informações sobre troca de SIM. Ela aceita um número de telefone e um período (em horas) e, em seguida, envia uma solicitação com vários insights ativados: formato, originalCarrier, currentCarriere simSwap.

Para os fins desta postagem no blog, estamos passando todos eles como objetos vazios e usando apenas o SIM Swap Insight. O valor é convertido em um número inteiro antes de ser enviado à API.

Se a verificação de troca de SIM retornar “true” (o que significa que ocorreu uma troca de SIM dentro do período especificado), o login será bloqueado. Se uma chamada à API falhar, a API registrará um aviso, mas permitirá que o aplicativo continue.

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);
 }
}

Rotas e pontos finais

O servidor possui quatro rotas principais. A primeira atende a index.html, onde os usuários podem fazer login ou se cadastrar, e a segunda direciona para main.html, a página de boas-vindas após a autenticação bem-sucedida.

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"));
});

O /register cuida do cadastro de novos usuários com verificações de validade. Ele garante que o nome de usuário ainda não exista e impede que o mesmo número de telefone seja cadastrado em várias contas. Se o cadastro for válido, ele é armazenado no objeto .

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!" });
});

O /login é assíncrono e lida com a autenticação com proteção contra troca de SIM. Primeiro, ele verifica se o nome de usuário existe no sistema e valida se a senha está correta. Somente após ambas as verificações serem aprovadas é que ele chama a função de detecção de troca de SIM com o período 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" });
 }
});

Neste tutorial, verificamos se há possíveis accounts falsas. Também gostaria de mencionar que o SIM Swap Insight oferece verificação em tempo real da data de ativação de um cartão SIM na rede móvel em pontos de conexão na UE e nos EUA.

Você também pode consultar a página de referência do Insight do Identity Insights (Troca de SIM), que inclui a especificação da OpenAPI.

A página index.html

A página de conteúdo para index.html permite que você crie um novo usuário e insira um nome de usuário, senha e número de telefone. Adicionaremos uma verificação para garantir que o mesmo número de telefone não seja associado a duas contas diferentes, como primeiro passo para reduzir o risco de criação de contas duplicadas com o mesmo número de telefone. Em seguida, você poderá fazer login com as credenciais que criou.

O arquivo client.js

As informações que adicionamos à página HTML serão passadas para o arquivo client.js assim que o formulário for enviado. Em seguida, os dados são enviados para o server.js para processar o cadastro, o login e as verificações de troca de SIM. Se o login for bem-sucedido, o usuário será redirecionado para /main.html.

Veja como funciona

Execute o arquivo JavaScript do servidor para inicializar o aplicativo web.

npm run start:dev

Vá em frente e teste criando um novo usuário e fazendo login. Você pode usar o Operadora Virtual; há 10 números de telefone disponíveis para teste: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488 e +990123499. 

Cada um desses números de teste possui um valor “latest_sim_swap_at”. Você pode usar esse número de horas como valor da variável de ambiente “period” para testar um cenário de troca de SIM verdadeiro ou falso.

Se você tiver Registro de Rede e um número de telefone de um CSP aceito, você pode selecionar a opção de produção no painel e testá-la com o número de telefone real, definindo a variável de ambiente período para detectar uma troca de SIM.

Comece a usar o Identity Insights

No Painel da Vonage, você encontra o Identity Insights Playground, que permite que você experimente não apenas o SIM Swap Insight, conforme mostrado nesta postagem do blog, mas também outros insights. Digite um número de telefone, selecione os dados relevantes e receba os insights solicitados.

Você tem à disposição dois modos de teste: o “Demo”, que permite escolher entre um conjunto de números de telefone predefinidos para experimentar a API por meio de exemplos simulados, e o “Live”, no qual você pode selecionar seu aplicativo e números de telefone de teste para experimentar interações reais com base nos recursos compatíveis.

Conclusão

Parabéns, você chegou ao fim deste tutorial. Nos concentramos no SIM Swap Insight, mas há muitos outros insights disponíveis para você explorar. Confira o Identity Insights Playground e aprenda como coletar mais informações.

Compartilhar:

https://a.storyblok.com/f/270183/400x400/3f6b0c045f/amanda-cavallaro.png
Amanda CavallaroRepresentante de Desenvolvedores