Blog Haypo

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

Résultats de votre recherche de fil.

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 ;-)

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.

mardi 10 novembre 2009

sudo adduser elisa

$ date
mar. nov. 10 04:17:00 CET 2009

$ sudo adduser elisa
Adding user `elisa' ...
Adding new group `elisa' (1002) ...
Adding new user `elisa' (1002) with group `elisa' ...
Creating home directory `/home/elisa' ...
Copying files from `/etc/skel' ...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Changing the user information for elisa
Enter the new value, or press ENTER for the default
        Full Name : Élisa Stinner
        Room Number :
        Work Phone :
        Home Phone :
        Other : 3,540 Kg, 50 cm
Is the information correct? [Y/n] y

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.

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.

lundi 19 janvier 2009

Installer Ubuntu Ibex depuis un disque dur USB externe

Remplacer Debian Sid par Ubuntu Ibex

Il y a 3 mois, j'installais Debian Sid sur mon PC portable à partir d'une clé USB. Je suis assez déçu de Debian Sid car les touches « multimédias » (monter/baisser le son) du clavier ne sont pas détectées, la sortie vidéo (écran externe ou vidéo projecteur) ne fonctionne plus, et KDE est moins joli. D'une manière générale : Debian exige beaucoup de temps pour être configuré. Il y a quelques années, ça m'amusait de bidouiller. Aujourd'hui, je veux juste un système d'exploitation « qui marche ».

Préparer une partition sur le disque externe

Mon lecteur de CD-Rom étant toujours hors-service, j'ai choisi mon disque dur USB externe (500 Go) comme support d'installation. J'ai crée une nouvelle partition (j'avais de l'espace libre non partitionné) ext3 et j'y ai placé les fichiers :

  • /boot/vmlinuz : noyau Ubuntu (téléchargé depuis archive.ubuntu.com/.../hd-media/ étant donné que la version dans l'ISO est destinée booter depuis un CD-Rom)
  • /boot/initrd.gz : configuration du noyau en mode « hd-media » et pilotes (également téléchargé depuis archive.ubuntu.com)
  • /boot/grub/(...) : copie du contenu de /boot/grub/* (Debian)
  • /ubuntu-8.10-alternate-i386.iso : ISO d'Ubuntu Ibex avec l'installeur en mode texte (alternate) pour processeur i386
  • /preseed/ubuntu.preseed : Sélection de paquets à installer (fichier extrait de l'ISO)

Je pense qu'on peut utiliser une partition ext3 existante (ou autre système de fichier reconnu par GRUB).

Configuration de Grub

J'ai choisi Grub pour booter le disque car il permet de modifier la configuration au chargement, et possède un terminal texte avec accès au disque dur. La configuration (boot/grub/menu.lst) minimale est :

title Install Ubuntu
root (hd0,7)
kernel /boot/vmlinuz file=/hd-media/preseed/ubuntu.seed
initrd /boot/initrd.gz

Sous Debian, mon disque externe est reconnu comme /dev/sdb8. Comme Grub compte à partir de zéro (hd0,0), il faut soustraire un au numéro de partition : (hd0,7). Je pensais que c'était (hd1,7), mais comme je boote depuis ce disque, Grub le reconnaît comme hd0 et non hd1, soit.

Pour installer Grub, j'ai lancé grub --config-file=/mnt/install/boot/grub/menu.lst et dans le terminal Grub j'ai tapé setup (hd1).

Lancement de l'installation

Je redémarre ma machine en demandant au BIOS de booter sur ce disque. Et hop, l'installeur se lance !

Quelques remarques :

  • Linux est incroyable, on peut vraiment l'installer de plein de manières différentes et ça marche !
  • Ubuntu ne met pas à jour ses ISO avec des mises à jour. Du coup, quand l'installation est terminée il faut installer 219 mises à jour (!), c'est dommage.
  • J'ai choisi Gnome plutôt que KDE pour changer. Comme ma seconde machine est sous Kubuntu, je vais pouvoir jongler entre Gnome et KDE ;-)

Pour en savoir plus

J'ai fait beaucoup de raccourcis dans cet article pour aller à l'essentiel. Pour les détails, lisez l'article How to install from CF media/USB drive using the grub bootloader sur le wiki d'aide officiel d'Ubuntu.

L'installation d'un nouveau système d'exploitation est dangereuse : vous risquez de perdre des données à la moindre fausse manipulation ! Ne le faites pas si vous ne comprenez pas ce que vous faites. Ou alors faites vous aider !

Un gros merci à phh sur IRC qui m'a bien aidé pour cette installation ;-)

vendredi 16 janvier 2009

Broadcast IPv4, socket RAW et multicast DNS

Pour tester l'interface de configuration de parefeu sur laquelle je travaille, j'ai mis en place des règles de filtrage strictes sur ma machine. Stricte car par défaut rien ne passe : il faut accepter chaque service explicitement avec une nouvelle règle. Cet article présente les cas particuliers que sont les sockets RAW et le multicast IPv4.

DHCP et table raw

Sur ma machine, l'attribution d'une adresse IPv4 est dynamique et utilise le protocole DHCP (niveau 4). Le premier paquet (DHCP Discover) est envoyé à destination de 255.255.255.255 (adresse de broadcast : envoi à tout le monde) avec comme source 0.0.0.0, et l'adresse MAC destination est aussi du broadcast (ff:ff:ff:ff:ff:ff). Bizzarement, même en bloquant tout en sortie avec iptables (iptables -F; iptables -P OUTPUT DROP), DHCP continue à fonctionner.

Ceci vient du fait que le programme dhclient utilise une socket de type RAW. les paquets sont forgés et n'entrent pas dans le suivi de connexion (conntrack) de Netfilter. On peut néanmoins loguer ou filtrer ces paquets en utilisant la table « raw ». Le schéma suivant montre que raw est le premier traitement pour les paquets entrant (chaîne PREROUTING) et sortant (OUTPUT) : schéma synthétique d'iptables.

Multicast DNS

Ubuntu active le démon avahi par défaut, système de découverte de services sur le réseau local. Il embarque un serveur DNS multicast qui n'est pas utilisé pour résoudre les noms de domaine Internet (comme google.com), mais pour la découverte de services. Ce système permet sans aucune configuration manuelle d'échanger des fichiers, d'écouter de la musique, de dialoguer, etc. avec les ordinateurs du réseau local.

Côté technique, avahi envoie et reçoit des paquets UDP sur le port « mDNS » (port 5353 vers 5353) et des des paquets IGMP (Internet Group Management Protocol, à ne pas confondre avec ICMP) en utilisant l'adresse destination 224.0.0.251. Cette adresse fait parti du réseau 224.0.0.0/24 : multicast local (réseau privé).

Note au sujet d'IPv6 : les paquets ICMPv6 multicast sont détectés comme invalides par -m state --state INVALID. Refuser tous les paquets invalides revient donc à se couper d'Internet... J'ai rapporté le bug à Netfilter.

lundi 5 janvier 2009

Obtention d'une adresse IPv6 auprès du routeur

En jouant avec les règles de filtrage IPv4 et IPv6 de Netfilter, je perd régulièrement ma connectivité IPv6. J'ai supprimé mes règles de filtrage et lancé sudo tcpdump -p -i any -s 0 -w snif.pcap 'ip6' pour observer quels paquets sont envoyés au routeur pour obtenir une adresse IPv6. Pour renouveller mon adresse IPv6, j'ai démonté (sudo ifconfig eth0 down) puis remonté (sudo ifconfig eth0 up) mon interface réseau.

Questions

En 1,5 secondes, Linux envoie 3 paquets ICMPv6 en multicast :

  • (t=0,0 sec) Multicast Listener Report Message v2 (type 143)
    • De :: vers ff02::16:
    • Avec « Changed to exclude: ff02::1:ffab:79ed »
    • Annonce au routeur qu'on écoute sur le canal multicast « ff02::16: »
  • (t=0,5 sec) Neighbor solicitation (type 135)
    • De :: vers ff02::1:ffab:79ed:
    • Avec « Target: fe80::216:76ff:feab:79ed »
    • Vérifie auprès des voisins que mon adresse de lien (fe80::216:76ff:feab:79ed) est unique : qu'elle n'est utilisée par aucun autre équipement
  • (t=1,5 sec) Router solicitation (type 133)
    • De fe80::216:76ff:feab:79ed vers ff02::2:
    • Demande au routeur les informations sur le réseau IPv6

Réponse

Le routeur (dans mon cas, une Freebox) répond en 10 ms par un message ICMPv6 « Router advertisement » (type 134), de fe80::207:cbff:fe3c:edd8 vers ff02::1. Les informations les plus importantes sont celles relatives au préfixe : longueur (64), préfixe (2a01:e35:8a04:25b0::), durée de vie/durée de vie préférée (86400 secondes = 1 jour). Le paquet contient également le MTU (1480 octets) et l'adresse MAC du routeur.

Création de l'adresse

Avec ses informations, mon ordinateur peut calculer sa propre adresse IPv6 publique à partir du préfixe (2a01:e35:8a04:25b0::/64) et de l'adresse MAC de mon interface réseau (00:16:76:AB:79:ED). L'adresse résultante est 2a01:e35:8a04:25b0:216:76ff:feab:79ed.

Enfin, un paquet ICMPv6 de type Neighbor solicitation est envoyé aux voisins pour vérifier que la nouvelle adresse (2a01:e35:8a04:25b0:216:76ff:feab:79ed) est bien unique.

Pour plus d'informations, lisez l'article Découverte de voisins.

mardi 16 décembre 2008

Aliens versus Predator : Requiem

Fan des films Aliens (1, 2, 3 et 4), j'étais curieux de voir à quoi ressemble le film « Aliens versus Predator ». Manque de bol, je me suis trompé et j'ai regardé la suite (Aliens versus Predator : Requiem) ! Allez, va pour le deuxième.

Un vaisseau infesté d'aliens s'écrase sur la Terre

Un vaisseau Predator contient un laboratoire qui analyse des spécimens d'Aliens... tiens, le laboratoire me rappelle Aliens 4. Les aliens sortent de leurs cages et tuent les Predator... l'histoire se répète encore et encore. L'univers est infini et pourtant le vaisseau dérive et tombe pile sur la Terre (aux USA en plus !). Là un papa et son fils chassent en forêt. Ils meurent et leurs corps serviront de cocon pour un couple d'aliens. Un predator revoit le crash de sa planète et prend un vaisseau pour aller faire le ménage sur Terre avec un liquide bleu qui fait disparaître les traces. Un predator et plusieurs aliens sont sur Terre, le carnage peut commencer.

Stéréotypes et minorités

Le film se déroule sur Terre aux alentours des années 2000. C'est bizzare étant donné qu'Alien 1 (Le huitième passager) se déroule en 2122 et les humains ont des vaisseaux spaciaux sophistiqués et non pas des pickups qui roulent à l'essence. Disons que pour fusionner les séries Predator et Aliens, il fallait bien faire des concessions.

On retrouve un jeune américain du style « pauvre type » qui bosse dans une pizzeria. Il aime en secret une blonde à gros seins qui sort avec un crétin costaux. Pour rendre le livreur de pizza plus attachant, on va lui coller un frère qui vient de sortir de prison. Photo de groupe : je vous laisse deviner qui est qui !

Comme il y a un noir (qui ne dit rien mais meurt rapidement), les minorités sont présentes : on peut continuer !

Gestuelle du predator

Il n'y a pas à dire, le predator a du mal à cacher que c'est un acteur qui porte un costume. Il saute dans l'eau comme un gros patapouf et a une gestuelle pitoyable. Regardez combien il est méchant, grrr !

Heureusement qu'il a sa vision de nuit, ses armes issues d'une technologie avancée avec des symboles dans un alphabet inconnu, et sa sale gueule pour rattraper un peu le reste.

On va mourir n'est-ce pas ?

Alors que la ville est à feu et à sang, un groupe de survivants se réfugie dans un magasin pour y chercher des armes. Après un long silence, notre blonde lache un mémorable :

On va mourir n'est-ce pas ?

Nouveau silence... et là un cri strident retentit ! En fait non, c'est juste deux hommes qui sortent de la pénombre :

1er homme — Tirez pas, ok ! Vous pouvez tout prendre.

2e homme — Je suis pas prêt à mourir pour ce que je gagne.

Le flic — Nous sommes attaqués.

2e homme — Les terroristes attaquent Galisson ? [à l'autre] Je t'avais dit que ça arriverait.

Le flic — Vous êtes stones ou quoi ?

Reproduction anormalement rapide des aliens

Les aliens sont toujours aussi effrayants avec leur double machoire, jet d'acide, déplacement au plafond et une manière si particulière de se reproduire (petite innovation dans l'hôpital d'ailleurs). Par contre, ils se reproduisent vraiment trop vite ! Alors que ça prend plusieurs heures habituellement, là ils se reproduisent en une dizaine de minutes.

Autre problème technique : étant donné qu'un drame hollywoodien doit se dérouler la nuit sous une pluie battante, il est difficile de distinguer les aliens du predator durant les affrontement. Face à face final :

Un bon nanar

Assez bon nanar (c'est-à-dire film pitoyable). Alors que dans les autres films Aliens les monstres sont habillement suggérés, ici on les voit sans arrêt, ce qui laisse le temps d'en analyser tous les défauts. Fort heureusement, on a notre dose de gore dans l'hôpital. La présence d'enfants, durant tout le film, censé renforcer le côté dramatique n'ajoute pas grand chose à part quelques cris. La fin heureuse et la scène finale (à la Hypercube) sont assez nulles, et dont cohérents avec le reste.

mercredi 5 novembre 2008

Create a git repository of a svn source tree using git-svn

When you're not allowed to commit in a svn repository, it's sometimes difficult to write an huge patch or to maintain an old patch. If the svn is updated while you're working on your patch (or after you wrote your patch), it will be difficult to update your patch. The main problem is that a patch has no reference to the revision number of the patched files. Your patch may apply to svn rev 67001 but not on svn trunk (rev 67103).

That's why I want to try git to be able to easily update a patch to the svn trunk. This article is a quick tutorial to setup your local git repository using git-svn.

Lire la suite

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

mercredi 9 juillet 2008

Publication de Fusil le fuzzer version 0.9, fuzzing de CPython et de PyPy

Fuzzer Python

Suite à ma conférence sur l'assurance qualité et fuzzing aux RMLL, je me suis remis à jouer avec mon fuzzer Fusil. Dans le TGV retour, 8h quand même pour rentrer à Strasbourg, j'ai écrit un fuzzer pour le langage Python. L'idée est de récupérer la liste des fonctions, classes et méthodes d'une module, et les appeler/instancier avec un nombre d'arguments aléatoires de type aléatoire. Comme je m'y attendais, une fois le fuzzer python écrit, CPython 2.5 a rapidement planté : erreur de segmentation dans le module imageop.

Rapports de bugs Python 2.6

Pour écrire un rapport de bug correct, j'ai reproduit les bugs avec la version trunk (futur CPython 2.6) compilée avec l'option pydebug et... mince, ça plante plus : le bug imageop est déjà corrigé. J'ai donc amélioré le fuzzer pour qu'il ne teste non plus uniquement un seul module, mais toute une liste de modules (j'ai noté ceux écrits en langage C), et j'ai rajouté d'autres types d'argument (nombre flottant, objet, unicode, etc.). Voilà CPython qui plante, ouf, l'honneur du fuzzing est sauf :-) J'ai alors rapporté une quinzaine de bugs (cherchez les bugs rapportés entre le 6 et le 9 juillet), à chaque fois accompagné d'un patch et d'un exemple pour reproduire le crash. Deux patchs sont déjà appliqués.

Publication de Fusil 0.9

Pour fêter ce succès, j'ai publié la version 0.9 de Fusil. Cette nouvelle version contient le nouveau fuzzer pour Python, peut s'exécuter dans l'interprète Python PyPy, gère mieux le logging (sortie plus concise mais contient le nombre de crash et un fichier project.log est conservé dans le dossier du projet), et l'outil IncrMangle est plus rapide et précis.

Fuzzing de PyPy

Enfin, j'ai fuzzé un peu PyPy, mais le seul vrai bug que j'ai trouvé est dans un module que j'ai écrit (module pwd écrit avec ctypes) ! Par contre, Carl (cfbolz sur le salon IRC #pypy du serveur Freenode) a trouvé d'autres bugs dans PyPy en utilisant Fusil.

Classement des interprètes Python

Pour résumer, vu les résultats face aux tests de fuzzing, on peut classer la qualité des interprètes Python comme ceci : CPython 2.5 < CPython trunk << PyPy où << veut dire très supérieur. Effectivement, je n'ai trouvé qu'un seul bug PyPy après une nuit de fuzzing contre une quinzaine dans CPython rapidement détectés.

jeudi 19 juin 2008

Éviter les opérations dangereuses en ligne de commande

L’erreur est humaine, mais pour provoquer une vraie catastrophe, il faut un ordinateur.

Quand on passe trop de temps dans la ligne de commande, on a tendance à oublier qu'on manipule des documents importants et qu'au détour d'une commande on peut les éradiquer à tout jamais ! Voici quelques astuces pour limiter la casse : lignes à ajouter dans votre configuration « ~/.bashrc ».

Option -i pour demander confirmation

Alias qui rajoutent l'option -i sur les opérations dangereuses :

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

Vous pouvez également utiliser l'option -k de tar pour éviter d'écraser les fichiers existant :

alias tar='tar -k'

Option -C de bash

Bash possède une option -C pour interdire les redirections vers un fichier existant :

set -C

Exemple au pif : ça arrive qu'on tape « echo "user:password:" >/etc/passwd » alors qu'on voulait écrire « >>/etc/passwd » :-)

Configurer l'historique

Bash permet de ne pas mettre une commande dans l'historique (touche haut ou CTRL + r) avec la variable HISTIGNORE :

# Ignore commands like:
#  >konsole&<
#  any command starting with a space (eg. " sudo touch /tmp/x")
#  >bg<
#  >fg<
#  >exit<
#  >svn revert*<
#  >hg revert*<
#  >*rm *<   (eg. "svn rm file", "rm -rf dir", ...)
#  >tee *<
export HISTIGNORE='*&: *:[bf]g:exit:*>|*:history*:svn revert*:hg revert*:*rm *:tee *'

Du coup, si vous tapez une commande que vous savez délicate, précédez la d'une espace pour éviter qu'elle soit sauvée (merci acatout pour l'astuce !).

lundi 9 juin 2008

Développement de la bibliothèque Hasard

Suite au bug OpenSSL de Debian, je me suis à nouveau intéressé de près aux générateurs de nombres pseudo-aléatoires (PRNG). J'ai commencé à écrire la bibliothèque Hasard qui contient plusieurs algorithmes pour générer des nombres et des fonctions de haut niveau : int(min, max), bool(), bytes(size), etc.

Outils ENT et Dieharder

J'ai utilisé le programme ENT pour tester la qualité des algorithmes. ENT utilise :

ENT n'accepte en entrée que des fichiers contenant des octets (pseudo-)aléatoires. On ne peut donc pas tester la qualité d'un générateur de nombre flottants par exemple. Exemple de sortie (algorithme RANDU avec l'opérateur pow2(8)) :

Entropy = 6.000000 bits per byte.

Optimum compression would reduce the size
of this 262144 byte file by 25 percent.

Chi square distribution for 262144 samples is 786432.00, and randomly
would exceed this value 0.01 percent of the times.

Arithmetic mean value of data bytes is 126.0000 (127.5 = random).
Monte Carlo value for Pi is 2.999862669 (error 4.51 percent).
Serial correlation coefficient is 0.322338 (totally uncorrelated = 0.0).

Il existe également le programme Dieharder qui accepte en entrée des nombres de 32 bits non signés dans un fichier binaire ou un fichier texte. Il utilise des tests bien plus rigoureux, mais comme je ne sais pas les interpréter, je ne vais pas commenter.

Représentation visuelle

C'est pas très rigolo tout ça, alors voyons un peu des dessins et schémas qui permettent de distinguer le bon chasseur du mauvais chasseur. Image générée à partir des 8 bits de poids faible de l'algorithme RANDU :

Chaque pixel utilise une valeur du générateur comme couleur. On voit clairement que l'algorithme n'est pas du tout aléatoire ! Pour reproduire l'image :

$ cd tests
$ ./gen_files.py --rng=randu --op=pow2 --bits=8 randu.dat
$ ./draw_pil.py --width=300 --height=300 randu.dat

Une autre façon de représenter des nombres est d'utiliser un axe 2D avec x=random() et y=random() :

On voit qu'il existe très peu de combinaisons (x, y) : j'en dénombre 16. Pour reproduire cette image :

$ ./gnuplot.py randu.dat --point=2

La page web graphics présente d'autres images.

Script de tests de la bibliothèque Hasard

Le script gen_files.py génère un fichier au format texte plat qui contient les nombres générés par l'algorithme RANDU pour l'opérateur pow2(8) (génère un nombre dans l'intervalle [0; 255]). Lire file_format.rst pour voir le format de ce fichier. Le script file_info.py calcule l'entropie des nombres générés, la valeur maximale et la valeur minimale.

$ ./file_info.py randu.dat
Engine: randu
Seed: linux_urandom
Range: 0..255
Operation: pow2
Count: 262144
Minimum: 1
Maximum: 251
Entropy: quality=75.00%, value=6.0000/8.0000

On voit que seul 6 bits sur 8 sont réellement aléatoires (2 bits sont invariants) et que l'intervalle annoncé est incorrect : 0..255 versus 1..251.

J'aime bien l'algorithme RANDU car il est vraiment mauvais et il permet donc de tester l'outillage de test :-)

Pour la suite

Ma bibliothèque est encore en chantier. J'ai beaucoup travaillé sur l'outillage pour tester la sortie des algorithmes en comparant avec d'autres bibliothèques comme Python, PHP ou la libc. La version 0.2 n'inclut par encore ce travail, ça sera le cas pour la prochaine version 0.3 qui n'est pas encore publiée. En attendant, vous pouvez utiliser le dépôt Mercurial.

Je ne sais pas trop ce qu'Hasard va donner au final, mais en tout cas ça avance :-)

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.

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

lundi 3 mars 2008

Évolution des appels systèmes d'entrée/sortie Linux

En juin 1998, Larry McVoy propose une nouvelle API pour les entrées/sorties dans le noyau Linux : The splice I/O model. Il propose une interface d'entrée/sortie vectorielle (scatter/gather), asynchrone et sans copie (zero copy). Le but est de maximiser les performances en évitant de recopier inutilement des zones mémoires. Les travaux pour concrétiser ses idées prendront presque une dizaine d'années.

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.

Le fournisseur d'accès à Internet Free

Depuis Octobre 2006, je suis abonné au fournisseur d'accès Internet Free. Situé à 900 mètres du DSLAM, l'affaiblissement de ma ligne (ADSL 2+) est de 13 dB. Le téléphone (VoIP) fonctionne plutôt bien et la télévision également : je peux enregistrer une émission tout en regardant un film. L'appel à l'international est gratuit dans de nombreux pays et bon marché pour les autres. Note : l'appel aux États-Unis est gratuit... mais pas pour l'Alaska (qui un état des États-Unis) !? L'appel en Alaska coûte 22 centimes la minute (tiens, je vois dans la grille tarifaire que l'appel en Alaska est aussi noté comme gratuit !?).

Employé en télétravail, la stabilité de ma connexion Internet est primordiale. De mémoire, en 17 mois, j'ai du avoir à peu près 30 minutes d'interruptions de services (plus d'internet du tout). Ce qui donne une fiabilité de 99,996%. Début 2007, la télévision était parfois hors-service, mais ça n'arrive plus aujourd'hui. J'ai choisi le mode PATATE de l'option Fastpath : « synchronisation ADSL sans bridage (jusqu'à 24 Mbit/sec) et sans seuil minimum sur le bruit, mais peut entraîner des erreurs et des pertes de paquets ».

Fin novembre dernier, le code source du site grenouille.com est passé sous licence AGPLv3. J'en ai profité pour m'inscrire à ce service : consultez mes graphiques de vitesse de téléchargement. La vitesse de téléchargement varie entre 800 et 1200 Ko/sec, la vitesse d'envoi semble bridée à 100,0 Ko/sec et le ping est d'environ 35 ms.

C'est vraiment très agréable d'avoir une aussi grosse bande passante avec une si bonne fiabilité. Pour finir, je paie 29,99€ en tout pour Internet, la télévision et le téléphone.

Note : Le support Free est difficilement joignable et totalement incompétent. Si vous avez le moindre problème avec votre connexion, c'est la croix et la bannière... Free est plutôt binaire : soit ça marche (bien), soit ça marche pas (du tout).

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.

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

Publication de Fusil version 0.7

J'ai commencé à m'intéresser au fuzzing en avril 2007 alors que je testais la solidité de mon projet Hachoir. J'ai ensuite écrit divers scripts bash, puis Python, pour fuzzer d'autres programmes. Perfectionniste, j'ai commencé en novembre dernier à réécrire tous mes scripts depuis zéro en partant sur une nouvelle architecture basée sur un système multi-agents. Deux mois plus tard, j'ai fini de réécrire tous les scripts (Mplayer, ClamAV, Firefox, etc.). Pour marquer le coup, j'ai publié la version 0.7 du projet Fusil.

Nouveautés de la version 0.7

  • Projet Firefox utilisant un serveur HTTP écrit depuis zéro, un processus Firefox, et un agent qui envoie la touche F5 à Firefox
  • Début du portage sous Windows : Fusil devrait maintenant fonctionner sur Linux, *BSD et Windows
  • Corrections du système multi-agents et divers bugs mineurs

La complexité du scénario du projet Firefox montre que Fusil est maintenant prêt pour n'importe quel type de scénario :

  • Exécution d'un processus Firefox
  • Génération d'images invalides (ou n'importe quel type fichier, comme un animation Flash)
  • Exécution d'un serveur HTTP : port TCP 8080 en écoute, puis réponse aux diverses requêtes du navigateur web
  • Envoi de la touche F5 à Firefox pour rafraichir l'affichage

Chaque étape est activée à la fin de la précédente, ce qui se décrit simplement avec les événements Fusil (session_start, mangle_filenames, http_server_ready, ...).

Fusil gagne en fonctionnalités

L'idée de Fusil est de simplifier l'écriture d'un projet de fuzzing. Il suffit de décrire le scénario pour préparer et surveiller l'environnement, sans avoir à s'occuper des détails techniques (rediriger la sortie du processus, détecter un plantage, etc). Fusil va plus loin en offrant des fonctionnalités communes à tous les projets :

  • Reconnaissance des comportements anormaux : utilisation excessive du processeur (+75% durant 3 secondes), motif de texte dans la sortie standard ou logs Linux (« assertion », « segfault », « glibc detected », ...)
  • Recherche automatique des paramètres optimaux capables de planter une application (en particulier, le nombre d'erreur injectées dans un fichier valide)
  • Protection du système d'exploitation : limitation des ressources (mémoire / temps) des processus crées, copie partielle des variables d'environnement, etc.
  • Pause pour attendre que la charge de la machine retombe sous un certain seuil (CPU à 50%)
  • Création d'un dossier temporaire pour chaque session (exécution) du projet, sauvegardé en cas de succès
  • Fichier de log contenant l'ensemble des commandes permettant d'analyser un crash voir de rejouer le scénario manuellement

Dans sa version 0.7, Fusil offre des outils pour compiler du code C, créer et surveiller des processus, des clients et serveurs réseaux non blocants (en particulier, un serveur HTTP), etc.

jeudi 13 décembre 2007

Découverte d'IPv6

Adresse IPv6

Maintenant que j'ai activé IPv6 chez Free, mes machines se voient attribuer une IPv6. Voyons comment elles sont construites en prenant « 2a01:5d8:58a0:425b:216:96ff:feab:79ea » comme exemple :

  • « 2a01:5d8 » (32 bits) : le préfixe IPv6 de Free
  • « 58a0:425b » (32 bits) : mon IPv4 publique (88.160.66.91)
  • « 0216:96ff:feab:79ea » (64 bits) : mon adresse MAC (00:16:96:AB:79:EA, 48 bits) étendue sur 64 bits. Les deux premiers chiffres de l'adresse MAC (00) changent (02), car le second bit est inversé pour indiquer que c'est une adresse globale (Internet) et non plus locale (Intranet). Les chiffres « ff:fe » sont fixes. Lire l'annexe A de la RFC 4291 pour les détails : Creating Modified EUI-64 Format Interface Identifiers.

On peut donc facilement retrouver l'IPv4 et l'adresse MAC à partir de l'IPv6. Ceci peut poser des problèmes de confidentialité car l'adresse MAC est parfois utilisée pour tracer l'activité d'un utilisateur. Microsoft Office écrit par exemple l'adresse MAC de la machine dans chaque document généré (jusqu'à Office version 2001 je crois bien). Par contre, l'IPv6 semble fixe pour une même machine étant donnée qu'elle est calculée selon l'adresse MAC.

Tests IPv6

Testons notre connectivité IPv6. Pour commencer, « ping6 ::1 » permet de pinger sa propre machine. Le test ultime est celui de la tortue KAME : en IPv4 elle est floue, alors qu'en IPv6 l'animation est nette :-)

Quelques serveurs publics à pinger en IPv6 :

  • ipv6.teleglobe.net
  • www.kame.net
  • www.enst.fr

Commande pour obtenir les enregistrements DNS en IPv6 :

$ host -t AAAA www.kame.net
www.kame.net has IPv6 address 2001:200:0:8002:203:47ff:fea5:3085

(au passage, www.free.fr n'est pas accessible en IPv6, c'est un comble)

Dans un navigateur web, on peut spécifier une IPv6 en l'écrivant entre crochets : « http://[2001:200:0:8002:203:47ff:fea5:3085]/ ». On peut toujours spécifier le port TCP sur lequel contacter le serveur si besoin est : « http://[2001:200:0:8002:203:47ff:fea5:3085]:80/ » (ici le port 80 pour l'exemple).

Utilisateur du serveur IRC Freenode, je m'empresse de me connecter à « ipv6.chat.eu.freenode.net ». Mais je perd régulièrement ma connexion, je suis alors repassé en IPv4 en attendant que ça se stabilise du côté de chez Free (rappel : IPv6 est en phase de test chez Free).

Outils pour IPv6

Outils réseaux à installer pour jouer avec IPv6 :

  • nc6 : netcat (client TCP générique) compatible IPv6
  • nmap : le scanneur de port par excellence, l'option -6 active le mode IPv6
  • traceroute6 : affiche les nœuds réseaux entre votre machine et un serveur

Pour les installer :

sudo apt-get install netcat6 nmap iputils-tracepath

En testant rapidement, la première chose qu'on réalise est que bien que la Freebox soit en mode routeur avec du NAT, les machines en IPv6 sont directement accessibles depuis Internet ! Je m'empresse de configurer le parefeu Netfilter pour éviter les mauvaises surprises. Règles pour accepter le ping (ICMPv6) et le port TCP 80 :

#!/bin/sh
ip6tables -F
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A INPUT -j DROP

Pour en savoir plus

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

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 15 septembre 2007

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).

mercredi 8 août 2007

Sécurité des systèmes virtualisés

La virtualisation est décidément à la mode. Niveau logiciel (libre) : QEMU, Xen, Bochs et VirtualBox offrent un large panel de possibilités. Niveau matériel, les microprocesseurs grand public gagnent des jeux d'instructions supplémentaires avec Intel VT (Virtualization Technology) et AMD-V (AMD Virtualization).

La virtualisation présente un intérêt en sécurité pour isoler les composants logiciels. C'est une alternative aux prisons logicielles existantes : chroot(*), BSD Jail, zones Solaris, etc.

Un nouveau moyen de protection attire forcément des hackers qui vont chercher à le contourner. Joanna Rutkowska a proposé en juin 2006 une technique appelée Blue Pill (la pillule bleue du film Matrix) qui permet d'être totalement invisible pour le système d'exploitation. En avril 2007, Rutkowska fonde la startup InvisibleThingsLab, et récemment le code source de Blue Pill est rendu disponible sur bluepillproject.org (vous y trouverez présentations et détails techniques). Lire également l'annonce par heise Security.

En février dernier, Tavis Ormandy, de l'équipe sécurité de Google, publie un papier sur la sécurité des hôtes virtualisés pour CanSecWest 2007. Il a trouvé plusieurs failles de sécurité comme par exemple dans la carte réseau de Bochs : NE2000 RX Frame Overflow (mai 2007). N'ayant pour l'instant que survollé le papier, j'ai cru comprendre qu'il a utilisé le fuzzing avec deux outils : crashme et iofuzz (écrit à l'occasion ?). Il va falloir que je les teste un de ces jours, ainsi qu'ioctlfuzz et syscallfuzz de la Digital Dwarf Society :-)

(*) chroot est une prison logicielle écrite pour des raisons pratiques et non pas pour répondre à une problématique de sécurité, il existe de nombreuses manières de s'en évader !

lundi 30 juillet 2007

Remplacez le plugin propriétaire Flash par swfdec

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

Lire la suite

samedi 19 mai 2007

Tentative d'attaque de gettext

En cherchant des failles de sécurité, j'ai réalisé que je n'avais jamais pensé à Gettext (bibliothèque de traduction). Or la majorité des applications Linux l'utilisent. Gettext utilise un ensemble de fichier portant l'extension « .mo » (un fichier par langue) : les variables d'environement (LANGUAGE, LC_ALL et LANG) indiquant lequel choisir.

Réussite du fuzzing

J'ai tenté de fuzzer un fichier .mo et je suis rapidement arrivé à faire planter mon programme de test. J'ai alors contacté l'auteur de gettext, l'allemand Bruno Haible, qui m'a répondu en moins d'une heure ! Résumé de sa réponse : « This is known: The gettext routines (...) don't verify the integrity of .mo files. (...) Such a verification would not serve the purpose of a maximally efficient lookup of translations ». Traduction libre : « Le problème est connu, les routines gettext ne vérifient pas l'intégrité des fichiers .mo. Une telle vérification serait en contradiction avec le principe d'efficacité (vitesse) maximale de la traduction. »

Je peux comprendre ses raisons mais je reste perplexe. De plus, il ajoute « It is the duty of the distribution or system manager to ensure that the directories containing .mo files (...) are not world- nor group- writable. » que je traduis « C'est la responsabilité de la distribution [Linux] ou l'administraeur système de s'assurer que les dossiers contenant des fichiers .mo ne sont pas modifiables par les utilisateurs ».

Échec sur un programme suid

Je me suis alors mis en tête de lui prouver qu'il avait tord et que ses bugs pouvaient mettre à mal la politique de sécurité. J'ai d'abord réussi à utiliser un fichier .mo arbitraire avec une astuce : en donnant la valeur « ../../../../../tmp » à la variable d'environnement LANGUAGE, gettext va chercher le fichier mo dans « /tmp/LC_MESSAGES/ ». J'ai alors testé sur un programme suid (ie. lancé avec les droits d'administrateur) et là : ça ne marchait plus.... bizzare. J'ai creusé Internet avec Google et je suis tombé des articles montrant que des vulnérabilités avaient déjà été trouvées en 2000 et en 2003 au sujet de gettext : soucis avec la variable NLSPATH et soucis avec la variable LANG. J'avais déjà lu des informations à ce sujet en tombant sur la liste des variables d'environnement de la glibc qui énumère les variables proscrites pour un programme suid.

Raison de l'échec

Tétu comme un âne, je me suis mis à lire le code source de la glibc et je suis retombé sur NLSPATH : la constante UNSECURE_ENVVARS (définie dans sysdeps/generic/unsecvars.h) contient les variables interdites pour un programme suid. Mais nul part je ne lis LANGUAGE, LC_ALL ou LANG. D'ailleurs, je réalise que ces variables d'environnement ne sont pas supprimées pour un programme suid. Finalement, je réalise que c'est gettext qui possède une protection ! Bruno Haible avait oublié de m'en parler ;-) Dans intl/dcigettext.c, si __libc_enable_secure vaut 1 (cas d'un programme suid) les locales contenant le caractère « / » sont proscites. Et bien voilà, tout simplement !

Conclusion

Fausse alerte, gettext est troué mais ce n'est pas (trop) grave :-) D'autres personnes avaient constatées le problème avant moi.

Néanmois, la sécurité reste minimale : elle consiste à bloquer les attaques injectant un dossier dans une variable d'environnement. Et encore, uniquement pour les programmes suid. Les autres programmes sont donc vulnérables.

dimanche 22 avril 2007

Initiation au fuzzing

Le fuzzing est un outil de test logiciel qui consiste à injecter des données incorrectes pour rechercher des erreurs dans un programme, plus particulièrement dans le but de trouver des failles de sécurité. Aujourd'hui (en 2007), cette méthode est extrêmement efficace ! Disons que globalement, aucun programme ne résiste au fuzzing : ils finissent tous par montrer des faiblesses (qui se manifeste la plupart du temps par un plantage) dans un temps plus ou moins court.

Mon expérience du fuzzing

J'avais lu beaucoup de rapports de fuzzing montrant clairement de grosses faiblesses dans quasiment l'ensemble des logiciels testés. Mais je n'y croyais qu'à moitié, il fallait que je le vois de mes propres yeux. J'ai alors écrit un programme de fuzzing pour mon projet Hachoir. Durant deux semaines j'ai continuellement corrigé des bugs plus ou moins critiques. Comme quoi, la technique fonctionne très bien !

J'ai ensuite adapté mon programme de fuzzing pour tester d'autres applications. J'ai testé sur la suite Image Magick (manipulation de photos)... que je suis arrivé très rapidement à faire planter. J'ai isolé deux cas critiques : pour une image XCF de 80 Ko, Image Magick allouait 1 Go de mémoire (ce qui est énorme), et pour une image TGA, Image Magick consommait toute la puissance du processeur (100% du CPU) durant plusieurs minutes (je n'ai pas eu la patience de mesurer le temps exact). J'ai tenté de rapporter le bug mais je n'ai eu aucun retour.

Je me suis alors senti poussé des ailes et je me suis senti invinsible :-) Tant qu'à faire, allons tester un élément de sécurité ! J'ai choisi au pif l'anti-virus ClamAV... que j'ai réussi assez rapidement à mettre à genoux. Un document Word forgé prend 2 Go de disque dur et l'ensemble du processeur pendant plusieurs minutes. J'ai rapporté le bug qui a été classé comme critique et sera corrigé dans la prochaine version.

Écriture du programme de fuzzing

En pratique, pour Hachoir, Image Magick et ClamAV : je suis parti de fichiers valides (le format dépendant de l'outil testé) que j'ai ensuite tronqué et/ou j'y ai inséré des octets aléatoires. Je passe alors ce fichier forgé au programme testé. Cette algorithme est celui du programme « mangle.c » écrit par le belge Ilja van Sprundel que j'ai réécrit en Python. J'ai ensuite ajouté d'autres opérations comme modifier plusieurs octets à la fois, incrémenter/décrémenter un octet, insérer des valeurs spéciales, etc.

Ce qui me fait peur, c'est que globlament mon programme de test reste extrênement simple et pourtant j'arrive à faire planter très rapidement (moins de 5 minutes) tous les programmes que j'ai testés. Je n'ose même pas imaginer ce qu'on pourrait découvrir avec des programmes beaucoup plus intelligents. Et justement, l'été dernier des conférences ont présenté des logiciels de fuzzing utilisant des algorithmes génétiques ainsi qu'une grammaire dédiée au fuzzing. Le but étant, en gros, d'arriver le plus profondément possible dans le programme cible. Ils utilisent un débogueur dédié ainsi qu'un outil permettant de mesurer la couverture du code (quantité de code exécuté dans le programme cible).

Je pense qu'en couplant un fuzzing avec un outil comme Valgrind, on pourrait créer des outils beaucoup plus intelligents car on connaitrait la couverture du code mais également les erreurs d'accès mémoire.

Le fuzzing étant assez nouveau pour moi, je ne saurai conseiller un site web en particulier. En attendant, suivez les liens donnés sur la page Fuzzing de mon wiki. Je la ferai vivre au fur et à mesure des mes recherches.

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

Nouvelles d'Hachoir (core et parser)

Je viens de me rendre compte que ça fait pas mal de temps que je code sans écrire de journal sur les derniers développement de mon projet Hachoir. Voici donc un premier billet donnant des nouvelles du front.

hachoir-core

hachoir-core est le cœur d'Hachoir : la partie bas niveau qui va découper un fichier en une multitudes de champs. Mais ce composant contient également énormément d'outils divers comme une humanDuration() qui va convertir une durée en une représentation « humaine » (ex: "22 sec 320 ms"). Aujourd'hui, hachoir-core évolue peu car il commence à couvrir l'ensemble des besoins d'un parseur.

Le plus gros changement récent est la tolérance aux erreurs. En fait, l'erreur n'est pas corrigée mais rattrapée. Par exemple, si une erreur est détectée durant la génération de la description d'un champ : l'erreur est affichée et la description devient une chaîne vide. Ceci peut sembler naturel, mais ce n'était pas le cas avant. Précédemment, si la génération d'une description échouait, on perdait beaucoup d'informations car l'erreur déclanchait une cascade d'autres erreurs et finalement plusieurs champs étaient détruits. Ce principe de rattrapage d'erreurs est utilisé dans un maximum de code. Il reste peu de fonctions qui ne sont pas « protégées » ce qui rend le code toujours plus robustes.

hachoir-parser

hachoir-parser est un ensemble de parseurs de fichiers (images, vidéos, archives, programmes, ...). Ce composant est celui auquel contribue le plus de monde car il est simple de le modifier (corriger) ou d'ajouter son propre parseur. J'ai notamment reçu un gros coup de main de Christophe GISQUET qui a écrit les parseurs ACE, RAR, Torrent et d'autres. Mike Melanson, le chef de projet du greffon Flash pour Linux, a également écrit des parseurs pour les formats Real Audio et Real Media. Enfin, Olivier SCHWAB a écrit un parseur 7-zip.

La liste des ajouts récents de parseur montre la forte activité de ce composant :

  • Archive : archive ACE, Microsoft cabinet (CAB), Roshal archive (RAR), archive Microsoft (MAR)
  • Audio : Uncompressed amiga module (MOD), ScreamTracker3 module (S3M), FastTracker II Extended Module (XM), Audio Interchange File Format (AIFF et AIFC), Real audio (RA), image Targa (TGA)
  • Image : Photoshop (PSD), icone animé Windows (ANI), Aldus Placeable Metafile (APM), Microsoft Enhanced Metafile (EMF) et Microsoft Windows Metafile (WMF)
  • Divers : BitTorrent (.torrent), police de caractère TrueType (TTF), document PDF, exécutable Windows 16-bit (NE), vidéo MPEG-2 Transport Stream (MPEG TS), raccourci Windows (LNK), X11 Portable Compiled Font (PCF), aide Windows HTML (CHM), ...

À l'heure actuelle il y a 70 parseurs dans la version de développement d'Hachoir. J'ai du mal à savoir si c'est beaucoup ou peu. En consultant la liste complète des parseurs, je pense tout de même que c'est assez conséquent pour ne pas dire énorme. Il faut d'ailleurs savoir que certains parseurs gèrent plusieurs formats. Exemples : RIFF parse les formats AVI, WAV, ANI et CDA; WMF parse les formats AMF, EMF et WMF; etc.

lundi 26 mars 2007

Configurer gvim

Étant donné qu'un éditeur de texte est l'outil essentiel de mon travail, il se doit d'être adapté à mes besoins et configuré aux petits oignons. Je vais présenter gvim car c'est l'outil que j'utilise. Tous les jours je découvre de nouvelles commandes et fonctions de gvim, et je fignole ma configuration au jour le jour. Je vais vous présenter mon éditeur chéri dans son état actuel.

Personnaliser gvim

Pour commencer, voyons gvim sorti d'usine :

C'est moche ! Mais on n'a quand même déjà de quoi faire : copier/coller, barre de défilement, numéro de la ligne (974, dans la barre d'état), etc. Activons maintenant la coloration syntaxique (commande « :syn on ») et choisissios une police de caractère légèrement plus petite et plus grasse (set guifont=Deja\ Vu\ Sans\ Mono\ Bold\ 9) :

La police est plus lisible et prend moins de place. On peut donc afficher plus de lignes simultanément. Enfin, voici une capture d'écran un peu plus réaliste, avec ma configuration actuelle gvim :

Les détails qui font la différence :

  • Le motif actuellement recherchés (datas) est surligné en jaune
  • Les tabulations sont différenciées par léger gris (ici en début de ligne)
  • Les espaces inutiles en fin de ligne sont surlignés en rouge (pas trop) vif
  • Il y a 4 zones : 3 fichiers ouverts ainsi que le résultat d'une recherche (accessible avec la commande « cw »)
  • L'accolade correspondante est mise en évidance (en cyan)

Ma configuration gvim

Mon fichier ~/.vimrc simplifié :

syntax on             " Coloration syntaxique
set hlsearch          " Surligne les resultats de recherche
set nowrap            " Pas de retour a la ligne auto (affichage)
set showmatch         " Affiche parenthese correspondante
set autoindent        " Indentation automatique
set softtabstop=4     " Largeur d'une tabulation
set shiftwidth=4      " Largeur de l'indentation
set fdm=indent        " Repli selon l'indentation
set expandtab         " Utilise des espaces plutôt que le caractère tabulation

" Supprime les espaces en fin de ligne avant de sauver
autocmd BufWrite * silent! %s/[\r \t]\+$//

" Police de caractere pour gvim
set guifont=Deja\ Vu\ Sans\ Mono\ Bold\ 9

Pour en savoir plus, voyez mon article sur vi sur mon site web.

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

À mort le franglais !

La langue anglaise est de plus en plus présente. Elle a remplacé le latin, qui était la langue des sciences, dans de très nombreux domaines. L'apprentissage de cette langue est désormais obligatoire en France, mais peu de gens la parlent correctement.

Le phénomène du « franglais » est apparu : des mots anglais sont utilisés dans un texte en français, ou alors des mots français sont mal orthographiés à cause de leur ressemblance à des mots anglais. Le même phénomène existe chez les allemands qui apprennent l'anglais (Denglisch), les espagnols (Spanglish) et encore les japonais (Engrish). Pour finir, on parle de « Franponais » pour le mélange entre le français et japonais.

Je suis pour la mort du franglais ! Je n'ai rien contre l'anglais, par contre, il faut séparer le français et l'anglais lorsque c'est possible !

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 30 mai 2006

Hachoir 0.3 et les méta-données

Hachoir est un projet que je développe depuis maintenant sept mois et qui a pour objectif de pouvoir visualiser le contenu d'un fichier binaire. Le cœur est maintenant bien avancé et de très nombreux formats de fichier sont supportés (21 formats allant de l'image JPEG au système de fichier EXT2 en passant par la musique MP3).

Un petit mois après la sortie de la version 0.2, voici la version 0.3 du Hachoir. Celle-ci sent le code mûr et commence enfin à servir à quelque chose :-) En particulier, la fonction « extraction des méta-données » vaut le détour. Elle permet d'afficher la taille d'une image, le codec d'une vidéo, la fréquence d'acquisition d'une musique, et bien plus encore ! J'ai découvert moi-même des informations sur des fichiers que j'avais sur mon disque dur, comme par exemple le logiciel utilisé pour encoder une vidéo, ou encore des commentaires d'une musique (fichier MP3).

Lire la suite