Pour la dernière étape du planning prévisionnel de 2019 annoncé ici, la NLnet (via le consortium NGI0, qui a reçu des fonds de la commission européenne via le projet européen Horizon 2020) et la société RadicallyOpenSecurity engageaient le projet Meta-Press.es dans un audit de sécurité.
La version 1.7.7 est donc le résultat de cet audit, apportant principalement de petits renforts à la sécurité du projet.
Après un certain délais (en mois) dans la planification de l’audit tout s’est bien passé. J’ai fourni des identifiants pour l’ouverture d’un compte sur l’infrastructure de RadicallyOpenSecurity (qui comprend un GitLab privé pour stocker les résultats de l’audit et un web chat).
Une fois cette étape passé, quelques semaines d’attente supplémentaires furent nécessaires pour qu’un analyste en sécurité se planifie Meta-Press.es comme prochaine tâche (et force est de constater que l’analyse d’une WebExtension semblait sortir de l’ordinaire). Un courageux penetration tester s’est finalement signalé et nous avons pu faire connaissance lors d’une visio-conférence inaugurale, au cour de laquelle nous avons pu discuter de la nature du projet Meta-Press.es et de ses objectifs. J’ai également été consulté sur ce qui me semblaient être les points faibles du projet, et j’étais bien content de pouvoir fournir une liste de points délicats à vérifier (ou contre-vérifier).
Les premiers résultats sont arrivés la semaine suivante, guidés par quelques séances de claviotage pour rester en phase entre les attentes et le terrain exploré. La collaboration fut efficace, j’ai beaucoup appris, j’étais content d’avoir principalement de bons retours, et fut finalement fort occupé à régler les quelques problèmes rencontrés et implémenter les recommandations.
La méthodologie était simple : faire le tour des remparts, inspecter ce qui entre et ce qui sort de l’extension. Les dépendances furent passées au crible, puis les données obtenues depuis les sources interrogées (via un environnement élaboré d’interception de trafic réseau) et enfin les fichiers exportés.
Les principes de bases de Meta-Press.es furent confirmés, comme le fait que les mécanismes de suivi publicitaire des journaux ne sont pas activés par l’utilisation de Meta-Press.es, les données étaient correctement nettoyées à l’entrée (sauf dans un cas exotique de source répondant en JSON, ce qui a été corrigé avec cette nouvelle version) et les authentifications à deux facteurs (2FA) recommandées pour les services en ligne auxquels Meta-Press.es fait appel (réservation du nom de domaine, hébergement web, envoi des nouvelles versions à Mozilla…) étaient déjà activées.
Il m’a également été recommandé de documenter un peu plus ce que Meta-Press.es est sensé faire ou ne pas faire et comment prendre contact avec le projet en cas de découverte d’un problème. Ces deux initiatives servant à encourager les experts en sécurité à regarder le code et rapporter leurs découvertes. Il m’a également été conseillé de mettre en place des règles CSP (Content Security Policy) plus strictes, ce que je me suis empressé de faire vu que c’est déjà l’implémentation initiale de ce mécanisme dans le projet qui nous a protégé d’une faille qui aurait pu être sévère dans le traitement des résultats des sources répondant en JSON. Sur ce point une approche en fire-wall a donc été adoptée en désactivant tout par défaut (y compris les règles inutilisées ou à venir) et en ré-autorisant un par un les cas utiles. Cela a demandé pas mal de travail, par exemple pour éviter les règles CSS embarquées dans le HTML, mais c’est à ce prix qu’on s’assure qu’une nouvelle règle CSS ne sera injectée avec un fragment de HTML dans la page…
Pour en finir avec la sécurité, j’ai découvert un nouveau type d’attaque contre un logiciel, le ReDOS. Un déni de service engendré par un traitement trop long d’une entrée par une expression rationnelle (ou régulière). Cela peut se produire lorsqu’on envoi une chaîne de caractères forgée spécialement pour représenter un cas extrême de difficulté pour l’expression régulière qu’on suppose appliquée à un champs de saisie. À partir de maintenant, les définitions de source de Meta-Press.es seront vérifiées à l’aide de l’outil RegexStaticAnalysis (malgré le fait qu’il soit écrit en Java :-p).
Pour cette nouvelle version j’ai également mis à jour les dépendances qui
pouvaient l’être (en me notant de le faire à chaque nouvelle version). J’ai
aussi activé le module json-lint
de l’éditeur de code CodeMirror qui aide à
définir de nouvelles sources dans Meta-Press.es afin d’avoir un signalement
rapide des erreurs dans le format du JSON saisi. Enfin j’ai échangé 15 petits
blocs try/catch contre un gros pour couvrir un peu plus de code et
garantir que toutes les recherches aient une fin (même quand une source
déclenche un bug dans le code de Meta-Press.es en fournissant une réponse d’un
format inattendu). Les blocs try/catch du JavaScript n’étaient pas
optimisables par les navigateurs web jusqu’à il y a peu, la modification
devrait donc faire gager du temps, mais n’hésitez pas à m’indiquer si vous
mesurez au contraire une perte de performance gênante.
Un dernier mot à propos des statistiques d’utilisation, on imagine bien que la majorité des utilisateurs sont français (non seulement parce que Mozilla m’indique que 75% des utilisateurs ont un navigateur réglé en français, ou parce que j’ai principalement présenté Meta-Press.es à des audiences francophones) mais aussi parce que les statistiques s’écroulent durant les vacances d’été : de 800 utilisateurs quotidiens à 550 mi-août.
Heureusement, le nombre de sources continue de grandir lui, avec plus de 310 sources actuellement !
PS: Une nouvelle façon de soutenir le projet Meta-Press.es a récemment vu le jour sur ce site, il s’agit d' HelloAsso. Ce mécanisme permet aux dons ponctuels d’arriver entiers (sans commission) sur le compte de l’Association Meta-Press.es (si vous retirez le pourboire ajouté par la plate-forme). Pour mémoire, la liste complète des moyens de soutenir Meta-Press.es est disponible ici.