Shared Notes : quand le partage, les bots et les identifiants se composent
Analyser une chaîne web où partage d’objet, visite automatisée et contrôle d’accès se renforcent.
Cette note est une lecture théorique du challenge Shared Notes, présent dans la catégorie Web de Hackropole. Elle ne donne ni flag ni recette officielle : elle construit le modèle mental nécessaire pour comprendre la famille de vulnérabilités visée.
L’idée en une image
Chaque fonction semble raisonnable : créer une note, la partager, la faire relire. La faille apparaît dans la composition des transitions entre propriétaires, lecteurs et bot.
Dans un challenge web avancé, la vulnérabilité est rarement « une ligne ». Elle apparaît quand plusieurs composants n’ont pas la même définition d’une URL, d’un objet, d’une identité ou d’un contenu sûr.
Le modèle technique
Le modèle utile est un automate d’états : private→shared→visited. Pour chaque transition, préciser l’acteur, l’objet, la preuve d’autorisation et les données transportées. Une transition sans invariant clair devient le point faible.
Le réflexe utile est de dessiner les frontières : navigateur, reverse proxy, serveur, worker, base de données, bot. Pour chaque frontière, noter ce qui est parsé, normalisé, validé et transmis.
Indices à chercher
- Liens de partage porteurs d’un identifiant ou token
- Bot privilégié qui ouvre du contenu utilisateur
- Contenu riche rendu différemment selon le lecteur
Un indice ne devient une preuve qu’après une observation reproductible. Préférer une différence bénigne — code HTTP, longueur, timing, valeur affichée — à une charge complexe impossible à diagnostiquer.
Démarche d’analyse
- Écrire la matrice acteurs×actions.
- Suivre l’identité à chaque requête.
- Séparer découverte d’identifiant et autorisation.
- Tester les transitions dans un ordre différent du parcours nominal.
Travailler avec une matrice aide beaucoup : lignes pour les acteurs, colonnes pour les objets et cases pour les opérations. Les trous de sécurité deviennent visibles lorsque deux chemins censés être équivalents appliquent des règles différentes.
Là où le niveau hardcore commence
Les protections existent souvent, mais au mauvais endroit ou sur une représentation intermédiaire. Une validation de chaîne peut être annulée par le parseur suivant ; un contrôle sur la route racine peut être contourné par une relation ; une propriété nettoyée peut réapparaître via héritage.
La question centrale n’est donc pas « le filtre bloque-t-il mon payload ? », mais : quelle représentation le composant décisif utilise-t-il au moment de prendre sa décision ?
Fausses pistes classiques
- Chercher uniquement une XSS.
- Supposer qu’un UUID constitue une autorisation.
- Oublier les previews et métadonnées générées par le bot.
Construire une preuve minimale pour chaque hypothèse. Si trois mécanismes sont testés en même temps, un échec ne dit pas lequel est faux.
Ce que l’architecte sécurité doit en retenir
Les liens de partage doivent être révocables, bornés et vérifiés côté serveur ; le rendu du bot doit être isolé.
Les meilleures défenses réduisent le nombre d’interprétations possibles : types stricts, politiques centralisées, sorties encodées selon leur contexte, identités propagées explicitement et accès réseau contraints.
Exercice conseillé
Reproduire le mécanisme sur une application locale minuscule avec deux utilisateurs, deux origines et un seul objet sensible. Ajouter ensuite proxy, bot ou cache. Cette progression révèle exactement à quel moment l’invariant de sécurité se casse.