Overview
Affected Versions
Spring Framework 5.0.x prior to 5.0.7; Spring Framework 4.3.x prior to 4.3.18; older unsupported versions. The issue is exposed when MappingJackson2JsonView (or equivalent) is configured in a Spring Boot app.
Code Fix Example
// Vulnerable pattern (JSONP enabled via MappingJackson2JsonView)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RestController
public class DataController {
@GetMapping("/data")
public Map<String, String> data() {
Map<String, String> map = new HashMap<>();
map.put("secret", "sensitive-value");
return map;
}
}
}
@Configuration
class JsonpVulnerableConfig {
@Bean
public ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
List<View> defaultViews = new ArrayList<>();
// Vulnerable: enabling JSONP by registering MappingJackson2JsonView as a default view
defaultViews.add(new MappingJackson2JsonView());
resolver.setDefaultViews(defaultViews);
return resolver;
}
}
// Fixed pattern (JSONP disabled by removing JSON view)
package com.example.demo;
@Configuration
class JsonpFixedConfig {
@Bean
public ContentNegotiatingViewResolver contentNegotiatingViewResolverFixed() {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
// Do not register JSONP-enabled JSON view; rely on @RestController/@ResponseBody for JSON only
resolver.setDefaultViews(new ArrayList<>());
return resolver;
}
}