Signature de code
La signature de code (en anglais : code signing) est la signature numérique de fichiers exécutables et de scripts pour confirmer l’identité de l’auteur du code et garantir que le code n’a pas été modifié ou corrompu depuis qu’il a été signé. La signature de code se fait au moyen d’une fonction de hachage cryptographique.
La signature de code peut supporter plusieurs fonctionnalités très utiles. L’utilisation la plus courante de la signature de code est d’assurer la protection de l'intégrité du code lors du déploiement du code sur plusieurs ordinateurs ; dans certains langages de programmation, elle peut également être utilisée pour aider à prévenir les conflits d’espace de noms. Presque chaque implantation de la signature de code fournit une sorte de mécanisme de signature numérique pour vérifier l’identité de l’auteur, et une somme de contrôle pour vérifier que l’objet n’a pas été modifié. La signature peut également être utilisée pour fournir des informations de version sur un objet ou pour stocker d’autres métadonnées sur l’objet[1].
Implémentation de la sécurité
De nombreuses implémentations de signature de code utilisent une paire de clés, une clé publique et une clé privée, similaire au processus employé par SSL ou SSH. Par exemple, dans le cas de .NET, le développeur utilise une clé privée pour signer ses bibliothèques logicielles et ses fichiers exécutables chaque fois qu’il les modifie. Cette clé sera unique à un développeur ou un groupe de développeurs. Le développeur peut générer cette clé lui-même ou l’obtenir d'une autorité de certification de confiance[2].
La signature de code est particulièrement utile dans les environnements distribués où la provenance d’un morceau de code peut ne pas être évidente - par exemple, les applets Java et les contrôles ActiveX. Une autre utilisation importante de la signature de code est la distribution en toute sécurité des mises à jour et des correctifs des logiciels déjà installés sur des ordinateurs. Windows, Mac OS X et la plupart des distributions Linux fournissent leurs mises à jour avec une signature de code pour s’assurer que des personnes mal intentionnées ne peuvent pas distribuer du code malicieux via leurs systèmes de mises à jour. La signature permet au système d'exploitation qui reçoit une mise à jour de vérifier la légitimité de cette mise à jour, même si la mise à jour a été livrée par des tiers ou des supports physiques (DVD, clés USB).
Identification de confiance en utilisant une autorité de certification
La clé publique utilisée pour authentifier la signature de code doit être traçable à une autorité de certification de confiance, de préférence en utilisant une infrastructure à clés publiques sécurisée. Cela ne garantit pas que l'on peut faire confiance au code lui-même, mais seulement que le code vient de la source indiquée (ou plus précisément, de quelqu'un qui possède la clé privée de la source (c'est-à -dire la source elle-même si celle-ci a bien protégé sa clé privée)[3]. Une autorité de certification fournit un niveau de confiance et est en mesure de transmettre ce niveau de confiance aux autres par procuration. Si un utilisateur fait confiance à une autorité de certification, il peut faire confiance au code qui est signé avec une clé validée par cette autorité. De nombreux systèmes d'exploitation reconnaissent et acceptent une ou plusieurs autorités de certification (comme StartCom (en), VeriSign / Symantec, DigiCert, TC TrustCenter, Comodo (en), GoDaddy et GlobalSign (en)). Parfois, de grandes organisations implantent des autorités de certification privées, internes à l'organisation, qui ont les mêmes caractéristiques que les autorités de certification publiques, mais ne sont reconnues qu'au sein de l'organisation.
Alternative à l'autorité de certification
Une alternative à l'autorité de certification est la fourniture d'une clé autogénérée par le développeur. Dans ce scénario, l'utilisateur du code doit normalement obtenir la clé publique du développeur d'une certaine façon pour vérifier le premier envoi de code. De nombreux systèmes de signature de code stockent la clé publique à l'intérieur de la signature de code. Certains systèmes d'exploitation qui vérifient la signature de code avant l'exécution demandent à l'utilisateur s'il veut faire confiance au développeur après la première exécution. Un développeur peut fournir un système similaire en incluant sa clé publique avec le programme d'installation. La clé peut ensuite être utilisée pour veiller à ce que tous les objets installés par la suite, comme les mises à niveau, des plug-ins, ou une autre application, soient tous vérifiés comme venant de ce même développeur.
Problèmes
Comme toute mesure de sécurité, la signature de code peut être mise en échec. Des utilisateurs peuvent être trompés et exécuter du code non signé, ou même du code dont la validation de signature a échoué . De plus, la signature de code est une mesure de sécurité efficace seulement aussi longtemps que la clé privée est bien protégée par son propriétaire[4] - [5].
Il est également important de noter que la signature de code ne protège pas l'utilisateur de toutes activités malveillantes ou de bogues logiciels involontaires par le développeur du logiciel - il assure simplement que le logiciel provient bien du développeur et n'a pas été modifié depuis sa signature.
Implantation par Microsoft
Microsoft met en œuvre une forme de signature de code (basée sur Authenticode) pour les pilotes. Comme les pilotes s'exécutent dans le noyau du système d'exploitation, ils peuvent déstabiliser le système ou l'ouvrir à des logiciels malveillants. Pour cette raison, Microsoft teste les pilotes soumis à son programme WHQL (Windows Hardware Quality Labs). Une fois qu'une version du pilote a passé ses tests de sécurité, Microsoft signe la version du pilote comme étant sans danger. Sur les systèmes 32 bits, l'installation des pilotes qui ne sont pas validés par Microsoft est possible après que l'utilisateur ait accepté l'installation dans une invite l'avertissant que le code n'est pas signé.
Code non signé dans les consoles de jeux
Dans le contexte de consoles de jeux et d'autres appareils numériques, l'expression code non signé est souvent utilisée pour désigner un logiciel qui n'a pas été signé avec la clé cryptographique normalement requise pour que le logiciel puisse être accepté et exécuté sur l'appareil (il s'agit alors habituellement d'une copie non légale du logiciel). La plupart des jeux de console doivent être signés avec une clé secrète conçue par le fabricant de la console pour que le jeu puisse être chargé sur la console. Il existe évidemment plusieurs méthodes pour contourner cette signature comme les exploits logiciels, les modchips, les Swap Magic (en) et les softmods.
Il peut sembler surprenant qu'une copie d'un programme légitime signé ne soit pas acceptée comme le serait le programme légitime lui-même. Sur la Xbox, la raison en est que le fichier exécutable Xbox (XBE) contient un indicateur de type de média, qui spécifie le type de support à partir duquel l'application peut être exécutée. Sur les logiciels Xbox, l'indicateur est réglé de sorte que le programme ne peut être exécuté qu'à partir d'un disque gravé en usine. Le programme ne peut donc pas être exécuté à partir d'un disque enregistrable ou réinscriptible sur lequel il aurait été copié. Comme le programme est signé, une modification de l'indicateur de type de média ne contourne pas ce problème, car alors la signature du programme est changée et le programme échoue la validation de la signature.
Notes et références
- (en) William Hendric, « A Complete overview of Trusted Certificates - CABForum » [PDF], (consulté le )
- (en) William Hendric, « What is Code Signing? », (consulté le )
- https://casecurity.org/wp-content/uploads/2013/10/CASC-Code-Signing.pdf
- (en) « Fake antivirus solutions increasingly have stolen code-signing certificates », sur Trend Micro, (consulté le ).
- (en) « A Racket's Brewing in the Code Signing Cert Business », sur eWEEK (consulté le ).