Un GET inter-sites atteignait l’aperçu de message authentifié sur bitcointalk.org

Par Sylvain Rey (0xSly), chercheur indépendant en sécurité ·

Cible
bitcointalk.org (SMF 1.1.19, fortement personnalisé)
Classe
Contrôle de session/CSRF manquant (CWE-352) sur un point d’accès qui produit un affichage dépendant de l’état
Statut
Corrigé par l’opérateur le 2026-09-01 ; récompense versée
Tests
Non destructifs, GET uniquement, aucun contenu publié ni enregistré, aucune donnée d’utilisateur consultée

Chronologie

Date (UTC)Événement
2026-08-30Premier rapport envoyé au contact sécurité de Bitcointalk dans le cadre de son programme de récompenses
2026-08-31L’opérateur confirme que le checkSession() de SMF 1.1.20 n’est pas présent dans le chemin d’aperçu, et cite l’échappement des sorties et les cookies SameSite=Lax comme mesures atténuantes
2026-09-01Rapport complémentaire avec preuves en conditions réelles que SameSite=Lax n’empêche pas le vecteur GET
2026-09-01L’opérateur supprime la possibilité de définir message et subject par GET et verse une récompense

Contexte

En amont, SMF 1.1.20 a ajouté un appel à checkSession() dans Post2(), juste avant de passer la main au gestionnaire d’aperçu. Le chemin de code de la version 1.1.19 revient à l’aperçu sans vérifier le jeton de session. Le journal des modifications de SMF rattache ce changement à des attaques par formulaire falsifié impliquant du contenu HTML.

bitcointalk.org exécute une version de SMF 1.1.19 substantiellement modifiée, avec quelques correctifs rétroportés. La question était de savoir si cette protection précise, ou une protection équivalente, était présente en production.

Constat

Le chemin d’aperçu acceptait des paramètres de requête sans jeton de session, et ces paramètres pouvaient être fournis par un simple GET.

Depuis une origine tierce, un lien ordinaire de navigation de premier niveau vers l’URL d’aperçu de Post2 a été suivi dans Chrome. Comme les navigations GET de premier niveau transmettent les cookies SameSite=Lax, la session authentifiée a été conservée, et le forum a affiché l’aperçu fourni par l’attaquant à l’utilisateur connecté, sans erreur de vérification de session.

Un attaquant pouvait donc faire afficher, dans la session authentifiée d’une victime, un aperçu au contenu contrôlé par l’attaquant sur bitcointalk.org, à partir de n’importe quelle page externe.

Ce qui limitait l’impact

  • Pour les comptes ordinaires, le HTML brut comme le HTML encadré par [html] étaient échappés dans l’aperçu affiché. Aucun élément HTML n’a été créé dans le DOM de l’aperçu lors des tests.
  • SMF 1.1.19 en amont contient une branche admin_forum distincte qui désactive l’échappement du contenu [html]. La tester demandait un compte administrateur ; l’exécution de script en conditions réelles n’a donc pas été revendiquée. L’opérateur indique que cette branche est désactivée dans son code personnalisé.

Le problème confirmé est donc le chemin inter-sites sans jeton vers un aperçu authentifié, et non une exécution de script stockée ou réfléchie.

Remédiation

L’opérateur a supprimé la possibilité de définir message et subject par requête GET, ce qui ferme le vecteur inter-sites décrit ci-dessus, et a versé une récompense pour ce rapport.

Recommandation complémentaire, pour les déploiements SMF 1.x en général : rétablir le contrôle de session avant le passage au gestionnaire d’aperçu, ou mettre en place un jeton anti-CSRF équivalent sur l’action d’aperçu.

Méthode

  • Comparaison du code source de Post2() entre SMF 1.1.19 et 1.1.20.
  • Tests en conditions réelles limités à des requêtes GET depuis une origine inter-sites locale, sur mon propre compte.
  • Inspection du DOM de #preview_body pour distinguer éléments créés et texte échappé.
  • Les fichiers de preuve ont été transmis à l’opérateur avec leurs empreintes SHA-256.

Pour aller plus loin

Ingénierie backend et intégration de systèmes · Conception de protocoles et systèmes blockchain · Tous les articles