Blog Haypo

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

Résultats de votre recherche de ven.

jeudi 25 mars 2010

Visualiser une image qui ne tient pas en mémoire vive : utilisez nip2 !

La majorité des applications se portent pâles quand il s'agit d'afficher de grandes images. Par grande, j'entend 5000x5000 pixels voir beaucoup plus. Le pire étant quand l'image décompressée est plus grande que la mémoire vive : l'application épuise petit à petit la mémoire, commence à utiliser le swap (utilise le disque dur, très lent), et finit par se faire tuer par OOM Killer. Sauf que l'application met du temps à se faire tuer, et l'ordinateur devient très rapidement totalement inutilisable (la charge de la machine monte à 5, 10, puis on n'arrive même plus à l'obtenir dans top).

La solution est le programme nip2 qui ne charge en mémoire que ce qui est affiché à l'écran, ce qui permet de d'afficher des images qui ne tiennent pas en mémoire. Il affiche une barre de progression lorsqu'il prépare l'image (il crée sûrement un index position en pixels => offset dans le fichier).

nip2 affichant une photo JPEG de 27.684 × 3.488 pixels

La bibliothèque GEGL permet également d'afficher de très grosses images, mais je ne connais pas d'outil facile à prendre en main qui l'utilise pleinement. Gimp a commencé à l'intégrer dans sa version 2.5, mais c'est encore expérimental et tout n'utilise pas GEGL. Il me semble que Gimp ne sait pas afficher d'image plus grande que la mémoire vive. En tout cas, je n'ai pas envie de tester !

En parlant de grosses images, j'en connais deux types : « grosses » photos (souvent un photomontage de plusieurs autres photos) et schémas (typiquement vectoriel) générés par un logiciel.

Il existe par exemple les photos panoramiques qu'on peut créer avec le logiciel Hugin. Wikipédia en contient un grand nombre : voir la catégorie Panoramics de Wikimedia Commons. Exemple au pif : Paysage - vue panoramique - rocher du pain de sucre - Guadeloupe - Les Saintes, photo JPEG de 27.684 × 3.488 pixels (17,9 Mo : énorme pour une image JPEG !).

Pour les schémas générés par ordinateurs : on trouve souvent des graphes représentant les relations entre différentes entités. En ce moment, c'est par exemple la mode des graphes montrant la relation entre des personnes (réseau social) ou projets informatiques. Exemple du jour : Github explorer, schémas présentant les relations entre les utilisateurs du site github (hébergeur de programmes libres). L'idéal est d'utiliser le schéma au format vectoriel, car un ordinateur sait très bien dessiner ça efficacement... Sauf que c'est rare que la version vectorielle soit disponible, ou alors dans un format bizzare (tout ce qui n'est pas SVG est bizzare pour moi :-)).

Mais les plus grosses photos que j'ai vu venaient de la NASA : une photo satellite de 100.000x100.000 pixels. Je ne me souviens plus où je les ai trouvées, mais OnEarth semble être une bonne piste. On dirait qu'ils offrent maintenant une interface web pour navigurer directement dans l'énorme image et donc télécharger petit bout par petit bout comme le font Google Maps & cie.

Enfin, il existe un logiciel (propriétaire et payant) qui permet de se balader dans de grandes images : Zoomify. La version Flash permet de l'utiliser très simplement dans un navigateur web. Je trouve le résultat plutôt réussi. La page d'accueil affiche une vue aérienne de Paris avec une excellente résolution, sûrement des photos prises par avion (comme sur mappy.com).

... Tout ce blabla uniquement pour me souvenir du nom « nip2 ». Pourtant c'est pas dur, il suffit de penser à des tétons !

jeudi 25 février 2010

Ce qui m'énerve dans les pubs télévisées

Petit billet d'humeur sur ce qui m'énerve dans les publicités à la télévision.

Bandeau de texte illisible

Les pubs vantent souvent une offre précise. Sauf que les offres sont limitées par de nombreuses conditions qu'il est obligatoire d'afficher (si ce n'était pas le cas, les publicitaires s'en passeraient volontiers). Souvent, un bandeau de texte défile en bas pendant la pub. Problème : certains publicitaires malhonnêtes font en sorte que ce texte soit illisible. Il y a plusieurs manière de faire, comme utiliser un police très fine ou bien faire défiler le texte trop vite. En ce moment, j'ai vu encore pire :

Si on regarde le texte de plus près :

On pense à un problème dans sa télévision ou qu'on a besoin de lunette. Bah non, c'est uniquement le bandeau de texte en bas qui est flou ! Le texte en grand et la voiture sont nets. Pour obtenir cette image, j'ai utilisé le logiciel VLC en regardant la télévision via le multiposte Free. J'ai coché l'option « Vidéo > Désentrelacement > Moyenne », et j'ai pris une capture d'écran avec KSnapshot. Je précise tout, car je n'ai pas réussi à trouver ces publicités sur Internet. Sur Youtube ou Dailymotion, j'ai trouvé les publicités, mais... sans les bandeaux de texte défilant.

Fiat n'est bien sûr pas le seul à utiliser du texte flou. La MAIF, la pub pour la Renault Mégane DCI (coupé 2009) ou encore la Citroën C4 Picasso utilisent aussi cette astuce (arnaque ?). Et il y en a sûrement bien d'autres.

Volume sonore

La plupart des chaînes augmentent le volume sonore lors de l'interruption publicitaire. Ça a bien sûr pour effet d'éveiller mon attention, mais ça m'énerve car à chaque fois je dois baisser le volume.

Côté possitif : on peut utiliser cette singularité pour détecter le début et la fin de la publicité. Cette astuce a été utilisée sur les boitiers TiVo aux États-Unis (fonction « commercial-skip »). D'ailleurs, aux États-Unis, la quantité de publicité à la télévision est incomparable avec ce qu'on a en France. Mais ce n'est pas une excuse pour ne pas râler !

Divers

Il y a d'autres trucs qui m'horripilent. Les pubs utilisant une animation 3D pour en mettre plein la vue, mais avec une animation complètement bidon (bien loin de la réalité). Exemples typiques : action de la brosse à dent, d'un dentifrice, du shampoing ou d'une lessive.

Autre horreur : la mode des publicités en chanson. Votre banquier ou votre assureur se met à chanter sur un air connu... sauf que c'est une reprise. Le pire étant un slogan repris régulièrement pendant plusieurs mois comme la publicité « C'est la MAAF ». Raaaaah !

Il y a aussi les publicités en deux parties. La plus ridicule étant la même publicité (ou deux versions très proches) diffusée deux fois dans un intervalle très court (genre deux ou trois minutes). Sinon il y a une première partie qui crée le suspense, puis la 2e partie qui révèle la nouvelle (décevante bien sûr).

Pour finir, sachez que les agences de publicité ont leur QG : Syndicat National de la Publicité TéléVisée (SNPTV). Si vous en avez ras la pub, c'est le moment de relire ou revoir 99 francs ;-)

Partager une imprimante avec CUPS

Je partage mon imprimante USB entre deux ou trois ordinateurs (selon mon humeur). Chaque fois que je dois (re)configurer le serveur qui la partage ou un poste client, je m'arrache les cheveux. Pourtant, c'est simple, mais j'oublie toujours une étape importante. Voici donc une petite liste récapitulative, sûrement incomplète et imprécise, pour partager une imprimante sous Linux.

Serveur

Installation l'imprimante

Pour l'installation, l'interface web de CUPS (http://localhost:631) est bien foutue et inclut même de la documentation ! Sinon il existe des assistants graphiques qui fonctionnent pas trop mal. Bref, rien de spécial à dire pour cette étape.

Partager l'imprimante

Il faut bien marquer l'imprimante comme étant partagée. Par exemple avec l'outil Ubuntu (ou Gnome ? system-config-printer.py), il faut faire un clic droit sur l'imprimante et s'assurer que « [x] Partagée » soit coché.

Partager le serveur d'impression

Il faut que le serveur CUPS soit accessible sur le réseau local. Pour cela, il faut « Publier les imprimantes partagées connectées à ce système ».

Après il se peut qu'il y ait des soucis de permissions. Mais alors là, bonne chance :-)

Poste client

cups-bsd

Sous Debian, s'assurer que c'est le paquet cups-bsd (et non lpr) qui est utilisé. lpr pose des problèmes, notamment avec Kpdf.

/etc/cups/client.conf

Il n'y a pas besoin de serveur CUPS (enfin, j'ai jamais trop su... mais je crois pas). Il suffit d'une seule ligne dans le fichier /etc/cups/client.conf :

ServerName lisa

où lisa est le nom du serveur.

Test en ligne de commande

Le programme lpq permet de voir la liste des tâches d'impression :

$ lpq
HP_LaserJet_P2015_Series est prêt
aucune entrée

Ça marche !

Configurer KDE

Avec KDE 3.x, assurez-vous d'utiliser le « pilote » CUPS et non pas LPD :

  • Allez dans le menu : K > Configuration > Périphériques > Imprimante
  • Système d'impression : choisissez CUPS

Utilisez du laser !

Mon imprimante est une HP LaserJet 2015 noir & blanc branchée sur USB. Elle m'a coûté cher (environ 300€ je crois), mais depuis que je l'ai (2 ans je crois ?) je n'ai jamais changé le toner. Elle est très rapide : la première page sort en 10 secondes maxi et les suivantes se suivent directement sans interruption. En plus, le papier est chaud et j'aime bien l'odeur. Par contre, parfois elle clignote quand elle est ronchon :-) Je lui tripote les boutons et ça la calme. Ah oui, elle s'installe sans aucun problème sous Linux.

Si comme moi vous n'imprimez que du texte sans schéma (article de recherche, facture, recette de cuisine, etc.) : je vous conseille d'investir dans du laser noir et blanc plutôt qu'une imprimante jet d'encre droguée qui réclame sans arrêt ses doses à 30€ (quand c'est pas 50€ ou plus !). Je pense que les constructeurs vendent à perte, mais se rattrapent très vite sur les consommables. Et si possible, ils mettent des verrous matériels ou logiciels pour empêcher que vous achetiez des cartouches concurrentes ou que vous rechargiez vos cartouches à la main (avec une seringue, opération rigolote).

mercredi 24 février 2010

Outils Xorg en ligne de commande

Xorg est fourni avec une large palette d'outils en ligne de commandes bien pratique pour dépanner un serveur Xorg malade. Voici une courte liste des commandes que j'ai déjà utilisées. Initialement, j'ai écrit ce billet juste pour me souvenir de xdpyinfo :-)

Clavier

Configuration la répétition du clavier :

 xset r rate 500 30

Changer la disposition du clavier. Passer en QWERTY :

setxkbmap us

Changer la disposition du clavier. Passer en AZERTY (français) avec la variante latin9 :

setxkbmap fr -variant latin9

Définir les touches Propriété Windows et Menu Windows droit comme touches de composition :

setxkbmap -option compose:menu,compose:rwin

Écran

Afficher les écrans connectés, les résolutions disponibles et la résolution courante :

xrandr

Utiliser l'écran externe ("VGA") plutôt que l'écran interne ("LVDS") d'un ordinateur portable :

xrandr --output VGA --auto --output LVDS --off

Lire la taille en millimètres et la résolution en points par pouce (PPP, ou DPI en anglais). Chercher « screen #0: » dans la sortie de la commande :

xdpyinfo

Exemple :

...
screen #0:
  dimensions:    1280x1024 pixels (294x235 millimeters)
  resolution:    111x111 dots per inch

Désactiver l'économiseur d'écran :

xset s off

Divers

Application affichant les événements claviers et soucis. Peut par exemple server à trouver le code d'une touche (keycode). Voir mon article sur la touche compose de mon article Touche compose) qui en parle.

xev

Générer un fichier de configuration Xorg dans le dossier courant (créer un fichier « xorg.conf.new ») :

Xorg -configure

Si Xorg est déjà en foncitonnement, utiliser le second display :

Xorg :1 -configure

Autoriser l'utilisateur toto à se connecter à votre serveur X :

xhost +toto

Puis xhost -toto pour retirer la permission. Désactiver les bips du buzzer :

xset -b

dimanche 27 décembre 2009

Cette grosse plaie de PulseAudio

PulseAudio est un serveur sonore visant à simplifier la lecture de son sur le bureau. Il remplace le vieux Esound (ESD). Il permet d'envoyer le son sur les hauts parleurs d'un autre ordinateur, d'utiliser plusieurs cartes son, prend en charge les oreilettes bluetooth, gère la consommation d'énergie, etc. Sur le papier, ça semble super : relire Why you should care about PulseAudio (and how to start doing it) pour s'en convaincre. Par contre, en pratique c'est une grosse plaie : PulseAudio rajoute une couche entre les applications et ALSA qui consomme du temps processeur, de la mémoire, et (dans mon cas) dégrade la qualité du son (rajoute des petits pics sonores).

Problèmes liés à PulseAudio sur un Eee PC (Fedora 11)

En particulier, sur mon Eee PC (1101 HA) équipé de Fedora 11 : mplayer est incapable de lire une vidéo (le film Sympathy for Lady Vengeance) bien que mon processeur graphique (la célèbre puce Poulsbo) accélère grandement le décodage de l'image. Dans les logs noyaux (/var/log/messages), j'ai pu voir que PulseAudio tente de rattraper la situation :

Nov 15 23:07:57 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 1,00 ms
Nov 15 23:16:27 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 2,00 ms
Nov 15 23:16:50 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 4,00 ms
Nov 15 23:20:43 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 8,00 ms
Nov 15 23:20:48 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 16,00 ms
Nov 15 23:21:19 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 26,00 ms
Nov 15 23:22:03 maggie pulseaudio[6894]: alsa-sink.c: Increasing wakeup watermark to 15,99 ms
Nov 15 23:37:22 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 36,00 ms
Nov 15 23:37:37 maggie pulseaudio[6894]: alsa-sink.c: Increasing wakeup watermark to 25,99 ms
Nov 15 23:43:03 maggie pulseaudio[6894]: alsa-sink.c: Increasing minimal latency to 46,00 ms

Toutes à 5 à 10 minutes, le son finit par sauter et mplayer se fige. J'ai trouvé un contournement : revenir un peu en arrière puis aller un peu en avant (touches gauche puis droite).

Solution : passer directement par ALSA

Après trois coupures dans mon film (c'est-à-dire après un quart d'heure), j'ai fini par me décider à le couper et à chercher à résoudre ce problème énervant. J'ai vu que Mplayer utilisait PulseAudio. J'ai alors essayé l'option « -ao alsa » (-ao : Audio Output), mais mplayer utilisait quand même PulseAudio. Bizarre.

En regardant la configuration ALSA, j'ai vu dans le fichier /etc/alsa/pulse-default.conf :

# Let's make it the default!
pcm.!default {
    type pulse
    ...
}

Donc PulseAudio est configuré pour être le pilote par défaut. J'ai supprimé ce fichier et j'ai redémarré la machine (vu que PulseAudio a trituré ALSA, j'ai préféré tout réinitialiser).

Après le redémarrage, j'ai relancé mon film et j'ai pu le voir jusqu'au bout sans la moindre coupure !

Utilisation du processeur

  • mplayer -ao pulse : le processus pulseaudio utilise 20% du CPU, et au total 20 à 25% du CPU est utilisé
  • mplayer -ao alsa : le processus pulseaudio n'est plus solicité (et n'est donc plus visible dans top), et au total 5 à 10% du CPU est utilisé

Réglage du volume

Avec PulseAudio, alsamixer (et autres mixeurs de sons) n'affiche qu'une seule sortie. Il faut utiliser « alsamixer -c 0 » pour que je puisse avoir accès à toutes les sorties. En particulier, ça me permet de régler le volume du casque, chose nécessaire car le volume est insuffisant.

Problèmes liés à PulseAudio qu'ont d'autres utilisateurs

Lors de la migration à PulseAudio, pas mal d'applications ne fonctionnaient plus (le son en tout cas). Flash et Skype supportent aujourd'hui PulseAudio (Flash 10+ et Skype 2.1+), par contre Audacity ne le supporte toujours pas. Les jeux utilisant la bibliothèque SDL (ex: l'excellent xmoto) ont également des problèmes. Correction : SDL 1.2.12 a un pilote natif pour PulseAudio.

Complaintes :

Le démon PulseAudio a besoin de tourner en priorité temps réel (SCHED_FIFO). Or il faut être root pour cela. Une faille de sécurité dans PulseAudio a déjà servi pour exploiter des failles du noyau Linux (2.6.30, 2.6.31, 2.6.32), notamment via la boîte à outils de Brad Spengler.

Conclusion

Sympathy for Lady Vengeance est un excellent film ! Il fait parti de trilogie sur la vengeance du sud-coréen Park Chan-wook. La fin est bien gore, j'adore :-)

Pour PulseAudio, c'est plutôt mauvais signe étant donné qu'il est activé par défaut sur Ubuntu, Fedora et Mandriva. Bien que j'ai du mal à voir l'intérêt de PulseAudio, il doit bien en avoir un pour que les distributions bureaux majeures l'activent par défaut. Par contre, il serait bon de donner le choix de désactiver complètement PulseAudio le temps que le code soit stabilisé.

samedi 21 novembre 2009

Analyse de spam (commentaires de ce blog) : sites chermou.org et denjala.com

Avec mon antispam maison (NIH powa !), je filtre une grosse partie du spam (dans les commentaires), mais quelques uns passent à travers le filtre. La plupart sont ponctuels, mais un spam persiste dans la durée : chermou. Cet article tente de comprendre l'insistance de ces spams (qui visent à amener du trafic vers certains sites précis), notamment en analysant le contenu et la stratégie commerciale de ces sites.

Analyse des spams

Le mardi 29 septembre 2009 à 02:40
Email : 
Site : http://www.denjala.com
@IP : 41.249.40.88
mais pourquoi les americains sont si fort et dans tout les domaines!!!

L'auteur des messages est différent pour chaque message (bomi41, s3aidia, tafrawte, windman, ...). Par contre, la même adresse de courriel est utilisée pour plusieurs messages durant plusieurs semaines (mais sur plusieurs mois, il y a donc plusieurs adresses différentes). Le contenu des messages est en français (plutôt correct) et semble avoir un rapport avec l'article (peuvent passer inaperçu si on n'est pas attentif).

Le plus intéressant reste les noms de domaine (les sites vers lesquels ces spams tentent d'amener du trafic) :

  • www.jeseraimillionnaire.com
    • Crée en juin 2008 (voir plutôt en 2006 ?)
    • Registrar: ENOM, INC.
    • (autres informations : cachées)
  • www.twinibila.com
    • Crée le 16 août 2007
    • Propriétaire : Leblanc SARAH
    • Registrar : ONLINE SAS
  • www.chermou.org
    • Propriétaire : Mourad Chermou
    • Registar : Gandi
    • Crée le 24 décembre 2008
  • www.lannuairegrand.com
    • Crée le 26 février 2009
    • Propriétaire : Mourad Chermou
    • Registar : Espace 2001
    • Adresse postale : Mohammedia, Maroc
  • www.lannuairesport.com
    • Propriétaire : Mourad Chermou
    • Adresse postale : Mohammedia, Maroc
    • Registar : Espace 2001
    • Crée le 25 février 2009
  • www.denjala.com
    • Propriétaire : Mourad Chermou
    • Registar : Gandi
    • Crée le 21 mai 2009

Sur mon blog, c'est essentiellement chermou.org et denjala.com que j'ai croisé. Bon mais sinon, que vendent ces sites ?

Présentations des différents sites

Denjala.com ressemble à un annuaire très généraliste de sites webs : 2000 thèmes divers allant de Dictionnaire à Tissage en passant par Perruque. Il propose d'acheter une « page » pour 50€. Le contenu pornographie est interdit. Si j'ai bien compris, une « page » est une annonce publicitaire. La page d'accueil contient un emplacement Google Ads, et chaque page contient deux emplacements Google Ads : un bandeau textuel (en espagnol) et une image (bannière horizontale).

C'est là que je ne comprend pas. Le seul contenu proposé par denjala.com est de la publicité ? Quel est le public visé : des annonceurs, des internautes égarés, voir carrément des fans de publicité sur Internet ? En tout cas Mourad espère gagner 100.000€ avec son affaire. L'annuaire contient quelques entrées, mais je ne sais pas si les webmestres de ces sites ont payé pour être enregistrés.

Lannuairesport.com est également un annuaire, dédié au sport. Il comporte un emplacement de publicité Google Ads.

Lannuairegrand.com est un « annuaire de tous les meilleurs sites du web francophone ». L'inscription d'un site est manuelle et gratuite. Il y a un bandeau (image) Google Ads sur la page d'accueil, et deux bandeaux textuels sur chaque page.

chermou.org est un site de question/réponse. La page d'accueil contient des liens vers les questions résolus et non résolues, et un lien pour poser une question. Juste sous le menu, il y a une ligne d'annonces Google sous forme textuelle sur une seule ligne « Annonces Google Reponse Question Eau Poser Loisirs 92 Loisirs En » (les mots clés me semblent assez étonnants). Cliquer sur un des mots amène à une page qui liste des publicités Google (textuelles avec un grand bandeau en bas). Il semble que des personnes utilisent ce site pour poser des questions, et répondent aux autres questions. Le concept de site question/réponse n'est pas nouveau, il existe par exemple Yahoo! Questions/Réponses ou l'oracle Wikipédia.

Google Ads

Si j'ai bien compris, les sites chermou visent à faire gagner de l'argent à son auteur, grâce à la publicité (Google). La question que je me pose donc est « Google Ads, combien est-ce que ça rapporte ? ». Problème : La charte interdit de dire combien on gagne... Les mots clés sont vendus aux enchères chaque jour, de 2 cents à plusieurs dollars par clic. Une rémunération est perçue à chaque clic sur une annonce. Les annonces sont choisies selon le contenu de la page web où les annonces sont placées. Par contre, il faut gagner au moins 100$ pour avoir le premier versement : « Les gains vous sont reversés tous les mois par chèque ou virement bancaire à partir du moment où vos gains dépassent la somme de 100$. Sinon, ils sont reportés au mois suivant et ainsi de suite. » Pour en savoir plus, lire par exemple googlecash.

Mourad Chermou achète également des mots clés vers son site. Du coup, cliquer sur un pub menant vers son site va donc lui coûter des sous.

Ce qui m'étonne surtout, c'est les formes que prennent les publicités sur les sites que j'ai cités. Publicités pas très attirantes, parfois en espagnol, parfois uniquement sous forme de quelques mots qui me semblent aléatoires... La logique est difficile à suivre.

jeseraimillionnaire.com

En juin 2008 (ou 2006 ? j'ai pas trouvé de date exact), Mourad avait également lancé le site jeseraimillionnaire.com : Comment devenir millionnaire sans bouger... (novembre 2006). Exemple de spam pour ce site : « Paris 28 juin 2008. Je m'appelle chermou mourad, j'ai 31 ans je suis marocain je vie depuis 5 ans en france sans papiers, je suis venu en france pour terminer mais études mais j'ai pas terminé... J'ai créé ce site pour être millionnaire et retourner chez moi pour mettre fin à cette mésaventure! La france, je l'aime mais je dois la quitter » (source). Il y a 2000 mots et si vous voulez que votre site apparaisse dans la page d'un mot, vous devez payer 100 €.

Étant donné que Google référence gratuitement (et représente 90% des moteurs de recherche ou plus), je ne vois pas trop l'intérêt de ces sites.

Twinibila.com

Parmi cet ensemble de sites, Twinibila.com se détache du lot. C'est un site d'annonces gratuites pour vendre des voitures au Maroc. Ce site semble actif et pas mal utilisé par des particuliers. Alors que les autres sites sont essentiellement statiques, celui là comporte un moteur de recherche. Il héberge également un forum phpBB. Le site est plutôt bien foutu. L'enregistrement DNS indique le nom « Sarah Leblanc ». Je suppose que le site a été conçu par une personne différente de tous les autres sites.

mercredi 2 septembre 2009

Réparer un dépôt git après l'échec de git svn dcommit

git-svn est bien pratique pour travailler en local (déconnecté) sur un dépôt Subversion. Le plus gros défaut de cet outil est que lorsque la commande "git svn dcommit" échoue, il laisse le dépôt dans un état assez chaotique. Heureusement l'outil git est conservateur : il est toujours possible de revenir en arrière, sauf que l'opération est très technique et délicate.

Récupérer le numéro de commit

La première étape est de retrouver le numéro du commit qui a échoué en ouvrant le fichier .git/logs/HEAD (j'ai mis des "..." pour votre santé mentale, les logs sont assez illisibles sinon) :

...
eb85fa... e72f83... Victor <haypo@bart> 1251220925 +0000 rebase: access: move calls to network/status from frontend to backend
e72f83... 5112b1... Victor <haypo@bart> 1251220965 +0000 refs/remotes/git-svn: updating HEAD
5112b1... 0f86ea... Victor <haypo@bart> 1251220979 +0000 refs/remotes/git-svn: updating HEAD

Le format du fichier est « uid avant | uid après | nom | timestamp | message ». Disons que c'est la dernière opération (la dernière ligne) qui a merdé. Il faut donc revenir à la version précédente (avant dernière ligne) :

e72f83... 5112b1... (...) 1251220965 (...): updating HEAD

Il faut l'ancien numéro de commit (première colonne donc) : e72f83....

Récupérer ses commits

La commande pour revenir à la version précédente (avant le chao laissé par git svn dcommit) est :

git reset --hard e72f83...

Tada ! Pour comprendre ce qui s'est passé, on peut jetter un oeil à .git/logs/HEAD :

...
eb85fa... e72f83... Victor <haypo@bart> 1251220925 +0000 rebase: access: move calls to network/status from frontend to backend
e72f83... 5112b1... Victor <haypo@bart> 1251220965 +0000 refs/remotes/git-svn: updating HEAD
5112b1... 0f86ea... Victor <haypo@bart> 1251220979 +0000 refs/remotes/git-svn: updating HEAD
0f86ea... e72f83... Victor <haypo@bart> 1251221469 +0200 e73f83...: updating HEAD

Articles similaires

Autres articles (en anglais) qui décrivent cette « astuce » :

mardi 1 septembre 2009

Fuseau horaire français, heure d'été et heure d'hiver

Alors que j'essayais d'implémenter une nouvelle fonction Python liée à la gestion du temps, j'ai buté sur un bug. Le but était de supporter les dates avant 1970 (epoch négatif). Le résultat pour les dates entre 1946 et 1969 étaient corrects, par contre pour les dates antérieures il y avait un « trou » incompréhensible de quelques heures.

Fuseaux horaires

En me documentant sur les fuseaux horaires, j'ai appris que la France est passée d'UTC+0 à UTC+2 en 1940, suite à l'invasion allemande. Ah ! C'était donc ça.

La France est le pays du monde qui couvre le plus de fuseaux horaire (12) :

  1. UTC-10 : Polynésie française (Îles de la Société, Archipel des Tuamotu, Archipel des Tubuai)
  2. UTC-9:30 : Polynésie française (Îles Marquises)
  3. UTC-9 : Polynésie française (Îles Gambier)
  4. UTC-8 : Clipperton
  5. UTC-4 : Guadeloupe, Martinique
  6. UTC-3 : Guyane française, Saint-Pierre-et-Miquelon
  7. UTC+1 : France métropolitaine
  8. UTC+3 : Îles éparses de l'océan Indien, Mayotte
  9. UTC+4 : Îles Crozet, La Réunion
  10. UTC+5 : Îles Kerguelen, Îles Saint-Paul et Amsterdam
  11. UTC+11 : Nouvelle-Calédonie
  12. UTC+12 : Wallis-et-Futuna

Heure d'été, heure d'hiver

Déjà, les fuseaux horaires, c'est compliqué. Mais il y a pire : l'heure d'été et l'heure d'hiver ! En juin 1916, la France adopte l'heure d'été et l'heure d'hiver, suite à la proposition du député André Honnorat. À la fin de la 2e guerre mondiale, l'heure d'été est abandonné en 1946 (ouf !), avec une certaine confusion entre zone libre et occupée.

Mais en 1975, l'heure d'été et l'heure d'hiver (UTC+1 et UTC+2) font leur grand retour suite au choc pétrolier de 1974. Depuis 2002, les dates des changements sont fixées par l'Union Européenne.

Selon une étude de la Commission européenne de 2007, « les économies effectivement réalisées sont difficiles à déterminer, et, en tout cas, "relativement limitées" »... Je vois pas pourquoi on s'emmerde à conserver cet héritage idiot qui sert juste à perturber tout le monde (y compris les vaches qui font du mauvais lait pour se venger).

tzdata

Au niveau informatique, sous Linux c'est tzdata qui est utilisé : paquet qui contient les informations sur les fuseaux horaires, heure d'été/d'hiver et les secondes intercalaires. C'est une archive qui est maintenue par Arthur David Olson et disponible sur le serveur FTP du ''National Institutes of Health''. L'archive compressée du 17 août 2009, tzdata2009l.tar.gz, pèse 176 Ko, taille qui montre bien la complexité de la gestion du temps...

Remarques

  • Le changement d'heure estival a été introduit dans l'ensemble des pays de l'Union européenne au début des années 1980.
  • En traversant la frontière depuis l'Afghanistan pour aller en Chine, on passe d'un fuseau horaire UTC+4:30 à un fuseau UTC+8.
  • Un fuseau horaire n'est pas forcément un nombre entier d'heures. Il existe par exemple les fuseaux UTC-9:30 et UTC+12:45

Sources : le calendrier du changement d'heure d'été, heure d'hiver, service public français, heure d'été (Wikipédia)

Je trouve surtout que c'est un grand bordel et qu'il serait plus simple qu'on utilise tous l'heure UTC. D'ailleurs, la Chine n'a qu'un seul fuseau horaire malgré sa superficie !

mercredi 5 août 2009

Migration vers Bitbucket, fin de l'hébergement à la maison (ADSL)

Hébergement à la maison

Fier de ma connexion ADSL Free à Strasbourg (1 à 2 Mo/sec en download, 80 à 100 Ko/sec en upload), j'ai hébergé durant 3 ans mes projets personnels à la maison. L'administration du serveur qui héberge Subversion, Apache et Trac était un peu laborieuse (pour moi) et surtout chronophage. L'administration consiste à créer manuellement une nouvelle instance de Trac, un nouveau dépôt Subversion, et la configuration Apache qui va bien, pour chaque nouveau projet. Mais également à surveiller un peu les logs Apache pour détecter des problèmes et les tentatives de compromission. Il n'y en a eu aucune compromission du serveur bien que je n'ai mis aucune protection en place. Soit les bots automatiques sont idiots, soit les logiciels libres sont sûrs par défaut :-)

Migration sur mon nouveau serveur

J'ai mis 6 mois à me décider à migrer les services de l'ancien serveur au nouveau (pourtant très largement plus rapide) tant je savais que la migration allait être longue. Après la migration, j'ai eu des soucis avec les « VirtualHost » Apache. Virtual Host est la fonction qui permet d'héberger plusieurs sites Internet sous des noms de domaines différents mais sur la même adresse IPv4 (et IPv6). Quand on surfait sur un des sites fusil.hachoir.org, hachoir.org, python-ptrace.hachoir.org ou haypo.hachoir.org : on se retrouvait aléatoirement sur l'un ou l'autre des sites. Je ne sais pas si le problème venait de ma configuration Apache, de Python, de Trac ou encore de WSGI.

Migration du projet Hasard

J'ai d'abord migré mon projet Hasard sur le site Bitbucket. Je suis très content de leurs services (gratuit et sans pub, mais le dépôt Mercurial est limité à 150 Mo) :

  • Code source stocké dans un dépôt Mercurial. Comme Mercurial réalise les commits en local, je ne suis pas dépendant de ma connectivité à Internet pour faire des commits (ex: dans le train). Et les commits instantanés m'incitent à faire plus de petits commits, donc plus faciles à relire.
  • Wiki éditable en ligne et via Mercurial (dépôt Mercurial séparé)
  • Gestion des tickets similaire à Trac
  • Dépôts Mercurial accessibles en HTTP, HTTPS et SSH

Migration des tous mes projets

Finalement, j'ai profité de mon déménagement pour migrer tous mes projets personnels sur Bitbucket. Nouvelles adresses de mes projets :

Je suis plutôt content que la disponibilité de mes projets personnels ne dépendent plus de l'état de mon réseau électrique (de la météo) ou de l'état de ma connexion à Internet.

samedi 4 avril 2009

Projet de loi Hadopi : un nouveau succès de la démocratie !

Les tentatives de contrôler la diffusion des œuvres par l'industrie musicale et du cinéma sont vraiment navrantes. Malgré les moyens considérables déployées depuis une dizaine d'année (disons que Napster marque l'année zéro du P2P : 1999) dans cette croisade contre les réseaux pair à pair (P2P), ces réseaux existent toujours et au contraire gagnent en popularité chaque année.

Brêve histoire des réseaux pas tout à fait pair à pair

Les premiers réseaux P2P (années 2000) dépendaient de quelques nœuds centraux. Il suffisait de trouver les responsables de ces nœuds pour couper tout le réseau. Comme ils étaient américains, les maisons de disque (Internet était trop lent pour télécharger des films) n'ont pas eu de mal obtenir gain de cause.

Les réseaux évoluèrent pour ne plus dépendre de nœuds centraux, et la solution du procès ne fonctionnait plus. Il y a eu des procès d'internautes, aux États-Unis comme en France, mais l'impact sur les consciences semble peu efficace.

Tentative d'éradication du P2P par des moyens techniques

Une autre approche est la déception : tenter de polluer les réseaux en injectant des fichiers corrompus. Bien que des sociétés soient payées pour diffuser continuellement des chansons tronquées ou des vidéos pornographiques portant le nom de dessins animés pour enfant (ou du dernier film à succès), cette technique ne semble pas non plus porter ses fruits. Les internautes s'organisent, montent des forums, et la technologie évolue (BitTorrent ?).

Il existe aussi le tatouage numérique (watermarking) : technologie de pointe mais extrêmement coûteuse et pénible pour l'éditeur de contenu. Effectivement, les éditeurs de solution de tatouage sont paranoïaques car leur technologie repose sur le secret. Ils surveillent donc leurs clients (pas les internautes, les éditeurs de contenu) de très près (l'arroseur arrosé ?).

Bon bref, pas besoin d'en écrire des tas, il semble clair que ce n'est pas une solution technique qui va sauter l'industrie du disque et du cinéma.

Faire voter une loi, une solution de dernier recours ?

L'industrie attaque donc sur un nouveau front : la législation à grand coup de lobbyistes. Il y a d'abord eu une tentative en 2006 avec la « réponse graduée » dans la loi DADVSI, mais le conseil constitutionnel a censuré cette proposition.

Pendant ce temps (23 février) à l'autre bout du monde, la Nouvelle Zélande a suspendu un projet de loi similaire à Hadopi.

Plus récemment (le 26 mars), le parlement européen a adopté à 481 voix contre 25 (et 21 abstentions) un rapport intitulé « Renforcement de la sécurité et des libertés fondamentales sur Internet » qui dit justement que l'accès à Internet ne peut être refusé comme une sanction par des gouvernements ou des sociétés privées.

Qu'importe, le projet Hadopi est maintenu à l'assemblé nationale. Ça a fonctionné car la la loi a été acceptée à 23h. Elle a été votée par 16 députés : 10 pour, 4 contre, 2 abstentions, et hum... 528 absents (ils étaient tous à la piscine).

C'est marrant quand même, notre ministre de la culture se justifiait en disant qu'il n'y avait que « 5 gus dans un garage » opposés au projet de loi Hadopi. Alors que le mouvement « Blackout » lancé fin février a été suivi par plus de 12.200 sites Internet et que la pétition lancé par la magazine SVM a collecté 47.903 signatures (députés européens, associations, chefs d'entreprise, et même des artistes !).

L'industrie de la musique et du cinéma se porte bien

Bizzarement, j'apprend que le chiffre d'affaire global de la musique, en incluant les concerts, est en augmentation. Le cinéma a quant à lui battu des records d'entrées en 2008 (en France, aux USA et en Suède). Les jeux vidéo ont augmenté leur chiffre d'affaire de 22% en 2008 par rapport à 2007, qui était déjà une année exceptionnelle.

Résumé

Pour ceux qui n'ont rien suivi à Hadopi (comme moi), je vais tenter de résumer (maladroitement donc). C'est un projet de loi liberticide (donne le droit à des sociétés privées d'obtenir votre nom et adresse selon votre adresse IP) qui va provoquer une vague de censure (fermeture des points d'accès wifi, filtrage par liste blanche dans les écoles et bibliothèques, etc.), mais ne va pas éradiquer le P2P (au mieux, ça va se calmer pendant quelques mois). Les techniques est toujours la même : la déception (rendre le P2P plus difficile : réseaux anonymes chiffrés, plus lent) et la peur (bloquer par mesure préventive).

Je pense que la meilleure lutte contre Hadopi est d'informer les internautes. Quelques pointeurs : l'excellent résumé d'Hadopi (une page A4) par la Quadrature du Net et l'article Wikipédia.

MISE À JOUR : J'ai corrigé la phrase « acceptée à 23h par 16 députés, 1 contre (Lionel Tardy, merci à lui !), et hum... 560 absents (ils étaient tous à la piscine) ». Merci à Arcaik de m'avoir indiqué le bon nombre de votants.

vendredi 13 février 2009

FOSDEM, Fusil, bières, python-ptrace et conférences

Triple Carmelite Le week-end dernier se tenait à Bruxelles l'édition 2009 de FOSDEM, LA rencontre européenne des développeurs de logiciel libre. J'y ai présenté Fusil le fuzzer qui a été inclus dans le Main track. La vidéo de la conférence devrait être bientôt disponible. En attendant, j'ai mis le diaporama en ligne : fosdem_2009.pdf (je me suis remis à Beamer !).

Pour l'occasion, j'ai publié Fusil 1.2 avant l'événement (suivi rapidement par Fusil 1.2.1), et python-ptrace 0.6 aujourd'hui. La nouvelle version de Fusil arrive avec une meilleure documentation, en particulier avec un guide d'utilisation et un index des documentations, de nombreuses corrections de bugs, des améliorations des agents réseaux, etc. Du côté de python-ptrace, strace.py peut maintenant afficher le pointeur d'instruction, Mark Seaborn a écrit une extension (itrace.py) à strace.py (pour déboguer la libc dans le bac à sable de Google Chrome), PtraceSignal donne des informations plus précises, etc..

À FOSDEM, j'ai essentiellement bu des bières et travaillé sur ma présentation (je déconne ! elle était prête depuis des semaines !). Je vous conseille d'ailleurs la Triple Carmélite (que m'a conseillée Jean) et la Rochefort niveau 8 (découverte par hasard, la 10 est trop forte).

Rochefort

Niveau conférences, j'ai retenu les présentations :

  • LLVM et Gallium3D par Stéphane Marchesin : utilisation du compilateur LLVM dans les pilotes 3D d'Xorg pour optimiser les shaders (micro-programmes utilisés dans les GPU de nos cartes graphiques)
  • Nemiver par Dodji Seketeli : jolie interface graphique à GDB en Gtk+ avec une vue du code orientée debug (ex: survoler une variable affiche sa valeur) qui semble très fonctionnelle
  • L'introduction à XMPP (Jabber) par Remko Tronçon et Peter Saint-Andre était jolie, fluide et bien préparée. Par contre, je n'ai pas appris grand chose. Ça confirme juste que Jabber est vraiment bien conçu (Peter est l'un des auteurs des spécifications XMPP) et très largement extensible.

Le « petit » monde du logiciel libre est de plus en plus actif. La fréquentation et la taille de FOSDEM ne cesse d'augmenter. D'ailleurs, Debian Lenny devrait sortir ce week-end, en même temps que Python 2.6.2 et 3.0.1.

mardi 27 janvier 2009

Hors-série Linux Mag : Explorez les richesses du langage Python

Depuis un an, Philippe Biondi parcourait la France sans relâche à la recherche d'auteurs pour écrire un hors-série dédié à Python. Grâce à sa persévérance, le hors-série dédié à Python est enfin en vente dans toutes les librairies (en France) !

J'ai écrit quatre articles dans ce hors-série.

Nouveautés de Python 2.6

Version améliorée, corrigée et illustrée (d'exemples) de ma dépêche linuxfr.org (elle-même basé sur What’s New in Python 2.6 que j'ai traduit).

Nouveautés de Python 3.0

Article écrit avant la sortie de Python 3 par ma propre expérience, et avant que la documentation What’s New In Python 3.0 ne soit écrite par Guido van Rossum (... mais finalement publié après).

Trucs et astuces

Article écrit co-écrit par Philippe Biondi même s'il est trop humble pour l'avouer !

Ctypes et Python

Guide pratique pour écrire un binding C en Python avec ctypes. C'est aussi un retour d'expérience sur mes bindings pynetfilter_conntrack et python-ptrace.

--

Ruez-vous en librairie, il n'y en aura pas pour tout le monde ! Je me suis déjà empressé d'acheter mon exemplaire. J'ai particulièrement apprécié l'article de Gaël Varoquaux : Python comme langage scientifique, article qui sent le vécu et l'utilisation concrète de Python.

mardi 11 novembre 2008

Achat d'un nouvel ordinateur de bureau

Suite au décès prématuré de mon ordinateur portable (un Compaq de 2003), je me suis décidé à acheter un ordinateur de bureau monté moi-même. Tout fonctionne sous Ubuntu en 64 bits, et je suis agréablement surpris de la réactivité de la bête.

Lire la suite

samedi 11 octobre 2008

Retour aux sources : installation de Debian Sid

Après avoir pas mal utilisé Ubuntu pendant plusieurs années, j'ai décidé de réinstaller Debian Sid sur mon portable histoire de voir si je sais encore m'en servir.

Installer Debian par clé USB

Une fois que j'ai compris que le lecteur de CD était mort (j'ai cramé 3 CDR pour m'en rendre compte), je me suis essayé à l'installation par clé USB.

  • Il faut une clé USB d'au moins 100 Mo
  • Sauvegardez les données de votre clé USB car toutes les données seront détruites par cette procédure.
  • Télécharger un booteur ISOLINUX (hd-media/boot.img.gz, 16 Mo) et une image ISO d'un installeur Debian (netinst/mini.iso, 59 Mo) depuis la page netinst.
  • Installer le booteur sur la clé USB : « zcat boot.img.gz > /dev/sdb » où /dev/sdb est le périphérique de votre clé USB
  • Un système de fichier ext2 a été crée sur la clé USB. Montez le et copiez-y l'image ISO téléchargée.
  • Démonter la clé et rebooter.
  • Booter sur la clé USB, et voilà.

Installation de paquets

J'ai choisi de n'installer aucun paquet, c'est-à-dire avoir l'installation la plus minimaliste possible histoire de contrôler ce qui est installé sur ma machine. Les commandes qui suivent permettent d'installer certaines catégories de logiciels.

Fichier /etc/apt/sources.list

deb http://debian.revolsys.fr/debian/ sid main contrib non-free
deb http://www.debian-multimedia.org sid main
  • non-free est nécessaire pour Flash
  • debian-multimedia.org est nécessaire pour mplayer

Le minimum vital

apt-get install less vim

Serveur graphique (Xorg) et KDE

apt-get install kde kdm kde-i18n-fr kde-style-polyester yakuake
  • Je n'ai pas réussi à reproduire le joli thème KDE de Kubuntu, mais le style Polyester est déjà pas mal
  • yakuake est un terminal qui se déplie/se cache à la demande (comme la console Quake pour les connaisseurs)

Pour partager souris et clavier entre mes deux ordinateurs :

apt-get install synergy

Firefox (Iceweasel) et Flash

apt-get install mozilla-noscript iceweasel iceweasel-l10n-fr flashplugin-nonfree
  • Le greffon NoScript est un parefeu Javascript
  • Note : Thunderbird s'appelle Icedove

Son et vidéo

apt-get install alsa-utils mplayer

Certains préféreront vlc, xine ou encore totem.

Gestion des clés SSH

apt-get install ssh-askpass-fullscreen keychain

Diagnostic et bidouilles réseau

apt-get install nmap netcat

Compilation

apt-get install gcc make autoconf automake libtool fakeroot
  • fakeroot est utile pour recompiler un paquet Debian

Écriture de code source

apt-get install manpages-dev manpages-fr subversion exuberant-ctags meld
  • ctags est un indexeur de code source permettant d'aller à la définition d'un symbole (variable, fonction, classe) dans vim avec « CTRL + ] »
  • meld est un excellent outil pour comparer deux fichiers textes ou deux dossiers contenant des fichiers textes (et donc utilisable pour du code source)

Débogage

apt-get install gdb strace ltrace lsof
  • strace trace les appels systèmes
  • ltrace trace les appels de fonctions de bibliothèques externes
  • lsof liste les fichiers ouverts

Analyse de code Python

apt-get install pyflakes pylint pychecker

OpenOffice

apt-get install openoffice.org openoffice.org-l10n-fr ttf-mscorefonts-installer

Utilisez DicOOo pour installer des dictionnaires français plus complets

Wifi

apt-get install network-manager-kde
  • Il semble que je doive exécuter knetworkmanager en tant que root (problème de permission ?)

Firmware pour mon chipset Intel 3945 :

apt-get install firmware-iwlwifi

Cet article concis et fouilli me servira de notes au cas où je réinstalle la machine. J'espère que vous découvrerez de chouettes paquets parmis ceux que j'ai listé. C'est enfin le moment tant attendu pour placer cette URL : Debian Package of the Day.

mardi 23 septembre 2008

Acheter un billet ou trouver des horaires SNCF

Aujourd'hui, un collègue m'a demandé quel était le meilleur moyen d'acheter un billet de TGV sur Internet. Bien que j'effectue régulièrement des aller-retours Strasbourg-Paris en TGV, je ne connais pas LA solution idéale. Néanmoins je connais quelques astuces.

voyages-sncf.com

Le site de référence pour acheter des billets de train en France est voyages-sncf.com. Accessoirement, il semble que ça soit le seul site Internet permettant d'acheter des billets SNCF en ligne. C'est également le pire site Internet que je connaisse : bugs d'affichage avec mon navigateur (Konqueror) empêchant parfois de naviguer dans le site, indisponibilités régulières (parfois pendant plusieurs heures), difficultés pour trouver le bon train (absence de réponse ou réponses aberrantes), formulaires compliqués (choix du train et achat en ligne), etc.

Ce site existe depuis 2000 et est géré par le Groupe Voyages-sncf.com (VSC, AVSC et VSCT). Le site utiliserait Oracle sous Solaris, et les bornes (en gare) sont sous Windows XP. Le groupe VSC emploie plus de 260 personnes.

Sites web SNCF alternatifs

Il existe une version allégée de voyages-sncf : voyages-sncf.mobi, version destinée aux téléphones mobiles mais utilisable sur un ordinateur. Je ne l'ai jamais utilisé pour acheter un billet, mais il semble beaucoup plus simple. Notez l'absence de publicité !

Il existe également tgv.com qui propose des informations sur les trains TGV. On peut rechercher des horaires ou acheter un billet, mais on est fatalement redirigé sur voyages-sncf.com.

Bah tiens, il existe aussi ter-sncf.com, peut-être enfin un site SNCF simple pour trouver des horaires ? Mis à part un petit bug (il me demande de choisir entre la gare et la commune de Sélestat, or c'est la même chose), l'affichage des résultats est propre et la navigation dans les horaires suivantes / précédentes est agréable. Il n'est pas possible d'acheter de billet en ligne. En même temps, pas besoin de réserver pour un TER.

Il existe aussi les sites d'information sncf.com (informations générales sur la SNCF) et infolignes.com (état actuel et prévisions du trafic).

Agences SNCF

Il existe aussi des agences SNCF dans les centres villes (dans les grandes villes en tout cas) qui évitent d'aller en gare pour acheter des billets. À Paris, j'avais également vu des bornes (les gros trucs jaunes) en super-marché (Monoprix), mais leur disponibilité est loin du 100%.

Horaires des trains sur les sites étrangers

  • bahn.fr (Allemagne) : site de la Deutsche Bahn simple, efficace et disponible dans trois langues (allemand, français et anglais). Il demande juste de préciser son âge pour calculer le prix du billet.
  • sbb.ch (Suisse) : site des Chemins de fer fédéraux suisses disponible en quatre langues (français, allemand, italien et anglais). La page d'accueil est très sobre et n'affiche qu'un moteur de recherche.

Ce qui me choque aussi bien sur bahn.de ou sbb.ch, c'est la vitesse à laquelle apparaissent les résultats d'une recherche. Ils n'ont besoin que d'une seconde alors que voyages-sncf.com prend environ cinq secondes pendant lesquelles il nous impose une publicité ! D'ailleurs, la navigation sur voyages-sncf.com est lente de manière générale, pas uniquement lors d'une recherche. Il faut s'armer de patience pour « modifier tous les souhaits ».

Pour finir

Un ami m'a parlé du site trocdesprems.com qui permet de revendre ou d'acheter des billets Prems (non échangeables ni remboursables). Je n'ai jamais acheté de billet sur ce site, mais je suis sûr qu'on peut y faire de bonnes affaires.

dimanche 21 septembre 2008

Fusil en version 1.0 et article dans MISC (pan!)

Après 3 versions béta, le projet Fusil est enfin sorti en version 1.0 ! La version 1.0beta3 a été annoncée dans un journal linuxfr, et sur les listes de diffusions Full Disclosure et Pen test.

Nouveautés de Fusil 1.0

Entre la version 0.9.1 et la 1.0, la liste des changements est longue, mais voici les plus importants :

  • Fusil exécute maintenant les processus fils sous un autre utilisateur UNIX (fusil) pour éviter qu'il supprime vos fichiers ou tue vos processus !
  • Création d'un script replay.py pour pouvoir rejouer une session. Il permet de rejouer une session dans gdb, Valgrind ou gdb.py.
  • Possibilité de créer un fichier de configuration (~/.config/fusil.conf) pour modifier de nombreuses options (ex: désactiver le débogueur)
  • Renomme le dossier d'une session avec le type d'erreur pour pouvoir regrouper les sessions similaires (ex: « invalid_read-null », « div_by_zero », « timeout », etc.).
  • Chaque fuzzer est un programme qui a ses propres options en ligne de commande : utilisez l'option --help pour obtenir l'aide de chaque fuzzer
  • Création de fusil-vlc : teste le lecteur multimédia VLC
  • Création de fusil-zzuf : réutilise la bibliothèque zzuf de Sam Hocevar. Contrairement aux outils Fusil, zzuf mute les fichiers en mémoire, ce qui est plus rapide et permet de travailler avec de très gros fichier (plusieurs giga-octets).
  • Support de Python 3000 avec le script de conversion conv_python3.0.sh qui utilise le programme 2to3 puis applique quelques patchs supplémentaires
  • Support minimal de Windows

Fusil fonctionne sous Linux, FreeBSD et Windows. Il nécessite Python 2.4, supporte CPython et PyPy. Des paquets Debian, Mandriva, et d'autres distributions Linux sont disponibles.

Article dans le magazine MISC

J'ai écrit l'article « Pratique du fuzzing avec Fusil » dans le dernier numéro du magazine MISC (#39). L'article fait parti du dossier dédié au fuzzing.

D'ailleurs, j'ai bien aimé aimé l'article sur Sulley (fuzzer similaire à Fusil) de Gabriel Campana et Laurent Butti (deux dingues de fuzzing qui vous envoyent des exploits noyaux par le wifi !). J'y ai appris qu'ils ont réutilisé python-ptrace (binding Python de ptrace) pour porter Sulley sous Linux.

jeudi 11 septembre 2008

Phobies des nombres

Alors que je recherchais une liste des numéro de commit pour lesquels il faut payer son coup (exemples : 1000, 1664, 5000), je suis tombé sur une liste des phobies sur Wikipédia. J'apprend qu'il existe la triskaidékaphobie, peur du nombre 13, et l'hexakosioihexekontahexaphobie, la peur du nombre 666. Alors comme ça il existe des avions sans place numéro 13, j'avais jamais fait attention :-) Photo des boutons d'un ascenseur sans étage 4 ni 13 :

J'avais aussi lu que les appartements numéro 13 se vendent moins bien, en y réfléchissant, ça se comprend. Ça me rappelle un article sur l'absence de quatrième étage : c'est la tetraphobie, peur du nombre 4 venue de Chine où la prononciation du nombre 4 (四) sonne comme le mot « mort » (死). Un bande dessinée sur ces phobies :

(lire la BD en grand format : 600x720 pixels)

Bon, avec tout ça, je ne suis pas avancé pour savoir si je dois ou non payer mon coup pour le commit numéro 2175 ;-) Je devrais peut-être le décomposer en nombre premiers pour voir, ou alors séparer chaque chiffre et en calculer la somme modulo 17, ou .... euh, je vais arrêter ça tout de suite avant de finir en tuant ma copine (histoire de placer une référence au chouette film « 23 » avec Jim Carrey) !

vendredi 22 août 2008

Déboguer un programme Python avec gdb

Python est un langage interprété par une machine virtuelle appelée CPython. Dumoins, CPython est l'implémentation de référence, il en existe d'autres moins répendues (PyPy, Jython, IronPython, etc.). Pour ceux qui ne le savent pas encore, CPython est écrit en langage C. Lorsque CPython plante (« Fatal error: ... », erreur de segmentation ou autre), il est difficile de connaître les raisons du plantage. Ce billet devrait vous éclairer un peu si vous en êtes arrivé à passer par gdb pour déboguer Python.

Lire la suite

lundi 18 août 2008

Attaquer un générateur de nombres pseudo-aléatoires

Je commence doucement à comprendre comment fonctionnent les générateurs de nombres pseudo-aléatoires (PRNG) et à voir quel est leur impact dans la sécurité informatique. En bref : la sécurité repose sur eux, trouver une faille dans le générateur revient à compromettre la sécurité !

Utilisations des PRNG

Cas où les PRNG empêchent qu'un espion puisse lire ou injecter des données dans un canal de communication (connexion réseau) :

  • L'établissement d'une connexion SSL (https dans firefox) ou SSH utilise un PRNG pour générer des clés de session
  • La sécurité du protocole TCP repose sur un PRNG

Cas où un PRNG sert à prouver l'identité d'une personne :

  • Création d'un mot de passe (ex: programme pwgen) ou d'une clé SSH utilisés pour l'authentification
  • Création d'un certificat X.509 (ex: identité d'un serveur avec https)
  • Création de clés GPG (courriels)
  • etc.

Attaquer la graine

La graine est un nombre de N bits utilisé pour construire l'état interne (M bits) du PRNG. N est souvent plus petit que M. Exemple : time(NULL), 32 bits voir beaucoup moins, est utilisé pour construire l'état interne de l'algorithme Mersenne Twister (20.000 bits). Il est plus facile de deviner N bits que M (32 vs 20.000 dans le cas de Mersenne Twister), c'est donc la première cible.

Obtenir la graine permet de reconstruire l'état interne initial complet.

Cas réel :

  • Dans la faille OpenSSL Debian, la valeur réelle de N était 15 : ce qui donne seulement 32.768 graines différentes
  • DSA-152-1 l2tpd -- missing random seed : la graine était tout simplement constante...

Une graine basée uniquement que sur time(NULL), getpid() et getppid() ne peut être utilisée dans un contexte de sécurité. Il faut utiliser de vraies sources d'entropies (ex: /dev/random sous Linux).

Reconstruire l'état interne

Si un attaquant arrive à obtenir suffisamment de bits générés par le PRNG, il pourra reconstruire l'état interne du PRNG. Dans le cas de Mersenne Twister, il suffit de 19.937 bits (ou 624 nombres de 32 bits) pour reconstruire l'état interne complet.

Pour éviter qu'un attaquant puisse reconstruire l'état interne du PRNG à partir de bits générés, on peut utiliser une fonction de hachage (ex: SHA-1) sur sa sortie. Un attaquant devra inverser la fonction SHA-1 pour obtenir l'état interne (ce qui est possible mais très coûteux).

Biais dans un générateur

Pour générer un nombre pseudo-aléatoires dans un intervalle, un mauvais PRNG va produire certaines valeurs plus fréquemment. En connaissant le biais, l'attaquant peut gagner du temps en testant ces valeurs en priorité.

Un bon PRNG donne une distribution uniforme : chaque nombre doit sortir avec une probabilité identique. Assurez-vous que le PRNG passe tous les tests statistiques connus (ex: Mersenne Twister ne passe pas tous les tests de Dieharder).

Porte dérobée dans un générateur

Il a été prouvé (lire Des Trappes dans les Clés) qu'il est possible de construire un PRNG valide (passant tous les tests statistiques) possédant une porte dérobée. Son auteur peut alors calculer les nombres générés sans pour autant connaître la graine. En pratique, l'attaquant devra toujours effectuer une recherche par force brute, mais avec un coût très inférieur au coût classique de recherche exhaustive (ex: 2^32 au lieu de 2^256).

La porte dérobée peut être introduite au niveau algorithmique (ex: On the Possibility of a Back Door in the NIST SP800-90 Dual EC PRNG) ou bien dans une implémentation.

Limiter l'effet d'une attaque dans le temps

Casser un PRNG permet de :

  • Calculer les nombres précédemment générés (passé)
  • Calculer les nombres qui vont être générés (futur)

L'opération de regénération de la graine, appelée reseed, limite la portée d'une attaque. Cette opération peut se faire après avoir généré N bits (ex: générer 1000 mots de passe) ou alors une fois que le pool d'entropie a atteint un certain seuil (dépend des générateurs matériels et non plus de la quantité de bits pseudo-aléatoires générés). Un pirate n'aura donc pas accès à tous les mots passe (certificats ou autre) précédents et suivants, mais seulement une partie.

Appeler reseed après chaque nombre généré est une très mauvaise idée si la graine est de mauvaise qualité. Exemple : appeler srand(time(NULL)) après chaque appel à rand() va avoir pour conséquence de générer plusieurs fois le même nombre durant la même seconde. Il est primordial d'utiliser une source ayant une excellente entropie.

Pour en savoir plus : Random number generator attack.

dimanche 13 juillet 2008

Mon poste de travail

Je suis devant mes ordinateurs de 8h jusqu'à plus de 16h certains jour. Mon poste de travail est donc critique. Je vous invite pour une petite visite, voir l'antre depuis lequel je télétravaille.

Bien sûr, j'ai tout rangé pour la photo :-) La chaise avec dossier en cuir est rigide et s'incline quand je me penche en arrière. Les pieds du bureau sont dans les coins, donc en pratique, j'ai énormément d'espace pour les jambes. L'imprimante dans un coin est une imprimante laser noir et blanc : HP LaserJet 2015. Elle est parfaitement compatible Linux, imprime la première page en 8,5 secondes et les suivantes suivent immédiatement. La machine à café, Magimix de Nespresso, n'est pas compatible Linux mais produit un excellent café :-)

J'utilise deux écrans en 1280x1024 pixels côte à côte, chacun branché sur un ordinateur différent : un portable (écran au fond en jaune) et un fixe (fond bleu). C'est des écrans LCD 17 pouces que je trouve agréables. Je n'ai pas réellement noté de différence avec un écran CRT... mis à part l'encombrement : les écrans prennent juste 5 cm en profondeur, ce qui laisse toute la place à mes bras.

Grâce à Synergy, je n'utilise qu'un seul couple clavier-souris pour les deux ordinateurs. Il suffit de passer le curseur de la souris sur le bord de l'écran pour changer de machine. Le copier-coller fonctionne dans les deux sens, même quand j'utilise Windows sur une des machines. Le clavier est un Logitech UltraX : sensisble, silencieux et assez lourd pour être stable. Je voulais essayer un clavier « plat » et j'en suis plutôt satisfait, c'est agréable.

Ma souris n'est pas une souris mais une trackball : Logitech Cordless Optical TrackMan. Ce périphérique épouse la forme de la main. C'est beaucoup plus reposant qu'une souris, les muscles sont moins contractés.

J'ai toujours une souris (secondaire) dans un coin pour Gimp ou quand la trackball m'énerve. Effectivement, une trackball est moins précise qu'une souris, en particulier pour cliquer sur une zone de 10x10 pixels ou moins. Exemples : fermer une fenêtre en cliquant sur la croix, case à cocher dans un formulaire web, sélectionner une ligne de texte dans une page web ou document PDF, etc. Je redécouvre l'ergonomie par la pratique :-)

Pour finir, la déco. En face, un poster de Gilles Tran (Main Street (West)), à côté une peinture de Dalí (Une femme à la fenêtre), et à gauche un poster de Gaston dessiné par Franquin ramené du musée de la bande dessinée de Bruxelles :

Fin de la visite, n'oubliez pas le guide (laissez un commentaire ;-)).

jeudi 19 juin 2008

Améliorer la ligne de commande

En dehors des raccourcis claviers que j'avais déjà abordé, il existe énormément d'astuces pour améliorer la ligne de commande sous Linux. En voici quelques unes pour gagner encore plus de temps avec la ligne de commande.

Complétion avancée

La touche TAB sert à compléter automatiquement les commandes. C'est diablement efficace, mais bash peut faire mieux ! En chargeant /etc/bash_completion, la complétion dépendra du programme utilisé. « kpdf <tab><tab> » n'affichera que les fichiers PDF (et les répertoires). « apt-get install python-<tab><tab> » affiche les paquets Debian installables dont le nom débute par « python- ». Pour l'activer la complétion avancée, ajoutez dans votre ~/.bashrc :

source /etc/bash_completion

Le chargement de bash sera plus long, mais vous serez beaucoup efficace avec votre ligne de commande !

Ignorer les doublons dans l'historique

Par défaut, bash conserve toutes les commandes tapées. J'ai présenté dans mon billet précédent la variable d'environnement HISTIGNORE pour ignorer certains commandes. Pour ne pas sauver un commande saisie plusieurs fois, utilisez :

export HISTCONTROL=ignoredups

Rappel : CTRL+r permet de rechercher une commande déjà tapée en en saisissant quelques lettres.

Utiliser most plutôt que less pour lire du texte

Pour lire un fichier texte, il existe le programme more qui n'est pas très pratique. Le programme less est mieux : il permet de revenir en arrière, rechercher du texte, etc. Il existe encore mieux ! most utilise des couleurs (meilleur rendu des pages de manuel), permet de découper l'écran en plusieurs vues indépendentes, etc. Lisez l'aide intégrée pour les détails. Installez-le avec « apt-get install most » et choisissez-le par défaut en ajoutant dans votre fichier de configuration ~/.bashrc :

export PAGER=most

Activer les couleurs

Plusieurs programmes permettent d'afficher des couleurs mais ne le font pas par défaut pour des raisons de compatibilité avec les anciens terminaux. Activez les couleurs avec :

alias ls='ls --color=auto'
alias grep='grep --color'
alias egrep='egrep --color'

Tailles de fichier avec des unités humaines

L'option « -h » permet d'afficher les tailles avec des unités plus facilement compréhensibles par un humain (19 Ko, 367 Mo, 1 Go, ...) :

alias du='du -h'
alias df='df -h'

La commande ls supporte également l'option.

Passer en mode verbeux

Par défaut, les programmes sont silencieux : ils ne disent pas ce qu'ils font. Or c'est pratique pour vérifier qu'on a bien fait ce qu'on voulait. Aliases pour activer le mode verbeux :

alias ln='ln -v'
alias cp='cp -v'
alias mv='mv -v'
alias rm='rm -v'

Personnaliser l'invite

L'invite est le court texte invitant à saisir une commande, du style « haypo@marge:~$ ». C'est la variable d'environnement PS1 qui contient l'expression pour générer cette invite. « \u » est remplacé par le nom d'utilisateur, « \h » le nom de la machine, « \w » le répertoire de travail, etc.

Je n'aime pas du tout avoir une invite qui contient le répertoire de travail car l'invite prend rapidement toute la largeur de l'écran. J'utilise donc une invite qui ne contient que le nom de la machine :

export PS1='\h$ '

C'est rudimentaire mais efficace. La commande « pwd » me sert à me rappeler où je suis quand je me perd ;-)

Voilà, j'espère que je vous ai appris des trucs, n'hésitez pas à m'en apprendre d'autres en déposant un commentaire !

jeudi 8 mai 2008

Pycon FR : les Journées Python Francophones édition 2008 (JPF08)

Comme l'année passée, je participe aux Journées Python Francophones organisées par l'AFPy à Paris (à la Cité des Sciences et de l'Industrie pour être exact). Contrairement aux conférences telle que Blackhat où l'entrée coûte plusieurs milliers d'euros, Pycon FR est entièrement gratuit !

Pour les gens qui ne peuvent pas se rendre à Paris ou qui sont déjà pris ce week-end là, aucun soucis ! Les conférences seront diffusées en direct sur Internet (ils ont pensé à tout). Elles seront très certainement disponibles en téléchargement un peu plus tard.

Au niveau du programme, je vous laisse le consulter vous même. Je donne une conférence sur l'interprète PyPy et une autre sur Python 3000. Il faudrait d'ailleurs que je commence à les préparer... Pour l'anecdote, j'ai deux collègues INL qui donnent des conférences (seb et misc) :-)

Pycon FR est aussi l'occasion de rencontrer des programmeurs Python et de discuter autour d'un café ou d'une bière. Alors, viendez !

mercredi 9 avril 2008

Traitement d'image

Maintenant que j'ai écrit combien je suis indigné de la retouche photo, je vais vous présenter quelques outils de traitement d'image impressionnants :-)

Morphing de visage en 3D (1999)

Exemple de modification du visage de Tom Hanks à partir d'une seule photo (1) :

Scale2x (2001)

  • Auteur : Andrea Mazzoleni
  • Utilisation : Agrandir 2 ou 4x la résolution (en pixels) d'anciens jeux de faible résolution (typiquement 320x200 pixels en 16 ou 256 couleurs)
  • Site internet : Scale2x
  • Démonstration : Scale2x, Scale4x

Exemple de l'algorithme Scale2x :

Interactive Digital Photomontage (2004)

  • Auteurs : Aseem Agarwala, Mira Dontcheva, Maneesh Agrawala, Steven Drucker, Alex Colburn, Brian Curless, David Salesin, Michael Cohen
  • Site Internet : Interactive Digital Photomontage
  • Utilisations :
    • Créer une photo de famille où tout le monde souri à partir de plusieurs photos
    • Supprimer des personnes et objets pour créer une photo de paysage ou monument « propre »
    • Augmenter la profondeur de vue d'une photo macro (pris à quelques centimètres d'une plante ou animal)
    • Créer un panorama
    • Corriger l'éclairage d'un objet
  • Publication : Interactive Digital Photomontage (mai 2004)

Exemple de montage tronqué et simplifié (j'ai apposé moi même les marques vertes et rouges pour mieux comprendre) pour créer une photo de famille où tout le monde est heureux :

GREYCstoration (2006)

Exemple tronqué de la suppression de la cage d'un perroquet :

Seam Carving for Content-Aware Image Resizing (2007)

Exemple de réduction de la hauteur d'une photo d'un port (j'ai réduit l'ensemble avec un redimensionnement cubique pour que ça tienne dans le blog) :

Je n'ai présenté que quelques outils que je connais. Il en existe sûrement d'autres encore plus puissant ! Bientôt Blade Runner sera la réalité...

On nous cache tout, on nous dit rien !

On nous cache tout, on nous dit rien
Plus on apprend plus on ne sait rien
On nous informe vraiment sur rien

... chantait Dutronc en 1966. Et bien, il avait plutôt raison et ça ne fait qu'empirer. Pour commencer, voici deux exemples frappants :

À gauche (Curves Cereal: The Lid Said Flesh Tone) la couleur de peau change au niveau du nombril, alors qu'à droite (Parenting: All The Fun Is In The Top Half) un bébé n'a pas de bas ventre ! Ces photos sont extraites de l'excellent blog Photoshop disasters qui liste les pires photos retouchées par le logiciel Adobe Photoshop. Retoucher une photo (modifier la réalité) n'est jamais fait au hasard. Parfois, c'est pour retirer quelques détails disgracieux du visage ou du corps, dans le but de rendre beau. Rappelez vous l'histoire du magazine Paris Match qui a gommé les bourrelets du président Sarkozy (article du journal Libération, août 2007) :

Sans parler de retouche, la publicité a tendance à faire de très belles photos, parfois bien différentes de la réalité. Exemple avec le site Pundo 3000 qui compare la photo sur l'emballage (est-ce qu'il y a une mention non contractuelle écrit en tout petit ?) et le produit une fois déballé :

Je vous conseille également le page Fast Food: Ads vs. Reality. La retouche sert également à des fins politiques ! L'UMP a par exemple fabriqué de fausses preuves pour contrer les verts qui proposent de taxer les automobilistes utilisant le périphérique de Paris (L'UMP d'Ile-de-France a besoin d'une formation à Photoshop, janvier 2008) :

La retouche photo est beaucoup plus vieille que Photoshop (qui lui date de 1980). Le livre Le commissariat des archives d'Alain Jaubert (ISBN: 9782736000479) contient des photos retouchées de Lénine, Staline, Mao Zedung, Mussolini, et d'autres... À l'occasion, je scannerai peut-être quelques exemples.

lundi 10 mars 2008

Un nouvel antispam pour ce blog !

Dans le plus pur respect du syndrôme NIH, j'ai écrit mon outil de détection de spam pour les commentaires Dotclear : antispam. Je sens que rien que le nom vous fait déjà trépigner d'impatience.

Système de notation

Je me suis inspiré de mon travail sur la notation dans le projet Fusil pour noter les commentaires, ce qui n'a rien de révolutionnaire en soit (SpamAssassin le fait déjà). J'ai écrit des règles empiriques selon mes observations sur les spams. L'idée est de rechercher les caractéristiques typiques des spams puis de les transformer en règles.

Voici les règles utilisées actuellement :

  • Adresse de courriel : liste blanche/noire pour les domaines, voir conf/email_domains.txt (liste noire par défaut)
  • Mots clés : recherche de mots clés à partir d'une liste blanche/noire, voir conf/words.txt (liste noire par défaut)
  • Ratio des lettres latines majuscules et du nombre total de lettres latines : s'il y a plus de 35% de majuscules, le message gagne 5 points
  • Longueur du texte : si le texte hors liens externes contient moins de 30 lettres latines, le message gagne 2 points
  • Ratio d'url par domaine : s'il y a plus de 3 liens vers le même domaine (en moyenne), le message gagne 5 points
  • Pour chaque url, une liste blanche/noire (plutôt liste blanche) permet d'attribuer un score selon le domaine. Si l'url ne correspond à aucun domaine, elle obtient une note de +1 point

Finalement, j'utilise peu de règles pour éviter les faux-positifs (message légitime détecté comme spam). Ce n'est pas nécessaire car je n'ai pas encore vu passer de faux-positif.

Résultat sur les commentaires de ce blog

En utilisant un score initial de -3, les commentaires légitimes ont une note négative entre -3 et -2. Pour les spams, j'ai observé trois types selon la note moyenne :

  • (A) note de 0,5 à 2 : un ou deux liens, message court, texte crédible en anglais
  • (B) note de 15 à 25 : une dizaine de liens vers le même serveur avec quelques mots anglais aléatoires
  • (C) note de 150 à 200 : grosse collection de liens et liste presque exhaustive des mots clés que j'ai mis en liste noire (ex: une vingtaine de variantes de « buy cheap viagra » dans le même message)

Les spams de type (B) et (C) sont triviaux à détecter. Les plus pénibles étant les spams de type (A).

Exemple de spam pénible

Commentaire reçu aujourd'hui, j'ai remplacé les urls par xxx :

Author: brazilian <thongwaxingbrazilian@mail.com>
Website: http://xxxxxxxxx.nl/35424
IP: 218.16.224.243

- she reached for her clit. madam, i ve got arthritis,
<a href=  http://xxxxxxx.com/phpbb/barthololauries.html >waxing thong brazilian</a> and.

Le message contenait aussi deux caractères Unicode invalides (U+0092 et U+0093). Analyse avec la configuration actuelle d'antispam pour ce blog :

Match URL (+1.0): http://...
Match URL (+1.0): http://...
Match email domain (+1.0): mail.com
-stdin- score: +0.00

Le message n'est pas détecté comme spam. J'ai donc ajouté les mots clit, brazilian, thong et waxing en liste noire pour gonfler la note jusqu'à +7.

Fiabilité de l'antispam

Après une semaine de développement sur antispam, je suis plutôt content du résultat. Bien que cet outil demande beaucoup de configuration manuelle, il supprime déjà environ 90% du spam de ce blog. Sachez que je reçois à peu près 100 spams par jour sur ce blog.

L'ancien moteur de spam était fiable à 100% : il bloquait simplement tout message contenant un lien externe. J'essaye de le rendre un peu plus laxiste pour autoriser les liens externes.

Amélirations possibles

Idée pour améliorer antispam :

  • Réutiliser du code (au moins des idées) des antispams existants (ex: Spam Karma)
  • Utiliser un filtre bayésien
  • Utiliser des listes noires (URL / IP / email) dynamiques
  • Filtrage horaire et/ou selon le jour de la semaine (je pense qu'il y a peu de commentaires légitimes entre 2h et 7h)
  • Utiliser des listes blanches ou d'autres règles pour diminuer la note

Contactez moi directement si vous voulez tester antispam sur votre forum ou votre blog. L'intégration étant pénible à automatiser. Antispam est écrit en Python et distribué sous licence GNU GPL.

Comment réaliser un fuzzer ?

Après de dizaines de projets d'articles avortés (mort-nés), j'ai enfin réussi à en finir un ! C'est l'article « Comment réaliser un fuzzer ? » qui est publié dans le magazine de sécurité informatique MISC numéro 36 (mars/avril 2008). J'explique quels sont les points critiques lorsqu'on écrit un fuzzer : génération des données, surveiller la cible, auto-configuration du fuzzer, etc. Image de la première des six pages de l'article :

L'article parle indirectement de mon travail sur le projet Fusil. Un deuxième article plus pratique et dédié à Fusil devrait suivre dans le prochain MISC (reste à l'écrire...).

Je regrette d'avoir oublié la section remerciements à la fin de l'article. Alors je profite de ce blog pour remercier Sebastien Tricaud, Feth Arezki, Stéphane Marchesin et ceux que j'ai oublié pour leurs relectures attentives et leurs conseils avisés. Merci aussi à Anthony Carré pour m'avoir encouragé à écrire pour des magazines papiers :-)

Au passage, si vous êtes amateur de sécurité informatique mais que vous ne connaissez pas encore MISC, je vous en conseille la lecture. Le prix élevé de 8€ est à diviser par deux car c'est un bimensuel : ce qui donne 4€/mois. D'ailleurs, il faut deux bons mois pour digérer les articles souvent complexes ;-)

dimanche 9 mars 2008

Spam dans les forums, blogs, etc.

Le spam désigne un « message non sollicité ». Avant limité à la messagerie électronique, le spam inonde aujourd'hui Internet en utilisant n'importe quel moyen de publier du texte avec des liens externes. Les plus touchés sont les forums (ex: phpbb) et les blogs (ex: dotclear). Plus généralement, plus la cible est populaire, plus elle a de chances d'être spammée. Dès lors, n'importe quel formulaire public devient est cible potentielle.

Filtrage par test de turing

Pour limiter le spam, l'inscription aux forums est devenue pénible : besoin de confirmer l'inscription par courriel par exemple. De même, déposer un commentaire sur un blog demande souvent des talents en décodage de hiéroglyphe (captchas). Le spam doit vraiment être lucratif car qu'importe le niveau de complexité de la protection, elle est déjouée un jour ou l'autre. La meilleure parade aux captchas étant de demander à des humains de les décoder à votre place. Cette faille déjoue l'ensemble des tests de turing !

Filtrage de l'enveloppe

On pourrait alors penser à filtrer l' « enveloppe » : les informations obtenues sur l'expéditeur du message. Le nom de l'expéditeur est généré aléatoirement et pourtant crédible, on ne peut pas en faire grand chose. Son adresse de courriel est souvent crée pour l'occasion sur un serveur offrant des adresses gratuites (ex: gmail). L'adresse IP semble une bonne piste pour bloquer un spammeur. Sauf que les spammeurs ont aussi trouvé une parade : ils louent des serveurs à moindre coût pour émettre anonymement du spam. Ces serveurs peuvent faire parti d'un botnet : ordinateurs verrolés à l'insu d'internautes légitimes. Bloquer une IP empêcherait un internaute légitime de poster un commentaire. De toute manière, les spammeurs changent régulièrement de serveurs (et donc d'adresse).

Filtrage du contenu

Si l'enveloppe n'est pas une information fiable, on peut se concentrer sur le contenu du message. Bien que chaque spam soit différent, on peut tout de même reconnaître certaines caractéristiques générales :

  • un spam comporte au moins un lien externe (parfois une dizaine ou plus)
  • on retrouve les même mots tels que « porn », « download » ou encore « viagra »

Une fois de plus, ces caractéristiques ne sont pas fiables à 100%. Certains spammeurs contournent le blocage par mots-clés en modifiant légèrement le terme : « viagra » devient « v1agra » par exemple. Concernant les liens externes, on commence à trouver des liens pointant sur google.com (ex: sur groups.google.com et pages.google.com) : bloquer un domaine est donc plutôt hasardeux. Bien que les spams ne comportant aucun lien externe soient rares, bloquer tout message comportant un lien externe est très contraignant pour l'internate légitime.

Filtrage par l'obscurité

Pour déjouer les plans des robots, certains se protègent en modifiant les formulaires de leur application. Une bidouille est d'ajouter un champ au formulaire. Ce champ contient un valeur spéciale ou est laissée vide : si le bot le modifie, le message est considéré comme un spam. Ce champ peut être caché (type HTML hidden ou caché par la mise en forme CSS) ou visible, auquel cas une mention avertira l'internaute de ne pas y toucher. Malheureusement, de telles pratiques relèvent de la sécurité par l'obscurité et ne peut être utilisé à grande échelle. Une fois l'astuce connue, des robots vont la déjouer facilement.

Filtrage par pot de miel

Il existe des services mettant en place des pots de miel : forums, blogs et autres dédiés à la récolte de spam. Cette collecte permet de créer une liste noire d'URL et/ou d'IP, exemples : surbl.org et projecthoneypot.org. La technique du pot de miel ne sert qu'à limiter la diffusion d'un spam.

Aucun espoir ?

C'est en écrivant mon propre antispam pour ce blog que j'ai réalisé l'ampleur du problème. Bien qu'aucune protection citée n'est fiable à 100%, cumuler plusieurs solutions permet de bloquer l'essentiel du spam, allégeant considérablement la charge du modérateur.

Malheureusement, plus un moyen de protection est efficace, plus il est utilisé, plus les spammeurs vont se concentrer dessus pour le déjouer. La sécurité par l'obscurité semble donc conseillée voir nécessaire. Des services comme Akismet reposent justement sur ce principe. Pourtant, je m'y oppose car c'est contraire à l'esprit de partage du logiciel libre !

mardi 4 mars 2008

Scanneur de ports PortBunny

Comme je n'ai pas pu aller au 24th Chaos Communication Congress (fin décembre 2007), je me suis rabattu sur les vidéos publiées quelques temps après. J'ai beaucoup apprécié les vidéos « (2279) Deconstructing Xbox 360 security » et « (2131) Port scanning improved ». Je voudrais parler plus particulièrement de PortBunny, un nouveau scanneur de port qui a pour logo un lapin rose. Le diaporama de la présentation est disponible en ligne.

Lire la suite

Historique de la faille vmsplice()

Le chercheur en sécurité Wojciech Purczynski, employé par COSEINC et membre de l'association iSEC Security Research, a trouvé divers bugs dans l'appel système vmsplice() du noyau Linux. Cette fonction, introduite avec Linux 2.6.17, sert à envoyer des données de l'espace utilisateur vers l'espace noyau pour alimenter un pipe. Lire mon précédent billet sur l'évolution des entrées/sorties dans Linux pour les détails. Les développeurs noyau sont prévenus dès le 1er février. Cet article relate la publication, l'exploitation, puis la correction de ces failles.

Lire la suite

mardi 19 février 2008

Profiling PHP et Javascript

Lorsqu'on cherche à accélérer une application, on a besoin d'outils pour en mesurer les performances : isoler les fonctions les plus lentes et suivre l'évolution des performances. La méthode la plus simple est de sauver une estampille de temps au début et à la fin de l'opération testée, puis de calculer la différence en répétant la mesure pour la fiabiliser. Cette méthode est loude à utiliser car il faut modifier le code source. Je vais vous présenter des outils plus simples pour PHP et Javascript.

PHP : Xdebug

L'outillage PHP est rare et de piètre qualité. Néanmoins, je suis tombé sur XDebug qui, pour une fois, semble d'excellente facture. Ce projet est un extension PHP au moteur Zend qui permet de mesurer les performances d'un script PHP, d'analyser la couverture de code, ou encore de déboguer interactivement un script.

Pour compiler le projet sous Linux, vous aurez besoin de l'outil phpize qui va générer le script configure. Cet outil fait parti du paquet Ubuntu php5-dev. Bizzarement, Ubuntu (/usr/lib/command-not-found) ne propose pas d'installer le paquet php5-dev quand on tente d'exécuter phpize. Incapable de corriger le problème, j'ai ouvert un rapport de bug.

Une fois le module installé (./configure && make && sudo make install), il faut l'activer en ajoutant une option zend_extension à PHP. Sous Ubuntu, il suffit de créer un fichier /etc/php5/conf.d/xdebug.ini avec le contenu suivant (adaptez le chemin si besoin est) :

# configuration for php Xdebug module
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"
xdebug.profiler_enable=1

Maintenant, pour chaque hit sur une page PHP, un fichier /tmp/cachegrind.out.pid sera généré. Les résultats peuvent manipulés avec l'excellent KCacheGrind. Un des graphiques les plus utiles est l'arbre ci-dessous :

Note : Pour l'installation, je me suis aidé du guide Installer Xdebug pour PHP 5.2.

Javascript : Venkman et Firebug

Pour profiler Javascript, là encore, il y a peu d'outils. J'ai testé le débogueur Javascript Venkman dans Firefox. Malheureusement, j'ai rapidement été confronté à un bug Firefox : Venkman crashs on profiling after clearing profile data. J'ai perdu beaucoup de temps à isoler ce bug avec gdb et Valgrind. Et dire qu'un rapport de profiling Venkman est une longue page HTML incompréhensible...

J'ai perdu tellement de temps sur Venkman que je ne me suis pas aperçu que j'avais déjà la solution sous les yeux ! L'excellente extension Firebug contient déjà des outils de profiling Javascript. Pour profiler une page, activez Firebug, cliquez sur le bouton « Profile » (c'était vraiment sous mon nez), chargez la page à tester, puis recliquez sur « Profile ». Vous obtiendez un joli tableau synthétique où on peut changer la méthode de tri dynamiquement. Voir le tableau (tronqué) ci-dessous :

Note : Je n'ai pas eu le temps de tester Drosera qui est le profiler Javascript de WebKit.

Mots de la fin

Pour finir, petit rappel : une optimisation n'est profitable que lorsqu'on gagne plus de 5% (voir 20%). Parfois, un changement sera une légère accélération sur une machine, et un léger ralentissement sur une autre. Les micro-optimisations sont à bannir. Souvent, un algorithme qui convenait à de petites quantités de données se révèle avoir une complexité en O(n^2) voir O(n^3) et effondre les performances. Il faut alors changer d'algorithme. Autre méthode : limiter les appels aux fonctions lentes, en utilisant un cache par exemple.

lundi 4 février 2008

Sécurité des réseaux sociaux

Les années 2003 et 2004 ont vu fleurir un grand nombre de réseaux sociaux : LinkedIn, MySpace, del.icio.us, Orkut, Facebook, Flickr, ... La popularité de ces sites Internet a rapidement explosé : le nombre de membres se compte en millions. MySpace comptait 100 millions de membres en juillet 2007. Malheureusement, la sécurité de ces réseaux est régulièrement ébranlée. Pour le passage à l'année 2004, Annalee Newitz publiait l'article Defenses lacking at social network sites sur SecurityFocus. Extrait : « Williams explained that "XSS is amazingly widespread. Plus, XSS vulnerabilities are easy to discover and exploit" ». Les problèmes sont donc connus depuis longtemps. Voyons ce qu'il en est aujourd'hui.

Collecte d'informations : attaque ciblé et revente d'informations

Il y a un mois, Mary Landesman écrivait que les utilisateurs de réseaux sociaux donnent des détails sur leur vie, amour, travail, et loisirs qu'ils n'oseraient jamais dévoiler à un étranger dans un bar. Ces informations sont extrêmement utiles pour une attaque ciblée. L'attaque typique en ingénierie sociale est l'hameçonnage : envoi d'un courriel demandant à la victime d'aller sur un site Internet imittant l'habillage du site connu, ebay ou paypal par exemple, où elle sera invitée à saisir son identifiant, mot de passe ou autres informations confidentielles.

Certains réseaux sociaux indiquent ouvertement qu'ils revendent vos informations à des sociétés. Facebook en est un exemple : la section « Vie privée : la récolte et la vente des informations personnelles à des entreprises privées » de l'article Facebook de Wikipédia est forte instructive.

Heise-security vous conseille de ne pas noter d'information critique réelle telle que votre date de naissance ou votre adresse : posez-vous la question « est-ce que je dirai ça à un passant dans la rue ou à mon patron ? » avant de poster n'importe quel contenu. Petite anecdote amusante : How Facebook Ended My Marriage. Un couple ayant décidé de retirer leur fiançaille de leur profil Facebook, parce que c'était trop personnel, a provoqué une petite tornade à travers le monde. Plusieurs amis ont compris que leur mariage était annulé, certains allant même jusqu'à transmettre l'information par blog interposé.

Infection des sites Internet des réseaux

Comme on pouvait s'y attendre, les sites Internet des différents réseaux sociaux sont régulièrement infectés dans le but de prendre le contrôle du profil des membres ou bien d'infecter l'ordinateur des membres.

Samy is my hero

Le premier ver qui a fait parler de lui est le ver Samy is my hero injecté dans MySpace en octobre 2005. Le ver inscrit la victime comme ami de Samy et ajoute le message « but most of all, samy is my hero » au profil de la victime. L'auteur, Samy, a d'ailleurs monté une page web dédiée au ver. MySpace se protégait en bloquant le mot « javascript », mais Samy a outrepassé cette protection en écrivant le mot javascript avec un retour à la ligne entre java et script. Le code HTML est de la forme :

<div id=mycode style="background: url('java
script:eval(document.all.mycode.expr)')" expr="EXPLOIT"></div>

Le ver n'exploite pas vraiment de vulnérabilité de MySpace, mais plutôt du navigateur web. Pour que le ver fonctionne, ce dernier doit interprèter le Javascript inscrit dans le style CSS. Or un style CSS n'est pas prévu pour ça et le navigateur ne devrait pas le faire. Le ver fonctionnait sous Internet Explorer (Windows), mais ne touchait pas les versions récentes de Safari (Mac OS X) par exemple.

Le ver infectant automatiquement les amis des victimes (effet boule de neige), Samy a réussi à récolter un million d'amis MySpace en seulement 18 heures.

Failles Flash et WMF

En juillet 2006, MySpace a subi deux nouvelles infections. La première utilise une vulnérabilité du greffon Flash qu'Adobe avait corrigé il y à peine une semaine, lire MySpace Attacked by Flash Worm et Myspace Hack spreading like wildfire: SPAIRLKAIFS (16 juillet 2006). Le ver injecte du code HTML de la forme suivante dans le profil MySpace de la victime et installe un spyware sur l'ordinateur de la victime :

<embed allowscriptaccess="never" src="http://i105.photobucket.com/albums/mff225/yrkblack/redirecft.swf">

Quatre jours plus tard (20 juillet 2006), une publicité pour le site « DeckOutYourDeck.com » utilise une vulnérabilité WMF de Windows. Un cheval de troie est alors utilisé pour pour installer ClickSpring, un logiciel qui affiche de la publicité. Selon le Washington Post, ClickSpring a été installé avec succès sur un peu plus d'un million d'ordinateurs.

Livre d'or Orkut

En décembre 2007, c'est le réseau Orkut qui est infecté par un ver Javascript. Selon Symantec, le ver a modifié le profil d'environ 700.000 membres en 24 heures. Il modifiait le livre d'or (guest book) pour y injecter un lien vers du code Javascript. Des courriels ont également été envoyés aux victimes pour les persuader de visiter des livres d'or infectés. Les victimes étaient aussi inscrites automatiquement dans la communauté « Infectados pelo Vírus do Orkut » (infecté par le virus Orkut, en portugais). Le javascript génère du code Flash à la volé pour exécuter du code malicieux sans que la victime ne s'en rende compte. Le ver était resteint à Orkut, l'ordinateur de la victime n'était pas infecté.

Widget Facebook

Facebook propose à ses membres d'ajouter des widgets Javascript à leur compte. Début janvier dernier, un widget verollé installait le spyware Zango sur l'ordinateur des visiteurs. Le widget utilisait une <iframe> qui pointait sur l'installeur de Zango.

Infection par bandeaux publicitaires

Quelques jours après Facebook, un serveur de bandeaux publicitaires distribue du code verrolé exploitant des vulnérabilités des navigateurs web pour infecter l'ordinateur de la victime. De nombreux sites sont touchés, en particulier : MySpace, Excite.com et Blick.ch. Les bandeaux publicitaires installent des chevaux de troie comme RBot, SDBot et Spybot.

Vulnérabilités des barres d'outil

Pour faciliter la navigation, certains réseaux sociaux proposent des extensions pour votre navigateur web. Malheureusement, chacun s'est vu attribuer une faille. Petite liste d'exploits milw0rm :

Second Life

L'univers Second Life n'est pas en reste. De plus en plus populaire, il intéresse également les pirates.

Le premier événement majeur date de novembre 2006 : un ver appelé Grey Goo installe des anneaux d'or dans l'univers. Le ver a beaucoup ralentit Second Life qui a du être mis hors service pour se débarasser du ver.

En septembre 2007, une faille a été trouvée dans le client Second Life. Elle utilisait le scheme « secondlife:// » dans une <iframe> pour voler l'identifiant et le mot de passe de la victime en réalisant une fausse authentification.

Plus drôle, des chercheurs ont démontré que la vulnérabilité Quicktime pouvait être exploité dans Second Life. Ils ont fabriqué une vidéo qui volait 12 Linden dollars (5 cents américains) et faisait dire à sa victime « I got hacked » !

Comment se protéger

Les attaques présentées dans cet article utilisent souvent de multiple vulnérabilités pour monter une attaque complexe : navigateur web, Javascript, Flash, QuickTime, etc. D'une manière générale, il faut s'assurer que tous les logiciels de votre ordinateur sont à jour. Avec une distribution Linux, c'est trivial, des outils sont déjà prévu pour ça. Sous Windows, vous pouvez par exemple utiliser le logiciel Personal Software Inspector de Secunia. N'utilisant pas Windows, je ne l'ai pas testé.

Pour la navigation sur Internet, je vous conseille d'utiliser Firefox plutôt qu'Internet Explorer. Firefox est le seul navigateur web a avoir une protection Javascript efficace : l'extension NoScript.

Conclusion

Comme nous avons pu le voir, les réseaux sociaux deviennent une cible de choix car ils offrent aux pirates un moyen d'infecter un million de membres et/ou d'ordinateurs en une seule journée. Les premières attaques étaient l'œuvre d'hackers voulant démontrer leurs capacités d'outrepasser les protections. Aujourd'hui, c'est un marché lucratif qui sert à installer de la publicité et chevaux de troie sur l'ordinateur des victimes.

De nombreuses sociétés travaillent main dans la main pour rendre le web plus sûr : consultez le site OWASP pour en savoir plus.

Une fois n'est pas coutume, je voudrais dédicasser ce billet à Florent ;-)

samedi 26 janvier 2008

Failles de sécurité liées à Unicode

La complexité du jeu de caractères Unicode est source de nombreuses failles de sécurité. Cet article présente quelques failles récentes pour illustrer les problèmes qu'on peut rencontrer.

Écriture bidirectionnelle (RLO et LRO)

Le premier type que je veux présenter n'est pas un bug d'Unicode, mais une fonctionalité ! On peut changer l'ordre dans lequel est écrit le texte. Un dieu du CSS, Stu Nicholls, l'utilise pour afficher son adresse email en clair, alors qu'en fait elle est écrite à l'envers dans la souce HTML ! Le style CSS est « unicode-bidi:bidi-override; direction: rtl; ».

Sauf que des malins ont pensé à utiliser cette fonctionnalité pour tromper l'œil humain en cachant l'extension d'un nom de fichier. L'article Deceptive file names under Vista (septembre 2007) montre comment une programme Windows (.scr) est affiché comme une image JPEG (.jpg) dans Windows Vista. Windows XP ne supporte pas cette fonctionnalité et affiche donc les codes de contrôle Right-to-left override (RLO, U+202E) et Left-to-right override (LRO, U+202D), montrant alors la supercherie.

Halfwidth and Fullwidth Forms

Les failles de type « directory traversal » outrepassent les mesures de sécurité et permettent de lire un fichier arbitraire. En PHP, on trouve souvent des failles du type « index.php?page=../../../../etc/passwd ». Les webmestres se protègent en interdisant la chaîne « ../ » dans le nom du fichier utilisé. Quelques fois, il est possible d'outrepasser cette protection en spécifiant le chemin complet du fichier. Une variante est de jouer entre les caractères « / » et « \ » selon le système d'exploitation. Certains serveurs et/ou systèmes d'exploitations acceptent également « .../ » dans le nom du fichier.

Ce type de bug est aujourd'hui connu et corrigé dans la majorité des serveurs. Dumoins, c'est ce qu'on pensait jusqu'à cette annonce : Unicode encoding can be used to bypass intrusion detection systems (juin 2007). L'idée est d'utiliser les caractères halfwidth et fullwidth de la plage Unicode U+FF01-U+FFEE. Le soucis est que les URL sont normalisées après avoir été validées !

Exemple de normalisation (décomposition canonique) avec Python 2.5 :

>>> from unicodedata import normalize
>>> char=normalize('NFKC', u'\uFF0E'); print "%r (%s)" % (char, ord(char))
u'.' (46)
>>> char=normalize('NFKC', u'\uFF0F'); print "%r (%s)" % (char, ord(char))
u'/' (47)
>>> char=normalize('NFKC', u'\uFF3C'); print "%r (%s)" % (char, ord(char))
u'\\' (92)

Séquence UTF-8 invalide

Il faut savoir que 7 ans plus tôt, un bug similaire avait déjà été découvert dans Microsoft IIS (octobre 2000). Cette fois-ci, le problème était la normalisation de l'encodage UTF-8. IIS était trop laxiste : il acceptait les séquences invalides, c'est-à-dire lorsqu'un code a une séquence plus longue en octets que la taille normale. Exemple : le caractère point « . » (U+2E) s'encode « 0x2E » en UTF-8, mais peut également être encodé (0xC0, 0xAE) (forme invalide).

Note : Le langage Java utilise d'ailleurs une forme non standard d'UTF-8 : le caractère nul est encodé volontairement (0xC0, 0x80) pour éviter qu'une chaîne soit tronqué par une fonction C bas niveau (telle que strcpy).

Confusion entre octet et caractère

Depuis que le jeu de caractères ASCII a été inventé, il existe une confusion entre la notion d'octet et de caractère. C'est encore plus vrai avec les jeux de caractères ISO-8859. La très grande majorité des programmes mélangent allègrement octets et caractères sans se poser de question. D'une manière générale, ce n'est pas trop gênant. On retrouve cette problématique lorsqu'on manipule du HTML : si on tronque du texte HTML à une position donnée, il est possible qu'on coupe en plein milieu d'une balise ou d'un caractère écrit sous la forme « &nom; ». Exemple : « J'ai mang&eacute; ! » tronqué au 12e caractère donne « J'ai mang&ea ».

Exemple de vulnérabilité : WordPress Charset SQL Injection Vulnerability (décembre 2007). Le problème apparait lorsque la base de donnée utilise un jeu de caractère chinois : Big5 ou GBK. La fonction qui échappe les chaînes de caractères SQL utilise addslashes() qui travaille sur des octets et non pas des caractères. La séquence d'octets (0xB3, 0x27) est alors échappée en (0xB3, 0x5C, 0x27). Or 0xB35C est un caractère valide en Big5, et on obtient donc une apostrophe seule !

Exemple avec Python 2.5 :

>>> user='\xB3\x27'
>>> sql=user.replace("'", "\\'")
>>> print unicode(sql, "big5")
許'

Le problème de fond est que PHP ne supporte pas Unicode. Il va falloir attendre PHP6 qui est en cours de gestation. Notez que ce genre de bug touche également les programmes écrit en C, Java ou même en Python. Bien que Python propose le type unicode, il est rarement utilisé bien que complet. Le module re (expression régulières) supporte les expressions unicode. Python 3000 vise, entre autre, à encourager l'adoption d'Unicode comme type par défaut des chaînes de caractères.

Autres bugs des implémentations d'Unicode

La bibliothèque Qt de Trolltech calculait mal la longueur des chaînes UTF-8 (il manquait un "+1") : Bugzilla Bug 269001: CVE-2007-4137 QT off by one buffer overflow (rapport de bug avec patchs pour Qt3 et Qt4, août 2007).

La fonction repr() du langage Python n'allouait pas assez de mémoire pour les chaînes Unicode : buffer overrun in repr() for unicode strings (août 2006, lire aussi le CVE-2006-4980). La fonction repr() n'allouait que 6 octets par caractère en ne considérant que la forme « \uXXXX », or la forme « \Uxxxxxxxx » peut être nécessaire et consomme 10 octets par caractère.

Conclusion

Unicode regorge de fonctionnalités qui sont souvent méconnues. Mal utilisées ou utilisées à mauvais escient, ça peut faire très mal. Je pense qu'il manque des fonctionalités de sécurité dans les bibliothèques Unicode. Les encodages non standards doivent être rejettés ou une alerte doit être déclanchée. Le module mod_security d'Apache propose ce genre de fonctionnalité : voir SecFilterCheckUnicodeEncoding et @validateUtf8Encoding. Il faudrait pouvoir désactiver toutes les fonctionalités Unicode et n'activer que ce dont on n'a besoin pour éviter les effets de bord indésirables.

Jeu de caractères Unicode

Unicode est un hydre : lorsqu'on découvre Unicode, chaque point éclairci va faire surgir deux nouvelles questions ! Cet article tente de démystifier Unicode en présentant quelques particularités de ce jeu de caractères.

Unicode 5.0

Unicode est un jeu de caractères incluant tous les autres jeux de caractères existant : c'est un surensemble qui est donc forcément plus gros. La dernière version publiée date de juillet 2006 : la norme Unicode 5.0.

Nombre de caractères :

  • Caractères graphiques : 98.884 (lettres, marqueurs, chiffres, ponctuations, symboles et espaces)
  • Code de formatage : 140 (séparateurs de ligne et de paragraphe, sens du texte, ...)
  • Code de contrôle : 65 (héritage de l'ASCII)
    • U+00–U+1F
    • U+7F–U+9F
  • Caractères à usage privé : 137.468 (l'émetteur et le récepteur peuvent définir leurs propres codes)
    • U+E000–U+F8FF
    • U+F0000–U+FFFFD
    • U+100000–U+10FFFD
  • Codes surrogates : 2.048
    • U+D800–U+DBFF : Low surrogates
    • U+DC00–U+DFFF : High surrogates
    • Pour UTF-16, les codes U+10000 à U+10FFFF sont encodés sur deux mots de 16 bits :
      • On retire 0x10000 au code : 0x10000..0x10FFFF => 0x0000..0xFFFF
      • On découpe le résultat en deux valeurs de 10 bits chacune
      • Finalement, le premier mot est : 0xD800 + (code-0x10000) & 0x003FF (10 bits de poids faible)
      • Et le deuxième mot est : 0xDC00 + ((code-0x10000) >> 10) & 0x003FF (10 bits de poids fort)
    • Les surrogates sont donc des codes Unicode interdits pour éviter de confondre un code avec un mot d'UTF-16
  • Non caractères : 66
    • Codes terminés par 0xFFFE en hexadécial : U+FFFE, U+1FFFE, ... U+10FFFE (17 codes). Codes interdits pour que le code U+FEFF puisse servir comme marqueur d'endian pour les encodages UTF-16 et UTF-32.
    • Codes terminés par 0xFFFF en hexadécial : U+FFFF, U+1FFFF, ... U+10FFFF (17 codes). Peuvent être utilisé dans une implémentation d'Unicode comme « valeur maximale ».
    • U+FDD0–U+FDEF
  • Codes réservés : 875.441 (réservés pour des usages futurs)

Unicode 5.0 contient donc 1.114.112 codes caractères : codes 0x000000 à 0x10FFFF.

Les codes 0x0000 à 0xFFFF constituent ce qu'on appelle le « Plan multilingue de base » (abrégé BMP en anglais).

Sérialisation d'Unicode

Un octet ne pouvant contenir que 256 codes différents, Unicode a besoin d'un encodage sur plusieurs octets pour chaque code. Il existe de nombreux encodages :

  • UTF-7 : mots de 7 bits (le 8e bit peut être utilisé comme bit de parité)
  • UTF-8 : mots de 8 bits
  • UTF-EBCDIC : mots de 8 bits (compatible avec le jeu de caractère EBCDIC)
  • CESU-8 : mots de 8 bits (mélange entre UTF-8 et UTF-16)
  • UTF-16 : mots de 16 bits (UTF-16LE et UTF-16BE pour little endian et big endian)
  • UTF-32 : mots de 32 bits (UTF-32LE et UTF-32E)

Il existe également les algorithmes SCSU et BOCU qui servent à compresser un texte Unicode sérialisé.

Exemple avec Python 2.5 :

>>> u'é'.encode('utf8')
'\xc3\xa9'
>>> u'é'.encode('UTF-16LE')
'\xe9\x00'
>>> u'é'.encode('UTF-16BE')
'\x00\xe9'

Caractère U+AF05 :

>>> u'\uAF05'.encode('utf8')
'\xea\xbc\x85'
>>> u'\uAF05'.encode('UTF-16LE')
'\x05\xaf'
>>> u'\uAF05'.encode('UTF-16BE')
'\xaf\x05'

Encodage Punycode

L'algorithme Punycode, normalisé par la RFC 3492, sert à convertir un nom de domaine Unicode sous forme ASCII : lettres A à Z, chiffres 0 à 9 et le caractère « - ». L'algorithme est réversible : on peut convertir un punnycode en Unicode sans perte d'information. Cet encodage est surtout utilisé pour les noms de domaine Unicode (serveurs DNS) : les Internationalized Domain Names (IDN). Lire le billet de Stéphane Bortzmeyer sur les IDNA.

Exemple avec Python 2.5 :

>>> from encodings.idna import ToASCII, ToUnicode
>>> ToASCII(u'café')
'xn--caf-dma'
>>> print ToUnicode('xn--caf-dma')
café

Normalisation d'un caractère

On peut composer un caractère. Le caractère « ä » peut s'écrire « a » + umlaut (U+308). Il existe trois caractères correspondant dans la table Unicode :

  • U+61 : « a », lettre A
  • U+E4 : « ä », lettre A avec umlaut
  • U+308 : « ¨ », umlaut

Donc U+E4 et (U+61, U+308) sont équivalents. Il existe des outils pour normaliser selon les différentes formes :

  • NFD (Forme normale D) : décomposition canonique
  • NFC (Forme normale C) : décomposition canonique suivie d'une recomposition des caractères précomposés
  • NFKC (Forme normale KC) : décomposition de compatibilité, c'est-à-dire remplace les caractères de compatibilité par leurs équivalents
  • NFKD (Forme normale KD) : décomposition de compatibilité suivie d'une décomposition canonique

Exemple avec Python 2.5 (Décompose puis Compose) :

>>> from unicodedata import normalize
>>> list(normalize('NFD', u'ä'))
[u'a', u'\u0308']
>>> list(normalize('NFC', u'a\u0308'))
[u'\xe4']

Conclusion

Unicode est un sacré bordel ! Les gens habitués à manipuler ASCII et son jeu de caractère ridicule de 128 codes sont perdus. Même ceux habitués à ISO-8859-15 flambant neuf avec son euro bling-bling (€) sont perdus car ils connaissent presque les 256 codes par cœur. Unicode contient plus d'un million de codes qu'on peut écrire d'un millier de manières différentes !

Néanmoins, c'est un pari sur l'avenir car on peut enfin mélanger sans broncher des textes dans n'importe quel langue. D'ailleurs, on peut changer l'ordre d'affichage pour les écritures de droite à gauche et inversement. Les encodages UTF-8, UTF-16 et UTF-32 simplifient la détection de l'encodage et sont plus simples que leurs ancêtres (ex: Shift JIS et ses nombreux codes de contrôle). UTF-8 est le charset ultime pour l'interopérabilité car il n'a pas de problème d'endian, est simple à détecter et peu coûteux en place pour l'encodage d'ISO-8859-1.

vendredi 18 janvier 2008

Analyser un fichier binaire ou un programme inconnu

Cet article explique comment analyser un fichier d'origine peu sûre (ex: Internet) ou dont le format est inconnu (rétro-ingénierie). Il n'est sûrement pas exhaustif, mais liste divers outils bien pratiques pour ce genre de travail.

Avertissement

Lorsqu'on traite un fichier d'origine inconnue, il faut être sur ses gardes. Il se peut que le fichier attaque volontairement les outils d'analyse cités dans cet article. Les virus sont connus pour cracher les débogueurs et/ou changer leur propre comportement lorsqu'ils sont analysés. Travaillez sur une machine dédiée aux tests (ex: machine virtuelle), ou bien avec des privilèges minimaux (ex: machine coupée du réseau).

Détecter le type d'un fichier inconnu

Quand on reçoit un fichier binaire d'un type inconnu, le programme le plus utile est file. Il détermine le format du fichier à partir d'une importante base de signature. Il sait extraire certaines méta-données (dimension d'une image, version du format, etc.) et sait également faire la différence entre les sous-formats (tel que AVI ou WAVE pour le format RIFF, et Theora et Vorbis pour Ogg).

D'autres programmes peuvent servir pour identifier le format ou plutôt extraire les méta-données :

  • hachoir-metadata : supporte un grand nombre de formats de fichiers
  • extract : supporte un grand nombre de formats de fichiers
  • Kaa : images, sons et vidéos
  • identify : images, fait parti de l'excellente suite Image Magick

Analyse manuelle d'un fichier binaire

Le programme strings sert à extraire des chaînes de caractères d'un fichier binaire. Il vous faudra peut-être tester différentes options (encodages des chaînes) pour obtenir satisfaction. Souvent, strings donne beaucoup de faux positifs (la sortie est assez bruitée).

Un éditeur hexadécimal est toujours pratique pour rechercher visuellement des motifs, des chaînes de caractères, informations cachées, etc. J'utilise « hexdump -C fichier » ou bien khexedit (programme KDE).

Quand un fichier semble vraiment trop aléatoire, il se peut qu'il soit compressé et/ou chiffré. J'ai écrit un petit script « entropy.py » qui calcule l'entropie des symboles (mot de 8 bits) d'un fichier. Quelques exemples :

  • Programme EXE PE : 4,11 bits/symbole
  • Page HTML : 4,89 bits/symbole
  • Document PDF : 7,75 bits/symbole
  • Image JPEG et PNG : 7,87 et 7,82 bits/symbole
  • Archive gzip (.tar.gz) et bzip2 (.tar.bz2) : 7,99 bits/symbole

Au delà de 7,5 bits/symbole, il y a de fortes chances que le fichier contienne des champs compressés. C'est le cas dans les exemples, mais cet outil n'est qu'une mesure empirique.

Pour trouver les blocs compressés, une solution est de tenter de décompresser à partir du 1er octet, puis du 2e, etc. Le script « find_deflate.py » implémente justement cet algorithme, lent mais il fonctionne.

Enfin, l'outil hachoir-subfile permet de rechercher les fichiers contenu dans un fichier binaire en recherchant des motifs (marqueur de début, marqueur de fin) et en vérifiant que le fichier trouvé est valide (pour limiter les faux positifs). Il existe beaucoup d'outils similaires tels que Photorec et Scalpel, ou encore TestDisk et Sleuth Kit qui sont eux dédiés à l'analyse d'images de disque dur.

Analyse statique d'un programme

Ayant majoritairement travaillé sous Linux, je ne parlerai que des programmes ELF. L'outil objdump affiche de nombreuses informations sur un fichier ELF tel que ses sections, les symboles (objdump -T fichier) et sait désassembler du code. L'outil nm liste les symboles des bibliothèques statiques (extension du fichier « .a »). L'outil ldd liste les bibliothèques importés par un programme ou une bibliothèque avec le chemin complet qui sera utilisé. Enfin, elfsh est une suite complète d'outils pour l'analyse de fichier ELF.

Analyse dynamique

Analyser un programme sans l'exécuter ne permet que d'extraire de maigres informations. Il est toujours plus instructif de l'exécuter. Il existe de nombreux outils pour tracer un programme. strace affiche les appels systèmes. ltrace affiche les appels aux bibliothèques dynamiques, mais sait également tracer les appels systèmes. gdb est le grand classique parmis les débogueurs, boîte à tout faire.

Pendant l'exécution du programme, « lsof -p pid » affiche les fichiers qu'il a ouvert et « netstat » permet d'afficher les connexions réseaux.

Autres outils que je n'ai pas testé :

J'ai écrit un binding Python pour ptrace qui permet d'écrire facilement son propre outil d'audit à la manière de strace ou ltrace. Enfin, mon bref article Syscall contient mes divers notes sur les appels systèmes Linux.

Sites Internet

Pour en savoir plus sur le sujet, voici quelques sites très instructifs :

vendredi 4 janvier 2008

Évolutions des interfaces utilisateurs

Les périphériques de pointage les plus connus sont le clavier et la souris, tous deux inventés dans les années 1960. Depuis Windows 95, le clavier a gagné 3 « touches Windows », passage de 102 à 105 touches. La souris est passé de 2 boutons à 3 boutons, puis a gagné une roulette verticale. Certaines souris ont également une roulette horizontale et plus de 4 boutons. Il existe également les souris inversées : les trackballs, plus reposant pour le poignet mais moins précises (je trouve). Malgré tous ces changements, il n'y a rien de révolutionnaire. Voyons les interfaces multitouch, la Wii et autres innovations bien plus rigolotes :-)

Lire la suite

dimanche 2 décembre 2007

Bugs des générateurs de nombres pseudo-aléatoires

Maintenant que vous savez ce qu'est qu'un générateur de nombres pseudo-aléatoires, voyons en les bugs historiques, ainsi que les utilisations incorrectes qui en sont faites. Une mauvaise initialisation de la graine peut compromettre la sécurité de votre application. De même, la fonction rand() doit également être utilisée correctement sous peine d'abaisser l'entropie du résultat. Ce billet présente de multiple exemples dont le numéro de séquence TCP, pour finir sur les fuites d'information.

Lire la suite

Générateurs de nombres pseudo-aléatoires

Récemment, plusieurs vulnérabilités ont été trouvées dans des générateurs de nombre pseudo-aléatoires : Linux, Windows, FreeBSD et OpenSSL. Je prépare un billet dessus, mais avant je vais m'attarder sur les générateurs : comment un ordinateur purement déterministe pourrait être aléatoire ? Ce billet présente les algorithmes utilisés, comment mesurer la qualité d'un générateur, le groupe de travail du NIST, le choix de la graine et enfin les générateurs matériels.

Lire la suite

mercredi 28 novembre 2007

Buzz autour de Fusil

Annonce d'une nouvelle version de Fusil

Estimant que la réécriture du fuzzer Fusil est achevée, j'ai lancé une compagne de buzz pour faire connaître l'outil. J'ai posté un courriel sur les listes de diffusion fuzzing et pen-test. J'ai écrit un journal linuxfr.org. J'ai aussi contacté personnellement des auteurs de fuzzers. Enfin, j'ai enregistré le projet sur Cheeseshop, Ohloh et Freshmeat.

Logs Apache et scripts Python

Hébergeant les sites *.hachoir.org sur mon propre serveur, je peux facilement en consulter les logs Apache. D'ailleurs, j'écris depuis plusieurs mois des scripts Python pour les analyser : apache_log. Je m'intéresse plus particulièrement à l'origine des visiteurs. Apache enregistre l'IP du visiteur, son « user-agent » et l'url d'où il provient (referrer).

Lassé de taper « host 84.74.168.(...) » pour voir d'où vient chaque visiteur, j'ai écrit un nouveau script (host.py). Il prend en entrée un fichier de log et génère un rapport HTML listant les reverse-dns triés selon le nombre de hits. Les résultats du reverse-dns sont mis en cache durant une semaine (stocké dans un fichier). Le reverse-dns est simplifié : « lns-bzn-29-82-248-234-136.adsl.proxad.net » est affiché « www.proxad.net ». Ceci permet de regrouper les visiteurs venant du même réseau. Consultez parser.py et host.py pour les détails

Analyse des visiteurs de fusil.hachoir.org

En à peu près 24h, j'ai vu passer :

  • Laboratoires de recherche : France Telecom (R&D), INRIA, INRA, Motorola Laboratories, CERN, CERT, CEA
  • Entreprises : Virgin Media, Ericsson, Microsoft, Roche, STMicroelectronics, Alcatel, FlightSafety, Digital Defense, Daimler, MWR InfoSecurity, Cisco, Rockwell Collins, VMware, TippingPoint, EADS, Juniper, Qualys, CXR Anderson Jacobson, atsec
  • Agences gouvernementales : US Office of Personnel Management (OPM), Conseil de l'Europe, Sandia National Laboratories (États-Unis)
  • Pays : France, États Unis, Israël, Turquie, Belgique, Italie, Allemagne, Suisse, Russie, Brésil, Ukraine, Japon, Argentine, Chine, Nouvelle Zélande, Finlande, Hongrie, Canada, Taïwan, Pologne, Philippines, République dominicaine, Île Christmas
  • Universités :
    • France : Université de Technologie Compiègne ; Université de Rennes 1 ; CNAM ; Grande ecole d'ingenieurs informatique electronique telecoms reseaux biomédical ; Université de Versailles Saint-Florent-en-Yvelines ; Université Lille 3 ; Université de Limoges ; École Nationale Supérieure des Télécommunications de Bretagne ; Académie de Rouen
    • Autres pays : Universität Hamburg (Allemagne) ; Facultés Universitaires - Notre Dame de la paix - Namur (Belgique) ; Universiteit van Amsterdam (Pays-bas) ; Cranfield University (Angleterre) ; National Chiao Tung University (Taïwan) ; University of California Berkeley (États-Unis) ; Oxford Brookes University (Angleterre) ; Massey University (Nouvelle Zélande)

(je me suis aidé de la liste Wikipédia des domaines de premier niveau pour les domaines nationaux que je ne connaissais pas)

Que faut-il comprendre de toutes ces informations ? Bah déjà que le fuzzing intéresse beaucoup de monde :-) Sinon, ce n'est pas parce qu'un employé quelconque de Microsoft a cliqué sur mon site que le prochain Windows sera exempt de bug. Je ne pense pas non plus que ces informations soient très fiables, beaucoup de traffic provient de robots automatiques qui parcourent Internet nuit et jour. Par contre, je dois avouer que je suis plutôt fier de voir passer des hits en provenance des réseaux du CEA, EADS et du CERT :-)

mercredi 21 novembre 2007

Nouvelle implémentation de Fusil sous forme d'un système multi-agents

Cet article détaille l'architecture d'une nouvelle implémentation de mon outil de fuzzing « Fusil » : un système multi-agents qui devrait éviter la lourdeur des applications monolithiques.

Système multi-agents

Pour avoir mis les doigts dans de grosses applications (plus de 10.000 lignes de codes), je peux dire qu'une application monolithique est difficile à déboguer et à faire évoluer. L'architecture d'un logiciel repose sur un graphe d'objets liés les uns et autres à la sauce spaghetti. Modifier une classe ou le prototype d'une fonction impacte des dizaines d'autres classes et fonctions. Bien que des outils de refactoring facilitent la répercution des changements sur l'ensemble du projet, une architecture plus modulaire nous délesterait de cette tâche ingrate.

Un système multi-agents (SMA) est une simulation qui implique des dizaines d'agents simples qui communiquent entre eux par des événements. Le gros avantage est qu'un agent est (quasiment) aveugle : sa vision de l'environnement est volontairement limitée. En particulier, un agent n'a pas accès aux données des autres agents. Ce concept issu de la recherche en intelligence artificielle peut être adapté à des programmes plus communs. Comme j'ai repris mon projet Fusil depuis zéro (pour la 3e fois), j'ai décidé d'implémenter un SMA simple en Python pour mes besoins.

Agents dans Fusil

Pour rappel, Fusil est un générateur d'erreurs servant à rechercher des bugs dans un logiciel (Fusil est un fuzzer). Dans Fusil, tout est agent. Lorsqu'un agent émet un événement, ce dernier est mis en attente dans le MTA (Mail Transfer Agent). L'événement n'est transmis aux destinataires qu'au cycle de simulation suivant. L'agent Project est responsable d'exécuter la simulation : il demande à chaque agent de lire sa boîte de messages puis d'exécuter leur méthode live(). MTA et Project sont eux-même des agent et peuvent donc émettre et recevoir des événements. Exemples d'événements : « session_start », « process_create », etc.

Les agents de type Session sont crées pendant une session et sont automatiquement détruits à la fin d'une session. Les agents de type Project sont conservés toute la durée de vie du projet. Par contre, ils sont désactivés quand aucune session n'est active : ils ne peuvent plus communiquer (ni émettre ni recevoir de messages) et leur méthode live() n'est plus appelée. Enfin, lorsque le projet est fermé, les agents Project sont détruits. Ce découpage (Project/Session) permet de gérer simplement la durée de vie des données. En particulier, on s'assure que les données sont détruites au bon moment.

Exemples d'agent

  • CreateProcess : lance un programme. Tue le processus en cas de timeout (10 secondes par défaut).
  • WatchProcess: surveille un processus et en particulier sa mort (le processus a quitté ou a été tué par un signal fatal)
  • Syslog : surveille les logs systèmes (/var/log/message et /var/log/syslog)
  • TimeWatch : surveille la durée d'une session
  • MangleFile : injecte des erreurs dans un fichier

Système de notation

Les agents de surveillance attribuent une note à la session entre -100% et +100%. La note globale est la somme de toutes les notes. Si elle dépasse un seuil (+50% par défaut), la session est considérée comme un succès et est stoppée. Certains agents peuvent demander explicitement la fin d'une session : après un timeout ou la mort du processus par exemple.

Projets de fuzzing

Un projet Fusil est une configuration pour fuzzer une application. Une douzaine de projets sont disponible : ClamAV, printf, MySQL, rpm, etc. Les projets sont beaucoup plus diversifiés que les exemples des précédentes implémentations de Fusil. La nouvelle architecture plus modulaire et générique permet de configurer très finement chaque composant (agent).

Le moteur du SMA de Fusil est encore en gros chantier. Il risque encore de beaucoup évoluer ces prochaines semaines pour s'adapter au mieux aux besoins du logiciel. Note : Fusil s'autorise de multiple digressions par rapport au SMA parfait pour simplifier la vie du programmeur.

jeudi 8 novembre 2007

Gestion de la mémoire

Comme je commençais à accumuler pas mal de liens intéressants sur la gestion de la mémoire, je me suis décidé à écrire un article. J'espère qu'il vous sera utile, au moins pour la culture générale.

Multithreading et malloc()

L'implémentation actuelle du célèbre allocateur de mémoire malloc() de la GNU libc est peu performante pour un programme multi-threadé. En particulier, la mémoire se fragmente facilement et l'allocation de mémoire est donc de plus en plus lente. Google a développé sa propre version de malloc() : tcmalloc. Elle est disponible dans la suite google-perftools sous la nouvelle licence BSD. Côté points noirs, tcmalloc utilise directement 6 Mo au démarrage pour son usage interne, et elle ne rend jamais la mémoire au système !

La prochaine version de FreeBSD (7.0) aura aussi un nouvel allocateur de mémoire : jemalloc, écrit par Jason Evans. L'implémentation actuelle de de FreeBSD est celle de Poul-Henning Kamp : phkmalloc. Vous trouverez une présentation de jemalloc dans l'article What's cooking for FreeBSD 7? Lisez également le papier écrit par Jason en avril 2006 : A Scalable Concurrent malloc Implementation for FreeBSD.

Selon un benchmark « NetBSD versus FreeBSD », les performances restent stables au delà de 4 threads (sur une machine ayant 4 processeurs) pour le nouvel allocateur de FreeBSD, alors que pour NetBSD et Linux les performances s'écroulent. En utilisant tcmalloc, les performances de Linux sont similaires à celle de FreeBSD.

La version actuelle de la GNU libc utilise ptmalloc2, implémentation inspiré de celle de Doug Lea (dlmalloc) version 2.7. La nouvelle glibc (version 2.6) utilise ptmalloc3 : 3e version de ptmalloc, basée sur dlmalloc 2.8.3 (date de 2005).

Mesure de la mémoire des processus

En avril 2007, Matt Mackall présentait son travail sur la quantification de la mémoire utilisée par un processus au Embedded Linux Conference. Il part du constat que les valeurs données par le noyau Linux n'ont que pas/peu de sens.

Il propose un patch pour le noyau qui permet de compter le nombre de processus partageant une page mémoire. La quantité de mémoire utilisée par un processus est alors le nombre de pages mémoire non partagées plus le nombre de pages partagées divisé par le nombre d'utilisations. Exemple : si 20 programmes utilisent une bibliothèque KDE de 30 Mo, la bibliothèque pèsera 30/20 = 1,5 Mo pour chaque processus et non plus 30 Mo comme c'est le cas actuellement ! Ceci permettra d'avoir une meilleure idée de la répartition de la mémoire. LWN.net propose un article détaillant la présentation de Matt.

Aux dernières nouvelles (voir les prévisions météo de Linux), le patch devrait être intégré dans Linux 2.6.25. La dernière version stable de Linux est la 2.6.23 et la 2.6.24 est en cours de développement. Il faudra être donc être encore un peu patient (ou alors recompiler son noyau à la main ;-)).

Astuce : Pour mesurer l'utilisation de la mémoire vidéo par les applications graphiques, utilisez le programme xrestop plutôt que top ;-)

Ce que tous les programmeurs doivent savoir au sujet de la mémoire

Ulrich Drepper, actuel mainteneur de la GNU libc travaillant pour RedHat, a écrit un article détaillant sur 100 pages la mémoire de nos jours (2007) : What every programmer should know about memory. Il a contacté le site Internet LWN.net pour publier son article. Pour une lecture plus confortable, l'article est découpé en 6 parties :

J'ai commencé à lire la 1ère partie qui est d'une excellente qualité. Par contre, c'est extrêmement technique et très détaillé. La première partie présente l'organisation logique d'un ordinateur en se concentrant sur le/les processeurs, la mémoire, le northbridge et le southbridge. Merci à toady de m'avoir indiqué ce lien ;-)

Noyau Linux

Le site linux-mm.org (Linux Memory Management) centralise les informations sur la gestion de mémoire par le noyau Linux. On y trouve les projets en cours de développement comme advanced page replacement. On y trouve aussi de très bonnes informations sur le gestionnaire de mémoire Linux, comme par exemple les articles OOM Killer (mécanisme qui désigne quel processus tuer quand la machine n'a vraiment plus de mémoire) et page fault handling. Rik van Riel a d'ailleurs publié une lettre ouverte invitant les universités à faire de la recherche fondamentale sur la gestion de la mémoire. Les algorithmes utilisés ne sont plus adaptés aux machines actuelles !

Et Python ?

Le gestionnaire de mémoire interne de Python 2.3 et 2.4, pymalloc, est bogué. Il ne rend jamais la mémoire au système ! Lisez le billet d'Evan Jones pour en savoir plus. Evan Jones a justement corrigé ce bug et son travail a été intégré dans Python 2.5. Lisez l'annonce d'Evan Jones et l'annonce de Tim Peters sur la liste de diffusion python-dev. Tim Peters a repris le travail d'Evan Jones, l'a corrigé et l'a intégré à Python.

Pour finir, voici deux outils permettant de tracer l'utilisation de la mémoire : PySizer et Heapy. Je ne les ai pas encore testé, mais ils sont certainement très instructifs. Lisez également le papier Heapy: A Memory Profiler and Debugger for Python.

N'oubliez pas d'utiliser régulièrement Valgrind sur vos programmes pour traquer les fuites de mémoire !

mercredi 7 novembre 2007

PC SOFT et WinDev

Depuis plusieurs années, je voyais des publicités pour le logiciel WinDev dans divers magazines d'informatique. N'ayant aucune connaissance l'utilisant, je m'étais toujours demandé quels en sont les usages. J'étais également étonné du peu de sites Internet dédiés à l'outil. Je me suis alors attardé sur le site Internet de PC SOFT pour récolter un maximum d'informations. Pour éviter de colporter des bêtises, j'ai pêché un maximum d'informations dans divers forums, en particulier le newsgroup fr.comp.developpement.agl.windev.

PC SOFT

PC SOFT est une éditeur de logiciel français basé à Montpellier. La société existe depuis 1984 et s'est fait connaître avec son éditeur d'écran pour MS-DOS : High Screen. Ce logiciel s'intègre à divers langages de programmation (C, Pascal, Cobol, ...). Il est doté d'une base de données appelée Hyper File. Renommé Hyper Screen en 1992, il servira de fondement à son successeur : WinDev. Ce dernier est qualifié d' « Atelier de Génie Logiciel » (AGL) par son éditeur. WinDev est constitué :

  • d'un éditeur d'interface utilisateur
  • d'un langage de programmation : le WLangage
  • d'un éditeur de code source
  • de la base de données Hyper File
  • d'outils de modélisation (Merise et UML)

WinDev excelle dans la réalisation d'interfaces de saisie

Les captures d'écran et vidéos de démonstrations montrent qu'on peut dessiner facilement de belles interfaces. Chose délicate et pénible avec d'autres outils. Pour vous en faire une idée, visionnez la vidéo surcharge d'IHM et de code. De nombreuses fonctionnalités visent à améliorer l'interface utilisateur comme la mémorisation des valeurs saisies par l'utilisateur (persistance des champs) ou le grisage automatique des fenêtres inaccessibles.

PC SOFT soigne son image

[1997] Le webmestre du site Windev® Development Center, Pierre Fauque, est contacté par PC SOFT au sujet de son site Internet. Il utilisait le logo WinDev sans autorisation, le nom WinDev n'avait pas le suffixe ® (registred : nom déposé), et il n'était pas clairement indiqué que ce site n'est pas celui de PC SOFT. Lisez les échanges par courriel pour les détails.

[1999] En septembre 1999, Joël VARTIN de la société Oriom pose une question au support PC SOFT sur les performances de WinDev. Il évoque une rumeur sur de mauvaises performances. On peut s'étonner de la formulation de la réponse de PC SOFT : « La rumeur à laquelle vous faite allusion est ridicule, dénuée de tout fondement, et pourrait s'interpréter comme du dénigrement ou de la diffamation ».

[2006] Marc Lussac, fondateur de la communauté developpez.com, expliquait en janvier 2006 que l'ouverture d'un forum WinDev ne pouvait se faire sans l'aval de son éditeur : « On aimerait bien avoir une rubrique Windev mais on n'a pas reçu l'autorisation de PC SOFT, (...) et sans autorisation on ne peut rien faire ». Le forum existe aujourd'hui, Marc a sûrement fini par obtenir l'autorisation en question.

[2007] Les articles Wikipédia concernant les logiciels PC SOFT sont régulièrement modifiés par PC SOFT en sa faveur depuis une adresse IP de l'entreprise (81.80.226.153). Plusieurs personnes s'en plaignent dans la page de discussion de WinDev.

L'affaire Beaussier

Cyril Beaussier était un utilisateur WinDev de longue date. Il appréciait l'outil jusqu'au jour où il a ouvert plusieurs sites Internet dénigrant PC SOFT et son produit phare WinDev. Il a publié ses sites sous le pseudonyme Gérard Menvussa (Gégé) :

En octobre 2002, PC SOFT arrive à faire fermer ces sites en l'exigeant au près des différents hébergeurs (sans prévenir Cyril par contre). Le 11 février 2003, Cyril reçoit une assignation en justice. Le 13 mars 2003, il perd le procès : on lui interdit toute diffamation de PC SOFT et de leurs produits, et la fermeture de ses sites Internet (ce qui avait déjà été fait). Cyril a écrit de nombreuses informations sur son procès dans son forum. Lisez également l'article WinDev Trivia de l'auteur néerlandais Peter.

L'association WinD'Asso

En octobre 2000, une soixantaine de personnes de divers pays (France, Belgique, Hollande, Italie, Afrique, Canada, États-Unis, ...) émettent le besoin de se regrouper pour être plus fort et plus efficace. Le 22 décembre 2000, les status de l'association WinD'Asso sont déposés auprès de la préfecture des Alpes-Maritimes.

L'association a, entre autres, constistué une liste des dysfonctionnements (bugs) des différentes versions de WinDev. À l'heure où j'écris ces lignes, on y trouve 115 bugs ouverts et 82 bugs fermés ce qui donne un total de 207 bugs référencés.

Marketing WinDev

Voici quelques phrases extraites du site Internet de WinDev :

  • « AGL sans concurrence »
  • « 100% des besoins sont couverts »
  • « Horizon infini »
  • « Gain productivité phénoménal »

WinDev est aussi une cascade de nombres : « AGL numéro un en France », « Développer 10 fois plus vite », « 100 clients témoignent », « 500 nouveautés » et le bouquet final « HyperFile 10 milliards d'enregistrements ».

Conclusion

On peut se demander pourquoi PC SOFT est tellement agressif quant à la protection de son image. Je vous conseille d'aller faire un tour dans les différents forums WinDev. Les discussions y sont souvent houleuses.

En attendant, je suis d'autant plus heureux de travailler sous Linux et de n'utiliser que des logiciels libres !

Les marques Windev®, Webdev®, Hyper File® sont déposées par la société PC SOFT.

samedi 27 octobre 2007

Analyse statique de code et audit de sécurité

Alors que je cherchais un outil d'analyse statique pour PHP, j'étais tombé sur la page Tool Survey du projet Software Assurance Metrics And Tool Evaluation. Ce projet, mené par le NIST et financé par le DHS, m'intéresse car il vise à tester et classer divers outils servant pour un audit de sécurité. Plus particulièrement, la page Source Code Security Analyzers dresse une longue liste d'outils d'analyse statique de code.

Rien ne vaut une relecture manuelle et attentive

Je garde un souvenir amer de l'analyse statique. J'avais testé SPlint, FlawFinder et RATS pour m'aider à relire le code source du pare-feu NuFW écrit en C. Ces outils sont peu efficaces car on est rapidement noyés sous une tonne de faux positifs. On perd finalement plus de temps à affiner leur configuration qu'à trouver des bugs. Je préfère encore une relecture manuelle et attentive du code.

Quand les ressources humaines sont insuffisantes pour relire toute la base de code, il faut choisir efficacement les portions de code à auditer. Il vaut mieux commencer par celles qui traitent les données venant de l'utilisateur. Une autre approche est de rechercher des erreurs classiques comme les dépassements de tampon, erreur de formatage printf, injection SQL, etc. Je vous conseille d'ailleurs d'aller lire les recommandations du CERT : Secure Coding Standards.

Trouver une erreur memset avec Google

On peut s'amuser à exploiter les moteurs de recherche de code pour trouver des failles connues : koders.com, krugle.com et Google codesearch. Seul Google codesearch supporte les expressions régulières, sans référence arrière malheureusement. On peut également trouver des mots de passe codés en dur et autres indiscrétions. C'est le moment de redécouvrir la Google Hacking Database pour vous donner des idées. Recherchons par exemple une utilisation incorrecte de la fonction memset() par l'inversion du 2e et 3e argument. Utilisez le motif suivant avec Google codesearch :

memset\([^,]+,[^,]+,\ *0\)

On trouve cette erreur dans divers projets dont certains très connus : OpenSSL, GnuPG, Prelude, Linux, Mozilla, Python, Parrot, Kaffe, aMule, µClibc, libgphoto2, ATI gatos, WINE, Blender, etc. Après vérification dans quelques projets (en particulier OpenSSL, GnuPG et Prelude !), l'erreur est corrigée dans la dernière version. Le fait qu'elle ait existé un temps prouve que de meilleurs outils d'analyse statique seraient utiles !

Autre exemple : erreur memcpy

L'instruction « memcpy(dest, source, sizeof(dest)); » est incorrecte quand dest est un pointeur. La taille copiée est celle du pointeur et non pas celles des données pointées ! Voici donc deux commandes pour rechercher des utilisations incorrectes des fonctions memcpy(), memmove(), strncpy(), g_memdup(), memset() et wmemset() :

find DOSSIER -name "*.c"|xargs egrep -H '(memcpy|memmove|strncpy|memset|g_memdup)\(([^,]+), .*sizeof\(\2\)\)'
find DOSSIER -name "*.c"|xargs egrep -H 'w?memset([^,]+,[^,]+, *0)'

Sauf que strncpy() (et ses voisines) peuvent fonctionner pour « strncpy(dest, source, sizeof(dest)); » quand dest n'est pas pas un pointeur mais un tableau de taille fixe comme « char buffer[256]; »...

Complexité McCabe d'une fonction

Pour finir, un ami (misc) m'a fait découvrir aujourd'hui l'outil pmccabe par le billet The Cyclomatic Horror From Outer Space. Ce programme sert à estimer la complexité d'une fonction sachant qu'une note supérieure à 50 indique une fonction « non testable (risque très élevé) ». Je me suis amusé à lancer pmccabe sur la GNU libc avec la commande :

rm /tmp/out; find . -name "*.c"|xargs pmccabe >>/tmp/out; sort -nr /tmp/out|head

Voici les pires fonctions :

  • 494 : scanf()
  • 230 : fnmatch()
  • 222 : strtod()
  • 200 : collate_read()
  • 197 : dl_main()
  • 175 : wordexp()

Dans les commentaires du blog, on apprend que gcc explose le record avec une fonction à plus de 1000. Une scéance de refactoring cuisse-abdo-fessier ne ferait pas de mal à la libc et à gcc...

mercredi 24 octobre 2007

Dasher, Chaîne de Markov, N-gramme, Google et Pangramme

Comme j'ai la mémoire courte, j'oublie souvent le nom d'articles qui m'intéressent pourtant beaucoup. Ce billet reprend donc des idées (concepts, techniques, etc.) qui me passionnent mais que j'oublie à répétition.

Logiciel dasher

Aujourd'hui, je parlais de dasher à un ami. Ce logiciel sert à écrire du texte avec un dispositif de pointage ayant uniquement 2 axes (X et Y) tel qu'une souris, une manette de jeu ou les yeux (avec une caméra). L'animation ci-dessous en présente le fonctionnement :

Le point qui m'intriguait était de savoir comment dasher décide quelles lettres proposer à l'utilisateur pendant qu'il écrit son texte. Effectivement, dasher ne propose pas simplement l'alphabet, les chiffres et la ponctuation à chaque fois : ce serait trop pénible.

Chaînes de Markov

J'ai alors pensé aux chaînes de Markov : un modèle qui permet justement de répondre à ce besoin. Je maîtrise mal le sujet et je vais donc expliquer avec mes mots ce que j'en ai compris. Les chaînes de Markov servent à prédire quelles lettres sont les plus probables selon celles précédemment saisies. On utilise pour cela des « N-grammes » où N est le nombre de lettres, exemple de bigrammes : « de », « la », etc. En partant d'un corpus (grosse base de textes), on va construire nos chaînes de Markov donnant la probabilité d'apparition des N-grammes dans la langue du corpus. À partir de ces résultats, il y a une autre application rigolote : la génération de texte aléatoire. On peut effectivement crée un texte purement artificiel qui a l'air vrai mais est en fait le résultat d'un ordinateur ! Articles Wikipédia à lire pour en savoir plus : algorithme de Viterbi et modèle de Markov caché.

N-grammes de Google

La société Google a annoncé en août 2006 qu'elle allait distribuer ses N-grammes. Ce qui a été fait en septembre 2006 par l'intermédiaire de l'Institut des données linguistiques qui vend ces données sous forme de 6 DVD. L'ensemble est proposé au prix prix de US$150 plus US$50 pour les non-membres, ce qui fait un total de 146 €. Par contre, interdiction de rediffuser ces données ou de les utiliser à des fins commerciales ! Dommage car c'est, apparemment, la plus grosse base de données mondiale de N-grammes : 24 Go compressés par gzip en UTF-8 comprenant 1.024.908.267.229 lexèmes et 95.119.665.584 phrases. Il faut savoir que Google a utilisé Internet comme corpus. On peut donc se demander si c'est normal qu'il revende ses résultats, car très peu de sites Internet sont libres de droit !

Pangramme

Pour finir, un article qui n'a rien à voir mise à part la sonorité avec N-gramme : Pangramme. Cet article a résolu une énigme que je me posais depuis de nombreuses années : pourquoi Windows affiche « Portez ce vieux whisky au juge blond qui fume », une phrase qui sonne faux, pour la prévisualisation d'une police de caractères ? C'est simple, c'est une des phrases les plus courtes comportant les 26 lettres de l'alphabet français !

mardi 16 octobre 2007

Information, énergie et ordinateur réversible

En lisant le journal « Une équivalence entre l'énergie et l'information ? », je me suis mis à rechercher des articles sur les questions soulevées pour tenter d'y répondre. J'ai croisé les informations avec les articles que j'avais déjà collectés sur les ordinateurs réversibles. Le billet qui suit est un petit état de l'art en vrac sur le lien entre l'énergie et l'information et ses diverses applications actuelles et futures.

Lire la suite

samedi 15 septembre 2007

Liens septembre 2007 : imagerie et programmation

Par expérience, lorsque je collecte 10 liens Internet dans ma barre de favori, je n'en lis finalement qu'un seul voir aucun. J'essaye donc rapidement de vider mes favoris pour éviter d'avoir une liste kilométrique. Or des fois je cherche un lien que j'avais dans mes favoris mais que j'ai perdu en le supprimant rapidement... Voici donc une collection de liens que je ne voudrais pas perdre bien qu'ils ne m'intéressent que moyennement.

graphdep

Pour visualiser le trafic réseau d'un ordinateur, il existe de nombreux outils de visualisation. Philippe Biondi a par exemple développé l'outil RT Graph 3D qui utilise scapy pour dessiner en 3D les liens entre les éléments du réseau. Mais c'est la bibliothèque Python GVGlue de toady qui m'a donné envie de faire des schémas. J'ai alors écrit graphdep qui utilise GVGlue. Pour commencer, voici le graphe du programme graphdep :

Le schéma représente les dépendances entre les différents modules d'un projet. L'utilisation de graphdep ne nécessite pas de modification du programme : les modules sont découverts automatiquement. La version actuelle supporte les langages C, C++, PHP et Python. Comme à mon habitude, je distribue ce programme sous licence GNU GPL, vous pouvez le télécharger gratuitement sur graphdep.

Beaucoup d'options sont disponibles pour filtrer les modules à afficher ou cacher, ou non car le schéma peut rapidement devenir énorme. Exemple avec le même projet mais en affichant tous les modules :

On peut imaginer d'autres schémas : hiérarchie des classes, dépendances entre les fonctions, etc. Pour les fonctions, le logiciel Doxygen génère déjà de jolis graphes. Exemple : documentation de NuFW (libnuclient).

vendredi 31 août 2007

wikimapia, ohloh et web 2.0

J'aimerai vous présenter aujourd'hui deux sites internets qui me plaisent beaucoup. Les deux thèmes sont très différents mais ils ont un point commun : le « web 2.0 ».

Lire la suite

lundi 27 août 2007

Sélection Wikipédia d'Août 2007

Charles Osborne détient le record du monde du hoquet : il hoqueta sans interruption pendant 68 années, de 1922 à 1990. Avec un rythme de 40 fois par minute, on obtient un total d'à peu près 430 millions de fois !

Hans le malin est un cheval élevé en Allemagne, au début du XXe siècle, qui savait calculer, lire, épeler et identifier des notes de musiques. De multiples savants ont démontrés qu'il ne sagissait pas d'un canular.

Armin Meiwes est un informaticien allemand qui a mangé Bernd Jürgen Brandes. Les deux hommes se sont rencontrés sur Internet suite à une annonce postée par Armin. « Armin Meiwes déclare regretter son geste, mais il garde tout de même un « bon » souvenir du repas. »

La Loi de Parkinson affirme que « le travail s’étale de façon à occuper le temps disponible pour son achèvement ». Je suis bien placé pour dire que cette loi est diablement vraie. (source : blog d'Uwe Hermann)

Le Candirú est un petit poisson parasite vivant dans le fleuve Amazone. Des cas cliniques ont montré que ce poisson peut remontrer le long de l'urètre (comprendre, le pénis). (source : épisode de Grey's Anatomy).

Le Trou analogique explique pourquoi toute protection de la musique (CD audio, fichier informatique, DVD, ...) est futile.

Pour finir, une anecdote de l'Exploration de données :

[Une étude des magasins Wal-Mart a mis en évidence] une corrélation très forte entre l’achat de couches pour bébés et de bière le samedi après-midi. Les analystes s'aperçurent alors qu'il s'agissait des messieurs envoyés au magasin par leur dame pour acheter les volumineux paquets de couches pour bébé. Les rayons furent donc réorganisés pour présenter côte à côte les couches et les packs de bière... dont les ventes grimpèrent en flèche !

Je vous conseille de creuser les articles pour en découvrir d'autres encore plus insolites mais attention à ne pas s'y perdre ;-)

Rappel : Pour ceux qui ont loupé l'explosion de la baleine ou le poulet sans tête, lisez mon précédent billet sur Wikipédia (mars 2007).

mercredi 22 août 2007

Historique du site haypocalc.com

Étant donné que je suis en train de nettoyer mon site Internet, haypocalc.com, je vais en profiter pour en retracer son histoire.

Contenus hébergés

J'ai acheté le nom de domaine haypocalc.com ainsi qu'un hébergement chez OVH en décembre 2001 pour y publier ma calculatrice scientifique HaypoCALC. Ce logiciel restera le contenu essentiel du site web pendant plusieurs années.

J'ai ensuite hébergé deux sites Internet d'un ami (Nicolas Letavernier) : Le Système Solaire d'Exoscin et Généalogie des LETAVERNIER (sites hebérgés aujourd'hui sur son propre site, letavernier.com). Ami avec qui je suis d'ailleurs parti au Québec de Septembre à Décembre 2003. Ensemble nous avons monté un site Internet pour y narrer nos aventures : Notre aventure au Québec.

Enfin, le dernier gros événement est la création du blog que vous êtes en train de lire en mai 2006.

Vous trouvez les détails ainsi que mes autres sites Internet, anciens et actuels, dans mon article Mes sites web. La mémoire de l'Internet, archive.org, a conservé de nombreuses copies de mon site depuis sa création : consultez les archives d'haypocalc.com depuis 2002.

Évolutions technologiques

Le partie technique du site web où je publie mes articles d'informatique (de mathématiques et divers autres sujets) a connu trois grandes époques.

Au départ, j'écrivais mes articles sous forme de document HTML. Je me servais de l'éditeur Macromedia Dreamweaver 4 car j'appréciais de voir directement le résultat (principe d'un éditeur WYSIWYG). Un jeu de scripts PHP me permettaient d'ajouter un entête, un menu dynamique et un pied de page.

Émerveillé par les norme XML, XSLT et CSS, j'ai alors migré tout mon site sous forme de documents XML. Je voulais respecter la sacro-sainte rêgle « séparation du fond et de la forme » (dans mon cas : du texte et de la mise style). J'ai extrait le style pour rédiger une feuille de style CSS et j'ai écrit des outils XSLT pour générer du HTML à partir du XML. Les articles étaient écrits dans ma variante simplifiée du HTML.

Un jour j'en ai eu assez de passer plus de temps à développer des logiciels pour mon site web plutôt qu'à écrire des articles. J'ai alors décidé d'utiliser un outil existant pour me concentrer sur le contenu et j'ai choisi MediaWiki. J'ai découvert cet outil par l'encyclopédie Wikipédia et j'ai rapidement adoré l'édition en ligne par un simple clic. Depuis que j'utilise MediaWiki, j'ai réalisé que mon site web était plus actif. Je n'hésite plus à corriger mes fautes de frappes et à ajouter des informations à un article. Un autre avantage de MediaWiki est qu'il est toujours développé et je profite donc des mises à jour.

Publicité

Mon site haypocalc.com n'a jamais vu la moindre banière de publicité. Je me suis toujours refusé à me laisser tenter par cette pollution visuelle (Résistence À l'Agression Publicitaire). Pourtant, le traffic du site augmente continuellement. Je suis passé de 26.000 visiteurs en 2002 à 953.000 en 2006 pour atteindre aujourd'hui 3.700 visiteurs par jour. Il est tentant de gagner de l'argent en ajoutant des encarts publicitaires, mais je préfère préserver mes visiteurs pour un meilleur confort de lecture.

mardi 14 août 2007

Migration à MediaWiki 1.10 et réduction de la taille de la base MySQL

J'ai reçu récemment un email indiquant que ma base de donnée haypocalc.com atteignait 90% du quota de 25 Mo. J'ai rapidement suspecté mon wiki de monopoliser toute la place dans MySQL. Je sais que MediaWiki, logiciel gérant le wiki, est très gourmant en place : chaque révision d'une page est stockée intégralement dans la base de donnée et non pas juste les changements.

Changement de contrat

La première chose qui m'a choqué est que les termes de mon contrat OVH, une offre d'hébergement « 300GP » (GP pour Grand Public), avaient changé. Pour preuve, en 2003 l'offre comportait « espace MySQL illimité », alors qu'aujourd'hui il y a un quota de 25 Mo. Je n'ai pas été informé de ce changement. Il existe des options pour avoir 100 ou 250 Mo de base MySQL, mais ça se paie très cher : respectivement 72€ et 144€ (prix TTC par an). Un mauvais point pour OVH.

La grosse boulette

J'ai alors commencé par faire une sauvegarde de la base. Par expérience, j'ai appris à toujours sauvegarder avant de faire une opération délicate (susceptible d'être une connerie).

Pour faire le ménage dans le wiki, j'ai décidé de vider la table MySQL « wiki_text » qui semblait ne contenir que les anciennes versions. Les noms des colonnes de cette table sont préfixés par « old » (ancien) alors que pour la table « wiki_cur », les noms des colonnes sont préfixés par « cur » (current, actuel). Manque de bol, j'ai alors cassé le wiki : impossible de modifier une page (le formulaire d'édition était vide) !

Je réalise que j'ai fait une boulette : j'aurai du la renommer plutôt que de la vider.

Tentative de restauration du SQL par phpMyAdmin

Pour restaurer la base MySQL, je commence par la vider (supprimer toutes les tables) et j'utilise le phpMyAdmin d'OVH pour envoyer la sauvegarde. Sachant que la taille maximale de l'envoi est de 8 Mo (compressé ou non), je compresse mon dump SQL de 22 Mo avec gzip. Le fichier tient dans 4 Mo, la taille est bonne : je l'envoie. Premier échec : timeout PHP.

J'installe alors phpMyAdmin dans mon hébergement pour résoudre le problème de timeout. J'ai passé la première épreuve mais j'ai un nouveau soucis : la requête SQL s'interrompt. Il est possible de reprendre son exécution en réenvoyant le même fichier, sauf qu'après quelques étapes, c'est MySQL qui échoue. Décidément, rien ne fonctionne !

Concentration

À ce point là, la base de donnée MySQL de mon site était vide. Mon wiki et mon blog étaient donc hors-service depuis trois heures. Autre idée pour contourner les erreurs phpMyAdmin : j'écris un script Python pour découper le dump SQL de 22 Mo en petits bouts de 8 Mo. Nouvel échec. Je tente alors 6 Mo, 5 Mo, 4 Mo : rien à faire.

Finalement, je réunis tous mes neurones pour me souvenir que j'avais déjà eu ce même soucis quelques années auparavant. Pour les gros transferts SQL, il faut utiliser la commande « mysql » (en ligne de commande via un script PHP) après avoir envoyé le dump SQL par FTP. J'upload le dump et je lance la commande: ça marche !

Merde alors, si j'avais une meilleure mémoire, j'aurai gagné 4h :-( « Quand on n'a pas de tête, on a des jambes pour courir »

Migration à MediaWiki 1.10

Après de nombreuses heures, j'avais réussi à corriger ma boulette, mais mon soucis de taille de la base MySQL persistait. Entre temps, j'étais tombé sur l'article Help:Reduce size of the database de l'encyclopédie dédiée à Star Trek. En suivant les liens, j'ai vu que le problème est ancien et corrigé : il existe un script « maintenance/deleteOldRevisions.php » pour faire le ménage. Je récupère le script pour MediaWiki 1.6 par subversion et je le lance : erreur PHP (appel à une fonction non déclarée). Je comprend que ma version de MediaWiki est trop ancienne, il faut migrer à la nouvelle version.

Je prend mon courrage à deux mains et décide de migrer MediaWiki en version 1.10. C'est toujours une bonne idée niveau sécurité. Je récupère la base de donnée de mon wiki et l'installe dans un MediaWiki 1.10 neuf. Je lance le script « php upgrade.php --quick » (lu dans la documentation MediaWiki) et à mon grand étonnement, c'est un succès au premier essai !

Réduction de la base MediaWiki

Je peux enfin lancer « php maintenance/deleteOldRevisions.php --delete ». La commande dure longtemps, une dizaine de minutes, mais s'est terminée correctement.

Je renvoie ma base de donnée mise à jour et j'installe MediaWiki 1.10 sur haypocalc.com. Tout baigne.

Conclusion

Ce qu'il faut retenir : Pensez à faire des sauvegardes et assurez vous de pouvoir l'utiliser (avant de tout casser) !

Au total, j'ai du passer environ 6h sur mon problème en transpirant tout le long à grosses gouttes. Effectivement, j'avais supprimé volontairement six ans de boulot et j'étais incapable de le restaurer.

Je doute que ce billet intéresse grand monde, mais je me devais de l'écrire pour ne pas retomber dans les mêmes pièges ;-)

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.

samedi 23 juin 2007

Bogue Firefox vieux de 7 ans

Dans l'utopie du logiciel libre, un projet est mené par toute une communauté de gens où chacun participe à sa manière. En particulier, les développeurs écrivent le code source et les utilisateurs testent le programme. Quand un utilisateur trouve un bogue, il le rapporte et le développeur s'empresse de le corriger. En pratique, la dernière phrase est incorrecte : certains bogues ne sont corrigés que tardivement.

Aujourd'hui je suis tombé sur un bogue dont m'avait parlé un ami : le navigateur Mozilla Firefox tronque les « infos bulles » des images (texte affiché lorqu'on fige la souris sur une image). Le problème affecte le site de la bande dessinée xkcd dont la FAQ en parle justement.

Je suis alors tombé sur l'extension Firefox nommée Long Titles qui permet d'afficher le titre complet des images. Le bogue est pourtant connu depuis Juillet 2000 (SeaMonkey-only bug: Long tooltips) et a plus de 300 commentaires ! Il y a 7 ans Firefox n'existait pas encore, c'était la suite Mozilla qui était distribuée dans sa version 0.6.

Je vais éviter de faire un comparatif avec le logiciel propriétaire ou d'autres logiciels libres car je n'ai pas le temps de le faire. Je vais également éviter de dire que le navigateur que j'utilise, Konqueror, n'a pas ce bogue car il y a plusieurs autres que je connais :-) Je trouve quand même ça drôle qu'un bogue survive 7 ans et que des gens continuent le rapporter ! Pourtant, il me semble trivial à corriger, je ne comprend pas pourquoi ce n'est pas le cas.

mercredi 6 juin 2007

Bilan du SSTIC 2007

Me voilà de retour de Rennes où j'étais avec 3 collègues « nupik ! » pour le SSTIC. Ces trois journées de conférences étaient denses en information et vraiment très intéressantes. J'ai été agréablement surpris de recevoir les actes sur papier dès notre arrivée : plus de 300 pages contenant les publications de toutes les conférences ! Ça va me permettre d'en savoir plus à tête reposée. Je vous présente les conférences qui m'ont le plus marqué.

Mercredi : authentification Windows

Aurélien Bordes nous a offert une excellente présentation des « Secrets d'authentification sous Windows ». Il a réussi à vulgariser des techniques et concepts obscurs de Windows. En résumé : même si les hashs LM ne sont plus stockés sur disque dur, ils persistent en mémoire ! On peut également s'authentifier uniquement en connaissant un hash. Et enfin, si j'ai bien compris : il suffit d'être administrateur sur sa machine pour réussir à passer administrateur sur tout le domaine Windows.

Ce qui est drôle, c'est qu'il a supposé pour commencer qu'on est administrateur de la machine. Comprendre : c'est tellement facile de passer admin sous Windows, que je ne donne pas la peine de vous montrer comment ! Effectivement, les exploits Windows pleuvent ! Sortez les parapluies (hop, petite réferrence cachée à la météo Bretonne où il ne pleut que sur les ....).

Mercredi : analyse de canaux cachés

Christophe Clavier m'a enfin éclairé sur les canaux cachés dans sa conférence « Attaques par analyse de canaux cachés et de fautes. Applications aux algorithmes à spécifications secrètes ». En enregistrant la consommation de courant d'une puce électronique et en la bombardant avec un laser (c'est Starwars !), il en extrait des informations juteuses. Il a montré qu'on peut reconnaître des motifs dans les mesures de courant et deviner quels bits (d'une clé privée RSA) sont à 0 ou à 1. Avec ses schémas ça semblait clair... mais n'empêche que l'unité était un cycle processeur : on travaille donc à l'échelle de la nanoseconde !

Jeudi : fuzzing wifi

Alors que je n'avais pas terminé ma nuit, voilà que Laurent Butti et Julien Tinnès débarquent en parlant de « Recherche de vulnérabilités dans les drivers 802.11 par techniques de fuzzing ». Wow, je suis tout à vous les gars ! Toady m'avait déjà passé la présentation la semaine précédente, mais c'était bien plus clair avec les explications.

Je pense que tout le monde a été bluffé dans la salle lors de la démo : avec quelques paquets wifi, un exploit noyau est installé sans faire tomber le pilote wifi... alors qu'il utilise justement un bug dans le pilote. Le pire est que l'exploit se fait lors de la première phase de connexion wifi : avant l'authentification ! S'insérer dans un noyau sans contact physique, ça laisse quand même songeur.

J'étais aussi heureux de voir le travail d'autres personnes sur le fuzzing. Comme quoi cette technique est très hype ;-)

Jeudi : Metasm

Yoann Guillot nous a présenté son framework Ruby « Metasm, l'assembleur ». Cette boîte à outil permet d'insérer du code dans un programme en cours de fonctionnement, d'assembler des blocs de code, de compiler en assembleur à la volée, et bien d'autres choses.

J'ai surtout retenu qu'on peut écrire des shellcodes en assembleur en laissant des « trous » dans le code : des variables qui seront remplacées à la compilation ! Metasploit 3, également écrit en Ruby, va se baser sur Metasm pour les shellcodes. Ce qui évitera les BLOBs (shellcodes binaires peu souples) et vilains hacks.

Jeudi : analyse de la mémoire vive

J'entend de plus en plus parler d'attaques « tout en mémoire ». Nicolas Ruff nous le confirme dans sa présentation « Autopsie d'une intrusion « tout en mémoire » sous Windows ». Il y détaille toutes les méthodes pour dumper la mémoire : firewire, fichier d'échange (swap), génération d'écran bleu de la mort, hibernation, reset physique de la carte mère, etc. J'étais surpris par l'idée d'un reset de la machine mais selon ses dires, la mémoire est inchangée même après 15 secondes hors tension ! On pourrait donc débrancher puis rebrancher le PC tout en conservant le contenu de la RAM. Il parle alors de système d'exploitation minimaliste (il ne faut pas écraser la RAM !) pour dumper la mémoire.

Après le dump, il faut analyser l'image. Il présente deux méthodes pour retrouver l'organisation de la mémoire : recherche du registre CR3 ou recherche de motifs en mémoire (ex: recherche des structures des processus). Ses travaux sont très prometteurs et de plus en plus d'outils sont disponibles.

Jeudi : projet Fusil

Durant les rump sessions, j'ai eu l'honneur de parler de mon projet Fusil : présentation Fusil en PDF. C'était un exercice de style pour arriver à tenir dans quatre minutes et pas une seconde de plus. J'étais frustré de ne pas avoir plus de temps, mais au final c'est vrai que c'est tout bénef' : les rumps ennuyeuses sont vites zappées et on peut en voir un plus grand nombre en un temps minimal ;-)

Vendredi : OpenDocument et OpenXML

Philippe Lagadec confirme mes craintes : sa présentation « Sécurité d'OpenDocument et Open XML (OpenOffice et MS Office 2007) » montre que les protections des macros dans OpenOffice et Microsoft Office sont inefficaces. La politique de sécurité est incohérente et il est facile de tromper l'utilisateur (Social Engineering en force !). J'ai appris qu'OpenOffice peut embarquer des documents OLE2 de n'importe quel type. C'est sûrement pour des raisons de compatibilité avec Microsoft Office (sic). Or il existe un objet OLE2 permettant de lancer une ligne de commande arbitraire.

Bilan

Je rentre du SSTIC la tête grosse comme une pastèque. Je vais devoir creuser tout ça pour en savoir plus.

À peine rentré du SSTIC, je fonce dormir chez un ami pour y préparer mes présentations Python car le lendemain (Samedi) j'attaque les Journées Python Francophones.

Merci encore à toady qui nous a évité de dormir sous les ponts la première nuit. Il nous a dépanné en nous acceptant dans sa chambre d'hôtel. Tout de suite, ça crée des liens :-D

samedi 19 mai 2007

Journées Python le 2 et 3 juin 2007 à Paris

L'AFPy organise pour la première année les Journées Python Francophones. Au programme : de nombreuses conférences de 9h à 17h (voir plus si on est motivé), consultez le programme complet .

Au début je n'avais pas prévu d'y aller : Strasbourg - Paris ça fait encore 4h de train même si « le TGV Est arrive »... le 10 juin. Mais comme je vais au SSTIC, je vais m'arrêter à Paris au retour. Le SSTIC, c'est 3 jours de conférences, du 30 mai au 1er Juin à Rennes, sur le thème de la sécurité. C'est ma boîte, INL, qui me paie l'inscription (environ 200€ de mémoire) et le voyage. J'y serai avec 3 collègues et vu le programme, ça risque d'être vraiment chouette. En plus, je ferai un présentation éclair (5 minutes) sur le fuzzing ;-)

Pour revenir aux Journées Python (qui elles sont gratuites), je vais également y faire présentations : « Projet Hachoir et bonnes pratiques » et « Automatisation des tests logiciels ». Hum, ça a l'air intéressant, mais il va falloir trouver du contenu pour tenir 25 minutes chaque fois :-) Je mettrais toutes mes présentations en ligne une fois qu'elles seront écrites.

Présentations Python qui me tentent bien :

  • TraitsUI pour développer des applications graphiques : j'en avais déjà entendu parler et ça semble très prometteur comme technologie
  • Atelier http://ipython.scipy.org/ : interpréteur Python intégrant un débogueur, la coloration syntaxique, un petit éditeur, etc.
  • Lightning Talks : On peut s'attendre à plein de trucs chouettes :-)
  • Python et visualisation 3D : La 3D m'a toujours attirée
  • Dr. Gumby, the brain specialist (IA avec SciPy) : Intelligence artificielle et SciPy, ça ne peut qu'être intéressant.

En fait, il y a un peu tout qui me tente et je suis sûr que j'aurai de bonnes surprises. Allez, viendez aux Journées Python ;-)

MISE A JOUR POST WEEK-END : Vous pouvez maintenant consulter ma présentation du projet Fusil (PDF) et mes présentations Python (HTML).

Raccourcis clavier

Les raccourcis clavier permettent d'exécuter des commandes sans toucher à la souris. On ne perd pas de temps avec des aller-retours entre le clavier et la souris. Par contre, ils sont souvent peu ou mal documentés et difficiles à mémoriser. En réalité, le plus souvent on n'en connait même pas leur existence ! En tout cas, je vous garantis que ça en vaut la chandelle !

Commençons avec le b.a.-ba, le copier-coller qui évite d'avoir à retaper le même texte :

  • Sélectionner le texte en maintenant la touche SHIFT puis en se déplaçant (avec les touches flêchées)
  • Copier le texte avec « CTRL+C » (notation courante pour dire : maintenez la touche CTRL puis appuyez sur C sans relacher la touche CTRL)
  • Se déplacer à l'endroit où l'on veut coller le texte (toujours avec les touches flêchées)
  • Coller le texte avec « CTRL+V »

Cette manipulation est devenue pratiquement universelle à travers tous les logiciels sur les divers systèmes d'exploitation. Sachez qu'il en existe des centaines d'autres ! Une voici une petite liste :

  • Se déplacer mot par mot : CTRL+droite ou CTRL+gauche
  • Aller au début/à la fin de la ligne ou du document : touche Début (habituellement au dessus de la touche Fin) / touche Fin
  • Se déplacer page par page : touche Page haut / Page bas
  • « Tout » sélectionner : CTRL+A
  • Zone de saisie suivante / précédente : TAB / SHIFT+TAB
  • Recherche un bout de texte : CTRL+F
  • Annuler la dernière action : CTRL+z
  • Ouvrir un fichier : CTRL+o

Certains raccourcis sont différents selon les applications ou bien ne sont pas disponibles. Il est plus sûr d'ouvrir le menu Fichier ou édition et consulter les raccourcis affichés à droite du texte.

Bash

  • Naviguer parmis l'historique des commandes : Haut / Bas
  • Début/fin de la ligne : CTRL+a / CTRL+e
  • Couper la fin de la ligne : CTRL+k
  • Couper le mot précédent : CTRL+w
  • Coller ce qui a été coupé : CTRL+y
  • Rechercher une commande tapée récemment : CTRL+s (ensuite CTRL+s / CTRL+r permet de naviguer parmis les résultats de la recherche)
  • Interrompre le programme courant : CTRL+z (la commande « fg » reprend l'exécution alors que la commande « bg » continue l'exécution en arrière plan)

Vim

Pour vim, reportez-vous à mon article Vi car la liste est longue :-)

Firefox et Konqueror

  • Site (page) précédent / suivant : ALT+gauche / ALT+droite
  • Ouvrir un nouvel onglet : CTRL+T
  • Passer à l'onglet suivant / précédent : CTRL+Page bas / CTRL+Page haut

KDE

  • Ouvrir le menu K : ALT+F1
  • Lancer une application : ALT+F2 (j'utilise uniquement ça au lieu du menu K)
  • Fermer une application : ALT+F4
  • Aller sur le N-ième bureau : CTRL+Fn (ex: CTRL+F2 pour le 2e bureau)
  • Lancer le programme listant les processus : CTRL+Echappe

Cet article est loin d'être exhaustif, mais j'espère qu'il vous a donné goût aux raccourcis et que vous en trouverez d'autres par vous même :-)

lundi 14 mai 2007

Publication de deux vulnérabilités

Du fuzzing, toujours plus de fuzzing ! Plus je triture les programmes et plus je trouve de bugs. Je n'ai pas encore assez de recul pour dire si c'est positif ou non. En tout cas, je n'arrête pas de publier des rapports de bugs.

Un collègue m'a conseillé de contacter des organismes s'occupant de diffuser les vulnérabilités pour que tous les gens concernés soient au courant et prennent les dispositions nécessaires. Le premier, FrSIRT, m'a répondu en 2h et le second, Securina, en 4h. Chapeau ! Et après quelques échanges d'emails pour leur donner des détails, deux bulletins de sécurité ont été publiés :

Je ne suis pas peu fier de lire mon nom sur ces sites Internet :-) Le bug ClamAV (anti-virus libre pour Windows et Linux) est inquiétant car aucun nouvelle version n'a été publiée pour le corriger. Si ce bug est exploité, il peut rapidement mettre un serveur anti-virus hors-service : consommation massive de ressource processeur et de disque dur.

Je suis de plus en plus persuadé que tous les programmes sont bogués et qu'un certain nombre de bugs sont exploitables par des pirates informatiques. Ce n'est vraiment pas rassurant car tous les types de documents sont affectés. Pour ne citer que les plus courant : on peut planter un programme avec un simple document PDF voir même une image JPEG !

Je cherche et je rapporte les bugs pour contribuer au libre mais également pour éviter que des pirates le fassent à ma place et exploitent les bugs. Comme je n'aurai jamais le temps de tester tous les programmes, je pense plutôt à publier mes outils de test pour que d'autres poursuivent mon travail. J'ai déjà commencé par mettre en place un serveur Subversion ainsi qu'une plateforme Trac pour publier mon travail. Mon nouveau projet est hébergé sur mon serveur perso à l'adresse : fusil.hachoir.org. Consultez mon tableau de chasse : liste des bogues trouvés par la méthode du fuzzing.

lundi 7 mai 2007

Fuzzing de la glibc (printf)

Suite de mon initiation au fuzzing. J'ai continué des tests pour trouver toujours plus de bug. J'avais lu par-ci par-là que les programmes ont de très nombreux points d'entrée, pas uniquement le clavier et la souris. J'avais testé les fichiers, j'ai alors testé les variables d'environnement. J'ai d'abord écrit un script bash utilisant strace (puis ltrace) pour traquer les appels à getenv() (entre autres). À partir de la liste des variables, j'en tenté de faire planter les programmes en passant des valeurs invalides (grand nombre, très longue chaîne, etc.). Le premier programme à planter était dpkg avec « COLUMNS=10000000 dpkg -l ».

J'ai mis une bonne grosse semaine à isoler le bug. J'ai compris que le bug venait de vfprintf() mais je n'ai pas compris dans quel cas on pouvait le reproduire. J'ai isolé la chaîne de formatage : on peut alors reproduire le bug avec la fonction printf de bash ou /usr/bin/printf : « printf "%-1.25000000s" "Hello" ». En creusant encore plus, jusqu'à l'assembleur (on peut pas creuser plus profond :-)), j'ai isolé la ligne C qui posait problème. C'était un appel à mbstowcs() utilisant un tampon local de la forme « wchar_t ignore[prec]; », or prec vaut 25000000. En clair : la glibc tente d'allouer 25 Mo dans la pile alors qu'elle fait que 8 Mo et que Linux ne sait pas la faire grossir automatiquement (honte à lui). Je pensais justement que c'était un appel à alloca() mais je faisais fausse route. Conclusion : utilisez la pile avec parcimonie. Évitez absoluement la fonction alloca() et la notation C « type var[taille]; » où taille est supérieur de 4096 ou une variable contrôlable directement ou indirectement par l'utilisateur.

J'ai rapporté le bug et il a été corrigé en 48h par Ulrich Drepper (mainteneur de la libc). Encore une belle preuve de la réactivité des développeurs de logiciel libre.

mardi 24 avril 2007

Imposer des limites arbitraires

Durant mes essais de fuzzing, j'ai compris assez vite qu'espérer écrire un programme parfait n'est qu'un idéal. Plutôt que de corriger les erreurs, je pense qu'il vaut mieux écrire du code tolérant aux erreurs. Je veux dire par là que le programme continuera à fonctionner même si une procédure échoue.

Utiliser les exceptions

On peut utiliser pour ça le couple try/except en Python. Exemple trivial :

value = (...)
try:
   print "Date : %s" % datetime.datetime.fromtimestamp(value)
except ValueError:
   print "Date invalide (%r) !" % value

Mais le fuzzing mène souvent à une situation d'épuisement (monopolisation) des ressources : votre programme va manger tout le temps processeur, toute la mémoire, remplir le disque dur, utiliser toute sa pile, etc. J'ai alors cherché comment détecter ces situations de crise. D'ailleurs elles ne doivent pas être vue comme critiques mais normales et il faut les avoir à l'esprit en écrivant un programme. Effectivement, les ressources sont limitées : il faut apprendre à partager.

Limiter la mémoire

Sous Linux, on peut utiliser resource.setrlimit(RLIMIT_AS, ...). Si la mémoire totale dépasse max_mem, une exception MemoryError est émise par Python.

J'ai implémenté une fonction limitedMemory() qui va limiter temporairement la mémoire : lire memory.py d'hachoir_core. L'erreur apparait si la mémoire grossit de la quantité d'octets indiquée. Il suffit alors d'utiliser « try: limitedMemory(maxmem, ...) except MemoryError: ... ».

Limiter le temps processeur

Pour éviter que le programme reste bloqué au même endroit pendant un temps excessif (cas typique : une boucle infinie), il faut pouvoir appeler une fonction avec une durée maximale. Sous Linux, on peut utiliser au choix : time.alarm() ou resource.setrlimit(RLIMIT_CPU, ...). À noter que pour la seconde solution, les pauses (time.sleep()) et le temps passé dans le noyau ne sont pas pris en compte : il vaut donc mieux utiliser une alarme. Une alarme déclanche un signal SIGALRM alors que RLIMIT_CPU va générer un signal SIGXCPU.

J'ai implémenté les deux méthodes dans la fonction limitedTime(sec) : lire timeout.py d'hachoir_core.

Lorsque c'est possible, il vaut mieux utiliser des fonctions offrant déjà cette fonctionnalité comme par exemple la fonction select().

Limiter la pile

En testant dpkg, j'ai réussi à le planter avec « COLUMNS=10000000 dpkg -l ». Après investigation, il s'est avéré que l'erreur venait de la libc (chose qui semblait impensable à mes yeux). En creusant encore, j'ai vu que vfprintf() utilisait massiment la pile pour écrire la sortie de dpkg (qui configure stdout pour ne pas utiliser de tampon).

Bref, j'ai cherché à voir s'il était possible d'attraper l'erreur « épuisement de la pile ». Et bien sûr que oui : c'est possible ! Par contre, quand la pile est hors-service, hors de question d'utiliser printf() ou autre fonction succeptible de réutiliser la pile. Linux permet d'utiliser une pile dédiée aux gestionnaires de signaux. Ah là là, il est quand même fort ce système d'exploitation, hein !

Les fonctions clés sont sigaltstack() pour créer une pile dédiée à notre gestionnaire de signal, sigaction() pour appeler notre fonction quand le signal SIGSEGV est émis, setjmp()/longjmp() pour quitter le code bogué et revenir à la « borne de sauvegarde » (renseignée par setjmp()).

Exemple d'implémentation : stack.c.

En réunissant tous ces élements (try/except, limiter la mémoire, temps et pile), je pense qu'on peut commencer à écrire des programmes robustes. Bien sûr, rien ne vaut un audit minutieux du code source.

vendredi 20 avril 2007

Suivez l'actualité avec RSS

RSS permet de recevoir chez soi, sans se bouger les fesses (ni la souris), gratuitement, les nouveaux articles des sites Internet proposant ce service. Or ça tombe bien, aujourd'hui tous les sites le proposent. Je suis longtemps resté éloigné du buzz RSS car ça ne m'intéressait tout simplement pas. Et puis un jour j'ai remarqué que j'avais un logiciel (Akregator) préinstallé par la suite Kontact. J'ai alors ajouté mon premier flux (linuxfr de mémoire), puis un autre, etc. Aujourd'hui j'en ai une tripoté et j'avoue que je suis devenu fan.

Avantages du RSS :

  • Moindre effort (j'aime !) : se met à jour tout seul, pas besoin d'aller sur 20 sites différents quotidiennement : chaque heure les nouvelles fraiches viennent à vous (et non le contraire)
  • Suivre l'actualité : encore une fois, étant donné que c'est mis à jour tout seul : on peut suivre l'actualité de sites Internet à faible traffic (ex: une nouvelle par mois). Ceci me permet de suivre des blogs rarement mis à jour (ex: le mien).
  • Mise en forme épurée : pas de publicité, pas d'habillage bariollé ou encore une largeur de texte fixe. On reçoit le texte brut, quelques liens et parfois une image.

Désavantages du RSS :

  • Nouvelle drogue : comme pour le courriel, je me suis surpris à appuyer frénétiquement sur le bouton « rafraichir » pour recevoir toujours plus d'articles. À utiliser avec modération. Je me désinscris de temps en temps à des flux inintéressants ou qui me prennent trop de temps.
  • Pas de commentaire : il n'y a que le texte original, pas les commentaires. Il faut aller sur le site internet (un lien direct est donné) pour les obtenir. J'ai vu qu'il existe des flux dédiés aux commentaires mais je crains que ça soit une drogue dure :-/

Trève de blabla, voici ma liste de flux (en vrac). J'indique les thèmes principaux.

Blogs (faible traffic : 1 à 10 articles par mois) :

  • (fr) Biologeek : Python, Django, biologie.
  • (fr) devloop : Sécurité informatique, logiciel libre, Linux.
  • (fr) Thomas Petazonni : Logiciel libre, Debian, programmation.
  • (fr) yeKcim : Ubuntu, jeux libres, littérature, dessin, humour.
  • (fr) Tarek : Python et programmation.
  • (en) Glandium : Programmation, Debian, logiciel libre.
  • (en) Sam Hocevar : Programmation et Debian

Python :

  • (en) Daily Python-URL! : Python, Python, Python et Python (drogue dure ! jusqu'à 40 articles par jour)
  • (en) Python News : Sorties des nouvelles versions de Python (très faible traffic)

Logiciel libre :

  • (fr) Wormux : le jeu Wormux
  • (fr) Dépêches linuxfr.org : Logiciel libre au sens très large, Linux, *BSD (de 1 à 5 articles par jour)
  • (fr) Journaux linuxfr.org : Même thème que les dépêches + du n'importe quoi (drogue dure ! jusqu'à 10 articles par jour)
  • (en) Debian Package of the Day : Un nouveau logiciel Debian par jour (dumoins en théorie : en pratique c'est plutôt 10 par mois voir moins)

Photo du jour de Wikipédia (format 400x300 pixels), ce service vient d'être créé il y a à peine une semaine :

Pour finir, RSS de ce blog : RSS du blog Haypo.

mercredi 11 avril 2007

Qui veut gagner de l'argent en Masse

« Qui veut gagner de l'argent en Masse » est une parodie du jeu télévisé « Qui veut gagner des millions » avec Gad Elmaleh et Olivier. Pour avoir été au Québéc, je suis plié de rire en écoutant l'imitation de l'accent québécois. On remarquera le magnifique pull de Guy Saint Hilaire.

Quelques citations remarquables :

  • (1min)
    • M: Vous pouvez gagner jusqu'à un million de dollars. Mais qu'est-ce vous allez faire avec tout cet argent si vous gagnez ?
    • G: Ben disons que si j'arrive à ce niveau du jeu, j'pense que je quitterais ma femme et je me paierai des putes de luxe.
    • M: Mais comme je vous comprend !
  • (3min)
    • M: Guy, ne vous lancez pas à l'emporte pièce. Réfléchissez.
    • G: Marcel, si je m'arrête là, combien j'ai ?
    • M: Vous nous devrez un million de dollars.
  • (4min)
    • M: Mais qui allez-vous appeler ?
    • G: Garou
    • M: Garou ? L'intermittent ?
  • (6 min)
    • « Lorsqu'on invite un pancake à une Barmitzva les convives doivent :
    • (A) l'inciter à boire à l'Open Barmitzva
    • (B) lui présenter Raymond Barmitzva
    • (C) lui offrir des malabarmitzva
    • (D) la réponse D »
  • (9 min)
    • G: Marcel, je vais demander le moit'-moit'
    • M: Computer ? ... (rires) ... vous allez retirer deux mauvaises réponses
    • G: Marcel est-ce que je peux demander exceptionnellement le super moit'-moit' ?
    • M: Computer... procédez au super moit'-moit'

Pour voir ce sketch de 11 minutes, vous avez le choix :

Le sketch doit être ancien mais je ne me lasse pas de le revoir ;-)

mercredi 4 avril 2007

Nouvelles d'hachoir-metadata

hachoir-metadata est un programme permettant de lire les métadonnées d'un fichier : taille d'une image, auteur d'une vidéo, durée d'un son, etc. Il repose sur hachoir-parser pour lire les informations d'un fichier.

Traitements automatiques

hachoir-metadata réalise de plus en plus de traitements automatiques haut niveaux tels que :

  • supprimer les espaces inutiles
  • ignorer les chaînes de caractère vides
  • filtrer les valeurs : ignore les valeurs abbérantes (ex: image ayant une largeur nulle)
  • supprimer les doublons

La suppression des doublons ne concerne pas simplement les valeurs identiques. Pour les chaînes de caractère, hachoir-metadata est capable de reconnaître qu'une chaîne est le début d'une autre. Exemple : si on trouve les deux auteurs "James Brown" et "James Br" pour une chanson, seule la chaîne la plus longue est conservée (James Brown !).

Réutilisation des valeurs

L'extracteur de métadonnée est de plus en plus rigoureux : les valeurs doivent être d'un type précis. Par exemple, la durée d'une chanson est maintenant du type Python « timedelta ». Avant les dates, durées, débit en bit/sec, nombre de canaux audios étaient tantôt une chaîne de caractère, tantôt un entier, tantôt une date, ...

Le fait que le type des données soit strict a permis de faire des calculs sur les documents multimédias. On peut maintenant obtenir le débit en bits par seconde pour du son et de la vidéo, et le taux de compression pour une image et du son. Ceci permet de comparer la qualité d'un codec.

Option --quality

J'ai également ajouté l'option --quality permettant de choisir la « qualité » des métadonnées extraites. En fait, cette option détermine la vitesse d'extraction : les opérations lourdes ne seront faites que pour quality=1.0, alors que pour quality=0.0 toutes les opérations lentes sont ignorées. Cette option influe par exemple sur le calcul de la durée d'un MP3 à débit variable : pour un calcul exact, il faut lire le fichier en entier mais ceci est très long. L'option quality va donc faire varier le nombre de champs traités.

Lire la suite

jeudi 16 novembre 2006

Nom de code : Linux

Sous ce titre se cache un reportage sur Linux, le système d'exploitation libre basé sur le noyau du même nom. Ce reportage a été réalisé par le finlandais Hannu Puttonen en 2002. Étant co-produit par Arte et France5, il a également été diffusé sur Arte. Pour le visionner, vous pouvez demander à Google Vidéo ou vous le procurer en DVD (bonne chance...).

On y apprend d'où vient l'idée même de Linux d'une part le noyau avec Linus Torvalds et de l'autre le projet GNU avec Richard Stallman. D'autres « stars » du libre sont interviewées :

Le reportage dure 51 minutes dans la version française et 59 minutes dans la version originale. Le rythme est assez lent, il y a de nombreuses séquences avec des images censées représenter le monde des hackers que personnellement je trouve dénuées de sens. Mais dans l'ensemble il est très instructif.

Pour les assoifés d'informations : consultez le site officiel du reportage. Si ça ne vous a pas suffit, allez voir (ou revoir) « Le pacte des Gnous ». C'est un court métrage de 4 minutes réalisé par Bruno Thomé qui présente de manière assez caricaturale Linux face à Microsoft. Pour finir, merci à mickael__ pour m'avoir parlé de ce reportage :-)

dimanche 29 octobre 2006

Ma sélection de jeux libres

Au niveau du graphisme et du scénario, les jeux libres ont 5 à 10 ans de retard sur les jeux commerciaux. Malgré qu'ils soient souvent développés par une personne seule, ou au mieux une dizaine de personne, et ce durant leur temps libre : on trouve de vraies perles ! Je vais vous présenter ma sélection de jeux, c'est-à-dire ceux auquels je joue le plus souvent. Je ne choisis pas un jeu pour ses graphismes lêchés... qui n'apporteraient rien à la jouabilité, mais plutôt par le plaisir que je prend à y jouer.

Lire la suite

lundi 9 octobre 2006

IE7 sort bientôt

Après avoir lu un journal linuxfr traitant d'un crash d'Internet Explorer 6, je me suis mis à sourire en lisant « IE7 va bientôt arriver » dans un commentaire. Ce qui est comique, c'est qu'Internet Explorer 7 doit « bientôt arriver » depuis début 2005. D'ailleurs, cette nouvelle version majeure n'apporte rien en comparaison de ses concurrents. Une des nouveautés est le support des onglets... Cette fonctionnalité est déjà largement mise en avant par le butineur Firefox. Or Mozilla n'a que fait copier Opera qui a inventé les onglets il y a 10 ans !

Pendant que Microsoft copie lamentablement Firefox, ce dernier n'attend pas pour évoluer. Fin novembre 2005, Firefox passe de la version 1.0 à 1.5 : support de la norme CSS3 et des images SVG entre autres. Au même moment du côté de KDE, Konqueror passe de la version 3.4 à 3.5: Konqueror passe le test Acid2 et intègre adblock. Aujourd'hui, c'est Firefox 2 qui est en cours de finalisation : voyez les nouveautés de cette version 2. Konqueror continue bien sûr à évoluer avec des révisions mineures : 3.5.1, 3.5.2, .... La version 3.5.5 sort demain et apporte encore une grosse couche de correctifs sur les parties HTML et Javascript.

La leçon a retenir est que Microsoft n'arrive plus à imposer sa version de l'informatique. Avant, c'était Microsoft qui imposait sa version modifiée Java, sa version du web (HTML et CSS) et surtout son format de fichier pour les documents de bureautique (doc/xls, Word/Excel, notamment). Mon impression est que Microsoft sent qu'il est en perte de vitesse : Linux remplace peu à peu Windows sur les postes de travail, OpenOffice s'impose comme alternative à Microsoft Office, Firefox gagne chaque jour des parts de marché au détriment d'Internet Explorer, etc. Quelques signes : Microsoft tente d'être conforme aux standards du web (avec IE7) et se met finalement à l'Open Document.

vendredi 29 septembre 2006

À mort le spam !

Le spam, appelé pourriel en bon québécois français, est la plus grosse plaie d'Internet que je connaisse. En deux mots, le spam est le fait de recevoir mes messages non sollicités. Il prend de très nombreuses formes :

  • Courriel non sollicité (le spam désigne en général ce type de message) ;
  • Message non sollicité dans un forum de discussion (usenet, phpbb, etc.) ;
  • Insertion de message non sollicité dans les wikis ;
  • Message non sollicité envoyé par le protocole de message Windows (commande « netsend ») ;
  • Commentaires dans un livre d'or ou blog ;
  • Le plus original que j'ai vu étant des rapports de bugs dans Trac ;
  • etc.

Voyons quelle est l'origine des spams et surtout comment les éradiquer !

Lire la suite

dimanche 18 juin 2006

Typographie

L’informatique est truffée de choses illogiques qu’on peut parfois comprendre en découvrant son histoire. Par exemple, en France, les claviers ont une disposition des touches dite « AZERTY » (nom provenant de l’ordre des six premières lettres). Cette disposition du clavier, qui remonte au XIXe siècle, était une solution à un problème mécanique des machines à écrire. Or nous utilisons encore aujourd’hui cette disposition anti-ergonomique.

Enfin, je ne suis pas ici pour parler de machine à écrire, mais de typographie. J’ai remarqué qu'un clavier classique ne permet ni de saisir les guillemets français « », ni l’apostrophe française « ’ », ni les lettres majuscules accentuées « Á É … » (pas facilement sous Windows en tout cas), ni les lettres « œ Œ », etc.

Lire la suite

mercredi 14 juin 2006

Quelle Epoch vivons-nous !

Les limites arbitraires hantent nos ordinateurs. Ce sont des valeurs que des informaticiens ont jugées suffisantes lorsqu'ils écrivaient leur programme. Malheureusement, cet article montrera que souvent leur manque de recul les conduira à leur perte ! Voici donc une présentation du nombre 49,7 dans Windows 95/98, du Bogue de l'an 2000, et de la Fin du monde Unix (encore inconnue du grand public, mais pour combien de temps ? ;-)).

Lire la suite

mardi 23 mai 2006

Entrevue d'un chat par Marcel Broodthaers

Quand on dit qu'on trouve de tout sur Internet, on trouve vraiment de tout. Au menu du jour, je vous propose une entrevue d'un chat réalisée par le poète belge Marcel Broodthaers. Ce dernier faisait parti du « Groupe Surréaliste révolutionaire » avec, entre autres, Stéphane Mallarmé et René Magritte.

Lire la suite

lundi 15 mai 2006

Citations Fluide Glacial

Pour commencer mon ode à Fluide Glacial, je n'ai pas choisi les scénarios décalés d'Edika, ni « Les chroniques du dérisoire » de Bruno Léandri, mais plutôt les brèves de Vincent Haudiquet.

Une petite pour vous encourager à lire la suite : « L'homme qui possédait le don de changer le vin en eau s'est récemment donné la mort. Il semblerait que son bistro ne marchait pas très bien. » (Fluide Glacial n°335)

Lire la suite