Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

lundi 30 juillet 2007

Changements apportés par Python 3000

Je suis de très près le développement du langage Python et en particulier de la prochaine version majeure : Python 3000. Cette version casse la compatibilité mais pour de bonnes raisons.

Types bytes et str

Dans Python 3000, une chaîne de caractères sera du type « str » (de l'anglais string) et non plus « unicode » (qui prêtait à confusion). L'actuel type « str » de Python 2.x devient le type « bytes » qui comme son nom l'indique contient des octets (bytes en anglais). Pour avoir tenté d'expliquer à de nombreuses reprises Unicode et la différence entre caractère et octet, je pense que c'est une très bonne chose. Je vous conseille la lecture de la PEP 358 (The "bytes" Object) pour les détails. Le type bytes sera disponible dans Python 2.6 et Python 3000.

Annotation des fonctions

Critique récurrente à Python : le prototype d'une fonction n'indique pas son type. De mon point de vue, c'est une qualité : celà permet de duck-typing (If it looks like a duck and quacks like a duck, it must be a duck : Si ça ressemble à canard et que ça fait le bruit d'un canard, ce doit être un canard). Mais le gros problème est qu'on n'a pas la possibilité de déterminer à la compilation si la fonction va échouer ou non car le type d'un argument est incompatible.

La PEP 3107 (Function Annotations) propose d'ajouter des annotations optionnelles aux arguments et au type de retour. Une fois que ça sera implémenté, je suis sûr que ça sera rapidement exploité par les outils de vérification automatiques tel que pychecker.

Exemple d'annotation :

def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
    ...

Argument sous forme de mot-clé

Un autre défaut de Python 2.x : on ne peut pas indiquer qu'un argument ne peut être passé que sous la forme « mot-clé=valeur ». Exemple :

def afficheProduit(nom, prix, monnaie=u"€", note=None):
   print "%s: %s %s" % (nom, prix, monnaie)
   if note:
      print "(note: %s)" % note

Cette notation prête à confusion, on peut se tromper on oubliant de forcer d'indiquer qu'on veut spécifier une note : « afficheProduit("voiture", 100, "petite voiture rouge") ». Notre note sera passée en valeur de « monnaie », il aurait fallu écrire « afficheProduit("voiture", 100, note="petite voiture rouge") ».

La PEP 3102 (Keyword-Only Arguments) répond à ce problème avec la syntaxe suivante :

def afficheProduit(nom, prix, *, monnaie=u"€", note=None):
   print "%s: %s %s" % (nom, prix, monnaie)
   if note:
      print "(note: %s)" % note

L'appel « afficheProduit("disque", 50, "US$") » sera alors interdit, il faudra explicitement (Explicit is better than implicit) écrire « afficheProduit("disque", 50, monnaie="US$") ».

Dans mon exemple, ce n'est pas parlant mais lorsqu'on a 6 arguments ou plus, c'est bien pratique.

Documents sur Python 3000

Je ne voulais insister que sur les changements qui me semblaient les plus importants, mais Python 3000 change bien plus de choses ! Je vous conseille la présentation de Guido van Rossum : les slides « Python 3000 » (PowerPoint) et la vidéo « Python 3000 ».

Autres documents sur Python 3000 :

Et enfin, Python 3000 Status Update (19 juin 2007) par Guido Van Rossum.

Remplacez le plugin propriétaire Flash par swfdec

Swfdec est un logiciel libre destiné à lire les animations Flash. Le projet a été inité en novembre 2002 par l'américain David Schleef aka ds et est aujourd'hui maintenu par l'allemand Benjamin Otte aka company. Aujourd'hui, swfdec supporte Flash jusqu'à sa version 7. Depuis un an ou deux, je teste régulièrement le projet sans succès. En persévérant, j'ai réussi aujourd'hui à utiliser la version 0.5 qui marche au poil ! La compilation et l'installation se sont presque bien déroulées et j'ai réussi à lire une vidéo Youtube !

Lire la suite

mardi 24 juillet 2007

Logiciel libre nourri à la motivation

Pour avoir contribué à plusieurs projets libres, en particulier Wormux et Hachoir, j'ai élaboré une théorie sur les logiciels libres. Étant donné qu'aucun contributeur n'est rémunéré, mise à part de rares exceptions, je pense qu'un logiciel est nourri par la motivation. En particulier, lorsque la motivation baisse, le rythme du développement chutte pouvant le conduire à sa mort.

Je pense que lorsqu'on décide de donner naissance à un logiciel libre, il faut jauger précisément ses objectifs en fonction des ressources disponibles (comprendre : le nombre personnes motivés). Une fois que le projet est lancé, il faut conserver l'intérêt en se fixant des objectifs simples réalisables en 2 mois au grand maximum.

Il faut aussi être à l'écoute des utilisateurs car ce sont eux qui mettent à mort un projet en dédaignant s'y intéresser. Effectivement, je pense que la motivation est nourrie par la fierté de participer à un projet utile. Plus le projet est populaire et médiatisé, plus on est encouragé à l'améliorer.

Trop de projets sont renfermés sur eux-même : ses auteurs développent pour leur propre plaisir en ignorant complètement l'utilisateur final. Je pense par exemple aux interfaces inadaptés au commun des mortels : la ligne de commande, une fenêtre bourrée d'options inutiles, etc. Il s'en suit un problème de communication : le développeur insiste sur la qualité du code au lieu de mettre en avant les fonctionnalités visibles par l'utilisateur.

Pour finir, le succès d'un logiciel libre n'est pas lié aux fonctionnalités proposées mais plutôt au fait qu'il soit adapté aux besoins de l'utilisateur et au marketing autour du projet.

Note : ce billet est également une autocritique de mon projet Hachoir qui peine à trouver son public ;-)

jeudi 5 juillet 2007

Fuzzing, deux mois plus tard

Début mai (2007), je commençais ma campagne intensive de fuzzing comme en atteste mon tableau de chasse. Ce billet est un bilan sur ces deux derniers mois.

Projet Fusil

Depuis le temps, mon outil de fuzzing a trouvé un nom grâce à l'intellect de Feth : « Fusil ». Je suis fier de lui avoir attribué un nom français, qui plus est, a un sens : arme explosant (à) la gueule des programmes :-) En bonus, les anglophones s'y retrouvent à l'oreille (fusil / fuzzy). Le projet habite désormais à cette jolie adresse : fusil.hachoir.org qui pointe vers le duo gagnant, Trac & Subversion. L'outil en lui même a quelque peu évolué : limitation de la mémoire, possibilité de fuzzer les variables d'environnement, détection automatique des variables et fichiers accédés, opérations d'insertion et de suppression pour mangle, etc. Fusil n'est pas encore utilisable en l'état par un novice vu son manque de flexibilité mais j'y travaille.

J'ai eu l'honneur de présenter mon projet au SSTIC, mais les quatre minutes allouées ne m'ont pas suffi. Je pense néanmois avoir dit l'essentiel. J'ai donné la même présentation mais en entier et plus détendu (mais malade) deux jours plus aux Journées Python 2007. Le PDF de la présentation est consultable en ligne depuis le site web du SSTIC.

Ma déception de ClamAV

Autant le nombre de bogues trouvés par Fusil augmente, autant ma motivation pour améliorer les logiciels libres diminue. Je suis plutôt déçu par les réponses données par certains mainteneurs de projet : ils n'ont que faire des bogues de sécurité, ils veulent à tout prix des performances et des fonctionnalités.

J'ai trouvé un bogue assez critique dans l'anti-virus ClamAV : un document Word utilisant 2 Go du disque dur et une bonne partie du CPU durant plusieurs minutes. Il suffirait d'envoyer plusieurs fois ce même fichier (ou des variantes) pour mettre à genoux n'importe quel serveur ClamAV. J'ai posté ma découverte sur leur liste de diffusion en évitant de donner trop de détails, mais suffisament pour être crédible. Et bien, les réponses ne se sont pas fait attendre. En deux heures, trois développeurs m'avaient contacté... pour me gronder car j'avais fait du « full disclosure » (diffusion publique d'une faille de sécurité).

Je me suis excusé et j'ai reposté la faille sur leur outil de suivi des bogues en donnant cette fois tous les détails (étant donné que l'accès à l'outil est protégé). Je me suis dit que le bogue serait corrigé rapidement. Effectivement, en un jour un correctif était disponible. Je pensais qu'ils allaient sortir immédiatement une nouvelle version (étant donné mes révélations publiques)... que nenni. Ils ont attendu plus d'un mois pour publier une nouvelle version (0.90.3). Pourtant, entre temps l'information a été relayée sur les sites frsirt.com et secunia.com.

Avant hier, j'ai relancé une campagne de tests pour vérifier que le format OLE2 était sain. J'ai trouvé trois nouveaux bogues dont un qui est apparu dans la version 0.90.3 (bogue dans le correctif du problème que j'avais soulevé, quel comble !). Je suis allé jusqu'à écrire un correctif pour chaque bogue. Je l'ai fait pour accélérer la correction de ClamAV et pour pouvoir poursuivre mes tests. Après 2 jours, toujours aucune réponse à mes rapports de bogues. Quelle déception par leur manque de réactivité...

Autres déceptions

ClamAV n'est pas le seul projet à manquer de réactivite face aux vulnérabilités : les bogues libpoppler et libexif n'ont pas bougé d'un poil depuis que je les ai rapporté (il y a deux mois).

J'ai l'impression que le public visé (serveur d'entreprise ou application pour particulier) et le fait que j'écrive un correctif ou non importent peu. En fait, je ne sais pas comment faire réagir les mainteneurs pour qu'ils daignent m'accorder un peu de leur temps si précieux.

La lutte continue ! (gimp, mplayer, ...)

Histoire de me changer les idées, j'ai testé les logiciels très populaires que sont Gimp et Mplayer. Après une bonne heure de peaufinage de Fusil, j'ai commencé ma liste de bogues. En environ quatre heures, j'ai trouvé une dizaine de bogues sur chaque logiciel : dénis de service (CPU ou mémoire) ou plantage. Certains sont peut être exploitables.

J'avoue que je voulais vérifier que Secunia avait bien fait son travail en auditant Gimp. Secunia publiait avant-hier une vulnérabilité dans Gimp pour le format PSD. Et bien j'ai trouvé des « vulnérabilités » pour les formats BMP, ICO, PCX, PSD, TUB, XCF. Certains plantages semblent graves.

Histoire de savoir où j'en suis, j'ai commencé une liste des logiciels testés. Il faut maintenant que je prenne mon courrage à deux mains pour rapporter tous les bogues trouvés aux mainteneurs des projets... et espérer qu'ils daignent s'y intéresser.

Livre sur le fuzzing

Pour finir, je voudrais partager mon impatience : le livre Fuzzing: Brute Force Vulnerability Discovery de Michael Sutton, Adam Greene et Pedram Amini me semble sacrément intéressant. Seul hic : il n'est pas encore publié bien qu'il devrait l'être. O'Reilly le vend déjà sous format électronique dans sa boutique Safari. Je devine que l'éditeur donne sa chance aux ebooks avant de sortir la version papier. Raison marketing ou technique : qu'importe, je veux toucher ce livre ! Je pense que je l'achèterai chez le libraire Le Monde en Tique histoire de ne pas me ruiner en frais de port.

Mot(s) de la fin : « Le fuzzing est en pleine effervescence et je m'amuse follement avec ! »

Mes félicitations aux personnes qui ont supportées la lecture pénible des mes complaintes.

Schéma de la hiérarchie des autotools

Histoire d'affronter ma phobie (irrationnelle ?) des autotools(*), j'ai décidé de documenter un peu cette suite d'outils dans mon wiki ainsi qu'en dessinant une schéma présentant l'organisation des différents fichiers et programmes (schéma ci-dessous).

(cliquez sur l'image pour la voir en taille réelle)

Le schéma comporte sûrement des imprécisions voir même des erreurs. Un ami m'a signalé par exemple que je n'ai pas noté l'outil autoscan. Je ne veux pas l'ajouter sous peine de surcharger ce schéma déjà énorme. En tout cas, je me suis bien amusé avec Dia (outil de dessin vectoriel, spécialisé dans les diagrammes). En jouant sur les couleurs, on arrive à un résultat que je trouve pas dégueux.

J'espère que ce schéma servira à d'autres pour pénétrer l'univers des autotools :-)

Note (*) : Les autotools sont une suite d'outils servant à construire un logiciel à partir de son code source (le « compiler » en argot informatique).