# Security

> Setu's trust model in plain words, and how to report a vulnerability.

Published 2026-10-15 · Canonical: https://setucp.com/security

---

## The trust model, plainly

The control plane is effectively root on every server that joins it: agents carry out the commands it queues, some through a privileged helper. Protect the control plane, its database and its secret key accordingly.

The agent itself is not root. It reaches root only through `setu helper <verb>`: typed JSON on stdin, with no paths, modes or owners from the caller. The helper bounds *what* root can be asked to do, using typed verbs, fixed templates, paths derived from the site id and hostile archives refused, but not *who* asks.

- Sites are untrusted. Each runs as its own user and can write only its own data and run directories.
- Sites on one server share the kernel, the local PostgreSQL instance (one database and role each) and Caddy.
- Secrets are sealed at rest, never put on a command line or in logs, and revealed only with the operator's password.

The full model, the helper's verbs, the sudoers file and the firewall rules are in the [trust model](https://github.com/setucp/setu/blob/main/docs/TRUST.md) and [security documentation](https://github.com/setucp/setu/blob/main/docs/SECURITY.md).

## Reporting a vulnerability

Please report security issues privately through GitHub's [private vulnerability reporting](https://github.com/setucp/setu/security/advisories/new). Do not open a public issue. You should get an acknowledgement within three days. Fixes for the current minor release are published as a patch release with a security note in the changelog.

The full policy, including supported versions and scope, is in [SECURITY.md](https://github.com/setucp/setu/blob/main/SECURITY.md).
