metalfrom.eu/apps
Nicolas FRYDER cded10cb3b fix(sécurité): plafond de /admin/import contournable en variant le jeton
Le limiteur était keyé sur le Bearer fourni par l'appelant :

  keyGenerator: (req) => authBearer(req) || req.ip

La clé était donc une valeur non authentifiée, entièrement choisie par
l'attaquant. Envoyer un jeton différent à chaque requête ouvrait un seau neuf à
chaque fois : sur 30 tentatives avec un jeton variable, 0 étaient bloquées, là
où 20 l'étaient avec un jeton fixe. Le plafond ne freinait donc rien — alors
qu'il est précisément là pour ralentir la recherche du jeton par force brute.
Chaque jeton inédit consommait en prime une entrée du cache LRU du limiteur,
évinçant les compteurs légitimes.

La clé redevient l'IP. Isoler par identité réelle est impossible à cette
couche : le limiteur s'exécute avant l'authentification.

Le test « limite par jeton, pas globalement » verrouillait explicitement le
comportement vulnérable. Il est remplacé, avec la raison de l'abandon.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 13:15:12 +02:00
..
admin chore(infra): en-têtes de sécurité, conteneurs non-root, retrait de pgAdmin 2026-08-20 16:44:26 +02:00
api fix(sécurité): plafond de /admin/import contournable en variant le jeton 2026-08-22 13:15:12 +02:00
crawler chore(infra): en-têtes de sécurité, conteneurs non-root, retrait de pgAdmin 2026-08-20 16:44:26 +02:00
geocoder fix(geocoder): le contexte pays passait après la ville nue une fois sur quatre 2026-08-22 13:15:11 +02:00
web chore(infra): en-têtes de sécurité, conteneurs non-root, retrait de pgAdmin 2026-08-20 16:44:26 +02:00