Ce blog n'a d'autre prétention que de me permettre de mettre à la disposition de tous des petits textes que j'écris. On y parle surtout d'informatique mais d'autres sujets apparaissent parfois.
Première rédaction de cet article le 7 Septembre 2008
Parmi les protocoles utilisés sur
Internet, presque tous sont internationalisés
depuis longtemps. Le dernier gros manque concernait les adresses de
courrier électronique, obligées de s'en tenir à
stephane@internet-en-cooperation.fr alors qu'on voudrait pouvoir
écrire à
stéphane@internet-en-coopération.fr. Désormais,
nous avons une solution, Internationalized
Email, dont les normes sont désormais effectives.
Bien sûr, pour l'exemple ci-dessus, n'utilisant que l'alphabet latin, le gain n'est pas évident. Mais il l'est beaucoup plus si vous voulez écrire votre adresse avec l'écriture arabe ou chinoise.
Le contenu des courriers était internationalisé depuis longtemps, au moins depuis MIME (RFC 1341 à l'origine, en juin 1992). Mais les adresses ne l'étaient pas encore. Une solution était en développement depuis longtemps à l'IETF, sous le nom d'EAI (Email Addresses Internationalization) et elle avait été décrite dans le RFC 4952. Mais ce RFC ne décrivait que l'architecture générale. Il manquait les normes elle-mêmes qui, après une histoire complexe, sont désormais publiées. Pour l'instant, compte tenu de l'importance du courrier et de l'importance des modifications requises, ces spécifications ont le statut « Expérimental » et ne sont donc pas formellement sur le chemin des normes de l'IETF.
Il y a deux parties à l'adresse (décrites dans le RFC 2822) : la partie locale, à gauche du @ et le nom de domaine à droite. Si ce nom de domaine, depuis la sortie du RFC 3490, en mars 2003, peut s'écrire en Unicode (norme IDN), le courrier exigeait toujours un nom de domaine en ASCII donc un message de non-délivrance, par exemple, allait affichait la forme Punycode du nom. Ce n'était pas une vraie internationalisation.
La nouvelle norme, qui réalise enfin cette internationalisation, est spécifiée dans les RFC suivants :
Bien sûr, cette internationalisation du courrier devra s'étendre aux protocoles permettant la récupération locale du courrier, c'est-à-dire à POP et à IMAP. Le travail est en cours mais n'a pas encore débouché sur un RFC final.
Il existe plusieurs mises en œuvre d'EAI, dont l'interopérabilité a été testée en juillet 2008 lors d'une session commune aux NIC chinois, coréens, japonais et taïwanais.
Le principal protocole de la famille TCP/IP qui ne soit pas complètement internationalisé est donc désormais FTP qui dispose de deux types de transfert de données, « texte » et « binaire » où « texte » ne concerne que l'ASCII (ou, à la rigueur, les jeux ISO 8859). Un travail est en cours pour étendre FTP afin de pouvoir utiliser le texte Unicode du RFC 5198.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : Y. Abel (TWNIC)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 7 Septembre 2008
Dans l'ensemble des RFC qui décrivent les adresses de courrier électronique internationalisées (c'est-à-dire pouvant utiliser tout le répertoire Unicode), celui-ci se consacre au nouveau format des en-têtes, mettant donc à jour le fameux RFC 2822 (en toute rigueur, il n'est mis à jour que par ceux qui participent à l'expérience, cf. section 1.2 du RFC).
Désormais, on peut, si on participe à l'« expérience » (tel est son statut officiel) EAI (Email Address Internationalization), avoir dans un message un en-tête comme :
From: Stéphane Bortzmeyer <stéphane@sources.org>
Oui, avec du vrai UTF-8, y compris dans l'adresse proprement dite, pas seulement dans les commentaires, et encore, à condition de les surencoder selon le RFC 2047 comme c'était le cas avant.
L'éditeur du RFC travaille à TWNIC, le
registre chinois de .tw. Les
chinois ont, fort logiquement, été
particulièrement actifs dans tout le processus EAI. Celui-ci visait à
terminer l'internationalisation du courrier électronique, qui avait
passé une étape décisive en novembre 1996, avec la sortie du RFC 2045 sur MIME. Mais cette norme MIME
n'internationalisait que le corps des messages. EAI permet désormais
d'internationaliser également les en-têtes comme
From: ou Received: (mais
pas, par exemple, Date: ou
Message-ID:, qui resteront en ASCII pur,
cf. section 4.3 ; Date:, par exemple, est censé
être analysé par le MUA et présenté ensuite à
l'utilisateur dans sa langue).
EAI comprend plusieurs RFC, par exemple le RFC 4952
définit le cadre général, le RFC 5336, l'utilisation des
adresses Unicode dans SMTP (avec l'extension
UTF8SMTP), des futurs RFC qui traiteront le cas
de POP ou IMAP et notre RFC 5335, qui se concentre sur le format des messages.
Concrètement, que change donc ce RFC ? La section 4 détaille ce qui est modifié :
From: ou To:)
est modifiée pour accepter UTF-8. Pour les sites qui utilisent une
adresse électronique comme identificateur, comme le fait
Amazon.com, ce sera un intéressant
défi !message/global, pour permettre d'identifier un
message EAI (section 4.6).Parmi les conséquences pratiques de ce changement, il faut noter que les programmeurs qui écrivent des logiciels traitant le courrier doivent désormais gérer Unicode, même s'ils se contentent d'analyser les en-têtes... L'époque du courrier traité avec des scripts shell est bien passée.
La section 5 liste également quelques conséquences pour la sécurité comme le fait qu'un mécanisme d'authentification devra être prêt à gérer plusieurs adresses pour la même personne (car, pendant un certain temps, plusieurs utilisateurs auront à la fois une adresse en Unicode et une en ASCII pur).
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : J. Yao (CNNIC), W. Mao (CNNIC)
Expérimental
Première rédaction de cet article le 7 Septembre 2008
Dans la grande série des RFC décrivant les adresses de courrier internationalisées, ce document traite des modifications au protocole SMTP.
Plusieurs RFC composent la nouvelle norme EAI ou « Email Addresses Internationalized » (cf. RFC 4952). Les deux principaux concernent le format des messages (RFC 5335) et le dialogue entre deux serveurs de messagerie, suivant le protocole SMTP. Ce dernier cas est couvert dans notre RFC 5336.
Les adresses de courrier en Unicode ne sont
pas en effet compatibles avec le SMTP « brut ». Ainsi, la commande
RCPT TO qui permet d'indiquer le destinataire, ne
prend en paramètre que de l'ASCII. Il faut donc
étendre SMTP (actuellement normalisé en RFC 2821) pour
permettre de l'UTF-8 en paramètre de commandes
comme MAIL FROM et RCPT
TO. Cette extension se signale avec l'option
UTF8SMTP, dont l'usage permet de vérifier que le
MTA situé en face comprend bien la nouvelle
norme (sections 1 et 2 du RFC). Si ce n'est pas le cas, une adresse en
ASCII facultative peut être utilisée.
La section 3 forme le gros du RFC en spécifiant rigoureusement le nouveau protocole. Voyons d'abord un exemple de dialogue SMTP avec la nouvelle extension (C est le client - l'appelant - et S le serveur - l'appelé) :
S: 220 mail.example.org ESMTP Foobar (Debian/GNU) C: EHLO mail.iloveunicode.example S: 250-mail.example.org 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-UTF8SMTP 250 DSN C: MAIL FROM:<stéphane@internet-en-coopération.fr> ALT-ADDRESS=bortzmeyer@afnic.fr S: 250 2.1.0 Ok C: RCPT TO: <françoise@comptabilité.example.org> S: 250 2.1.5 Ok
Notez les deux adresses, chacune comprenant des caractères non-ASCII, à gauche et à droite du @.
Les serveurs qui mettent en œuvre l'extension
UTF8SMTP doivent également accepter la très
ancienne extension 8BITMIME (RFC 1652)
qui permet, depuis belle lurette, de ne pas se limiter à l'ASCII dans
le contenu des messages, sans pour autant nécessiter des encodages
comme Quoted-Printable (en dépit d'une légende tenace).
La section 3.1 présente la nouvelle extension,
UTF8SMTP. Les extensions SMTP sont définies par
le RFC 2821, section 2.2. Un MTA peut annoncer
qu'il accepte UTF8SMTP, permettant à son pair, s'il l'accepte également,
d'utiliser des adresses UTF-8. C'est également cette section qui
définit ce que doit faire un MTA lorsqu'il tente de transmettre un
message internationalisé à un ancien MTA qui ne gère pas cette
extension. Quatre solutions sont possibles, la plus fréquente sera
sans doute d'utiliser le mécanisme de repli
(downgrade).
La section 3.3 décrit la nouvelle syntaxe pour les adresses. L'ancienne était limitée à ASCII mais très permissive (bien qu'on trouve, notamment derrière les formulaires Web, énormément de logiciels de « vérification » bogués). En gros, la syntaxe est qu'une adresse est formée de deux parties, la partie locale et le nom de domaine, tous les deux séparés par l'arobase. La nouveauté est que les deux parties peuvent désormais être en Unicode, avec peu de restrictions sur la partie locale (le nom de domaine étant soumis aux restrictions du RFC 3490).
Une adresse alternative tout en ASCII peut être fournie par le
paramètre ALT-ADDRESS. C'est l'objet des sections
3.4 et 3.5. Elle doit s'utiliser conjointement à une modification du
message (qui peut contenir des en-têtes en UTF-8) et l'ensemble du
processus s'appelle le repli
(downgrade). Sa spécification n'est pas encore
publiée. (Dans l'exemple de dialogue SMTP plus haut, seul l'expéditeur
avait une adresse alternative.)
Il y a plein d'autres détails dans cette section, comme celui
(section 3.7.1) que
le paramètre de la commande EHLO (un nom de
machine) doit être encodé en Punycode puisque,
à ce stade, on ne sait pas encore si UTF8SMTP est accepté ou pas.
Je n'ai pas encore testé avec mes Postfix, ni vérifié quels étaient les plans des auteurs de ce logiciel vis-à-vis de cette extension de SMTP.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : C. Newman (Sun), A. Melnikov (Isode)
Expérimental
Réalisé dans le cadre du groupe de travail IETF eai
Première rédaction de cet article le 7 Septembre 2008
Dans l'ensemble des RFC sur l'internationalisation des adresses de courrier électronique, ce document traite le cas des accusés de réception et avis de non-remise (DSN pour Delivery Status Notification).
Puisque les RFC 5336 et RFC 5335 permettent désormais d'utiliser des adresses de courrier électroniques internationalisées, c'est-à-dire utilisant tout le jeu de caractères Unicode, il faut prévoir le cas où les courriers provoquent l'envoi d'avis de remise ou de non-remise (DSN pour Delivery Status Notification, RFC 3461 et RFC 3464) et d'accusés de réception (MDN, pour Message Disposition Notification, RFC 3798). C'est l'objet de ce RFC, qui met à jour les anciens documents qui limitaient ces accusés et avis au jeu ASCII.
Le format des DSN dans le RFC 3464 parle de « types
d'adresse ». Les adresses en UTF-8 du RFC 5335 sont un nouveau type d'adresses. Si le
serveur SMTP accepte l'extension UTF8SMTP du RFC 5336 et l'extension DSN du RFC 3461, il doit
permettre d'utiliser ce type dans le paramètre ORCPT
(Original Recipient, section 4.2 du RFC 3461). Si le
serveur n'accepte pas UTF8SMTP, l'adresse à utiliser dans les DSN doit
être encodée en 7bits, selon les règles exposées dans cette section 3 (et
non pas selon les règles du RFC 5137, paru trop tard). Par
exemple, stéphane@bortzmeyer.org peut s'écrire
st\x{E9}phane@bortzmeyer.org. (La
section 3 détaille plus complètement le traitement des adresses UTF-8.)
Une fois réglé le problème de la représentation des adresses, la
section 4 traite les DSN en UTF-8. Les DSN traditionnels étaient
composés d'un objet MIME de type
multipart/report comportant trois objets
décrivant le problème (un objet conçu pour être lu par un humain, un
message/delivery-status et le message originel,
message/rfc822). Pour le courrier
internationalisé, de nouveaux types ont été créés :
message/global-delivery-status qui,
contrairement à son prédécesseur
message/delivery-status, accepte l'UTF-8 et
permet donc de placer directement les adresses UTF-8, sans encodage en
ASCII. En
outre, il dispose d'un nouveau champ,
Localized-Diagnostic, qui permet de stocker des
messages lisibles par un humain. La langue de ces messages est
indiquée par une étiquette de langue (RFC 4646). message/global qui remplace
message/rfc822 (dont le nom, hommage au vieux
RFC 822, était de toute façon dépassé). À noter que le terme global
(mondial) utilisé pour noter ce type avait fait l'objet de vives
discussions et même d'un vote. Cet objet permet de
transporter le message original (si on ne transporte que les en-têtes,
on utilise message/global-headers.
On peut noter que la norme MIME (RFC 2046) interdisait l'usage de l'option
Content-Transfer-Encoding pour les objets de type
message/* mais cette règle a été assouplie par le
RFC 5335.
La section 5 traite des MDN (Message Disposition
NOtificatin, RFC 3798). Ils ne sont pas très
différents des DSN et ont un format très proche, avec un type MIME message/global-disposition-notification.
La section 6 traite des registres
IANA. Le type « UTF-8 » est ajouté au registre des types d'adresses
(section 6.1), et les nouveaux types MIME comme
message/global sont ajoutés au registre des types MIME (sections 6.3
à 6.5).
Enfin, la section 7 est dédiée aux questions de sécurité. Outre les problèmes de sécurité classiques des DSN et des MDN (non authentifiés, ils permettent de faire croire qu'un message a échoué, alors qu'il a bien été délivré, ou le contraire), le RFC nous prévient que des DSN ou des MDN délibérement incorrects peuvent être envoyés par un attaquant dans l'espoir de profiter d'erreur dans la programmation des analyseurs, par exemple pour déclencher un débordement de tampon. Le risque est plus important s'il y a beaucoup d'encodage, le décodage pouvant faire varier la taille des données.
Première rédaction de cet article le 4 Septembre 2008
Je viens de commencer un programme comportant plusieurs fils d'éxcution (threads). Lorsqu'on découpe un programme en fils, il y a une décision à prendre concernant le nombre de fils ; beaucoup de fils permet un parallélisme maximal mais implique aussi un surtravail dû à la communication avec ces fils. Peu de fils fait que du travail peut rester bloqué car le fil en est toujours au travail précédent. La valeur optimale dépend évidemment du problème précis.
Ici, il s'agissait d'un projet AFNIC d'interrogation des zones
DNS sous .fr pour en
déduire des informations, par exemple sur le niveau de déploiement de
IPv6 ou bien de
DNSSEC. Les requêtes DNS aux serveurs de noms
peuvent être très lentes, surtout si un ou plusieurs serveurs de la
zone sont en panne, et qu'on doit attendre l'expiration du délai de garde. Avec un programme
séquentiel, quelques pourcents de zones
vraiment cassées peuvent retarder considérablement tout le
programme. D'où l'idée de parallèliser.
.fr compte actuellement environ 1 200 000
zones déléguées. Faut-il 1 200 000 fils d'exécution ? Ou bien
seulement 10 ? Ou entre les deux ? On peut toujours spéculer a priori
sur le chiffre idéal. Il dépend de beaucoup de facteurs (matériel
utilisé, efficacité de
l'ordonnanceur utilisé, ici celui de Python,
nombre de communications nécessaires avec les fils, etc). Notons que,
le programme étant écrit en Python, où l'interpréteur lui-même n'est
pas parallèle, une machine multiprocesseur
n'est pas forcément utile.
Le mieux est de mesurer plutôt que d'essayer
d'imaginer. Je fais un programme qui lit le fichier de zone de
.fr, je crée N tâches Python et je confie à
chacune 1 200 000 / N zones à interroger (chaque tâche doit évidemment
aussi signaler à la tâche maîtresse le résultat de ses
interrogations). L'interrogation se fait avec l'excellent module DNS Python, en ne parlant pas
directement aux serveurs de noms mais en étant derrière un
résolveur/cache Unbound (donc, attention, le
cache peut influencer les mesures, c'est pour cela qu'elles ont été
faites deux fois).
Avec seulement cent tâches (N = 100), le programme ne peut faire qu'environ cent zones par seconde. Je l'ai interrompu avant la fin. Avec 1000 tâches, on arrive à 480 zones par seconde. Et avec 10 000 tâches, on atteint 550 zones par seconde.
Cela illustre l'efficacité de l'ordonnanceur Python : il vaut mieux utiliser « beaucoup » de tâches.
Ne prenez pas le résultat au pied de la lettre pour vos programmes. Ce qui compte ici est la méthode (mesurer au lieu de supposer ; l'informatique est une science expérimentale). Le résultat, lui, dépend de beaucoup de facteurs.
Date de publication du RFC : Septembre 2008
Auteur(s) du RFC : I. Goncalves (Xiph), S. Pfeiffer
(Xiph), C. Montgomery (Xiph)
Chemin des normes
Première rédaction de cet article le 4 Septembre 2008
Ce court RFC documente les types « MIME » (RFC 2045) à utiliser pour le format de fichiers multimédia Ogg, changeant sérieusement les anciens types du RFC 3534.
Dans un monde du multimédia dominé par des formats fermés comme WMF ou partiellement ouverts comme Flash (sans compter les innombrables et futiles brevets sur ces formats), Ogg, format maintenu par la fondation Xiph et décrit dans le RFC 3533, reste le principal format ouvert. Comme beaucoup de formats multimédia (par exemple AVI), Ogg ne permet que de créer des containers, des ensembles de flux de données, dont chacun a son propre format. Ainsi, un film stocké dans un container Ogg contiendra en général deux flux, un vidéo (typiquement au format Theora) pour l'image et un audio (typiquement au format Vorbis) pour le son. D'autres containers Ogg peuvent contenir plus de deux flux de données temporelles.
Cette façon de stocker les données complique un peu la définition
d'un type de données pour étiqueter les containers Ogg, lorsqu'ils
sont distribués par courrier électronique ou
bien envoyés via le protocole HTTP. Le
RFC originel, le RFC 3534, définissait
un type unique, application/ogg. Le problème
était qu'un container Ogg ne contenant que du son au format Vorbis se
trouvait étiqueté avec le type très général
application/ alors que le type
audio/ aurait certainement mieux convenu. Notre
RFC introduit donc deux nouveaux sous-types de
video/ et audio/, soit
video/ogg et audio/ogg, et
redéfinit le type application/ogg.
La section 2 du RFC rappelle les changements depuis le RFC 3534, la principale étant ces deux nouveaux types.
La section 4 décrit les problèmes de compatibilité qui pourraient
surgir avec les anciennes applications. Elle pose le principe que du
contenu purement audio devrait être marqué avec le nouveau type
audio/ogg (même chose pour la vidéo), réservant
l'usage de application/ogg aux contenus plus
complexes (par exemple dans le secteur scientifique, où ils sont plus
fréquents que dans le monde du multimédia). Pour ces contenus, notre RFC impose l'extension Ogg
Skeleton pour
identifier les différents flux contenus. Elle décrit aussi
l'utilisation du paramètre codecs qui permet de
préciser le format des flux inclus, et donc le
codec à utiliser. Ainsi, un flux
Speex dans un fichier Ogg pourra être identifié par
audio/ogg; codecs=speex. La section 5 du RFC
précise d'avantage les relations entre les trois types désormais
normalisés, du plus général, application/ogg au
plus spécifique, audio/ogg.
La section 10 contient la « paperasse » nécessaire à
l'enregistrement des trois types dans le registre IANA des types. La section 10.1 enregistre
application/ogg, recommandant l'extension de
fichier .ogx (.ogg étant
souvent utilisé uniquement pour l'audio).
10.2 définit video/ogg (extension
.ogv) et 10.3 audio/ogg, qui
garde l'extension « historique » .ogg.
Ogg dispose d'une mise en œuvre de référence, sous une licence libre, la libogg (section 8 du RFC, sur l'interopérabilité).
Notons enfin une section 7 du RFC consacrée à la sécurité et qui donne quelques avertissements utiles : si Ogg en lui-même n'est qu'un format et ne pose pas de problème de sécurité en soi, certains contenus d'un fichier Ogg peuvent être exécutables et poser alors de redoutables problèmes de sécurité comme l'ont montré les nombreuses alertes de sécurité qui concernaient Flash. Ces contenus ne devraient pas être exécutés sans une validation (par exemple une signature électronique, service non fourni actuellement par Ogg lui-même mais qui peut être utilisé sur les flux transportés dans un container).
D'autre part, les contenus multimédia sont souvent de grande taille et des attaques par déni de service indirect sont toujours possibles, par exemple en envoyant une image qui, après décompression, sera ridiculement grande, ou un flux audio avec un rythme d'échantillonage impossible à suivre. Les programmes qui lisent les fichiers multimédia doivent donc être prudents.
Première rédaction de cet article le 3 Septembre 2008
J'ai reçu en rentrant de vacances mon Neo Freerunner, un téléphone portable équipé de la plate-forme logicielle Openmoko. Ce téléphone entièrement libre, matériel et logiciel, tiendra t-il ses promesses ?
Le monde de la téléphonie mobile est aujourd'hui dominé par des engins totalement fermés dont le plus extrême est sans doute l'iPhone d'Apple. Ces appareils font tourner un système d'exploitation complètement privateur mais, surtout, ils ne permettent pas toujours de faire tourner dessus les applications qu'on veut. C'est ainsi que la machine favorite des ignorants, l'iPhone, refuse les applications non approuvées par Apple et ne permet d'utiliser qu'un seul opérateur de téléphone mobile. (Cf. Problems of typical "closed" phones.)
Ces appareils sont donc bien plus fermés qu'un PC avec MS-Windows. Au moins, Steve Ballmer ne m'empêche pas de faire tourner n'importe quel logiciel, par exemple Firefox et Open Office sur son système « fermé » ! Il est curieux de voir des gens critiquer vertement le géant états-unien du logiciel et se précipiter ensuite chez le petit Satan pour acheter très cher un engin dont le degré de fermeture ferait envie à Microsoft.
Il n'est donc pas étonnant qu'un gros effort marketing soit en cours pour nous convaincre que l'avenir de l'accès à Internet est dans la téléphonie mobile : l'Internet est un symbole d'ouverture et le refermer est une priorité pour beaucoup.
Pourtant, la téléphonie mobile n'est pas forcément synonyme de fermeture. Il existe plusieurs plate-formes qui sont relativement ouvertes (comme le fameux Android de Google) et surtout un système totalement ouvert, Openmoko. Avec Openmoko, non seulement le téléphone ne fait tourner que du logiciel libre mais, en outre, la partie matérielle repose également sur des composants dont les schémas sont publiés et réutilisables pour d'autres fabricants (pour des raisons légales, la partie GSM n'est pas dans ce cas). C'est donc un projet très (trop ?) ambitieux ; il offrirait plus de liberté que mon PC/Debian de la maison, où seul le logiciel est libre.
Il existe aujourd'hui un téléphone construit pour Openmoko, le Neo Freerunner. Il est distribué en France par Bearstech.
Son noyau est un Linux mais ce n'est pas cela qui compte : la Freebox a un Linux aussi et elle est extrêmement fermée. Par contre, la séquence de boot avec les messages du noyau de 0,4 mm de hauteur vaut le coup d'œil.
Qu'en est-il après quelques jours d'essais ? Si le matériel est très soigné (vous pouvez lire un excellent récit illustré du déballage et de la mise en route), le logiciel n'est pas à la hauteur. D'abord, il faut bien comprendre que l'état actuel d'Openmoko est franchement beta, voire alpha. Il n'est pas utilisable par des simples utilisateurs, et n'a pas vraiment d'intérêt même pour des geeks, si ces derniers ne sont pas des développeurs pour cette plate-forme. Quelques exemples : je n'ai jamais pu faire marcher la partie GPS, la dernière version officielle, Om 2008.8, ne permet pas de téléphoner sans un insupportable écho, l'application de gestion des contacts (stockés sur la carte SIM) n'a pas de fonction de recherche, le clavier virtuel a une touche d'effacement très complexe (les problèmes d'ergonomie sont fréquents sur Opnemoko), etc.
Surtout, le logiciel est très peu stable : les Freerunner sont livrés avec une image, Om 2007.2, qui n'est plus maintenue et que personne n'utilise. Le nouvel utilisateur doit donc commencer par en flasher une nouvelle. Il existe plusieurs images possibles, radicalement différentes (Qtopia, FSO, Debian, Om) et il est donc difficile de partager des expériences. La seule documentation d'usage concerne Om 2007.2 (Om 2008.8 est complètement différent). Le seul fait de signaler une bogue est un travail difficile.
Bref, le projet est intéressant mais encore peu avancé. Si j'apprécie de pouvoir me connecter avec ssh sur mon téléphone pour y taper ls, cela ne suffit pas encore pour remplacer mon téléphone ordinaire. Enfin, cela permet de frimer :
root@om-gta02:~# uname -a Linux om-gta02 2.6.24 #1 PREEMPT Thu Apr 24 08:23:36 CST 2008 armv4tl unknown root@om-gta02:~# traceroute www.google.com traceroute: warning: www.google.com has multiple addresses; using 74.125.39.104 traceroute to www.l.google.com (74.125.39.104), 30 hops max, 38 byte packets 1 192.168.0.200 (192.168.0.200) 0.871 ms 3.278 ms 1.697 ms 2 192.168.2.254 (192.168.2.254) 5.235 ms 4.121 ms 4.520 ms 3 88.189.152.254 (88.189.152.254) 37.890 ms 35.868 ms 49.363 ms 4 78.254.1.62 (78.254.1.62) 36.765 ms 37.107 ms 39.220 ms 5 seg75-1.v902.intf.nra.proxad.net (78.254.255.37) 37.450 ms 36.687 ms 37.085 ms 6 inv75-1-v900.intf.nra.proxad.net (78.254.255.33) 35.948 ms 37.212 ms 37.182 ms ...
J'espère que l'argent que j'ai dépensé sera utile pour les futurs développements mais je n'ai pas actuellement davantage de temps à y consacrer.
À noter qu'une réunion de présentation du Freerunner a lieu à Paris le 5 septembre.
Première rédaction de cet article le 30 Août 2008
I installed the operating system Ubuntu on a Packard-Bell EasyNote MX37 laptop machine. This article is to share the information that I obtained during the process.
While the basic functions are OK, there are problems. As often with laptops, especially very recent machines, a lot of things do not work, or do not work out of the box.
Première rédaction de cet article le 28 Août 2008
Question idiote du jour: quelle quantité de données peut produire un être humain tapant sur un clavier ?
Un être humain normal tape environ 1 à 2 caractères par seconde (à
noter que les professionnels mesurent plutôt en mots/minute ; vous
pouvez tester votre propre vitesse avec l'excellent http://www.lecturel.com/clavier/mots-par-minute.php ; mais il
s'agit alors de la vitesse de frappe brute alors qu'on considère ici
qu'on écrit des textes originaux, pour lesquels il faut réfléchir). Si
on prend deux caractères par seconde et s'il tape de 20 ans à la mort,
40 heures par semaine (sans RTT, ni vacances,
le rêve du MEDEF), cet humain (ou plutôt ce
surhomme pour avoir une telle productivité) produira dans sa
vie (en moyenne 81 ans en France) presque un milliard de
caractères. Supposant que ces textes soient encodés en
Latin-1, où chaque
caractère occupe un
octet, cela fera un
giga-octet seulement. Soit même pas la taille
d'une clé USB moderne. Une vie entière de
frappe sur un petit machin qui tient au creux de la main...
Si on multiplie par le nombre d'humains qui aient jamais vécu sur Terre (environ cent milliards selon Arthur Clarke dans un passage célèbre de 2001), on n'arrive encore qu'à cent exa-octets, ce qui dépasse la taille d'un seul très gros disque dur d'aujourd'hui, mais reste probablement un faible nombre par rapport à la capacité totale de tous les disques durs de la planète (tiens, qui la connait ?).
Même si ces données étaient stockés en UTF-32, un encodage d'Unicode parfois critiqué (bien à tort) pour la place qu'il utilise (quatre octets pour tout caractère), on n'aurait que quatre cents exa-octets.
Conclusion : s'il n'y avait pas de machines comme les caméscopes numériques ou le LHC pour produire rapidement d'énormes quantités de données, les fabricants de disques durs seraient au chômage...
Première rédaction de cet article le 28 Août 2008
Des failles de sécurité sur Internet, il y en a. Des failles concernant le protocole de routage BGP, il y en a. Que dire de particulier sur celle annoncé à Defcon en août 2008 ?
Notons d'abord la mise en scène. Comme le disait un participant de Nanog : « I think they saw the DNS people getting their 10 minutes of fame and wanted their own :) ». La sécurité informatique est un métier, comme le show-business : il faut faire parler de soi. Ce n'est pas par hasard que les exposés à Defcon commencent toujours par « cette faille est particulièrement sérieuse ». On n'a jamais vu un chercheur en sécurité débuter avec « C'est une petite vulnérabilité sans intérêt. ». Prendre conscience de cela aide à mettre cette annonce dans son contexte.
Ensuite, la faille de sécurité en question est-elle réellement nouvelle ? Non et oui. Non, car elle ne contient que des éléments déjà bien connus comme les limites du modèle de sécurité de BGP (BGP est normalisé dans le RFC 4271 et le RFC 4274 fournit une bonne analyse du protocole), qui avait par exemple été bien illustrées par l'attaque de Pakistan Telecom contre YouTube. Oui parce qu'une combinaison intelligente de techniques connues est en soi une nouveauté. Ce qu'ont présenté Anton Kapela & Alex Pilosov à Defcon est une réelle percée.
En quoi consiste t-elle ? Le socle sur lequel elle s'appuie est le
fait que n'importe quel routeur BGP de la
planète (donc, en pratique, n'importe quel
opérateur, ou craqueur ayant piraté un
opérateur), peut annoncer la route qu'il veut et elle se propagera,
dans certaines conditions, à tous les autres routeurs BGP du monde,
faisant ainsi converger le trafic vers les routeurs choisis par
l'attaquant. Par exemple, si je veux récupérer le trafic de
Paypal, j'observe que leur annonce BGP est pour
le préfixe 66.211.160.0/19, j'annonce
66.211.168.0/24 (un préfixe plus spécifique, pour être sûr
qu'il se propage et qu'il soit utilisé, tout en couvrant quand même les adresses IP de www.paypal.fr) et hop, je récupère les
paquets destinés à Paypal.
Mais, évidemment, ça se voit : la grande ouverture de l'Internet, qui fait sa vulnérabilité, est aussi sa principale ligne de défense, la base de son système immunitaire. N'importe qui peut utiliser un looking glass et voir qui est l'attaquant. Il y a même des services d'alerte automatique bâtis sur ce principe (commme MyASN ou bien Renesys Route Intelligence). Et, surtout, tout le trafic étant dévié, le service normal s'arrête et tout le monde peut faire un traceroute pour voir à cause de qui. Grâce à cela, l'attaque de Pakistan Telecom avait tourné court.
La première innovation de Kapela & Pilosov était donc de bloquer les méthodes de détection les plus simples en acheminant le trafic détourné vers son destinataire légitime. Si l'attaquant ne veut pas réaliser une DoS mais simplement espionner le trafic, cela lui permet d'être plus discret (cela porte le doux nom, emprunté à l'électricité, de BGP shunt. Cela ne stoppe pas les alarmes des systèmes comme MyASN mais cela empêche la détection immédiate. Il est probable que la majorité des sites qui sont ainsi attaqués ne se rendent compte de rien (tout le monde n'est pas abonné à MyASN).
La redirection est délicate à réussir : il faut que tout l'Internet achemine le trafic de la victime vers l'attaquant sauf les réseaux qui sont sur le chemin de retour choisi, de façon à ce que le trafic puisse revenir à son destinataire légitime. Kapela & Pilosov utilise pour cela l'AS prepending en mettant dans le chemin d'AS de l'annonce BGP des valeurs qui assureront le rejet de la route de retour pour tous... sauf pour les routeurs du chemin de retour que les attaquants ont choisi.
La deuxième innovation de nos deux chercheurs est de modifier le TTL dans les paquets IP qu'ils voient passer, pour rendre encore plus difficile la détection par la victime.
Faut-il s'inquiéter ? Oui. Même s'il n'y a rien de révolutionnaire dans cette attaque, on peut dire qu'elle démocratise le détournement BGP, comme l'attaque Kaminsky démocratisait les empoisonnements de caches DNS.
Que peut-on faire ? D'abord, le site normal, qui n'est pas opérateur. Il ne peut pas faire grand'chose pour empêcher le shunt mais il peut se protéger en utilisant systématiquement des mécanismes de sécurisation de bout en bout, notamment la cryptographie (par exemple SSH et jamais telnet). Ainsi, même détourné, le trafic révèlera nettement moins de chose. Mais c'est essentiellement aux opérateurs d'agir. Si on a son propre numéro d'AS, il est recommandé de s'inscrire aux mécanismes d'alarme cités plus haut. Si on est opérateur ou auteur de logiciel BGP, on peut vérifier ses règles de filtrage, se demander s'il ne serait pas une bonné idée d'utiliser un IRR (sans se faire d'illusions : la qualité des données qu'on y trouve est loin d'être parfaite) ou espérer le déploiement de technologies de sécurisation de BGP comme Secure BGP et soBGP (celles-ci ont du mal à décoller, non pas qu'elles soient trop compliquées mais parce qu'elles ont en commun de nécessiter la création d'une nouvelle infrastructure de confiance, avec ce que cela suppose de problèmes organisationnels et politiques. Le RFC 5123 en explique certains.)
L'article qui a fait le plus de bruit est Revealed: The Internet's Biggest Security Hole. C'est un article très sensationnaliste, une de ses plus grosses erreurs est de reprendre le discours standard : Those protocols were largely developed in the 1970s with the assumption that every node on the then-nascent network would be trustworthy. En fait, les concepteurs de l'Internet à l'époque (au fait, BGP est bien plus récent que « les années 70 ») étaient bien conscients de ces problèmes mais, même si on repartait de zéro, on ne pourrait pas les résoudre facilement (il n'existe pas d'État policier mondial qui pourrait attribuer des « licences d'opérateur » et des certificats X.509 afférents pour pouvoir signer les annonces BGP). Le second article de Wired, More on BGP Attacks -- Updated est bien meilleur, surtout pour les détails techniques. Mais le mieux est de lire les transparents originaux des deux découvreurs de la faille.
Sur BGP, on peut aussi lire mon cours pratique.
Date de publication du RFC : Septembre 2007
Auteur(s) du RFC : T. Narten (IBM), R. Draves (Microsoft), S. Krishnan (Ericsson)
Chemin des normes
Première rédaction de cet article le 26 Août 2008
Une des particularités d'IPv6 est de disposer d'un mécanisme, l'autoconfiguration sans état qui permet à une machine de se fabriquer une adresse IP globale sans serveur DHCP. Ce mécanisme crée typiquement l'adresse IP à partir de l'adresse MAC de la machine et une même machine a donc toujours le même identifiant (les 64 bits les plus à droite de l'adresse IPv6), même si elle change de réseau et donc de préfixe. Il est donc possible de « suivre à la trace » une machine, ce qui peut poser des problèmes de protection de la vie privée. Notre RFC fournit une solution, sous forme d'un mécanisme de création d'adresses temporaires, partiellement aléatoires.
L'autoconfiguration sans état, normalisée dans le RFC 4862 est souvent présentée comme un des gros avantages
d'IPv6. Sans nécessiter de serveur central
(contrairement à DHCP), ce mécanisme permet à
chaque machine d'obtenir une adresse globale
(IPv4, via le protocole du RFC 3927, ne permet que des adresses purement locales) et
unique. Cela se fait en concaténant un préfixe
(par exemple 2001:db8:32:aa12::), annoncé par le
routeur, à un identifiant
d'interface (par exemple
213:e8ff:fe69:590d, l'identifiant de mon PC
portable - les machines individuelles, non partagées, comme les
PDA sont particulièrement sensibles puisque la
connaissance de la machine implique celle de son maître), typiquement
dérivé de l'adresse MAC.
Partir de l'adresse MAC présente des avantages (quasiment toute
machine en a une, et, comme elle est unique, l'unicité de l'adresse
IPv6 est obtenue facilement) mais aussi un inconvénient : comme
l'identifiant d'interface est toujours le même, cela permet de
reconnaître une machine, même lorsqu'elle change de réseau. Dès qu'on
voit une machine XXXX:213:e8ff:fe69:590d (où XXXX
est le préfixe), on sait que c'est mon PC.
La solution initiale de ce problème avait été introduite par le RFC 3041, que notre RFC 4941 met à jour.
Les sections 1.2 et 2 du RFC décrivent le problème plus en détail. Elles notent entre autre que le problème n'est pas aussi crucial que l'avaient prétendu certains (une véritable campagne anti-IPv6 avait été montée à une époque par des gens mal informés). En effet, il existe bien d'autres façons, parfois plus faciles, de suivre une machine à la trace, par exemple par les fameux petits gâteaux de HTTP mais aussi par des moyens de plus haute technologie comme les caractéristiques matérielles de l'ordinateur, que l'on peut observer sur le réseau. Parmi les autres méthodes, notons aussi que si on utilise les adresses temporaires de notre RFC 4941 mais qu'on configure sa machine pour mettre dynamiquement à jour un serveur DNS avec cette adresse, le nom de domaine suffirait alors à suivre l'utilisateur à la trace !
La section 2.2, consacrée à la situation actuelle avec IPv4, fait d'ailleurs remarquer que la situation n'est pas parfaite avec IPv4 non plus, et que certains articles qui sonnaient l'alarme contre les dangers de IPv6 étaient donc vraiment peu informés. Aujourd'hui, en pratique, beaucoup de machines ont une adresse IPv4 qui change peu ou pas et elles sont donc plus vulnérables au « pistage » (sauf si elles changent de réseau souvent) que les machines IPv6 utilisant ce RFC 4941.
La section 2.4 commence à discuter des solutions possibles. DHCPv6 (RFC 3315, notamment la section 12) serait évidemment une solution, mais qui nécessite l'administration d'un serveur. L'idéal serait une solution qui permette, puisque IPv6 facilite l'existence de plusieurs adresses IP par machine, d'avoir une adresse stable pour les connexions entrantes et une adresse temporaire, non liée à l'adresse MAC, pour les connexions sortantes, celles qui « trahissent » la machine. C'est ce que propose notre RFC, en générant les adresses temporaires selon un mécanisme pseudo-aléatoire.
Enfin, la section 3 décrit le mécanisme de protection lui-même. Il y a deux cas, celui où on dispose d'un mécanisme de stockage des données, par exemple une mémoire Flash et celui où l'appareil, trop simple, n'a pas un tel mécanisme.
Le premier cas est détaillé dans la section 3.2.1 : on stocke une « valeur historique » à chaque génération d'une adresse. On utilise la valeur précédente, on la concatène à l'identifiant d'interface et on passe le tout à travers MD5. Les 64 premiers bits du résumé MD5 formeront le suffixe de l'adresse IPv6. La faiblesse cryptographique de MD5 n'est pas un problème, on ne cherche pas ici à résister à une attaque, juste à condenser un nombre aléatoire. Il n'est pas nécessaire que toutes les machines utilisent la même fonction de hachage et l'usage d'autres algorithmes que MD5 est donc autorisé.
La section 3.2.2 traite des cas où un dispositif de stockage n'existe pas et recommande alors l'usage d'une source réellement aléatoire, selon le RFC 4086.
Une fois l'adresse temporaire générée (les détails sont dans la section 3.3), il faut la renouveler de temps en temps (sections 3.4 et 3.5, cette dernière expliquant pourquoi renouveler une fois par jour est plus que suffisant). L'ancienne adresse peut rester active pour les connexions en cours mais plus pour de nouvelles connexions.
Maintenant que l'algorithme est spécifié, la section 4 du RFC reprend de la hauteur et examine les conséquences de l'utilisation des adresses temporaires. C'est l'occasion de rappeler un principe de base de la sécurité : il n'y a pas de solution idéale, seulement des compromis. Si les adresses temporaires protègent d'avantage contre le « flicage », elles ont aussi des inconvénients comme de rendre le déboguage des réseaux plus difficile. Par exemple, si on note un comportement bizarre associé à certaines adresses IP, il sera plus difficile de savoir s'il s'agit d'une seule machine ou de plusieurs.
L'utilisation des adresses temporaires peut également poser des problèmes avec certaines pratiques prétendument de sécurité comme le fait, pour un serveur, de refuser les connexions depuis une machine sans enregistrement DNS inverse (un nom correspondant à l'adresse, via un enregistrement PTR). Cette technique est assez ridicule mais néanmoins largement utilisée.
Un autre conflit se produira, note la section 7, si des mécanismes de validation des adresses IP source sont en place dans le réseau. Il peut en effet être difficile de distinguer une machine qui génère des adresses IP temporaires pour se protéger contre les indiscrets d'une machine qui se fabrique de fausses adresses IP source pour mener une attaque.
Quelles sont les différences entre le RFC originel, le RFC 3041 et celui-ci ? Peu importantes, elles sont résumées dans la section 8. Les principales sont des demandes plus fortes sur la configurabilité de l'usage des adresses temporaires, l'acceptation explicite d'autres fonctions de hachage que MD5 et surtout le fait que le réglage standard par défaut doit désormais être de couper l'usage des adresses IP temporaires.
Sur MS-Windows, ce mécanisme semble avoir
été implémenté depuis Vista. Sur Linux, notre RFC est mis en œuvre
depuis longtemps (c'est l'option CONFIG_IPV6_PRIVACY de compilation du noyau), mais désactivé par défaut, comme demandé par le
RFC (section 3.6). Le paramètre sysctl qui contrôle ce
protocole est net.ipv6.conf.XXX.use_tempaddr où
XXX est le nom de l'interface réseau, par exemple
eth0. En mettant dans le fichier
/etc/sysctl.conf :
# Adresses temporaires du RFC 4941 net/ipv6/conf/default/use_tempaddr = 1
On met en service les adresses temporaires, non « pistables »
pour toutes les interfaces (c'est le sens de la valeur
default). Notons que l'adresse « pistable » est
toujours présente mais vient s'y ajouter une adresse temporaire
choisie au hasard. Selon les règles du RFC 3484,
rappelées dans la section 3.1 de notre RFC,
c'est cette adresse temporaire qui sera choisie, en théorie (cela ne marche apparemment pas sur Linux 2.6.24) pour les connexions
sortantes. ifconfig affichera donc :
wlan0 Link encap:Ethernet HWaddr 00:13:e8:69:59:0d
...
inet6 addr: 2001:db8:32:aa12:615a:c7ba:73fb:e2b7/64 Scope:Global
inet6 addr: 2001:db8:32:aa12:213:e8ff:fe69:590d/64 Scope:Global
puis, au démarrage suivant, l'adresse temporaire (la première ci-dessus) changera :
wlan0 Link encap:Ethernet HWaddr 00:13:e8:69:59:0d
...
inet6 addr: 2001:db8:32:aa12:48a9:bf44:5167:463e/64 Scope:Global
inet6 addr: 2001:db8:32:aa12:213:e8ff:fe69:590d/64 Scope:Global
Ceux qui veulent configurer ce service sur une machine Linux peuvent aussi lire Stateless Network Auto Configuration With IPv6.
Première rédaction de cet article le 25 Août 2008
Dans beaucoup de protocoles réseau, ce qui passe « sur le câble » est dans un format binaire incompréhensible pour un humain. Il est souvent utile de pouvoir le représenter sous forme texte, par exemple lorsque des programmes comme tcpdump le décodent. C'est encore mieux si ce format texte est normalisé, cela permet la communication facile entre humains. Regardons quelques exemples surtout empruntés à la famille TCP/IP. Ce sera l'occasion de voir que la syntaxe des adresses IPv4 n'a jamais été normalisée...
Date de publication du RFC : Août 2008
Auteur(s) du RFC : E. Chen (Cisco Systems), Y. Rekhter (Juniper Networks)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF idr
Première rédaction de cet article le 24 Août 2008
Quand deux routeurs BGP échangent des routes, il est fréquent que certaines soient refusées par le routeur récepteur, par exemple parce qu'ils les estime invalides ou parce qu'elles ne correspondent pas à ses politiques de routage (section 2 du RFC). C'est donc un gaspillage que de les envoyer et ce nouveau RFC permet au routeur récepteur de signaler à l'avance à son pair BGP quelles routes il n'acceptera pas.
BGP, normalisé dans le RFC 4271 est le protocole d'échange de routes dans l'Internet. Pratiqué surtout entre organisations distinctes, il permet de faire du routage politique, cest-à-dire de rejeter certaines routes en fonction de la politique de chaque organisation. Pour cela, les routeurs BGP mettent typiquement en œuvre des filtres sur les routes reçues. Avec notre RFC, ces filtres peuvent être transmis au routeur pair sous le nom d'ORF (Outbound Route Filters) que le pair appliquera sur le jeu de routes qu'il allait annoncer, supprimant de ce jeu les routes qui ne conviennent pas à son pair.
La section 3 détaille ce qu'est un ORF. C'est un tuple composé de :
La section 4 explique ensuite comment encoder les ORF et les transmettre dans une session BGP. Les sections 5 et 6 précisent que le routeur qui gère les ORF doit l'annoncer (cf. RFC 3392) par la capacité BGP n° 3 Outbound Route Filtering Capability.
Date de publication du RFC : Août 2008
Auteur(s) du RFC : Tim Dierks (Independant), Eric
Rescorla (Network Resonance)
Chemin des normes
Première rédaction de cet article le 24 Août 2008
Le protocole de cryptographie TLS, autrefois nommé SSL, est un des protocoles de l'IETF les plus utilisés. À chaque seconde, des milliers de connexions TCP, en général HTTP, sont protégées contre l'écoute, et même parfois authentifiées par TLS. Ce RFC met à jour l'ancienne norme, le RFC 4346.
Aujourd'hui, plus personne n'aurait l'idée de faire circuler un mot de passe en clair sur le réseau, car il serait très facile à capturer (par exemple avec un programme comme dSniff). TLS fournit la confidentialité à une connexion TCP. (TLS peut aussi fonctionner avec d'autres protocoles de transport comme SCTP - RFC 3436 ou bien UDP - RFC 4347.)
L'authentification par mot de passe a par ailleurs des défauts, notamment que le mot de passe soit réutilisable. Si l'utilisateur a été victime d'un faux serveur, par exemple par suite d'un hameçonnage, il donne son mot de passe et le méchant qui contrôle le faux serveur peut l'utiliser sur le vrai site. Pour traiter ce problème, TLS fournit une solution d'authentification reposant sur les certificats X.509 ou bien sur les clés OpenPGP (RFC 5081). TLS permet aussi bien au client d'authentifier le serveur qu'au serveur d'authentifier le client (cette deuxième possibilité est à l'heure actuelle peu utilisée).
Les certificats X.509 sont composés de la partie publique d'une clé asymétrique et de méta-données, comme la date d'expiration. Ils sont signés par une CA, qui a elle-même un certificat signé par une CA et ainsi de suite jusqu'à arriver aux CA racines installés dans le logiciel. La plupart du temps, l'utilisateur n'a jamais examiné ces certificats des CA racine et n'a aucune idée de leur fiabilité. C'est l'un des gros points faibles de l'authentification par TLS / X.509.
TLS n'est pas une solution miracle, il n'en existe pas en sécurité informatique. Par exemple, TLS ne protège pas dans les cas suivants :
Passons maintenant au RFC proprement dit. Il fait plus de cent pages et pourtant de nombreux points n'y sont pas, comme la définition des algorithmes cryptographiques utilisés. La sécurité est un domaine compliqué, d'autant plus qu'une petite erreur peut annuler toute la sécurité de même que l'oubli de fermer à clé peut rendre inutile une lourde porte blindée.
TLS est composé de deux parties (section 1 du RFC), le Record Protocol, protocole de bas niveau qui transmet des messages en les chiffrant pour la confidentialité et l'intégrité et le Handshake protocol, bâti sur le premier, et qui se charge entre autres de négocier les paramètres de la session.
En effet, TLS fonctionne en négociant au début un algorithme de chiffrement ainsi qu'une clé cryptographique de cet algorithme pour la session. Le Record protocol va ensuite chiffrer les messages avec cette clé.
La section 4 du RFC détaille le langage de
présentation. L'IETF n'a pas de langage unique
de spécification, chaque RFC utilise des outils différents pour
décrire ses protocoles ou algorithmes. TLS crée donc le sien, proche
du C. Par exemple la section
4.4 décrit les nombres, tous créés à partir d'un type
unit8, qui stocke un octet. La section 4.5 décrit
les types énumérés comme enum { null, rc4, 3des, aes }
BulkCipherAlgorithm; (le type qui sert à définir les
valeurs de l'algorithme de cryptographie symétrique).
La section 6 décrit en détail le Record protocol. C'est un protocole qui va effectuer le chiffrement, mais aussi la compression, la fragmentation, etc.
La section 7 couvre le protocole de négociation (Handshake
protocol). C'est le protocole qui permet l'authentification
du serveur par le client (ou, plus rarement, le contraire) et la
sélection des options, par exemple l'algorithme de chiffrement
utilisé. L'authentification se fait en général en présentant un
certificat X.509,
certificat signé par un tiers de confiance (RFC 3280, en
pratique, le tiers « de confiance » est une des
CA installées par défaut avec le logiciel, dont
personne ne sait pourquoi elles ont été choisies). Voici par exemple
le résultat de ce protocole, tel qu'affiché par la commande
gnutls-cli (qui est livrée avec GnuTLS) :
% gnutls-cli -d 9 www.example.org Connecting to '192.0.2.20:443'... ... |<3>| HSK[80708e8]: Selected cipher suite: DHE_RSA_AES_256_CBC_SHA
Le chiffrement AES en mode
CBC a été
choisi. gnutls-cli permet de voir le passage de
tous les messages TLS de ce protocole, tels qu'ils sont décrits dans
la section 7.4 :
enum {
hello_request(0), client_hello(1), server_hello(2),
certificate(11), server_key_exchange (12),
certificate_request(13), server_hello_done(14),
certificate_verify(15), client_key_exchange(16),
finished(20), (255)
} HandshakeType;
Comme précisé dans la section 7.3, ce protocole de négociation a aussi ses propres vulnérabilités. Au démarrage, il n'y a évidemment pas d'algorithme de chiffrement ou de clé de session sélectionnés. Comme le précise la section 7.4.1, TLS démarre donc sans chiffrement. Un attaquant actif, capable de modifier les paquets IP, peut changer la liste des algorithmes acceptés, avant que le chiffrement ne soit actif, de façon à sélectionner un algorithme faible. (Le remède est de refaire la négociation une fois le chiffrement activé.)
Comme souvent avec TLS, le protocole est extensible. La section 7.4.1.4 décrit par exemple les extensions à l'annonce que font les machines TLS, possibilité qui est utilisée dans le RFC 5081 pour ajouter les clés OpenPGP aux certificats X.509. (Les extensions existantes sont décrites dans le RFC 4366.) Le registre complet des extensions est maintenu à l'IANA.)
La section 9 indique l'algorithme de chiffrement obligatoire, RSA avec AES. Il est nécessaire de définir un algorithme obligatoire, autrement, deux mises en œuvre légales de TLS pourraient être incompatibles si les deux ensembles d'algorithmes n'avaient aucun élément en commun.
Par rapport à son prédécesseur, le RFC 4346, qui normalisait TLS 1.1, les changements sont de peu d'importance (la liste figure en section 1.2). Un client TLS 1.2 peut interagir avec un serveur 1.1 et réciproquement (voir l'annexe E pour les détails.) Il s'agit en général de clarifications ou bien du changement de statut de certains algorithmes cryptographiques. En effet, la cryptographie bouge et certains algorithmes, qui paraissaient solides à une époque, sont vulnérables aux attaques modernes (c'est par exemple ce qui est arrivé à MD5 et SHA1). C'est pour cela que l'algorithme « RSA avec AES » fait désormais partie des algorithmes obligatoires et que par contre IDEA et DES sont partis.
Contrairement à IPsec (RFC 2401), TLS fonctionne entre la couche de transport et les applications. Il n'est donc pas invisible aux applications, qui doivent être explicitement programmées pour l'utiliser. Pour cela, il n'existe malheureusement pas d'API standard. OpenSSL, l'implémentation la plus populaire de TLS, a la sienne, son concurrent GnuTLS en a une autre, etc. (GnuTLS dispose d'une couche d'émulation de OpenSSL mais elle est incomplète.)
Un programme comme echoping qui peut utiliser aussi bien OpenSSL que GnuTLS, doit donc recourir aux services du préprocesseur C, par exemple :
#ifdef OPENSSL
...
SSL_set_fd(sslh, sockfd);
if (SSL_connect(sslh) == -1)
#endif
#ifdef GNUTLS
...
gnutls_transport_set_ptr(session,
(gnutls_transport_ptr) (long) sockfd);
tls_result = gnutls_handshake(session);
...
#ifdef OPENSSL
if ((rc = SSL_write(sslh, sendline, n)) != n) {
...
#ifdef GNUTLS
if ((rc = gnutls_record_send(session,
sendline, strlen (sendline))) != n) {
...
Une autre solution pour une application qui veut faire du TLS sans se fatiguer est de compter sur le fait que TLS est indépendant du protocole utilisé par l'application et qu'on peut donc simplement créer un tunnel TLS, par exemple avec stunnel. Ainsi, on n'a même pas besoin de modifier le source de l'application.
Première rédaction de cet article le 31 Juillet 2008
À la réunion IETF 72 de Dublin, la création du groupe de travail nommé ALTO pour Application Layer Traffic Optimisation n'est pas allée de soi et ne semble pas garantie.
À quoi sert ALTO ? La majorité du trafic sur Internet est aujourd'hui consacrée aux services pair-à-pair. Ces services remettent en cause bien des suppositions sur lesquelles avait été architecturé le réseau. Ils consomment autant de trafic montant que de descendant (contrairement à des systèmes asymétriques comme le Minitel ou l'ADSL), ils sont bavards, et imprévisibles. Il n'est donc pas étonnant que ces services se retrouvent souvent dans les médias comme à l'occasion du piratage des sessions BitTorrent par Comcast.
Tous ces points sont résumés dans l'expression du problème,
l'Internet-Draft,
draft-marocco-alto-problem-statement. À l'atelier
P2P infrastructure workshop de l'IETF le 29 mai
2008 à Boston, plusieurs mesures ont été
étudiées, par exemple de meilleurs systèmes de contrôle de la
congestion, mais aussi des mesures visant à améliorer la
localité, mesures qui mènent à ALTO.
En effet, contrairement au client/serveur, pour lequel on cherche à accéder à une machine (et on ne peut optimiser que le chemin qui y mène), le pair-à-pair concerne l'accès à une ressource. On peut alors chercher un exemplaire de cette ressource qui soit plus proche. ALTO peut donc se résumer à « Quand on est à Dublin, télécharger le fichier à partir d'un pair à Londres plutôt qu'à Tokyo ».
Les machines terminales, celles des utilisateurs, ne sont pas forcément les mieux placées pour sélectionner les « meilleurs » pairs (notons que la définition de « meilleur » est un des sujets les plus chauds dans les discussions sur ALTO). Par exemple, elles n'ont aucune idée des coûts, de quels liens sont du transit cher et desquels sont du peering gratuit. ALTO repose donc sur un système d'«