basu_← Back to the universe
FIELD NOTES

Vice-VeRSA : JWT, RSA et confusion de responsabilités

Comprendre comment un mécanisme web de jetons hérite des subtilités de la cryptographie asymétrique.

Cette note est une lecture théorique du challenge Vice-VeRSA, 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

Un JWT signé est une enveloppe dont le serveur vérifie le sceau. La sécurité dépend autant du choix du sceau et de la clé que du contenu de l’enveloppe.

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

La vérification doit fixer algorithme, usage de clé, issuer, audience, temporalité et type de jeton. Laisser l’en-tête non fiable choisir l’algorithme ou la clé transforme les métadonnées de l’attaquant en configuration de sécurité.

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

  • Header alg, kid, jku ou x5u contrôlé par le jeton
  • Même matériau utilisé pour plusieurs algorithmes
  • Claims vérifiés sans contexte d’émetteur et d’audience

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

  1. Séparer parsing et validation cryptographique.
  2. Fixer la politique attendue avant de lire l’en-tête.
  3. Tracer la résolution de clé.
  4. Tester confusion de type et de contexte entre jetons.

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

  • Se concentrer uniquement sur alg=none.
  • Confondre signature valide et autorisation valide.
  • Faire confiance à kid comme chemin ou URL.

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

Employer une bibliothèque moderne avec algorithme fixé, registre de clés fermé et validation complète des claims.

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.

← All notes