Description du problème
Faisons quelques hypothèses. Le logiciel est divisé en composants fonctionnels. Les licences concernent les composants fonctionnels de ce progiciel. Les licences peuvent être basées sur le temps, sur la version ou sur un certain nombre d'utilisations, c'est-à-dire que vous pouvez utiliser la fonctionnalité jusqu'à un point défini dans le temps, vous pouvez la fonctionnalité de la version que vous avez achetée ou un dérivé mineur de celle-ci ou vous pouvez l'utiliser un nombre de fois. Il y a deux scénarios principaux que vous devez résoudre, où un attaquant n'a pas accès à une licence et où il le fait.
Attaquant sans licence
Le premier scénario est celui où votre attaquant n'a pas accès à une licence valide pour votre produit. Ce problème est facile à résoudre. Attribuez simplement une clé de chiffrement distincte à chacune des parties fonctionnelles sous licence de votre logiciel. Cryptez chaque partie fonctionnelle avec la clé de cryptage conçue pour cette partie. Vous pouvez désormais distribuer votre logiciel sans vous soucier que quelqu'un puisse déchiffrer des fonctions pour lesquelles il n'a pas de licence puisque vous ne lui envoyez jamais la clé.
Attaquant ayant accès à la licence
Le deuxième scénario, qui est beaucoup plus difficile à résoudre, est celui où votre attaquant a une licence valide pour votre logiciel mais qu'il veut soit redistribuer les fonctions qu'il a concédées sous licence, soit prolonger sa durée de licence.
Maintenant, vous avez besoin d'une source horaire fiable, cela peut être résolu en:
- en intégrant une clé publique dans un dongle et en faisant en sorte que le dongle émette un défi aléatoire qui doit être transmis à un serveur de temps. Le serveur de temps répond en signant l'heure actuelle et le défi et en le renvoyant au client qui l'envoie ensuite à la clé et à la clé puis met à jour son horloge interne et se déverrouille.
- mise à jour de l'horloge interne en fonction de la fois qu'il a été branché sur l'ordinateur. Le port USB alimente en permanence votre clé électronique lorsqu'elle est branchée.
- mise à jour de l'horloge interne en fonction des horodatages envoyés par les pilotes installés sur la machine à laquelle il est connecté. Autorisez uniquement les horodatages dans le temps. N'autorisez le recul dans le temps que si la source de temps est un serveur de temps de confiance distant fournissant un horodatage signé.
Si votre licence est basée sur des versions auxquelles vous avez effectivement attaqué et qui n'a pas accès une licence parce que votre fonction de dérivation de clé pour l'unité fonctionnelle prend à la fois l'identifiant de l'unité fonctionnelle et sa version en entrée.
Distribution de clé
Ainsi, une fois que vous avez des clés distinctes pour chaque unité fonctionnelle, vos licences deviennent essentiellement une question de distribution de clés symétriques afin qu'elles puissent être envoyées au dongle. Cela se fait généralement en incorporant une clé symétrique secrète dans le dongle, en chiffrant les clés de déchiffrement de licence avec la clé secrète partagée, puis en signant les fichiers de mise à jour de clé chiffrée. Les fichiers de mise à jour signés sont ensuite transmis au dongle qui valide la signature lors de la mise à jour, décrypte les nouvelles clés avec la clé symétrique partagée et les stocke pour une utilisation ultérieure.
Stockage des clés
Tous les dongles doivent avoir accès à un stockage sécurisé afin de stocker les clés de décryptage de licence, les horodatages d'expiration, etc. En général, cela n'est pas implémenté sur la mémoire flash externe ou EEPROM. Si c'est le cas, il doit être chiffré avec une clé interne à l'ASIC ou au FPGA et signé de manière à ne pas pouvoir être modifié.
Trou de texte brut
Une fois que l'utilisateur a une licence pour votre composant fonctionnel, même s'il ne peut pas extraire votre clé secrète, il peut utiliser votre clé pour décrypter ce composant fonctionnel. Cela conduit au problème qu'il peut extraire tout votre texte brut et remplacer l'appel de décryptage par un appel direct au texte brut extrait. Certains dongles couvrent ce problème en intégrant un processeur dans le dongle. Le composant fonctionnel est ensuite envoyé chiffré au dongle qui déchiffre le composant et l'exécute en interne. Cela signifie que le dongle devient essentiellement une boîte noire et que les composants fonctionnels envoyés au dongle doivent être testés individuellement pour découvrir leurs propriétés.
Oracles
De nombreux dongles sont des oracles de cryptage et de décryptage, ce qui entraîne des problèmes potentiels avec les attaques Chosen-ciphertext, par exemple les récentes attaques d'oracle de remplissage.
Attaques de canaux secondaires
Outre les problèmes d'oracle, vous avez également beaucoup de soucis avec toutes les attaques de canaux secondaires bien connues jusqu'à présent. Vous devez également vous préoccuper de tout canal secondaire potentiel mais non découvert.
Décapsulation
Sachez qu'il existe un certain nombre d'entreprises dans le monde qui se spécialisent dans la sélection et l'audit des puces sécurisées. Certaines des entreprises les plus connues sont probablement Chris Tarnovsky de flylogic, qui fait maintenant partie de IOActive et de chipworks. Ce type d'attaque est coûteux mais peut constituer une menace réelle en fonction de la valeur de votre cible. Cela me surprendrait si quelques dongles, peut-être aucun, sont capables de résister à ce type d'attaquant à gros budget.
Fonctionnent-ils
Étant donné un dongle basé sur un cryptage fort, n'est pas basé sur le temps puisque vous ne pouvez pas expirer les clés de cryptage en fonction du temps ni le temps n'est absolu, libre de toute attaque de canal latéral et exécute le code sur la puce, oui, il rendra la découverte du code sous-jacent équivalent à sonder une boîte noire. La plupart des ruptures qui se produisent avec ces dongles sont basées sur des faiblesses d'implémentation par les détenteurs de licences du système de licences matérielles, car l'implémenteur n'est pas familier avec l'ingénierie inverse et la sécurité informatique en général.
De plus, réalisez que même les logiciels où la majorité de la logique est implémentée sur un serveur faisant face à Internet ont été interrompus simplement en sondant la boîte noire et en déduisant le code côté serveur en fonction des attentes du code client. Préparez-vous toujours à ce que votre candidature soit interrompue et élaborez un plan pour y faire face lorsque cela se produit.