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-30 | Premier rapport envoyé au contact sécurité de Bitcointalk dans le cadre de son programme de récompenses |
| 2026-08-31 | L’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-01 | Rapport complémentaire avec preuves en conditions réelles que SameSite=Lax n’empêche pas le vecteur GET |
| 2026-09-01 | L’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_forumdistincte 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_bodypour 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