{"schema_version":"1.9.0","id":"EEF-CVE-2026-28808","published":"2026-04-07T12:28:16.056Z","modified":"2026-09-08T13:45:04.220246044Z","aliases":["CVE-2026-28808","GHSA-3vhp-h532-mc3f"],"summary":"ScriptAlias CGI targets bypass directory auth in inets httpd (mod_auth vs mod_cgi path mismatch)","details":"## Summary\n\nIncorrect Authorization vulnerability in Erlang OTP (inets modules) allows unauthenticated access to CGI scripts protected by `directory` rules when served via `script_alias`.\n\nWhen `script_alias` maps a URL prefix to a directory outside `DocumentRoot`, `mod_auth` evaluates `directory`-based access controls against the `DocumentRoot`-relative path while `mod_cgi` executes the script at the `ScriptAlias`-resolved path. This path mismatch allows unauthenticated access to CGI scripts that `directory` rules were meant to protect.\n\nThis vulnerability is associated with program files `lib/inets/src/http_server/mod_alias.erl`, `lib/inets/src/http_server/mod_auth.erl`, and `lib/inets/src/http_server/mod_cgi.erl`.\n\nThis issue affects OTP from OTP 17.0 before OTP 26.2.5.19, OTP 27.3.4.10, and OTP 28.4.2, corresponding to inets from 5.10 before 9.1.0.6, 9.3.2.4, and 9.6.2. Whether OTP before OTP 17.0, corresponding to inets before 5.10, is affected is unknown.\n\n## Workarounds\n\n* Move CGI scripts inside `DocumentRoot` and use `alias` instead of `script_alias` to ensure `mod_auth` resolves the correct path.\n* Apply URL-based access controls at a reverse proxy layer to block unauthenticated access to the `script_alias` URL prefix.\n* Remove `mod_cgi` from the httpd modules chain if CGI functionality is not required.\n\n## Configurations\n\nThe inets httpd server must use `script_alias` to map a URL prefix to a CGI directory, combined with `directory`-based access controls (e.g., `mod_auth`) protecting the `script_alias` target path. The vulnerability applies whenever the `script_alias` target path differs from `DocumentRoot` + URL prefix.","affected":[{"ranges":[{"type":"GIT","repo":"https://github.com/erlang/otp","events":[{"introduced":"07b8f441ca711f9812fad9e9115bab3c3aa92f79"},{"fixed":"8fc71ac6af4fbcc54103bec2983ef22e82942688"},{"fixed":"9dfa0c51eac97866078e808dec2183cb7871ff7c"}]}],"versions":["patch-base-27","OTP-27.3.4","patch-base-26","OTP-26.2.5","OTP-27.0","OTP-27.3","OTP-26.2.3","OTP-27.3.3","OTP-26.0","OTP-25.0","OTP-27.3.2","OTP-27.2","OTP-27.3.1","OTP-27.1","OTP-26.2","OTP-26.2.4","OTP-27.0-rc3","OTP-27.0-rc2","OTP-27.0-rc1","OTP-24.0","OTP-26.1","OTP-26.0-rc3","OTP-26.0-rc2","OTP-26.0-rc1","OTP-23.0","OTP-21.0","OTP-25.0-rc3","OTP-25.0-rc2","OTP-25.0-rc1","OTP-22.0","OTP-24.0-rc3","OTP-24.0-rc2","OTP-24.0-rc1","OTP-23.0-rc3","OTP-23.0-rc2","OTP-23.0-rc1","OTP-20.0","OTP-22.0-rc3","OTP-22.0-rc2","OTP-22.0-rc1","OTP-19.0","OTP-21.0-rc2","OTP-18.0","OTP-21.0-rc1","OTP-17.0","OTP-20.0-rc2","OTP-20.0-rc1","OTP-19.0-rc2","OTP-19.0-rc1","OTP-18.0-rc1"],"database_specific":{"source":"https://cna.erlef.org/osv/EEF-CVE-2026-28808.json"}}],"references":[{"type":"ADVISORY","url":"https://github.com/erlang/otp/security/advisories/GHSA-3vhp-h532-mc3f"},{"type":"WEB","url":"https://cna.erlef.org/cves/CVE-2026-28808.html"},{"type":"WEB","url":"https://www.erlang.org/doc/system/versions.html#order-of-versions"},{"type":"WEB","url":"https://github.com/erlang/otp/commit/07b8f441ca711f9812fad9e9115bab3c3aa92f79"},{"type":"FIX","url":"https://github.com/erlang/otp/commit/8fc71ac6af4fbcc54103bec2983ef22e82942688"},{"type":"FIX","url":"https://github.com/erlang/otp/commit/9dfa0c51eac97866078e808dec2183cb7871ff7c"}],"database_specific":{"capec_ids":["CAPEC-1"],"cpe_ids":["cpe:2.3:a:erlang:erlang\\/otp:*:*:*:*:*:*:*:*"],"cwe_ids":["CWE-863"]},"severity":[{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N"}],"credits":[{"name":"Igor Morgenstern / Aisle Research","type":"FINDER"},{"name":"Konrad Pietrzak","type":"REMEDIATION_DEVELOPER"}]}