De plus en plus de sites requièrent une authentification à deux facteurs par SMS. D'un point de vue de la sécurité, c'est très bien, mais cela peut être pénible si le login est partagé par plusieurs personnes. Cette semaine, nous allons voir comment recevoir un SMS d'authentification et le transférer à plusieurs personnes.
En théorie, un login est personnel et ne doit pas être partagé. Le but de la double authentification est justement de s'assurer que seule la personne enregistrée puisse se logger. Mais dans certains cas comme, à l’intérieur d'une famille, plusieurs personnes utilisent le même login. Dans ce cas, la double authentification peut poser problème. À chaque login, il faut s'assurer que la personne qui a enregistré son numéro de téléphone est présente (ou au moins son téléphone). Si ce n'est pas le cas, il faut l'appeler pour qu'elle transfère le code à la personne qui est devant le PC.
Pour éviter ces petits soucis, nous avons réalisé un système qui réceptionne les SMS et qui les transfère à plusieurs autres numéros de téléphone.
Les SMS sont transférés à plusieurs numéros
Ce système utilise un YoctoHub-GSM-4G avec la carte SIM du numéro de téléphone qui est enregistré sur les sites web. Les données cellulaires du YoctoHub-GSM sont désactivées et le module est uniquement utilisé pour envoyer et revoir des SMS. Le YoctoHub est branché par USB à un PC qui exécute un script Python.
Le YoctoHub-GSM
Lors du login, le site web envoie un SMS avec le code d’authentification au numéro du YoctoHub-GSM-4G. Quand le SMS est reçu par le YoctoHub, le script cherche quels numéros sont programmés pour ce site web et retransmet le code d'authentification.
L'application
Note: l'application est écrite en Python, car c'est un langage facile et portable. Si vous n'avez jamais utilisé notre librairie de programmation Python, nous avons un tutoriel qui explique comment débuter avec notre librairie Python.
Comme vous allez le voir, le code est simple. Le script Python lit les SMS présents sur la carte SIM. En fonction du numéro de l'expéditeur, il retransmet le SMS à un ou plusieurs numéros de téléphone. Une fois que le SMS a été transmis à tous les numéros programmés, il est effacé de la carte SIM.
Le script Python commence par initialiser la librairie Yoctopuce pour qu'elle utilise les modules branchés sur les ports USB du PC. Ensuite, il vérifie la présence d'un module qui supporte YMessageBox.
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("Unable use USB port %s" % (errmsg.value))
mbox = YMessageBox.FirstMessageBox()
if mbox is None:
sys.exit("No device that supports YMessageBox")
Le reste du script est une boucle sans fin qui récupère les SMS présents sur la carte SIM avec la méthode get_messages(). Quand un SMS est présent, on cherche dans notre fichier de config la liste de numéros de téléphone qui doivent recevoir une copie de ce SMS.
for msg in messages:
sender = msg.get_sender()
self.log("New SMS from %s:" % sender)
self.log(" %s" % msg.get_textData())
unicodeData = msg.get_unicodeData()
for rule in self._rules:
if rule.match(sender):
targets = rule.getTargets()
...
Pour chaque destinataire, on crée un nouveau SMS avec le contenu du message originel et on le met dans la boîte d'envois avec la méthode send():
targets = rule.getTargets()
for dst_num in targets:
self.log("forward it to %s" % (dst_num))
sms = mbox.newMessage(dst_num)
sms.addUnicodeData(unicodeData)
sms.send()
...
Il ne reste plus qu'à effacer le SMS originel de la carte SIM.
msg.deleteFromSIM()
..
Au final, la boucle principale de l'application est la suivante:
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("Unable use USB port %s" % (errmsg.value))
mbox = YMessageBox.FirstMessageBox()
if mbox is None:
sys.exit("No device that supports YMessageBox")
while True:
messages = mbox.get_messages()
for msg in messages:
sender = msg.get_sender()
self.log("New SMS from %s:" % (sender))
self.log(" %s" % (msg.get_textData()))
unicodeData = msg.get_unicodeData()
for rule in self._rules:
if rule.match(sender):
targets = rule.getTargets()
for dst_num in targets:
self.log("forward it to %s" % (dst_num))
sms = mbox.newMessage(dst_num)
sms.addUnicodeData(unicodeData)
sms.send()
YAPI.Sleep(2000)
self.log("clear message from %s" % (sender))
msg.deleteFromSIM()
YAPI.Sleep(2000)
Notez que cette application n'a pas besoin d'être très réactive, car le YoctoHub-GSM-4G est autonome. En effet, comme un téléphone GSM traditionnel, le YoctoHub gère automatiquement la transmission des SMS entre l'opérateur et la carte SIM. Le script Python ne fait que consulter et effacer les SMS qui sont stockés sur la carte SIM. Nous n'avons pas besoin de gérer la communication GSM. Si l'application plante ou n'est pas exécutée pendant un moment, les SMS sont toujours réceptionnés par le YoctoHub et enregistrés sur la carte SIM. Lors du prochain démarrage, le script transférera tous les messages qui sont arrivés entre-temps.
Le code complet de l'application est disponible sur GitHub:https://github.com/yoctopuce-examples/sms_fwd
Conclusion
Nous avons choisi de transférer les SMS d'authentification à d'autres personnes par SMS, mais nous aurions aussi pu choisir transférer le contenu du SMS par email, ou d'autres moyens. Libre à vous d'adapter le code à vos besoins.
Pour finir, ce petit système est très pratique pour partager un login qui requière une authentification à deux facteurs par SMS, mais cela peut aussi être une source de faille de sécurité si la machine qui exécute le script Python est corrompue. Si vous décidez d'utiliser un tel système, cela peut être une bonne idée de débrancher la prise réseau du PC. De cette manière, si un attaquant a réussi à infiltrer votre réseau local, il ne pourra pas accéder au PC et donc aux SMS.