Une petite erreur de code peut avoir de grosses conséquences. En négligeant de vérifier scrupuleusement le code source de sa librairie SecureTransport, Apple a créé une faille de sécurité très importante sous iOS, Mac OS X, et de nombreuses applications qui utilisent la même librairie.

Vendredi dernier, Apple a déployé une mise à jour de son système iOS (également disponible pour iOS 6), en reconnaissant qu'il s'agissait de combler une faille dans la prise en charge du protocole de chiffrement SSL/TLS. "Un assaillant avec une position privilégiée sur le réseau pourrait capturer ou modifier des données dans des sessions protégées", expliquait la firme de Cupertino. "Secure Transport (la librairie d'Apple, ndlr) échouait à valider l'authenticité de la connexion. Le problème a été corrigé en restaurant des étapes de validation manquantes", ajoutait Apple.

Le problème serait apparu sur iOS 6.0 et a persisté jusqu'aux toutes dernières versions d'iOS, jusqu'au patch publié vendredi. La faille existe aussi sous Mac OS X, et n'a pas encore été corrigée sur le système d'exploitation qui équipe les ordinateurs Apple. Outre iOS, seul Apple TV a également bénéficié d'un correctif. 

Pour assurer la confidentialité des échanges de données, les sites web ou applications qui souhaitent chiffrer les communications utilisent les surcouches SSL (Secure Sockets Layer) ou TLS (Transport Layer Security) pour rendre illisibles les communications qui seraient interceptées. Mais la faille permettait à un hacker de réaliser une attaque de type man-in-the-middle pour intercepter des données que l'utilisateur croyait sécurisées, alors que la prétendue sécurité était déduite de faux certificats de sécurité prétendument délivrés à des sociétés ayant pignon sur rue.

Il faut pour cela que le hacker ait accès au réseau utilisé par la victime, ce qui possible par exemple en créant un hotspot Wifi public sur laquelle les victimes viennent se connecter.

Un petit doublon aux grandes conséquences

Sur son blog personnel, Adam Langley, un développeur d'Apple, explique que la faille est due à un bug dans l'écriture d'une librairie dont Apple avait rendu le code source public. On y trouve en effet une série d'instructions conditionnées (if), qui visent à vérifier l'une après l'autre qu'aucune des conditions d'échec de la sécurisation de la communication n'est remplie. Le cas échéant, en cas d'erreur, le code renvoie à la fonction de mise en échec (fail) si la condition est remplie, et une fois la fonction fail résolue, les autres conditions sont ensuite étudiées dans l'ordre prévu. Le renvoi éventuel à la fonction d'échec est réalisé par la ligne "goto fail;" que l'on retrouve à plusieurs reprises dans le code.

Mais à un endroit du code source, la ligne "goto fail;" était écrite deux fois de suite. Or seule la première est interprétée comme la marche à suivre si la condition est remplie. Le deuxième "goto fail" est systématiquement exécuté, ce qui a pour effet de sauter toutes les autres vérifications de sécurité prévues. Ainsi quiconque exploitait les problèmes de sécurité non vérifiés pouvait réussir son attaque.

La librairie SecureTransport qui contient ce code source ayant été mise à disposition des développeurs par Apple, ce sont tous les logiciels qui utilisent SecureTransport qui sont victimes du même problème de sécurité.

"Ce type de bug subtile au fin fond du code est un cauchemar", compatit Adam Langley.

Toutefois, il estime que l'erreur aurait pu être évitée en s'obligeant à utiliser des parenthèses { } pour toutes les instructions conditionnées. Dans ce cas, le doublon aurait fait partie du bloc if, et n'aurait jamais été exécutée si la condition décrite n'était pas remplie.

Il estime aussi que la politique d'Apple d'examen du code est peut-être trop laxiste, et qu'il faut toujours que du code modifié soit validé par plusieurs paires d'yeux avant d'être déployé sur des produits aussi sensibles.


Abonnez-vous à Numerama sur Google News pour ne manquer aucune info !