Resolves TWO Critical CodeQL SSRF findings by implementing five-layer defense-in-depth architecture with handler and utility-level validation. Component 1 - settings_handler.go TestPublicURL (Handler Level): - Added security.ValidateExternalURL() pre-validation - Breaks CodeQL taint chain at handler layer - Maintains API backward compatibility (200 OK for blocks) - 31/31 test assertions passing Component 2 - url_testing.go TestURLConnectivity (Utility Level): - Added conditional validation (production path only) - Preserves test isolation (skips validation with custom transport) - Breaks CodeQL taint chain via rawURL reassignment - 32/32 test assertions passing - Zero test modifications required Defense-in-depth layers: 1. Format validation (HTTP/HTTPS scheme check) 2. Handler SSRF check (DNS + IP validation) ← Taint break #1 3. Conditional validation (production path only) ← Taint break #2 4. Connectivity test (validated URL) 5. Runtime protection (ssrfSafeDialer, TOCTOU defense) Attack protections: - Private IPs blocked (RFC 1918: 10.x, 192.168.x, 172.16.x) - Loopback blocked (127.0.0.1, localhost, ::1) - Cloud metadata blocked (169.254.169.254) - Link-local blocked (169.254.0.0/16) - DNS rebinding/TOCTOU eliminated (dual validation) - URL parser differentials blocked (embedded credentials) - Protocol smuggling prevented (invalid schemes) Test coverage: - Backend: 85.1% → 85.4% (+0.3%) - SSRF tests: 100% pass rate (63/63 assertions) - Test isolation: Preserved (conditional validation pattern) - Test modifications: Zero Security validation: - govulncheck: zero vulnerabilities - Go Vet: passing - Trivy: no critical/high issues - All 15 SSRF attack vectors blocked (100%) CodeQL impact: - Dual taint chain breaks (handler + utility levels) - Expected: Both go/ssrf findings cleared Industry compliance: - OWASP SSRF prevention best practices - CWE-918 mitigation (CVSS 9.1) - Five-layer defense-in-depth Refs: #450
Charon
Your server, your rules—without the headaches.
Simply manage multiple websites and self-hosted applications. Click, save, done. No code, no config files, no PhD required.
Why Charon?
You want your apps accessible online. You don't want to become a networking expert first.
The problem: Managing reverse proxies usually means editing config files, memorizing cryptic syntax, and hoping you didn't break everything.
Charon's answer: A web interface where you click boxes and type domain names. That's it.
- ✅ Your blog gets a green lock (HTTPS) automatically
- ✅ Your chat server works without weird port numbers
- ✅ Your admin panel blocks everyone except you
- ✅ Everything stays up even when you make changes
🐕 Cerberus Security Suite
🕵️♂️ CrowdSec Integration
- Protects your applications from attacks using behavior-based detection and automated remediation.
🔐 Access Control Lists (ACLs)
- Define fine-grained access rules for your applications, controlling who can access what and under which conditions.
🧱 Web Application Firewall (WAF)
- Protects your applications from common web vulnerabilities such as SQL injection, XSS, and more using Coraza.
⏱️ Rate Limiting
- Protect your applications from abuse by limiting the number of requests a user or IP can make within a certain timeframe.
✨ Top 10 Features
🎯 Point & Click Management
No config files. No terminal commands. Just click, type your domain name, and you're live. If you can use a website, you can run Charon.
🔐 Automatic HTTPS Certificates
Free SSL certificates that request, install, and renew themselves. Your sites get the green padlock without you lifting a finger.
🛡️ Enterprise-Grade Security Built In
Web Application Firewall, rate limiting, geographic blocking, access control lists, and intrusion detection via CrowdSec. Protection that "just works."
🔗 Smart Proxy Headers
Automatically adds standard headers (X-Real-IP, X-Forwarded-Proto, etc.) so your backend applications see real client IPs, enforce HTTPS correctly, and log accurately—with full backward compatibility for existing hosts.
🐳 Instant Docker Discovery
Already running apps in Docker? Charon finds them automatically and offers one-click proxy setup. No manual configuration required.
📊 Real-Time Monitoring & Logs
See exactly what's happening with live request logs, uptime monitoring, and instant notifications when something goes wrong.
📥 Migration Made Easy
Import your existing Caddy configurations with one click. Already invested in another reverse proxy? Bring your work with you.
⚡ Live Configuration Changes
Update domains, add security rules, or modify settings instantly—no container restarts needed.* Your sites stay up while you make changes.
🌍 Multi-App Management
Run dozens of websites, APIs, or services from a single dashboard. Perfect for homelab enthusiasts and small teams managing multiple projects.
🚀 Zero-Dependency Deployment
One Docker container. No databases to install. No external services required. No complexity—just pure simplicity.
💯 100% Free & Open Source
No premium tiers. No feature paywalls. No usage limits. Everything you see is yours to use, forever, backed by the MIT license.
* Note: Initial security engine setup (CrowdSec) requires a one-time container restart to initialize the protection layer. All subsequent changes happen live.
Quick Start
Docker Compose (Recommended)
Save this as docker-compose.yml:
services:
charon:
image: ghcr.io/wikid82/charon:latest
container_name: charon
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
- "8080:8080"
volumes:
- ./charon-data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CHARON_ENV=production
Then run:
docker-compose up -d
Docker Run (One-Liner)
docker run -d \
--name charon \
-p 80:80 \
-p 443:443 \
-p 443:443/udp \
-p 8080:8080 \
-v ./charon-data:/app/data \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-e CHARON_ENV=production \
ghcr.io/wikid82/charon:latest
What Just Happened?
- Charon downloaded and started
- The web interface opened on port 8080
- Your websites will use ports 80 (HTTP) and 443 (HTTPS)
Open http://localhost:8080 and start adding your websites!
Upgrading? Run Migrations
If you're upgrading from a previous version with persistent data:
docker exec charon /app/charon migrate
docker restart charon
This ensures security features (especially CrowdSec) work correctly.
Important: If you had CrowdSec enabled before the upgrade, it will automatically restart after migration. You don't need to manually re-enable it via the GUI. See Migration Guide for details.
Getting Help
📖 Full Documentation — Everything explained simply 🚀 5-Minute Guide — Your first website up and running 💬 Ask Questions — Friendly community help 🐛 Report Problems — Something broken? Let us know
