
Partager:
Lorna est une ingénieure en informatique qui a la manie incurable de bloguer. Elle tente d'apprivoiser les mots et le code à parts égales.
Utilisation des signatures de message pour garantir la sécurité des webhooks entrants
Temps de lecture : 4 minutes
Les conversations à sens unique ne sont pas amusantes - chez Vonage, nous privilégions les conversations à double sens et cela inclut nos API. Par exemple, pour envoyer un SMS, vous appelez notre API. Pour recevoir une réponse par SMS, votre application devra gérer un crochet Web entrant. Les webhooks permettent d'utiliser HTTP pour notifier des événements, mais ils exigent que votre application soit disponible sur une URL publique. L'inconvénient ? Votre URL publique est, en fait, publique. N'importe qui ou n'importe quoi peut y envoyer des données, et comment pouvez-vous être sûr que les messages proviennent de Vonage ?
Remarque : L'utilisation des signatures de messages pour vérifier les webhooks entrants n'est actuellement disponible que sur l'API SMS de Vonage.
Il s'agit d'un problème courant avec les webhooks dans toutes sortes d'Applications. Chez Vonage, nous vous recommandons d'activer signature des messages sur votre Account pour garantir la sécurité des webhooks entrants. Cet article vous expliquera comment fonctionnent les signatures de messages et comment configurer cela pour vos propres Applications. La même approche est utilisée à plusieurs endroits, mais l'exemple d'aujourd'hui le montre dans le contexte de la réception d'un SMS. exemples de code pour la réception d'un SMS si vous souhaitez les voir avant de nous plonger dans ce sujet.
Activer la signature des messages
La signature des messages n'est pas activée par défaut pour les nouveaux comptes Vonage. support@nexmo.com pour demander que la signature des messages soit activée sur votre Account. Il existe une deuxième option pour exiger que tous les messages que vous envoyez soient accompagnés d'une signature ; nous n'aborderons pas cette utilisation aujourd'hui, mais il est bon de savoir qu'elle existe.
Obtenez votre signature secrète
Une fois la signature activée, vous devez vous rendre sur la page de paramètres dans votre tableau de bord. Vous pouvez y définir l'algorithme de signature à utiliser (j'utilise l'option SHA-256 HMAC dans ces exemples), et vous pouvez accéder à votre secret de signature. Copiez ce secret de signature, c'est le "secret partagé" que nous utiliserons pour calculer les signatures sur le serveur et le client.
Un "secret partagé" est une clé qui est partagée à l'avance entre deux parties, dans ce cas entre les serveurs de Vonage et vous. Ce secret partagé n'est jamais transmis, mais il est utilisé à la fois par Vonage et par votre application pour garantir que les données proviennent du serveur attendu et qu'elles n'ont pas été modifiées de quelque manière que ce soit.
Sur cette page de configuration, vous avez également la possibilité de changer le verbe HTTP pour vos webhooks en POST. La valeur par défaut est GET et les exemples ici utilisent GET mais si vous souhaitez le modifier (personnellement, je préfère POST personnellement), ce paramètre se trouve ici sous "Paramètres SMS par défaut" -> "Méthode HTTP".
Vonage prépare une signature
Lorsqu'un SMS arrive à votre numéro Vonage, Vonage envoie un webhook à l'URL configurée pour ce numéro, contenant toutes les informations sur le message arrivé. Si les signatures de message sont activées, il calcule également une signature à envoyer avec le message.
Vous pouvez lire les manuel détaillé des étapes de la création d'une signature mais la version courte est la suivante :
Récupérer les champs du formulaire par ordre alphabétique et les concaténer en une longue chaîne de clés et de valeurs.
Ajouter le secret de la signature à la fin
Hachez la chaîne que vous avez créée selon l'algorithme choisi, par exemple SHA-256 HMAC. Et voilà ! Voici la signature
Un hachage est une représentation textuelle d'une chaîne (généralement plus longue). Il n'est pas possible, à partir du hachage, de procéder à une rétro-ingénierie de la chaîne originale. Nous pouvons transmettre ce hachage en toute sécurité (dans ce cas, il s'agit de la signature du message) sans risquer de révéler la chaîne à partir de laquelle il a été créé.
Vonage envoie les données et une signature
Une fois la signature créée, le webhook contenant les données du message et la signature, mais PAS le secret, est envoyé à l'URL que vous avez configurée pour ce numéro. Cela ressemble à quelque chose comme ceci :
msisdn: 44784xxxxxxx
to: 44741xxxxxxx
messageId: 16000002632BEC99
text: Next step
type: text
keyword: NEXT
message-timestamp: 2019-01-23 10:51:39
timestamp: 1548240699
nonce: 9a706fdd-2b68-4761-87ab-c6ea80cab452
sig: 062470CA9A00C81FBF32FACE34B73D819BCDED07B36203DF7C0714E1094D86DENous recevons ces données dans notre application et nous pouvons les utiliser, ainsi que le secret de signature que nous avons copié plus tôt, pour recréer la signature et la comparer à ce qui nous est parvenu.
Calculer la signature attendue
À partir des données envoyées et du secret de signature, nous pouvons suivre les mêmes étapes pour créer une signature et nous assurer que nous obtenons quelque chose qui correspond exactement. Le processus manuel a été décrit et mis en lien ci-dessus, mais nos SDK de serveur pour la pile technologique que vous avez choisie créeront la signature pour vous.
Par exemple, voici la bibliothèque PHP en action :
$signature = new \Nexmo\Client\Signature(
$_GET,
NEXMO_API_SIGNATURE_SECRET,
'sha256'
);
$isValid = $signature->check($_GET['sig']);
La valeur de $isValid indique si les signatures correspondent ou non.
Attaquer son propre code
Vous pouvez essayer de faire un peu de piratage en capturant des requêtes vers votre plate-forme de développement locale en utilisant NgrokVous pouvez ensuite capturer les données et essayer d'envoyer des webhooks à votre application à l'aide d'un client HTTP tel que Postman. Si vous modifiez un champ quelconque - le message, le numéro de téléphone, l'horodatage - la correspondance des signatures échoue.
Garantir la sécurité des webhooks entrants
Dans les applications Web traditionnelles, nous disposons d'informations de session/cookie, de jetons CSRF et d'autres mesures pour nous protéger contre les données entrantes malveillantes. Les webhooks n'ont pas le même contexte et une approche telle qu'un secret partagé avec une signature de message peut protéger contre les attaques temporelles et les données entrantes qui ont été falsifiées ou qui proviennent d'un autre endroit que les serveurs de Vonage. D'après mon expérience, la plupart des données "malveillantes" ne sont en fait qu'une erreur d'URL ou quelque chose de tout aussi inoffensif. Qu'il s'agisse d'une attaque ou non, il en résulte toujours des données que votre application ne devrait pas traiter.
Prenez le temps d'activer les signatures sur votre Account Vonage et d'ajouter le code de vérification, les applications sécurisées sont des applications heureuses :).