Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
Your server on HTTP: REST and WebSocket for sites, bots, and AI agents, with tokens, scopes, and an audit log.
A security release. Update soon if anyone but you holds a token or a panel account.
Security
- 🔒 A token or account without permissions got every permission. A token with an empty list, an issued token whose group you later removed from
config.yml, or a panel account with such a group passed every permission check,codeandfiles:writeamong them. Anyone withtokens:managecould make such a token. Now it gets nothing, andPOST /tokensasks for at least one group or permission. - 🔒 A token named
anonymouscounted as an anonymous visitor, with a visitor's view and rate limit. A token is now always a token, whatever its name. - 🔒 The docs page pins its script.
/docsloaded the newest Scalar from a CDN on the panel's own origin, so a bad release there could have acted with a signed-in admin's session. It now loads one version, checked against its hash, under a Content-Security-Policy. - 🔒 WebSocket clients have a message limit. One connection could send subscriptions without end, each building a snapshot on the server thread, or try one token after another. A connection now sends up to 30 messages at once and 120 a minute; past that it gets
rate_limited. - 🔒 Anonymous clients lose coordinates at any depth. Location keys inside an object or a list of an event, as a plugin's event may carry them, are stripped too, not only those at the top.
- 🔒 A grep can't hang a thread.
GET /files/readwithregex=truestops after 5 seconds with 400grep_timeout, so a pattern that backtracks forever can't keep a thread busy. - 🔒 Smaller things. Sign-in bodies are read up to 4 KiB, not in full first. A failed sign-in keeps the name in the audit log only when it could be an account name, since anyone on the internet types it and AI agents read that log.
X-Forwarded-Prefixcounts only as a plain path for the OpenAPI document, which keeps a few copies at most. Anonymous clients no longer see a plugin's error message, only that it failed. The list of item keys without an icon stays bounded.config.ymlrefuses a token that is still a${VARIABLE}placeholder. The panel's sign-in sends you back only to a page on its own site.
Platforms
Paper
26.3