
Prévenir la fraude par prise de contrôle d'un compte grâce à SIM Swap Insight de Vonage
Temps de lecture : 7 minutes
Introduction
Nous avons tous des comptes professionnels et personnels enregistrés sur plusieurs sites web et applications en ligne. La prise de contrôle d'un compte se produit lorsque des attaquants détournent des comptes à l'aide d'identifiants volés, d'échanges de SIM ou de phishing. Dans cet article de blog, je montrerai comment utiliser Vonage SIM Swap Insight de Vonage pour vérifier les numéros de téléphone lors de la connexion. Même si le pirate possède la bonne combinaison d'informations d'identification de l'utilisateur et du mot de passe, nous aurons une vérification supplémentaire de SIM Swap en place.
Conditions préalables
A Compte de développeur Vonage.
Vonage API Account To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Code source
Vous pouvez trouver le Code sur le dépôt GitHub.
Remarque : Vérifiez que votre fournisseur de services de communication et votre pays sont pris en charge dans cette liste.
Qu'est-ce que la fraude à l'échange de cartes SIM ?
Vous utilisez peut-être, ou connaissez peut-être quelqu'un qui utilise son téléphone pour authentifier son identité sur différents comptes, comme ceux d'une banque ou d'un média social.
La fraude par échange de cartes SIM se produit lorsqu'un acteur malveillant se fait passer pour une victime et convainc un opérateur de réseau mobile de lier le numéro de téléphone de la victime à une nouvelle carte SIM. Les acteurs malveillants persuadent souvent les opérateurs de télécommunications par le biais de l'ingénierie sociale, en utilisant des informations personnelles obtenues par hameçonnage ou par des violations de données. L'attaquant intercepte ensuite la livraison de la nouvelle carte SIM ou active l'eSIM, prenant ainsi le contrôle du numéro de la victime.
Songez à ce que ce mauvais acteur peut faire : intercepter des SMS, réinitialiser des mots de passe, passer et recevoir des appels téléphoniques, accéder à des comptes protégés par une authentification à deux facteurs, et bien d'autres choses encore.
Créer une application Vonage
Maintenant que nous avons compris ce qu'est le SIM Swap, créons l'application Vonage qui utilisera le SIM Swap Insight de Vonage. SIM Swap Insight et notre solution d'application web de démonstration.
Pour créer une application, allez à la page Créer une application sur le tableau de bord de Vonage, et définissez un nom pour votre application.
Si vous avez l'intention d'utiliser une API qui utilise des Webhooks, vous aurez besoin d'une clé privée. Cliquez sur "Générer une clé publique et privée", votre téléchargement devrait démarrer automatiquement. Conservez-la en lieu sûr ; cette clé ne peut pas être retéléchargée si elle est perdue. Elle suivra la convention de nommage suivante private_<votre identifiant d'application>.key. Cette clé peut maintenant être utilisée pour authentifier les appels à l'API. Remarque : votre clé ne fonctionnera pas tant que votre application n'aura pas été sauvegardée.
Choisissez les fonctionnalités dont vous avez besoin (par exemple, Voice, Messages, RTC, etc.) et fournissez les webhooks requis (par exemple, URL d'événement, URL de réponse ou URL de message entrant). Ces éléments seront décrits dans le tutoriel.
Pour sauvegarder et déployer, cliquez sur "Générer une nouvelle application" pour finaliser la configuration. Votre application est maintenant prête à être utilisée avec les API de Vonage.
Sélectionner la capacité du registre du réseau
Lorsque vous travaillez avec les fonctionnalités alimentées par le réseau dans les API d'Identity Insights, il existe deux environnements différents :
L'environnement de production renvoie des données en direct des opérateurs pris en charge dans certains pays. L'accès à l'environnement de production nécessite l'approbation des opérateurs mobiles. Pour savoir comment demander l'accès.
Le terrain de jeu est un environnement de test sûr et contrôlé dans lequel les appels API renvoient des données en direct uniquement vers un petit nombre de numéros de téléphone autorisés. Il ne nécessite pas l'approbation des opérateurs de réseau. En outre, le terrain de jeu permet d'accéder à l'interface de l Opérateur virtuelun opérateur simulé qui génère des réponses fausses mais déterministes.
À l'étape de création de l'application, activez la fonction "Registre du réseau", sélectionnez "Terrain de jeux" et cliquez pour créer l'application en bas à droite de la page.
Network Registry Capability
Mise à jour du fichier des variables d'environnement
Copiez-le à partir du fichier .env.examplecréer un nouveau fichier .env pour votre projet, et ajoutez les variables d'environnement dans l'extrait de code ci-dessous.
# .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=300Note : Référez-vous à l'article de blog de Michael pour une explication de l'utilisation des variables d'environnement dans Node.js.
Installer les dépendances
Dans le fichier package.json du projetvous trouverez les dépendances suivantes : Vonage Identity Insights SDK pour Node.js, Vonage Auth SDK pour Node.js, Vonage Server SDK pour Node.js, dotenv, expresset nodemon. Tous ces logiciels peuvent être installés à l'aide d'une seule commande à partir de la ligne de commande.
npm install Le fichier Server.js
Le fichier server.js gère l'enregistrement et la connexion des utilisateurs, et ajoute la fonction SIM Swap Insight de l'API Vonage Identity Insights pour détecter les fraudes par échange de cartes SIM. Le serveur fonctionne sur le port 3000.
Nous avons besoin des dépendances que vous avez installées, comme décrit dans la section "Installer les dépendances" de cet article de blog.
require("dotenv").config();
const path = require("path");
const express = require("express");
const { IdentityInsights } = require("@vonage/identity-insights");
const fs = require("fs");Nous initialisons Express et le configurons pour qu'il serve des fichiers statiques à partir du dossier public.
const app = express();
app.use(express.json());
app.use(express.static("public"));Nous créons une variable utilisateur initialisée à une valeur vide qui sera remplie une fois que l'utilisateur se sera enregistré sur la page web. Ces données utilisateur ne sont pas conservées, de sorte que chaque fois que vous arrêtez le serveur, les informations sont effacées.
const users = {}; Initialisation et configuration
Nous chargeons trois variables d'environnement : VONAGE_APPLICATION_ID, VONAGE_PRIVATE_KEYet PERIOD (qui spécifie le nombre d'heures de vérification des événements de permutation SIM). Nous effectuons ensuite une étape d'amorçage pour vérifier que l'identifiant de l'application et la clé privée sont configurés ; si ce n'est pas le cas, le serveur s'arrête. Dans le cas contraire, il lit la clé privée à partir du chemin d'accès au fichier ou de la variable d'environnement et initialise l'élément identityClient avec ces deux valeurs.
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,
});
Fonction de détection de l'échange de cartes SIM
La méthode checkSimSwapWithIdentityInsights() est une fonction asynchrone qui interroge l'API Identity Insights de Vonage pour obtenir des informations sur l'échange de cartes SIM. Elle accepte un numéro de téléphone et une période (en heures), puis envoie une requête avec plusieurs aperçus activés : format, originalCarrier, transporteur actuelet simSwap.
Pour les besoins de ce billet de blog, nous les passons tous comme des objets vides et nous n'utilisons que le SIM Swap Insight. La période est convertie en un entier avant d'être envoyée à l'API.
Si la vérification de l'échange de cartes SIM renvoie un résultat positif (ce qui signifie qu'un échange de cartes SIM a eu lieu au cours de la période spécifiée), la connexion est bloquée. Si un appel à l'API échoue, l'API enregistre un avertissement mais permet à l'application de continuer.
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);
}
}
Routes et points d'arrivée
Le serveur a quatre routes principales. La première dessert index.htmloù les utilisateurs peuvent se connecter ou s'inscrire, et la seconde dessert le site main.htmlla page de bienvenue après une authentification réussie.
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"));
});
Le /register gère l'enregistrement de nouveaux utilisateurs avec des contrôles de validation. Il s'assure que le nom d'utilisateur n'existe pas déjà et empêche que le même numéro de téléphone soit enregistré pour plusieurs Account. Si l'enregistrement est valide, il est stocké dans le fichier utilisateurs dans l'objet users.
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!" });
});
Le /login est asynchrone et gère l'authentification avec la protection SIM swap. Il vérifie d'abord que le nom d'utilisateur existe dans le système et que le mot de passe correspond. Ce n'est qu'une fois les deux vérifications effectuées qu'il appelle la fonction de détection de permutation de carte SIM avec la période configurée.
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" });
}
});
Dans ce tutoriel, nous vérifions les comptes brûleurs potentiels. Je voulais également mentionner que SIM Swap Insight permet de vérifier en temps réel la date d'activation d'une carte SIM sur le réseau mobile à travers points d'extrémité de l'UE et des États-Unis.
Vous pouvez également consulter la page Identity Insights (SIM Swap) Page de référence Insightqui comprend la spécification OpenAPI.
La page index.html
La page de contenu de index.html vous permet de créer un nouvel utilisateur et de saisir un nom d'utilisateur, un mot de passe et un numéro de téléphone. Nous ajouterons une vérification pour nous assurer que le même numéro de téléphone n'est pas ajouté à deux Account différents comme première étape pour réduire le risque de créer des comptes en double avec le même numéro de téléphone. Vous pouvez ensuite vous connecter avec les informations d'identification que vous avez créées.
Le fichier client.js
Les informations que nous avons ajoutées à la page HTML seront transmises au fichier fichier client.js une fois le formulaire soumis. Celui-ci envoie alors les données au fichier server.js pour gérer l'enregistrement, la connexion et les vérifications de l'échange SIM. Si la connexion est réussie, l'utilisateur sera redirigé vers le fichier /main.html.
Voyez-le en action
Exécutez le fichier JavaScript du serveur pour initialiser l'application web.
npm run start:devTestez-le en créant un nouvel utilisateur et en vous connectant. Vous pouvez utiliser l Opérateur virtuel; 10 numéros de téléphone sont disponibles pour les tests : +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488, et +990123499.
Chacun de ces numéros de test a une valeur "latest_sim_swap_at". Vous pouvez utiliser ce nombre d'heures comme valeur de la variable d'environnement period pour tester un scénario de permutation SIM vrai ou faux.
Si vous avez Registre du réseau et un numéro de téléphone d'un CSP accepté, vous pouvez sélectionner l'option de production dans le tableau de bord et la tester avec le vrai numéro de téléphone, en définissant la variable d'environnement période pour détecter un échange de cartes SIM.
Démarrer avec Identity Insights
Dans le tableau de bord de Vonage, vous pouvez trouver la section Identity Insights Playgroundqui vous permet d'expérimenter non seulement le SIM Swap Insight tel qu'il est présenté dans cet article de blog, mais aussi d'autres informations. Entrez un numéro de téléphone, sélectionnez les points de données pertinents et recevez les insights demandés.
Il existe deux modes de test : "Demo", qui vous permet de choisir parmi un ensemble de numéros de téléphone prédéfinis pour expérimenter l'API à l'aide d'exemples simulés, en plus de "Live", dans lequel vous pouvez choisir votre application et tester des numéros de téléphone pour essayer des interactions réelles basées sur les fonctionnalités prises en charge.
Conclusion
Félicitations, vous avez atteint la fin de ce tutoriel. Nous nous sommes concentrés sur l'aperçu de l'échange de cartes SIM, mais il existe de nombreux autres aperçus que vous pouvez explorer. Consultez le Espace de jeu Identity Insights et apprenez à recueillir d'autres informations.
