
Règles Semgrep qui signalent les motifs de contournement d'authentification par confiance d'en-tête (classe CVE-2025-29927). Compagnon de bk-security.github.io.
Un petit ensemble de règles Semgrep qui détecte le code prenant des décisions d'authentification, d'autorisation ou de confiance basées sur des en-têtes de requête HTTP qu'un attaquant contrôle.
L'exemple canonique de cette classe de vulnérabilité est
CVE-2025-29927 : Next.js
faisait confiance à l'en-tête x-middleware-subrequest pour décider si le middleware s'exécutait, et toute requête entrante fournissant une valeur falsifiée pouvait contourner entièrement le middleware. Le même schéma se répète dans différents frameworks et écosystèmes.
Cet ensemble fournit des règles pour deux familles de langages et trois sous-classes du bogue. Il est conçu comme une aide à la revue de code, et non comme une porte CI entièrement paramétrée. Les règles privilégient le rappel sur la précision et sont mieux exécutées de manière interactive, avec un humain prenant la décision pour chaque résultat.
Pour un article plus long sur la classe de vulnérabilité et les choix de conception derrière cet ensemble, voir bk-security.github.io.
| Règle | Langage | Sévérité | Détecte |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Warning | Lectures d'en-têtes dont le nom suggère un usage de protocole interne ou de contournement d'authentification (x-internal, x-bypass-auth, x-middleware-subrequest, x-admin-override, x-impersonate, etc.) |
nodejs-header-as-identity | JS / TS | Warning | Lectures d'en-têtes classiquement utilisés pour véhiculer l'identité utilisateur (x-forwarded-user, x-authenticated-user, x-remote-user, etc.) |
nodejs-forwarded-for-trust | JS / TS | Info | Lectures de x-forwarded-for, x-real-ip, et en-têtes source-IP similaires souvent utilisés pour des décisions de sécurité |
python-header-flag-auth-bypass | Python | Warning | Identique à la variante Node.js, incluant l'accès Django-style request.META["HTTP_X_*"] |
python-header-as-identity | Python | Warning | Identique à la variante Node.js, version Python |
python-forwarded-for-trust | Python | Info | Identique à la variante Node.js, version Python |
Installer Semgrep :
pip install semgrep
Exécuter l'ensemble de règles sur une cible :
semgrep --config /path/to/auth-header-trust-rules/rules /path/to/target
Ou exécuter une règle unique :
semgrep --config /path/to/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /path/to/target
Valider les règles avec les fixtures fournies :
semgrep --test --config rules/ tests/
Sortie attendue :
6/6: ✓ All tests passed
Les règles correspondent à une liste choisie de noms d'en-têtes connus pour être dangereux lorsqu'ils sont utilisés comme source de confiance. Elles détecteront les cas courants. Elles ne détecteront pas :
getInternalFlag(req) qui lit x-some-novel-name ne sera pas détectée.x-internal-*, x-trust-*, et x-bypass-*, mais des noms originaux passeront à travers.Lors de l'extension de l'ensemble pour une base de code spécifique, les ajouts les plus utiles sont généralement les motifs de fonctions utilitaires propres au framework. Si une base de code possède une fonction utilitaire isInternalRequest(req), la règle qui la détecte est une ligne de YAML.
rules/<lang>/<name>.yaml.tests/<lang>/<name>.<ext> avec des exemples positifs annotés # ruleid: <rule-id> et des exemples négatifs annotés # ok: <rule-id>.semgrep --test --config rules/ tests/. La nouvelle règle et sa fixture seront détectées automatiquement ; les tests doivent réussir avant de soumettre une modification.MIT.
Bruce Kang. La source du billet de blog associé se trouve sur bk-security.github.io.