La fraude téléphonique rémunère généralement l'attaquant directement, sans acheteur ni rançon entre les deux. Rien n'est volé ni chiffré, les signes habituels d'une compromission sont donc absents. La perte apparaît sous forme de dépenses d'appels.
C'est ce qui façonne la défense. Vous ne pouvez pas la détecter en cherchant quoi que ce soit d'inhabituel dans le contenu d'un appel. Les contrôles portent entièrement sur les destinations autorisées, le nombre d'appels possibles et leur coût maximal.
Pourquoi s'en protéger si mon système est verrouillé ?
Parce que la valeur d'une compromission est immédiate et la fenêtre est courte.
Un identifiant SIP volé, ou un port ouvert sur un PBX, l'autocommutateur qui achemine les appels d'une entreprise, rapporte dès qu'il est utilisé. L'attaquant a intérêt à appeler autant que possible avant que quiconque ne s'en aperçoive. Les destinations les plus rentables sont celles qu'une entreprise normale n'appelle jamais.
C'est ce dernier point qui rend une liste blanche efficace et pas seulement ordonnée. La plupart des entreprises appellent un ensemble restreint et stable de pays. Un attaquant a besoin d'un ensemble spécifique et différent. Tout ce qui force les deux à se chevaucher détruit le modèle économique de l'attaquant.
Comment fonctionnent les contrôles de destination ?
Chaque pays est soit activé pour votre espace de travail, soit non, et les appels n'atteignent que ceux que vous avez activés.
Deux éléments distincts déterminent ce que vous pouvez faire avec un pays, et les confondre est la source habituelle de confusion :
- La disponibilité indique si le pays peut être activé.
Availablesignifie que Bird peut passer des appels vers ce pays depuis votre compte.Not supportedsignifie qu'il ne le peut pas, et le rétablir nécessite une conversation avec le support. - Votre activation indique si un pays disponible est en service. Le changement prend effet dès que vous l'effectuez.
Qu'un pays soit disponible ne vous dit donc rien sur le fait que des appels l'atteignent actuellement. C'est l'activation qui compte, et c'est le contrôle que vous manipulez.
Certains pays portent un marqueur risque élevé, qui reflète à la fois leurs tarifs et leur exposition à la fraude. Ce sont les destinations qu'un attaquant cherche à atteindre. Laissez-les désactivés sauf si l'entreprise les appelle réellement, et vérifiez le coût d'un appel avant d'en activer un. La page destinations voix liste chaque pays avec sa disponibilité et son état d'activation, et tarification voix affiche les tarifs.
Un appel refusé pour cette raison est rejeté avec destination_not_enabled. La solution est d'activer ce pays, pas de réessayer.
La disponibilité s'applique au pays dans son ensemble. Un numéro spécifique dans un pays activé peut tout de même être injoignable. Il est alors rejeté avec no_route_found.
no_route_found couvre plus d'une cause. Bird classifie le numéro composé avant d'examiner vos paramètres de destination. Il refuse un type qu'il ne route pas. Le tarif surtaxé est celui qui compte ici : des numéros dont la terminaison rémunère leur propriétaire, c'est-à-dire ce qu'un attaquant compose. Les plages à coûts partagés et à numéros personnels répartissent le coût de l'appel ou le redirigent vers une autre ligne. Les numéros non géographiques n'appartiennent à l'indicatif régional d'aucun pays. Les trois sont refusés de la même manière. Ces refus sont délibérés. Ils touchent les numéros que veut un attaquant, car une plage surtaxée à l'intérieur d'un pays que vous avez activé ne passe jamais la classification. Un numéro réellement injoignable signale le même code : vérifiez le type du numéro composé avant d'ouvrir un ticket.
Qu'est-ce qui limite une attaque à l'intérieur d'un pays que j'autorise ?
Trois plafonds, chacun refusant un appel à lui seul.
| Raison du rejet | Le plafond atteint |
|---|---|
daily_spend_exceeded | Plafond de dépense voix quotidien de votre organisation |
concurrent_calls_exceeded | Autant d'appels simultanés que le compte le permet |
calls_per_second_exceeded | Nouveaux appels passés plus vite que le compte ne le permet |
insufficient_balance | Le solde ne couvrait pas l'appel, il a donc été refusé d'emblée |
Le plafond de dépense se comporte le plus comme un contrôle antifraude, car il est libellé dans ce que l'attaquant prélève réellement. Il est aussi appliqué sur un chemin différent des deux autres. Il se réinitialise au début du jour UTC suivant : un pic qui l'atteint est donc contenu jusque-là, et pas simplement ralenti. C'est aussi celui qui n'existe pas tant que vous ne le configurez pas : une organisation sans plafond de dépense voix quotidien n'a aucun plafond de dépense appliqué.
Les deux autres se comportent de deux façons qui changent la manière dont vous pouvez compter sur eux.
Ils sont vérifiés dans l'ordre, pas ensemble. Le plafond d'appels simultanés est évalué en premier et répond immédiatement : un appel qui dépasse les deux plafonds signale concurrent_calls_exceeded sans jamais mentionner le débit d'appels. Cela compte pour le diagnostic, pas pour la défense. Un automate d'appels peut atteindre calls_per_second_exceeded sans être nulle part près du plafond d'appels simultanés. Vérifiez lequel vous avez réellement reçu avant de modifier un paramètre, car ils ont des correctifs différents et relever le mauvais ne change rien.
Un plafond dont la vérification ne peut pas aboutir laisse passer l'appel. Si le compteur d'appels simultanés ou le limiteur de débit ne peut pas être évalué, l'appel passe au lieu d'être refusé. Ces plafonds encadrent donc le fonctionnement normal de manière fiable, mais ne constituent pas une garantie en toute circonstance. C'est une raison de plus pour laquelle la liste de destinations compte : c'est la couche qui ne dépend pas d'une consultation en temps réel.
insufficient_balance agit comme un contrôle sans avoir été conçu comme tel. Le solde plafonne l'ampleur de la fraude qu'une compromission peut générer. Un rechargement automatique élevé supprime ce plafond, ce qui fait du montant de rechargement une décision antifraude autant qu'une question de commodité.
Qui peut envoyer des appels à mon trunk en premier lieu ?
Seules les adresses figurant dans la liste blanche IP du trunk, les clés API qu'il autorise et les identifiants de session qu'il a émis peuvent lui envoyer des appels.
Un trunk SIP décide qui peut lui envoyer des appels, et un appel provenant de toute autre source est rejeté avec source_not_allowed avant toute logique de destination. Les appels sortants sont également vérifiés par rapport à vos identifiants d'appelant vérifiés : un appel présentant un numéro non vérifié pour l'espace de travail est rejeté avec caller_id_not_verified au lieu d'être passé.
Ces deux points méritent un audit au même rythme que votre liste de destinations, car une liste blanche trop permissive annule tout le reste. Trunks SIP couvre la liste blanche IP, l'authentification par clé API et les identifiants de session, et identifiants d'appelant couvre la vérification.
Que dois-je faire concrètement ?
- Activez les pays que vous appelez et aucun autre, et considérez la liste comme quelque chose à réviser régulièrement, pas comme quelque chose à configurer une seule fois. Un pays activé pour une campagne il y a deux ans est une exposition permanente.
- Définissez la limite de dépense quotidienne de votre espace de travail, et dimensionnez-la de sorte que vous remarquiez qu'elle est atteinte plutôt que de faire en sorte qu'elle ne se déclenche jamais. Chaque espace de travail démarre avec une limite par défaut ; modifiez-la sous Voice → Spend limit, jusqu'au maximum de votre organisation. Une limite qui ne se déclenche jamais n'est pas un contrôle.
- Resserrez la liste blanche du trunk, car tout ce qui précède ne concerne que les appels qui sont arrivés jusque-là.
- Surveillez les raisons de rejet elles-mêmes. Une série soudaine de
destination_not_enabledoucalls_per_second_exceededest ce à quoi ressemble une attaque quand les contrôles fonctionnent. Ce n'est pas du bruit à filtrer de vos logs : c'est l'alerte.
Destinations voix couvre l'activation et la désactivation des pays, et le journal d'appels liste chaque raison de rejet avec sa solution.
En bref
L'attaquant est payé par la destination, pas par vous.
Il compromet un système téléphonique et appelle des numéros dont il tire des revenus : le coût atterrit sur votre compte tandis que le profit atterrit sur le sien.
Les pays sont désactivés tant que vous ne les activez pas.
Une destination doit être activée pour que les appels l'atteignent : le rayon d'action d'une compromission se limite donc à la liste que vous avez activée, et non au monde entier.
Disponibilité et activation sont deux choses différentes.
La disponibilité indique si un pays peut être activé. Votre activation indique s'il est en service. Un pays peut être disponible et désactivé.
Chaque plafond refuse un appel à lui seul.
Dépense quotidienne, appels simultanés et appels par seconde bloquent chacun un appel indépendamment. Chaque espace de travail dispose d'une limite de dépense quotidienne, modifiable sous Voice → Spend limit. Elle se réinitialise au début du jour UTC suivant.