The Most Dangerous Code in the World : Validating SSL Certificates in Non-Browser Software par Martin Georgiev, Subodh Iyengar, Suman Jana, Rishita Anubhai, Dan Boneh et Vitaly Shmatikov
Une excellente étude sur les vulnérabilités des applications utilisant TLS (autrefois nommé SSL), à l’exclusion des navigateurs Web. Des tas d’applications parfois peu connues et discrètes (par exemple pour réaliser la mise à jour des logiciels d’un système) utilisent, comme les navigateurs Web, TLS pour se protéger contre un méchant qui essaierait de détourner le trafic vers un autre serveur que celui visé. Mais, contrairement aux navigateurs Web, ces applications, souvent critiques (paiement entre cyber-marchands, par exemple) n’ont guère été étudiées et ont des vulnérabiités souvent énormes, permettant à un attaquant de se faire passer pour le serveur légitime, malgré TLS.
Pour ne donner qu’un exemple (mais un des plus beaux), la bibliothèque cURL, très utilisée par d’innombrables applications, a un paramètre CURLOPT_SSL_VERIFYHOST. La documentation dit bien qu’il doit être mis à 2 (sa valeur par défaut) pour que le nom soit vérifié et à 1 pour couper la vérification. Bien des programmes écrits dans des langages sans typage fort (comme PHP), mettent ce paramètre à « true », donc à 1, coupant ainsi la validation…
Les auteurs de l’article, après avoir cassé la sécurité de TLS dans des dizaines d’applications, suggèrent des API mieux documentées, plus claires et de plus haut niveau, pour diminuer le risque que les programmeurs se trompent.
# cURL
Posté par Gof (site web personnel) . Évalué à 10.
En même temps, tout les languages avec typage fort que je connais convertisse automatiquement true à 1.
Par ailleurs, la documentation de cURL: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTSSLVERIFYHOST
Donc cURL a été corrigé, et mettre la valeur à 1 ne désactive plus la vérification.
[^] # Re: cURL
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 10.
Euh, non, Go, Ada ou Java, pour ne prendre que trois exemples de langages typés, n'accepteraient pas un booléen là où on attend un entier. (A fortiori, ils ne le convertiraient pas.)
Les vulnérabilités citées dans l'article ont évidemment été signalées aux auteurs de logiciels avant la publication de l'article et plusieurs sont donc aujourd'hui corrigées.
[^] # Re: cURL
Posté par BFG . Évalué à 3.
C'est faux.
[^] # Re: cURL
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 6.
Désolé, mais c'est vrai. Les auteurs de libcurl n'ont pas été contactés tout simplement parce qu'il n'y a pas à proprement parler de faille dans libcurl, juste une API dangereuse.
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 5. Dernière modification le 09 décembre 2012 à 21:53.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: cURL
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 1.
Si mais s'ils réagissent tous aussi mal que l'auteur de libcurl, ça promet…
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 9.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: cURL
Posté par Krunch (site web personnel) . Évalué à 3.
C++ ne compte pas comme un langage avec typage fort.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: cURL
Posté par reno . Évalué à 4.
Bah, le "typage fort" ce n'est pas un booléan vrai/faux, c'est une échelle de 0 à 10.
Je mettrais le C++ à 8 personellement (les conversion automatiques signés/non-signés, entier/booléen affaiblissent le typage).
# Sensationnel
Posté par BFG . Évalué à 10.
Le problème n'est donc pas dans cURL, mais bien chez les développeurs qui ne lisent pas les documentations (et celle de libcurl est particulièrement claire). Et qu'on ne me parle pas d'une API qui soit là pour assister les incompétents (la documentation dit de passer 0, 1 ou 2, si l'on passe
true
, on est incompétent).Par ailleurs, Daniel Stenberg (l'auteur principal de cURL) signale que ceux qui ont écrit ce "papier" (qui à mon avis cherchent à faire du sensationnel plein de superlatifs) n'ont même pas contacté les auteurs des bibliothèques qu'ils "accusent".
[^] # Re: Sensationnel
Posté par Gof (site web personnel) . Évalué à 10.
Le problème est que l'API de cURL n'était pas bonne.
Tous les documents sur comment réaliser une API précise que une bonne API est « consistent » (cohérente) et « hard to misuse » (difficile à utiliser incorrectement) [1] [2] [3] [4]
Or ici l'API n'est pas cohérente puisque CURLOPT_SSL_VERIFYPEER est un boolean et CURLOPT_SSL_VERIFYHOST un entier. Et elle induit les gens en erreur, ce qui est le contraire de « hard to misuse »
[^] # Re: Sensationnel
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 6.
Plus précisement (parce que Stenberg nie bêtement le problème, en jouant sur les mots et en prétendant qu'il n'y a pas de paramètres booléens dans libcurl), le paramètre est un long (libcurl n'utilise effectivement pas bool) mais qui prend deux valeurs, 0 pour "non" et 1 pour "oui". C'est donc un quasi-booléen et l'erreur des programmeurs qui ont passé "true" à une autre fonction de libcurl est tout à fait excusable (même si BFG les prend de haut).
[^] # Re: Sensationnel
Posté par Prae . Évalué à 2.
Je te rejoins, surtout que le développeur parle d'un choix pour verifyhost.
Il aurait été peut-être plus pertinent de faire:
Au moins, on est sûr de pas se gourer.
[^] # Re: Sensationnel
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 4.
Non, Stenberg ne dit pas ça du tout. Il dit que lui n'a pas été contacté (rappelons que libcurl n'avait pas de faille).
[^] # Re: Sensationnel
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 10.
Avec une telle mentalité, on aura encore des failles de sécurité pendant longtemps. Peut-être que les abonnés à LinuxFr ne mettent jamais de bogues dans leurs programmes mais, dans le monde réel, avec les contraintes de délai et le PHB qui demande qu'on livre le code avant-hier, les bogues arrivent. Comme le rappelle très justement Gof dans son commentaire, le rôle d'une API n'est pas de tendre des pièges subtils, pour pouvoir ricaner ensuite de l'incompétence des programmeurs qui sont tombés dedans, c'est de rendre l'erreur difficile.
Je ne sais pas ce qu'il vous faut : des dizaines de programmes vulnérables à une attaque triviale (et pas des petits scripts PHP écrits par Jean-Kevin Boulet dans son coin pour son usage personnel, non des codes utilisés par des dizaines de milliers de gens pour des usages critiques, par exemple du paiement en ligne), et ça ne vous suffit pas ?
C'est un obstacle qu'on rencontre souvent dans le monde du logiciel privateur, le vendeur qui nie les failles de sécurité parce que cela le gonfle de corriger. Apparemment, ce mal frappe aussi le logiciel libre.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.