Open Redirect on Docker
How Open Redirect Manifests in Docker
Open Redirect vulnerabilities in Docker environments often arise from improper URL validation in container orchestration and management interfaces. The most common scenario occurs in Docker Compose applications where services accept redirect URLs from user input without proper validation.
Consider a Dockerized web application using Nginx as a reverse proxy with a backend service. If the backend accepts a redirect parameter from query strings and forwards it to the frontend without validation, attackers can craft URLs that redirect users to malicious sites. This becomes particularly dangerous when Docker containers expose management interfaces or when containerized applications handle authentication flows.
A typical vulnerable pattern in Docker Compose files:
version: '3.8'
services:
webapp:
build: .
ports:
- "3000:3000"
environment:
- REDIRECT_URL=${REDIRECT_URL:-https://example.com}
- AUTH_CALLBACK=${AUTH_CALLBACK:-https://example.com/callback}In this configuration, environment variables are passed to the container without validation. If the application uses these variables to construct redirect URLs, an attacker who can influence the environment variables could redirect users to phishing sites.
Docker-specific attack vectors include:
- Manipulating Docker Compose environment files (.env) to inject malicious redirect URLs
- Exploiting Docker Swarm's routing mesh to intercept and redirect traffic between services
- Targeting Docker API endpoints that accept URLs for webhook configurations
- Abusing Docker Trusted Registry (DTR) authentication redirects
- Exploiting Kubernetes ingress controllers when deployed alongside Docker containers
The Docker daemon itself can be a target. If an attacker gains access to the Docker socket (/var/run/docker.sock), they could potentially manipulate container configurations to include malicious redirect endpoints.
Docker-Specific Detection
Detecting Open Redirect vulnerabilities in Docker environments requires both static analysis of Docker configurations and dynamic scanning of running containers. middleBrick's Docker-aware scanning can identify these issues by examining container configurations and runtime behavior.
Static detection focuses on Docker Compose files, Dockerfiles, and environment configurations. Look for patterns like:
# Check for unvalidated redirect parameters in Dockerfiles
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Dynamic scanning involves testing running containers. middleBrick can scan exposed endpoints to detect Open Redirect vulnerabilities by attempting controlled redirects to canary domains and monitoring the response behavior.
Common Docker-specific detection patterns include:
- Scanning exposed ports for authentication endpoints that accept redirect parameters
- Testing Docker API endpoints for URL manipulation vulnerabilities
- Checking container metadata endpoints for information disclosure that could aid redirect attacks
- Verifying that Docker registry endpoints properly validate redirect URLs during authentication flows
For Docker Compose applications, middleBrick analyzes the entire service stack to identify cross-service redirect vulnerabilities. This includes checking how services communicate with each other and whether any service blindly forwards URLs to others.
Using middleBrick's CLI for Docker-specific scanning:
# Scan a Dockerized API endpoint
middlebrick scan https://api.example.com --output json
# Scan multiple endpoints from a Docker Compose stack
middlebrick scan --urls-file endpoints.txt --output htmlThe scanner tests for Open Redirect by sending requests with crafted redirect parameters and analyzing the response headers and body to determine if the redirect was honored without proper validation.
Docker-Specific Remediation
Remediating Open Redirect vulnerabilities in Docker environments requires a combination of secure coding practices and Docker-specific configurations. The most effective approach is implementing a whitelist-based validation system for all redirect URLs.
Docker-specific remediation strategies:
- Environment Variable Validation: Validate all environment variables that could contain URLs before they're passed to containers.
- Network Segmentation: Use Docker networks to isolate services and control which containers can communicate with external endpoints.
- Reverse Proxy Configuration: Implement URL validation at the reverse proxy level before requests reach application containers.
- Secrets Management: Use Docker secrets for sensitive URLs rather than environment variables that could be exposed.
Code example for Docker Compose with URL validation:
version: '3.8'
services:
webapp:
build: .
ports:
- "3000:3000"
environment:
- REDIRECT_URL=${REDIRECT_URL:-https://example.com}
- AUTH_CALLBACK=${AUTH_CALLBACK:-https://example.com/callback}
command:
- /bin/sh
- -c
- |
# Validate URLs before starting the app
if ! echo "$REDIRECT_URL" | grep -qE '^https?://(example\.com|allowed\.domain)$'; then
echo "Invalid REDIRECT_URL" >&2
exit 1
fi
if ! echo "$AUTH_CALLBACK" | grep -qE '^https?://(example\.com|allowed\.domain)$'; then
echo "Invalid AUTH_CALLBACK" >&2
exit 1
fi
npm startApplication-level code example for Node.js in a Docker container:
const validRedirectDomains = ['example.com', 'app.example.com'];
function validateRedirectUrl(url) {
try {
const parsed = new URL(url);
if (!validRedirectDomains.includes(parsed.hostname)) {
return false;
}
// Additional checks for protocol, port, path
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
return false;
}
return true;
} catch (e) {
return false;
}
}
// Middleware for Express
app.use((req, res, next) => {
const redirectUrl = req.query.redirect;
if (redirectUrl && !validateRedirectUrl(redirectUrl)) {
return res.status(400).json({ error: 'Invalid redirect URL' });
}
next();
});Using Docker secrets for sensitive URLs:
version: '3.8'
services:
webapp:
build: .
secrets:
- auth_callback_url
command: ["node", "server.js"]
screts:
auth_callback_url:
external: trueFor Docker Swarm environments, implement network policies to restrict container communication:
# Create an isolated network for sensitive services
docker network create --driver overlay --internal secure-network
# Deploy services with network restrictions
docker service create \
--name webapp \
--network secure-network \
--publish 3000:3000 \
webapp:latest