Security fixes are made on the latest release of Sylvode Webhook (formerly OpenPR Webhook). The
legacy openpr-webhook executable, image and archive names receive the same fixes, because they
are the same build.
Please do not open a public issue for a vulnerability. Report it privately through GitHub security advisories.
Include the affected version, a description of the problem, steps to reproduce and the impact you expect. We will acknowledge the report, keep you informed while we investigate, and credit you in the advisory unless you prefer otherwise.
- Inbound webhooks are authenticated by an HMAC-SHA256 signature in
X-Sylvode-Signature,X-Webhook-Signatureor the legacyX-OpenPR-Signature. Requests whose signature headers disagree are refused.allow_unsigned = truedisables verification and is meant for development only. allow_unsigned = trueis refused on an address other than loopback unlessallow_unsigned_non_loopback = trueacknowledges it. Blank secrets and the example placeholders refuse start-up. Signed requests are also checked for replay (id) and freshness (timestamp).- Several agent types run local commands, and they are gated differently:
clirunscodex,claudeoropencodewith permission checks bypassed. It runs only withfeatures.cli_enabled = true, never in safe mode (SYLVODE_WEBHOOK_SAFE_MODE=1), at mostruntime.cli_max_concurrencyat a time, and its whole process group is stopped on timeout or shutdown.openclaw,openprx(withcommand) andcustomrun their configured command for every matching bot task. Neithercli_enablednor safe mode stops them; the program and its fixed arguments come only from the configuration, and payload text is always passed as a single argument (forcustom, it may not start an option). Configure only the agents you need.
- Commands run without a shell, with stdin closed, and inherit the service's environment; do not give the service environment variables you would not give the agents.
- Run the service as a dedicated unprivileged user (see the systemd example in the README).
- Never commit a
config.tomlcontaining secrets;.gitignoreexcludes it.