3 points par GN⁺ 2024-01-15 | 1 commentaires | Partager sur WhatsApp
  • AsmBB est un moteur de forum web rapide et léger créé par JohnFound, qui permet d’exploiter un forum même sur de petits serveurs grâce à une architecture fondée sur le langage assembleur et SQLite
  • Il prend en charge les serveurs Linux x86 en 32 et 64 bits, et peut fonctionner sur un VPS ou un hébergement mutualisé compatible FastCGI sans bibliothèque préinstallée séparément
  • Côté sécurité, il met l’accent sur un faible nombre de dépendances et sa conception interne, avec la base de données chiffrée SQLeet en v2.7 puis la prise en charge de SQLite3MultipleCiphers en v3.0
  • Les fonctionnalités se sont étendues aux thèmes, à la personnalisation des templates, à MiniMag et BBCode, aux pièces jointes, aux fils à accès restreint, au chat en temps réel, à Atom/RSS, aux notifications SSE, à l’interface multilingue, à l’intégration YouTube et au classement des fils
  • La v3.0 introduit des changements incompatibles dans la base de données et la structure des templates ; lors d’une mise à niveau depuis la v2.9.1, il faut déchiffrer, sauvegarder, modifier le schéma, puis remplacer les binaires et templates/

Architecture et environnement d’exécution d’AsmBB

  • AsmBB est un moteur de forum web, et le forum AsmBB.org fonctionne lui-même sur AsmBB
  • Il est entièrement écrit en langage assembleur et utilise SQLite comme backend de base de données
  • Il met en avant sa capacité à gérer de nombreux visiteurs sans latence, même dans des environnements d’hébergement modestes
  • Ses exigences d’exécution sont plutôt faibles
    • Nécessite un serveur Linux x86
    • Prend en charge le 32 bits et le 64 bits
    • Ne requiert aucune bibliothèque spécialement préinstallée
    • Peut fonctionner même sur le VPS le plus petit ou le moins cher
    • Peut aussi fonctionner sur un hébergement mutualisé si FastCGI est pris en charge
    • Nécessite un serveur web compatible avec l’interface FastCGI
  • Les serveurs web testés sont Nginx, Apache, Lighttpd, Hiawatha, RWASA

Sécurité et base de données chiffrée

  • AsmBB vise à être une application web hautement sécurisée grâce à sa conception interne et à son faible nombre de dépendances
  • Pour une sécurité renforcée, il prend en charge en option une base de données chiffrée
  • Le principal changement de la v2.7 est la prise en charge d’une base de données de forum chiffrée
    • Elle utilise le plugin SQLite SQLeet
    • Selon la spécification, il prend en charge la dérivation de clé PBKDF2-HMAC-SHA256, un salt de 16 octets et 12 345 itérations
    • Il utilise le chiffrement par flot ChaCha20 et une clé à usage unique
    • Il utilise des tags d’authentification Poly1305
  • Le chiffrement peut être activé ou désactivé dans le nouvel onglet Encryption du panneau de configuration administrateur
  • La clé de chiffrement n’est pas stockée sur disque et n’est conservée temporairement qu’en RAM
    • L’objectif est d’empêcher l’exposition de la base de données du forum, des attributs de comptes et des données personnelles, même si le serveur web, le serveur de sauvegarde ou les supports de sauvegarde sont gravement compromis
  • La contrainte connue est qu’il faut ressaisir la clé de chiffrement via l’interface web à chaque redémarrage du moteur
    • En cas de redémarrage accidentel du serveur, l’accès au forum peut être bloqué pendant un certain temps
    • AsmBB explique que, comme il s’agit d’une application stable conçue pour fonctionner longtemps, ce type de situation ne devrait survenir qu’une fois tous les quelques mois ou quelques années
  • Lorsqu’une base de données chiffrée est utilisée, l’usage de SSL/TLS est indispensable

Personnalisation et chemins d’installation

  • AsmBB permet de personnaliser le forum sans modifier directement le code grâce à son système de templates
  • Le paquet binaire est disponible sur asmbb.tar.gz, ce lien pointant vers le paquet binaire le plus récent
  • Le suivi de l’avancement, les rapports de bugs et le clonage du code source sont disponibles dans le dépôt source d’AsmBB
  • La documentation d’installation sur son propre serveur est fournie sous forme de tutoriel d’installation avec NGINX et systemd
  • Avec RWASA, l’installation peut prendre moins de 2 minutes ; un tutoriel vidéo et une vidéo YouTube sont disponibles

Changements récents du forum

  • Les thèmes Glass, Neumor, Poly, Brutal, Joly, Tailwind, Snes ont été ajoutés au forum actuel
  • L’insertion d’URL via le bouton MiniMag utilise le texte sélectionné comme texte d’ancre
  • La vérification des e-mails est envoyée dans la langue configurée par défaut
  • Des correctifs liés à MiniMag ont été intégrés
  • Une fonction page, utilisable pour les contacts, les TOS, etc., a été implémentée
  • Une API a été implémentée

Principaux changements de la v3.0 et points d’attention pour la mise à niveau

  • La v3.0 ajoute plusieurs nouvelles fonctionnalités
    • Possibilité de coller directement des images pour les ajouter comme pièces jointes
    • Prise en charge de l’intégration de vidéos YouTube
    • Introduction d’un éditeur unifié de messages/fils qui simplifie le code et les templates
    • Ajout d’un classement des fils
  • Le skin Modern a été retiré du projet en raison de sa faible qualité
  • La v3.0 contient des changements incompatibles avec les versions précédentes
    • Modification de la structure de la base de données
    • Modification de la structure des templates
  • À la suite de l’arrêt du projet SQLeet, la prise en charge de l’extension de chiffrement SQLite3MultipleCiphers a été ajoutée
    • Le paquet binaire de release est compilé avec cette extension
  • Des bugs et vulnérabilités découverts ont été corrigés
  • Lors de la mise à jour de la base de données de la v2.9.1 vers la v3.0, l’ordre des opérations est important
    • La base de données existante doit être déchiffrée avant toute modification
    • La nouvelle bibliothèque SQLite3MultipleCiphers est utilisée dans un mode incompatible avec l’ancienne bibliothèque SQLeet
    • Avant la migration vers la v3.0, la base de données peut être déchiffrée, puis rechiffrée ensuite avec la nouvelle bibliothèque
    • Une sauvegarde est nécessaire en cas de problème
    • Il faut exécuter dans la console SQLite les requêtes SQL de modification de schéma fournies
    • Après la modification du schéma de la base de données, il faut arrêter le moteur et remplacer les fichiers binaires engine, ld-musl-i386.so et libsqlite3.so
    • Pendant l’arrêt du moteur, l’ensemble du répertoire templates/ doit être remplacé par le nouveau
    • Après le redémarrage du moteur, il faut vérifier que le forum mis à jour ne présente pas de problème
    • Si tout fonctionne normalement, la base de données peut être rechiffrée depuis la page de configuration d’AsmBB

Déroulé des releases v2.x

  • v2.9 : Urban Sunrise et amélioration de l’expérience d’édition

    • Le nouveau thème responsive Urban Sunrise a été ajouté
    • Il vise à améliorer l’apparence du forum
    • Une aide au formatage est intégrée dans l’éditeur de messages
    • L’éditeur de messages et le chat en temps réel prennent en charge nativement les Unicode Emoji
    • Prise en charge de la coloration syntaxique du code source via une bibliothèque JS
    • Le chat en temps réel peut recevoir des messages multilignes, y compris du code source
    • Des bugs signalés dans le moteur AsmBB et la bibliothèque FreshLib ont été corrigés
  • v2.8 : corrections de bugs et fonctions de défense

    • Plusieurs bugs ont été corrigés, dont certains étaient critiques
    • Le nouveau thème Modern a été ajouté
    • Une protection DDOS a été implémentée pour les rares cas où AsmBB ne parvient pas à absorber le rythme des requêtes
    • Un analyseur d’URL a été ajouté pour les parseurs MiniMag et BBCode afin d’empêcher les attaques XSS via les liens utilisateur
  • v2.6 : interface en allemand et extension de SSE

    • Il s’agit de la première version officielle incluant une traduction de l’interface en allemand
    • D’autres traductions ont aussi été améliorées avec l’aide de la communauté
    • Les flux Atom/RSS permettent de s’abonner à l’ensemble du forum, à des tags spécifiques ou à des thèmes spécifiques
    • Le traitement des événements envoyés par le serveur (SSE) a été réécrit depuis zéro
    • SSE peut désormais servir non seulement au chat en temps réel, mais aussi aux notifications de divers événements du forum, comme les nouveaux messages et l’activité des utilisateurs
    • Tous les clients sont gérés dans un seul thread, ce qui permet de traiter simultanément de nombreux visiteurs avec une faible charge serveur
    • Les versions récentes de SQLite et de la bibliothèque MUSL sont incluses dans le paquet binaire
  • v2.5 : interface multilingue et BBCode

    • L’internationalisation de l’interface utilisateur a été introduite
    • Les utilisateurs peuvent choisir la langue de l’interface du forum
    • Les langues fournies sont English, Bulgarian, Russian, French
    • Un parseur BBCode a été ajouté comme deuxième langage de balisage, ce qui permet de comprendre à la fois MiniMag et BBCode
    • BBCode est utile lors de la création de scripts de migration depuis d’autres moteurs de forum
    • Les e-mails peuvent être envoyés via un programme externe comme sendmail
  • v2.4 : pièces jointes, accès restreint et performance du chat

    • Des fichiers peuvent être joints aux messages, et les droits de pièce jointe sont gérés par utilisateur
    • Les fils à accès restreint permettent au propriétaire d’un fil de spécifier la liste des utilisateurs autorisés à y accéder
    • Les droits des utilisateurs peuvent être modifiés dans la page d’administration
    • Les droits des utilisateurs anonymes peuvent être configurés séparément, ce qui permet de créer un forum fermé lisible uniquement par les utilisateurs inscrits
    • Le service de chat en temps réel a été refactorisé pour traiter toutes les connexions dans un seul thread
    • Après optimisation du moteur de rendu des templates, du schéma de base de données et des requêtes SQL, il est environ 20 % plus rapide que la version précédente
  • v2.3 : maintenance et accessibilité

    • Il s’agit d’une release de maintenance qui corrige 2 bugs critiques
    • Pour l’accessibilité, les images de fond ont été remplacées par des balises <img> avec texte alt
    • Le forum reste utilisable même si les images sont désactivées
    • Le code JS du chat a été nettoyé et légèrement accéléré
  • v2.2 et v2.1 : connexion, récupération et navigation

    • Inclut la connexion persistante, la réinitialisation de mot de passe, la liste des utilisateurs et des améliorations du chat
    • La connexion persistante est désactivée par défaut
    • La réinitialisation de mot de passe exige une adresse e-mail valide et est accessible depuis un lien dans le formulaire de connexion
    • La v2.2 ajoute une navigation par Categories fondée sur le système de tags
    • La conservation de l’historique de modification/suppression des messages et la fonction de restauration ont été ajoutées
  • v2.0 : performance et sécurité du code

    • Le moteur de rendu de templates render.asm a été remplacé par render2.asm
    • La nouvelle implémentation utilise des algorithmes plus proches du style assembleur, ce qui la rend plus rapide et moins gourmande en mémoire
    • Les comparaisons de chaînes en cascade dans le parsing d’URL ont été remplacées par une table de hachage
    • La vitesse d’AsmBB a à peu près doublé
    • Des vulnérabilités découvertes avec des outils de test, dont OWASP ZAP et Tinfoil security, ont été corrigées
    • Des fuites de ressources et de mémoire découvertes lors de tests de fuzzing intensifs et de tests de charge quasi DDOS ont été corrigées
    • Un outil de débogage collectant les allocations et libérations de ressources et de mémoire, puis les rapportant sous forme de page web, a été implémenté

1 commentaires

 
GN⁺ 2024-01-15
Avis sur Hacker News
  • C’est vraiment chouette, mais la phrase suivante me paraît très suspecte :
    « AsmBB est une application web très sûre grâce à sa conception interne et à ses dépendances réduites. »
    Il y a aussi une grande valeur à utiliser des dépendances bien éprouvées, et même Chuck Norris finirait forcément par créer des bugs en écrivant un logiciel complexe en assembleur.
    C’est d’autant plus vrai pour un projet comme celui-ci, qui doit faire beaucoup de traitement de chaînes.

    • C’est exactement la première chose qui m’est venue à l’esprit en voyant le titre.
      J’avais ressenti la même chose quand c’était sorti comme défi CTF hébergeant tel quel la dernière version de ce projet, et au moins 8 vulnérabilités avaient été trouvées pendant la compétition.
      https://ctftime.org/task/24399
    • Cette phrase m’a aussi un peu fait tiquer. En général, ce genre d’affirmation ressemble à un signal d’alerte, mais l’auteur original ne semble pas être anglophone natif, donc il a peut-être manqué le fait qu’il fallait nuancer un peu la formulation.
      Par exemple, quelque chose comme « AsmBB met l’accent sur la sécurité dans sa conception et dépend moins de dépendances externes » aurait sans doute été mieux.
  • J’aime bien, et c’est impressionnant d’être allé jusqu’au bout avec l’assembleur. Réduire les dépendances réduit bien la surface d’attaque, mais ça ne suffit pas à dire que c’est « sûr ».
    Statistiquement, cela peut diminuer les possibilités d’exploitation, mais l’assembleur n’offre aucune sécurité mémoire ni autre garantie, ce qui peut aussi augmenter les risques.
    Je ne saurais pas dire quel effet l’emporte, mais les applications en assembleur restent séduisantes. En bonus, avec une transpilation vers aarch64, on pourrait peut-être faire tourner ça sur un Pi-Zero ou un Pi-W branché sur un adaptateur mural.
    De mon côté, je me suis aussi intéressé par intermittence aux forums distribués. Depuis que Usenet a été supplanté, ce type de forum est devenu dominant, mais à mon avis un remplaçant devrait combiner les fonctions distribuées/de réplication de Usenet avec une expérience utilisateur à la phpBB.
    Rendre le système distribué et doté d’une cohérence finale est un excellent problème de systèmes distribués, presque un puzzle amusant. Si quelqu’un a déjà construit quelque chose de similaire, j’aimerais vraiment le voir.

    • Je pense que la combinaison assembleur + ABI du noyau Linux peut être plus sûre que la pile C/C++ traditionnelle, parce qu’elle expose à beaucoup moins de comportements indéfinis.
      Les débordements et sous-dépassements arithmétiques signés se comportent comme attendu, et la mémoire allouée avec mmap + MAP_ANONYMOUS est bien initialisée à zéro comme prévu.
      L’accès à un espace d’adressage non mappé, y compris l’adresse 0, provoque bien un SIGSEGV comme attendu.
      L’assembleur fait beaucoup moins d’hypothèses qu’un compilateur C et se montre moins « malin », donc il est plus probable qu’une erreur fasse planter immédiatement plutôt que de briser silencieusement les attentes.
  • D’après le pied de page, le temps de traitement est absurdement rapide. Mais il faut 500 à 1000 ms pour que le document soit transmis jusqu’au Danemark.
    Dans ce cas, un CDN semble plus utile qu’un code très performant, mais le travail reste impressionnant.

    • Même depuis les Açores, au milieu de l’Atlantique, le chargement s’est fait en moins de 500 ms.
    • Pour avoir piloté des améliorations de temps de réponse dans une grande entreprise tech, 1 seconde, ça fait assez mal.
      Bien sûr, le temps de transmission représente probablement une grosse part, mais si c’est considéré comme « bon », ça me paraît un peu compliqué.
  • Je me demande comment on se connecte à une base de données depuis du code assembleur. Il existe des bibliothèques assembleur ou quelque chose comme ça ?
    En théorie je comprends, mais l’effort nécessaire pour écrire soi-même ce genre de choses « simples » doit être énorme.

    • C’est moins compliqué qu’on ne l’imagine. Il suffit d’appeler les fonctions de la bibliothèque C de SQLite en suivant la convention d’appel C.
      Le code correspondant est ici : https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
    • Le C est lui aussi généralement compilé d’abord en assembleur.
      Programmer en assembleur revient essentiellement à faire soi-même ce que ferait le compilateur, et on peut appeler les mêmes fonctions de bibliothèque qu’un code C peut appeler.
      Il faut toutefois respecter la convention d’appel de l’architecture concernée, ce qui est pénible et fastidieux, mais pas proche de l’impossible.
      En x64, les registres sont utilisés en premier, puis on passe à la pile une fois qu’ils sont tous utilisés, ce qui rend les appels de fonction plus agaçants. En x32, on utilisait uniquement la pile, ce qui était bien plus simple, mais la convention x64 permet de garder les valeurs dans les registres et de produire un code plus rapide.
    • Comme il est indiqué que la base de données est SQLite, il semble simplement lier contre la bibliothèque SQLite.
  • Ce n’est pas seulement écrit en assembleur : derrière, il y a SQLite. Comme pour beaucoup d’applications, le goulot d’étranglement est probablement l’E/S plutôt que le CPU.

    • On suppose souvent que le langage est le goulot d’étranglement, alors qu’en réalité il s’agit souvent des E/S ou de la conception de la base de données.
      Cela dit, quand je pense aux codes PHP que j’ai vus, je comprends pourquoi on peut avoir cette impression. Mais c’est davantage un problème d’utilisation que du langage lui-même.
    • La RAM est aussi un facteur. J’ai écrit quelques programmes en C sur Arduino, et certains auraient été bien adaptés à l’assembleur parce que la pile et la convention d’appel C y étaient du pur gaspillage. Par exemple, dans les cas où il n’y a aucune fonction récursive.
      Le problème, c’est la portabilité. J’aime bien l’AVR-8, mais quand les exigences augmentent, l’AVR-8 n’a guère d’avenir en dehors d’un soft core FPGA.
      Avec du C, on peut migrer vers un microcontrôleur ARM ; personnellement je trouve ça moins amusant, mais les performances sont meilleures.
      Le problème d’AsmBB aussi, c’est qu’il est lié à une architecture précise.
    • Même en mode WAL avec PRAGMA synchronous réglé sur NORMAL ? Je ne suis pas du tout spécialiste de SQLite, je suis en train de l’étudier pour l’utiliser dans un projet.
  • Il est écrit en plus que « les caractères Unicode Emoji sont pris en charge de manière réellement native », mais j’aimerais qu’ils expliquent cela plus en détail
    Je ne vois pas très bien ce que signifie « réellement native », ni en quoi ce serait différent d’une prise en charge « un peu native »

    • Dans le code assembleur d’AsmBB, il ne semble y avoir aucun traitement des emoji, donc on dirait qu’ils sont simplement laissés passer tels quels
      En revanche, le chat en temps réel met les emoji en évidence via du code JS qui fait partie du template :
      function formatEmoji(text) {
      var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;
      return text.replace(emojiRegEx, '$1');
      }
      L’intention était sans doute de capturer U+00A9, U+00AE, U+2000..3300 et U+1F000..1FBFF, mais c’est déjà beaucoup trop large en soi, et la regex n’effectue pas non plus une conversion fidèle
      Si vous voulez une bonne solution, il suffit d’utiliser emoji-regex [1] ou le motif plus récent /\p{RGI_Emoji}/v [2]
      [1] https://unpkg.com/browse/emoji-regex/index.js
      [2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
    • Ce n’est qu’une supposition, mais certains sites comme Twitter utilisent leur propre jeu d’emoji ; ici, cela pourrait simplement vouloir dire qu’ils ne font pas cela et s’en remettent au rendu des emoji par défaut du système d’exploitation
  • Il y a dans l’en-tête un bouton pour désactiver les notifications en temps réel
    Au passage, afficher la liste des utilisateurs du forum aux personnes non connectées ne me paraît pas très souhaitable. Est-ce configurable ?

    • Sur mobile, je n’ai pas trouvé le bouton pour désactiver les notifications en temps réel
    • Historiquement, les forums fonctionnaient comme ça, et c’est probablement configurable
  • Le concept et l’implémentation sont vraiment réussis. Cela dit, les notifications en temps réel deviennent vite envahissantes ; il faudrait sans doute une forme de limitation de débit

    • Des messages du type @User123 has entered the thread devaient très bien convenir aux petits forums où tout le monde se connaissait
      C’est aussi pour cela que phpBB/vBulletin affichaient une liste du type « Utilisateurs lisant ce fil : ... », et qu’il existait des plugins populaires indiquant que @Foo et @Bar étaient en train de répondre dans ce fil
      Dans les discussions particulièrement animées, cela donnait l’impression que l’espace était plus vivant, et il était aussi plutôt appréciable de savoir que l’autre était en train de rédiger son prochain long message pour réfuter le vôtre citation par citation
      Mais recevoir une notification chaque fois qu’un invité non inscrit clique sur un fil ne semble utile à personne
    • On peut désactiver les notifications en temps réel en cliquant sur l’icône de cloche
  • On peut créer quelque chose de similaire en C et renoncer aussi à la bibliothèque standard. On peut faire en sorte de n’avoir aucune dépendance en dehors des appels système
    À part comme exercice intellectuel, je ne vois pas vraiment de raison forte de le faire en assembleur

  • Le titre ne précise pas de quel assembleur il s’agit, ni même sur quel système d’exploitation cela tourne
    « x86 asm » et « on linux » mis ensemble ne sont pas plus longs que « assembly language »