Plugin security
Supply chain. Install needs
ManageSecurity. The tarball must carry a detached Ed25519 signature over its SHA-256 from one of the organization's trusted publisher keys (PUT /v1/orgs/{org}/plugin-trust), or the organization must setallow_unsigned(default off). Unsigned installs are audited asplugin.install_unsigned. The SHA-256 is recorded; an update is a new version. The runner verifies the SHA-256 and signature again before it starts any code.Sandbox. One process per plugin, started through the runner's
--sandboxwrapper that sets CPU, address-space and file-descriptor limits (Linux/macOSsetrlimit; a job object on Windows). The plugin gets no inherited environment, onlyWT_EGRESS_URL.Network. The plugin reaches the network only through the egress proxy at
WT_EGRESS_URL(/<http|https>/<host>/<path>). Hosts outsideegress_hostsare 403; the connect-time IP is checked against the SSRF rules; redirects are not followed. Secrets named insecret_refsare added to configured headers by the proxy, replacing any value the plugin sets, so plugin code never sees them.Failure. A crash or a hung call (30 s) kills the process; restarts back off 1 s, 2 s, 4 s ... up to 1 min. Health:
GET /v1/orgs/{org}/plugins/{id}/health.Scope. Filters apply to notification and workflow payloads only, never the ingest path. A plugin enabled in one project answers no other project's queries (404).
Limits.
RLIMIT_ASis not enforced by macOS; run the runner on Linux in production.