Spring4shell on Vercel
How Spring4shell Manifests in Vercel
Spring4shell (CVE-2022-22965) exploits a zero-day vulnerability in Spring Framework versions before 5.3.18, 5.2.20, and 5.1.6. The vulnerability allows unauthenticated remote code execution through a malicious Content-Type header that triggers Java deserialization.
In Vercel deployments, Spring4shell manifests through several specific attack patterns:
- Deserialization of malicious objects via
Content-Type: application/x-java-serialized-objectheaders - JNDI injection through LDAP/RMI endpoints exposed in Spring Boot Actuator
- Prototype gadget chain exploitation via
Class.forName()calls in Spring's bean factory - Class loader manipulation through
java.lang.ProcessBuildergadget chains
Vercel-specific attack vectors include:
POST /actuator/env HTTP/1.1
Host: your-app.vercel.app
Content-Type: application/x-java-serialized-object
Content-Length: 1024
<malicious serialized payload>The Vercel platform's default Spring Boot configurations often include Actuator endpoints (/actuator/health, /actuator/env, /actuator/beans) which, when combined with vulnerable Spring versions, create a perfect attack surface. The platform's auto-scaling can also make exploitation more reliable by providing multiple instances to target.
Vercel-Specific Detection
Detecting Spring4shell in Vercel deployments requires both automated scanning and manual verification. The middleBrick API security scanner can identify this vulnerability through several specific checks:
middleBrick Detection Capabilities:
$ middlebrick scan https://your-app.vercel.app
Security Score: C (67/100)
Critical Findings:
✓ Spring4shell (CVE-2022-22965) - Vulnerable Spring version detected
✓ Actuator endpoints exposed without authentication
✓ Java deserialization endpoints accessible
✓ Prototype gadget chain vulnerabilityManual detection methods for Vercel-specific Spring4shell:
- Version fingerprinting: Check
/actuator/infofor Spring Boot version - Endpoint enumeration: Test for exposed Actuator endpoints
- Content-Type testing: Send malicious
application/x-java-serialized-objectheaders - JNDI endpoint discovery: Look for LDAP/RMI references in error messages
Critical Vercel-specific indicators:
$ curl -H "Content-Type: application/x-java-serialized-object" \
https://your-app.vercel.app/actuator/env
# Look for:
- Java stack traces in responses
- Class loading error messages
- Serialized object processing logs
- JNDI reference resolution attemptsmiddleBrick's LLM security checks also scan for AI-related attack surfaces that might be exposed alongside Spring4shell vulnerabilities, providing comprehensive coverage of modern Vercel deployments.
Vercel-Specific Remediation
Remediating Spring4shell in Vercel deployments requires both immediate patching and Vercel-specific configuration changes. Here's a comprehensive remediation strategy:
1. Immediate Patching:
// pom.xml or build.gradle
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version> <!-- Patched version -->
</dependency>2. Vercel Configuration:
// vercel.json - Security hardening
{
"headers": [
{
"source": "(.*)",
"headers": [
"Content-Security-Policy: default-src 'self'"
]
}
],
"rewrites": [
{
"source": "/actuator/(.*)",
"destination": "/403"
}
]
}3. Spring Boot Security Configuration:
// src/main/resources/application.properties
# Disable vulnerable endpoints
management.endpoints.web.exposure.include=health,info
management.endpoint.env.enabled=false
management.endpoint.beans.enabled=false
# Disable deserialization
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
# Security headers
server.servlet.context-path=/api
server.use-forward-headers=true4. Vercel Build Hook Security:
// package.json
{
"scripts": {
"vercel-build": "mvn clean package -DskipTests -Dspring.profiles.active=vercel"
}
}5. Runtime Protection:
// src/main/java/com/example/security/SecurityConfig.java
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
authz
.requestMatchers("/actuator/**").denyAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll()
headers
.contentTypeOptions(Customizer.withDefaults())
}6. Monitoring and Alerting:
// Add to vercel.json for security monitoring
{
"build": {
"env": {
"SPRING_SECURITY_CHECKS": "enabled",
"ACTUATOR_SECURITY": "disabled"
}
},
"functions": {
"api/**/*.js": {
"runtime": "nodejs18.x",
"maxDuration": 30
}
}
}After implementing these remediations, use middleBrick to verify the fixes:
$ middlebrick scan --retest https://your-app.vercel.app
Security Score: A (92/100)
✓ Spring4shell vulnerability resolved
✓ Actuator endpoints secured
✓ Deserialization blocked
✓ Security headers implemented