HSTS is a hardcoded 2-year includeSubDomains preload commitment with no opt-out and no documentation of its value #271
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found by a TLS deployment audit running real nginx in front of the app.
Every response carries
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload, unconditionally and with no configuration option. The README names HSTS twice and never states the value.An operator deploying at
hooks.example.comtherefore silently commits every subdomain ofexample.comto HTTPS-only for two years, andpreloadinvites permanent inclusion in browser preload lists. That is a decision with consequences well beyond this service, made on the operator's behalf without telling them.Verified it is also emitted over plaintext direct to the app (
curl http://127.0.0.1:19001/pages/loginreturns the header). Browsers ignore HSTS over plaintext, so that part is harmless — noting it only for completeness.Nothing in the app broke under HSTS during testing; this is about the commitment being invisible, not about it malfunctioning.
Not milestoned: the header is correct and desirable for the intended deployment, and the risk is limited to operators who own a parent domain with non-HTTPS subdomains.
Definition of done:
max-age,includeSubDomainsandpreloadvalues are documented in README where HSTS is mentioned, stating plainly thatincludeSubDomainsaffects the whole parent domain and thatpreloadis effectively irreversible on browser timescales.includeSubDomainsandpreload, since those are the two that reach beyond this service. Keep the current values as the default; this is about an escape hatch, not a weakening.