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

Ouverte
#21,771 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
45/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Calme
Stack technique
java, spring
Domaine
backend, security

Piste de recherche

Commencez par comparer la requête stable java/unvalidated-url-redirection avec la requête expérimentale java/spring-unvalidated-url-redirection, en vous concentrant sur les noms de vues de redirection Spring et les flux faisant intervenir des helpers. Reproduisez les motifs indiqués, notamment les formes redirect:, ModelAndView et RedirectView, et vérifiez que les cibles contrôlées par l’utilisateur sont signalées tandis que les redirections sûres restent inchangées.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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
Langage dominant
CodeQL
Étoiles
10.1k
Forks
2.1k
Merge moyen
2 j 11 h
PR mergées (30 j)
129

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de github/codeql

Toutes les issues de github/codeql

Issues similaires

Plus d'issues Backend & API Design

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.