Caddy Warden Changelog & Release Notes
All notable changes to the Caddy Warden module (github.com/routewarden/caddy-warden) are documented here.
The format is based on Keep a Changelog, and Caddy Warden adheres to Semantic Versioning.
[v1.4.1] - 2026-10-07 (Latest)
Key Highlights
- Strict Status Code Canonicalization (
status_code):- Removed deprecated
statusalias at the root Caddyfile directive level and withinresponse { ... }blocks in favor of strictly canonicalstatus_code <int>. - Added unit test coverage confirming that deprecated
statusandpath_patternsdirectives fail Caddyfile parsing with clear unrecognized directive errors.
- Removed deprecated
- Canonical Directive Cleanup & Verification:
- Replaced legacy
path_patternsreferences across test fixtures and sample Caddyfiles with canonicalblock_patterns. - Added comprehensive test suites verifying
block_patternsandallow_patternsmatching, query parameter filtering, and exact regex rule evaluation.
- Replaced legacy
[v1.4.0] - 2026-10-05
Key Highlights
route_wardenDirective & Module ID Registration:- Registered both
"route_warden"and"routewarden"directives with Caddyfile parser (httpcaddyfile.RegisterHandlerDirective), enabling standard snake_case Caddyfile configuration blocks (route_warden { ... }) as documented. - Registered Caddy module alias
http.handlers.route_wardenin addition tohttp.handlers.routewarden, allowing native Caddy JSON configuration blocks ("handler": "route_warden") to resolve cleanly.
- Registered both
- Canonical Directive Standardization & Duplicate Alias Removal:
- Standardized Caddyfile and JSON directives on
enable_default_patternsandenable_default_allow_patterns. - Standardized on single canonical
block_patternsdirective replacing legacy aliases (path_patterns,block_pattern). - Standardized on
mode(replacingaction),status_code(replacingstatus),check_body_patterns(replacingbody_patterns), andcheck_body_max_bytes. - Removed deprecated duplicate aliases across structs and Caddyfile unmarshaler.
- Standardized Caddyfile and JSON directives on
[v1.3.1] - 2026-10-02
Key Highlights
- Protocol-Relative Open Redirect Prevention (
redirectUrl):- Hardened redirect URL validation in
response_handler.goagainst protocol-relative URL evasion vectors (e.g.//attacker.com). - Restricts relative redirects strictly to single-slash prefixes (
/...) and safely falls back to/if protocol-relative destinations are specified, mitigating open-redirect exploitation.
- Hardened redirect URL validation in
- Security Log Schema Normalization (
level: "warn"):- Added
"level": "warn","status_code", and"matched_pattern"across both Caddy's Zap logger and stdout JSONL logs. - Ensures full schema alignment with Traefik Warden, NGINX Warden, TCP Warden, and Grafana Loki/Alloy observability stacks.
- Added
- CI / Version Scripting Portability:
- Improved in-place sed editing in
scripts/update-version.shfor reliable multi-platform execution across macOS (BSD) and Linux (GNU).
- Improved in-place sed editing in
[v1.3.0] - 2026-10-01
Key Highlights
- Trusted Proxies Support (
trusted_proxies/trusted_proxy):- Added native Caddyfile directives
trusted_proxies <ips/cidrs...>andtrusted_proxy <ips/cidrs...>alongside JSON configuration support. - Forwarded headers (
X-Forwarded-ForandX-Real-IP) are now strictly honored only when the direct socket connection (RemoteAddr) originates from an explicitly trusted proxy or subnet. - Eliminates client IP spoofing risks and ensures unauthorized clients directly reaching Caddy cannot bypass
allowed_ipsfilters by injecting forwarding headers.
- Added native Caddyfile directives
- Redirect Mode Security Hardening (
redirectUrl):- Added strict validation for
redirectUrlin response handlers, enforcinghttp://,https://, or root-relative paths (/...). - Blocks unsafe URL schemes (e.g.
javascript:) to eliminate open-redirect and client-side execution vectors.
- Added strict validation for
- Silent Drop Connection Fallback:
- Added non-hijackable connection fallback for
silentDrop: if Caddy's HTTP hijacker cannot acquire the raw connection (e.g. over HTTP/2, HTTP/3, or wrapped response writers), RouteWarden responds with HTTP 200 OK and an empty body rather than leaking the blocking status code.
- Added non-hijackable connection fallback for
- Captcha Template Error Handling:
- Added Zap structured error logging when CAPTCHA template rendering encounters an error, with an immediate fallback to a clean, well-formed HTML security challenge document.
- Flexible Silent Drop Directives:
- Recognized case-insensitive aliases
silent_drop,silentdrop, anddropin both Caddyfile and JSON configurations, canonicalizing automatically tosilentDrop.
- Recognized case-insensitive aliases
- Header Candidate Path Expansion:
- Automatically includes raw header values in candidate path evaluation before tokenization for complete inspection parity across reverse-proxy headers.
[v1.2.1] - 2026-09-24
Key Highlights
- Query Parameter Attack Surface Hardening (
check_query):- Validates both parameter keys and parameter values.
- Prevents evasion attempts where sensitive targets are passed as query keys (e.g.,
/?key=val&.env=). - Added recursive anti-evasion normalization for candidate query parameter paths.
- Client IP Extraction & Port/Bracket Normalization (
cleanIP):- Handles client IPs with embedded ports (
192.168.1.1:8080) or bracketed IPv6 formats ([2001:db8::1]) from reverse proxies or CDNs before CIDR evaluation.
- Handles client IPs with embedded ports (
- Response Modes & Silent Drop Parity (
mode silentDrop):- Standardized modern
mode silentDropsyntax in Caddyfile and JSON configurations.
- Standardized modern
- Honeypot Evaluation Scope (
fakeSuccess):- Evaluates both normalized URL paths and raw request URIs to ensure honeypot decoys cannot be bypassed via URI manipulation.
- Caddyfile Configuration Hardening:
- Added singular directive aliases (
path_pattern,block_pattern,allow_pattern,allowed_ip) for configuration convenience. - Enforced top-level status code validation in
Validate().
- Added singular directive aliases (
[v1.2.0] - 2026-09-24
Key Highlights
- RouteWarden CLI (
rwarden generate --target caddy):- Added direct compilation from universal
routewarden.jsonpolicy manifests into nativeroute_wardenCaddyfile blocks.
- Added direct compilation from universal
- Caddyfile Block Parsing Enhancements (
caddyfile.go):- Enhanced parsing for nested response settings, headers, and custom tarpit/captcha properties.
- Unified Versioning Automation:
- Integrated
scripts/update-version.shfor atomic updates acrossversion.json,README.md, and Caddy docs.
- Integrated
[v1.1.0] - 2026-09-20
Key Highlights
- Expanded Default Block Patterns:
- Built-in coverage for private keys (
*.pem,*.key), container manifests (Dockerfile*,docker-compose*.yml),.DS_Store, and CMS configs (wp-config.php*,settings.py).
- Built-in coverage for private keys (
- Header Smuggling Protection (
check_headers):- Configurable header list (
X-Forwarded-Uri,X-Rewrite-URL,X-Original-URL, etc.) with recursive normalization.
- Configurable header list (
- Path Normalizer Fuzz Testing:
- Integrated fuzz testing (
FuzzExtractCandidatePaths) for Caddy URL normalization pipelines.
- Integrated fuzz testing (
[v1.0.0] - 2026-09-20
Key Highlights
- Official Caddy v2 Module GA Release:
- Seamless integration via
xcaddy build --with github.com/routewarden/caddy-warden. - Native
route_wardenCaddyfile directive and dynamic Caddy JSON API support. - Full support for all 13 response modes (
tarpit,gzipBomb,fakeSuccess,captcha,silentDrop, etc.). - Automatic order declaration:
order route_warden before reverse_proxy. - Structured security logging (
security_log true) compatible with CrowdSec.
- Seamless integration via
[v0.3.x Series] (Archived)
- HTTP Method Constraints (
method <verbs...>): Granular verb filtering in Caddyfile and JSON matchers. - Diagnostic Logging (
debug true): Verbose stdout diagnostic traces of candidate path transformations. - CrowdSec Auto-Ban Logging (
security_log true): Emits single-line JSON block audit events to stdout.