Safeguard
Vulnerability Analysis•

CVE-2026-28808: Erlang OTP inets CGI Authorization Bypass

Erlang/OTP inets httpd can serve script_alias CGI scripts without the directory auth you set (CVSS 9.8). Upgrade to OTP 26.2.5.19, 27.3.4.10 or 28.4.2.

Safeguard Security Team
3 min read

CVE-2026-28808 is a critical (CVSS 9.8) incorrect authorization flaw in the Erlang/OTP inets HTTP server. When script_alias points outside DocumentRoot, directory auth rules do not protect the CGI scripts. Fixed releases are OTP 26.2.5.19, 27.3.4.10 and 28.4.2.

What's affected

The GitHub advisory and the Erlang CNA entry say OTP from 17.0 is affected until the fixed releases: OTP 26.2.5.19, 27.3.4.10 and 28.4.2. In inets terms, that is versions from 5.10 before 9.1.0.6, 9.3.2.4 and 9.6.2. Whether older releases are affected is unknown.

You are affected only if all three apply. You use the inets httpd server, you map a URL prefix with script_alias to a directory outside DocumentRoot, and you protect that directory with mod_auth directory rules.

The advisory says you are not affected if you use erl_script_alias (mod_esi), keep script_alias targets inside DocumentRoot, or enforce authentication in an external reverse proxy.

How to check if you're exposed

Find your OTP release from a shell on the host:

erl -noshell -eval 'io:format("~s~n",[erlang:system_info(otp_release)]), halt().'

This prints the major release. Check the full patch version with your package manager or release notes. Then search your httpd configuration for script_alias entries and directory auth rules, and see whether they match the affected pattern.

What to do now

  1. Upgrade to OTP 26.2.5.19, 27.3.4.10 or 28.4.2 (or later) for your release line, and rebuild images that bundle Erlang.
  2. If you cannot upgrade yet, move CGI scripts inside DocumentRoot and use alias instead of script_alias, as the advisory suggests.
  3. Apply URL-based access control for the CGI prefix at a reverse proxy.
  4. Review access logs for requests to the CGI path from unauthenticated clients.

Why it matters

The record lists CWE-863 (incorrect authorization) and CWE-551 (incorrect behavior order: authorization before parsing and canonicalization). Two modules disagreed about which path a request meant. The alias module did not include script_alias entries when resolving the path, so the auth module checked rules against the wrong, DocumentRoot-relative path, while the CGI module ran the script at the real target.

The pattern is familiar: a check and an action that see different versions of the same request. The record does not mark the CVE as exploited in the wild.

Quick check

Does erl_script_alias have the same issue?

The advisory says no. That setting maps to Erlang modules, not file system paths, so it falls outside the affected configuration.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.