False negative in java/unvalidated-url-redirection for Spring MVC redirect view names

Aperta
#21,771 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
java, spring
Ambito
backend, security

Direzione di ricerca

Inizia confrontando la query stabile java/unvalidated-url-redirection con la query sperimentale java/spring-unvalidated-url-redirection, concentrandoti sui nomi delle viste di redirect di Spring e sui flussi mediati dagli helper. Riproduci i pattern elencati, incluse le forme redirect:, ModelAndView e RedirectView, e verifica che le destinazioni controllate dall’utente vengano segnalate mentre i redirect sicuri rimangano inalterati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

I ran into a false negative in the Java URL redirection queries for a common Spring MVC pattern.

java/unvalidated-url-redirection does not appear to cover redirects expressed through Spring view names like return "redirect:" + userControlledValue, especially when that construction is wrapped in a helper method.

I found this on a public CVE, CVE-2025-8813, in atjiu/pybbs.

Vulnerable code:

@GetMapping("changeLanguage")
public String changeLanguage(String lang, HttpSession session, HttpServletRequest request) {
    String referer = request.getHeader("referer");
    if ("zh".equals(lang)) {
        session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.SIMPLIFIED_CHINESE);
    } else if ("en".equals(lang)) {
        session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.US);
    }
    return StringUtils.isEmpty(referer) ? redirect("/") : redirect(referer);
}
protected String redirect(String path) {
    return "redirect:" + path;
}

This was fixed upstream by removing the user-controlled redirect target:
https://github.com/atjiu/pybbs/commit/edb14ff13e9e05394960ba46c3d31d844ff2deac

My understanding is that the stable query covers servlet-style redirect sinks such as sendRedirect(...) and Location headers, but not the Spring MVC redirect-by-view-name sink family. In this case the source is straightforward (request.getHeader("referer")) and the flow is short, so the gap seems to be sink coverage rather than source modeling.

This pattern is common in practice:

  • return "redirect:" + next
  • return new ModelAndView("redirect:" + next)
  • return new RedirectView(next)
  • helper wrappers such as redirect(next) in a base controller or utility class

That last form is especially common in real Spring code, so this is not just a one-off CVE shape. I would expect similar misses whenever a project centralizes redirect construction in a helper.

There is already an experimental query, java/spring-unvalidated-url-redirection, so this may just be a case where the relevant Spring sink modeling has not made it into the stable query set yet.

A reasonable fix might be to bring the Spring redirect sink coverage into the stable rule family, especially for:

  • "redirect:" + tainted
  • new ModelAndView("redirect:" + tainted)
  • new RedirectView(tainted)
  • helper-mediated variants that ultimately construct a Spring redirect view name
Lingua principale
CodeQL
Stelle
10.1k
Fork
2.1k
Merge medio
2g 11h
PR unite (30g)
129

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di github/codeql

Tutte le issue di github/codeql

Issue simili

Altre issue su Backend & API Design

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.