Advisory Database
  • Advisories
  • Dependency Scanning
  1. golang
  2. ›
  3. github.com/tinyauthapp/tinyauth
  4. ›
  5. CVE-2026-77560

CVE-2026-77560: Tinyauth: forward-auth per-app ACL is matched case-sensitively against the (case-insensitive) hostname, letting an authenticated user reach apps they are not on the allowlist for

September 22, 2026

tinyauth is a forward-auth service: a reverse proxy (Traefik/Caddy/nginx/Envoy) calls GET /api/auth/<proxy> on every request and only forwards the request upstream if tinyauth returns 200. tinyauth decides which per-app access rules apply by looking up the forwarded hostname (the app) in its ACL set — the static apps: config and/or Docker labels. Each app can restrict access with users.allow / users.block, oauth.whitelist, oauth.groups / ldap.groups, and ip.allow. These allowlists are the entire authorization model that separates one protected app from another for a shared pool of authenticated users.

The hostname → ACL lookup is performed with case-sensitive Go string comparisons (config.Config.Domain == domain and strings.SplitN(domain, ".", 2)[0] == app). Hostnames, however, are case-insensitive everywhere else in the stack: DNS, HTTP Host-header routing, and TLS SNI all treat immich.example.com and IMMICH.example.com as the same host, so a reverse proxy routes both to the same backend. When a request arrives with a mixed-case host, the proxy still routes it to the intended app and faithfully forwards the mixed-case value in X-Forwarded-Host (or X-Original-URL for nginx, or Host for Envoy), but tinyauth’s case-sensitive lookup misses the app’s ACL entry.

On a miss, tinyauth does not fail closed. GetAccessControls falls back to DockerService.GetLabels, which returns an empty config.App{} with no error whenever nothing matches (or Docker is not connected). The proxy handler then evaluates that empty App: IsAuthEnabled → true, CheckIP (no allow/block) → allowed, IsUserAllowed with an empty users.allow → CheckFilter("", …) → true, and the group check with empty required groups → true. The net result is that any already-authenticated user is authorized (200 Authenticated) for an app whose ACL was supposed to exclude them — simply by upper-casing (or otherwise re-casing) one letter of the hostname. This defeats the per-app users/groups/ip allowlist for every proxy integration.

References

  • github.com/advisories/GHSA-328g-jx67-v94g
  • github.com/tinyauthapp/tinyauth/commit/80bc87188ec3aabc5104c249eaa7b997973b9275
  • github.com/tinyauthapp/tinyauth/commit/e75605b2c534ec83525a33603e16d76baca13399
  • github.com/tinyauthapp/tinyauth/pull/1000
  • github.com/tinyauthapp/tinyauth/pull/1028
  • github.com/tinyauthapp/tinyauth/releases/tag/v5.1.2
  • github.com/tinyauthapp/tinyauth/security/advisories/GHSA-328g-jx67-v94g
  • nvd.nist.gov/vuln/detail/CVE-2026-77560

Code Behaviors & Features

Detect and mitigate CVE-2026-77560 with GitLab Dependency Scanning

Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Learn more about Dependency Scanning →

Affected versions

All versions before 1.0.1-0.20260720133915-80bc87188ec3

Fixed versions

  • 1.0.1-0.20260720133915-80bc87188ec3

Solution

Upgrade to version 1.0.1-0.20260720133915-80bc87188ec3 or above.

Impact 8.1 HIGH

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N

Learn more about CVSS

Weakness

  • CWE-178: Improper Handling of Case Sensitivity
  • CWE-636: Not Failing Securely ('Failing Open')
  • CWE-863: Incorrect Authorization

Source file

go/github.com/tinyauthapp/tinyauth/CVE-2026-77560.yml

Spotted a mistake? Edit the file on GitLab.

  • Site Repo
  • About GitLab
  • Terms
  • Privacy Statement
  • Contact

Page generated Wed, 23 Sep 2026 12:16:49 +0000.