
Regole Semgrep che segnalano pattern di bypass di autenticazione header-trust (classe CVE-2025-29927). Complemento di bk-security.github.io.
Un piccolo pacchetto di regole Semgrep che segnala codice che prende decisioni di autenticazione, autorizzazione o fiducia basate su intestazioni di richiesta HTTP che un attaccante controlla.
L'esempio canonico di questa classe di vulnerabilità è CVE-2025-29927: Next.js confidava nell'intestazione x-middleware-subrequest per decidere se il middleware veniva eseguito, e qualsiasi richiesta in entrata che forniva un valore manipolato poteva saltare completamente il middleware. La stessa forma si ripresenta in vari framework ed ecosistemi.
Questo pacchetto include regole per due famiglie di linguaggi e tre sottoclassi del bug. È pensato come aiuto per la revisione del codice, non come un gate CI completamente ottimizzato. Le regole privilegiano il richiamo rispetto alla precisione e sono meglio eseguite in modo interattivo, con un essere umano che prende la decisione su ogni risultato.
Per una descrizione più approfondita della classe di vulnerabilità e delle scelte progettuali alla base di questo pacchetto, vedere bk-security.github.io.
| Regola | Linguaggio | Gravità | Cattura |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Avviso | Letture di intestazioni il cui nome suggerisce uso di protocollo interno o bypass dell'autenticazione (x-internal, x-bypass-auth, x-middleware-subrequest, x-admin-override, x-impersonate, ecc.) |
nodejs-header-as-identity | JS / TS | Avviso | Letture di intestazioni convenzionalmente usate per trasportare l'identità dell'utente (x-forwarded-user, x-authenticated-user, x-remote-user, ecc.) |
nodejs-forwarded-for-trust | JS / TS | Info | Letture di x-forwarded-for, x-real-ip e simili intestazioni IP sorgente comunemente fidate per decisioni di sicurezza |
python-header-flag-auth-bypass | Python | Avviso | Stessa della variante Node.js, incluso l'accesso request.META["HTTP_X_*"] in stile Django |
python-header-as-identity | Python | Avviso | Stessa della variante Node.js, versione Python |
python-forwarded-for-trust | Python | Info | Stessa della variante Node.js, versione Python |
Installa Semgrep:
pip install semgrep
Esegui il pacchetto su un target:
semgrep --config /path/to/auth-header-trust-rules/rules /path/to/target
Oppure esegui una singola regola:
semgrep --config /path/to/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /path/to/target
Convalida le regole rispetto ai fixture inclusi:
semgrep --test --config rules/ tests/
Output previsto:
6/6: ✓ All tests passed
Le regole fanno match su una lista curata di nomi di intestazioni note per essere pericolose quando sono fidate. Cattureranno i casi comuni. Non cattureranno:
getInternalFlag(req) che legge x-some-novel-name passerà le regole.x-internal-*, x-trust-* e x-bypass-*, ma nuovi nomi sfuggiranno.Quando si estende il pacchetto per un codebase specifico, le aggiunte di maggior valore sono solitamente pattern di funzione helper specifici del framework. Se un codebase ha un helper isInternalRequest(req), la regola che lo cattura è una riga di YAML.
rules/<lang>/<name>.yaml.tests/<lang>/<name>.<ext> con esempi positivi annotati # ruleid: <rule-id> ed esempi negativi annotati # ok: <rule-id>.semgrep --test --config rules/ tests/. La nuova regola e il fixture verranno rilevati automaticamente; i test devono superare prima di inviare una modifica.MIT.
Bruce Kang. Il codice sorgente per il post del blog complementare si trova su bk-security.github.io.