Webhood separates its containers across two Docker bridge networks so that the scanner — the component most exposed to untrusted content — cannot directly reach the user-facing UI, and so that the backend database is never accessible from the public internet. Understanding this topology helps you verify that a deployment is correctly isolated and reason about the blast radius if a scan target were to compromise the scanner process.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/webhood-io/webhood/llms.txt
Use this file to discover all available pages before exploring further.
Docker Network Topology
The compose file defines two networks,frontend and rest, and assigns each container to only the networks it needs:
frontend network
Thefrontend network connects Kong, the core UI (webhood-core), and the backend (webhood-backend).
frontend network, meaning it is inaccessible from the host or from any container not on that network.
rest network
Therest network connects Kong, the scanner (webhood-scanner), and the core UI (webhood-core).
rest network — it is only on the frontend network. Kong is the sole bridge between the two networks, and its routing table forwards /api/ paths from the rest side through to the backend on the frontend side. The scanner’s authenticated API calls therefore pass through the same proxy as all other traffic.
Scanner isolation
The scanner is assigned only to therest network:
frontend network and therefore cannot reach the backend directly. The backend is only accessible through Kong, which enforces route-level authentication. If the scanner process were compromised by a malicious scan target, it would be unable to reach the backend except through Kong’s defined, authenticated routes.
Chrome Seccomp Profile
The scanner container runs headless Chromium to render scan targets. Chromium’s renderer process is itself sandboxed, but that sandbox requires a set of Linux syscalls that are not available by default in a Docker container. Webhood ships a dedicated seccomp profile to grant exactly those syscalls while restricting everything else:files/chrome.json profile is a syscall allowlist tuned for Chrome. Its effects are:
- Reduced kernel attack surface — a malicious page that exploits a Chrome vulnerability and reaches the renderer process still cannot make arbitrary kernel calls from the container.
- Sandbox without root — Chrome’s built-in sandboxing (
--sandbox) usesclone(2)and related calls that Docker’s default seccomp profile blocks. The custom profile re-enables them, so the container does not need to run asrootor with--privileged.
Private IP Blocking
TheSCANNER_NO_PRIVATE_IPS environment variable controls whether the scanner will follow URLs that resolve to private or loopback addresses:
true, the scanner resolves the hostname of each submitted URL using a DNS lookup before visiting it. If the resolved IP address is in a private range, the scan is rejected:
ip.isPrivate() check covers the following ranges:
| Range | Description |
|---|---|
10.0.0.0/8 | RFC 1918 class A private |
172.16.0.0/12 | RFC 1918 class B private |
192.168.0.0/16 | RFC 1918 class C private |
127.0.0.0/8 | Loopback |
169.254.0.0/16 | Link-local (APIPA) |
Host-Level Hardening
The Docker network isolation described above operates at the container layer. For defence in depth, apply a host firewall to restrict which source IPs can reach the Kong proxy ports: A minimalufw example: