CVE-2026-55599
phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
5.8
phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
CVE-2026-55599- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
EUVDEUVD-2026-38348
5.8
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
EUVD-2026-38348- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-m557-wrgg-6rp4
5.8
phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access
Summary
When an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. It is reproducible on current released LTS 3.0.53 and on 4.0 development line.
Details
When no already-trusted certificate authority is the issuer of certificate under validation, validateSignatureCountable() continues to AIA fetching. Default for validateSignature() is caonly = true:
// phpseclib/File/X509.php:1316-1327 (4.0 development line, commit 74ada1a6)
if (!isset($signingCert)) {
if ($caonly) {
return $this->testForIntermediate(true, $count) && $this->validateSignature(true);
} else {
try {
$this->testForSelfSigned();
$signingCert = $this;
} catch (BadMethodCallException) {
return $this->testForIntermediate(true, $count) && $this->validateSignature(true);
}
}
}
testForIntermediate() takes URL straight out of certificate's AIA caIssuers field and fetches it. Value comes directly from certificate content and is never restricted:
// phpseclib/File/X509.php:1357-1391 (4.0 development line)
$opts = $this->getExtension('id-pe-authorityInfoAccess');
...
foreach ($opts['extnValue'] as $opt) {
if ($opt['accessMethod'] == 'id-ad-caIssuers') {
if (isset($opt['accessLocation']['uniformResourceIdentifier'])) {
$url = (string) $opt['accessLocation']['uniformResourceIdentifier']; // attacker controlled
break;
}
}
}
...
$cert = static::fetchURL($url); // server-side request forgery
fetchURL() connects to attacker host and port. There is no destination validation: no block on loopback, link-local, private, or metadata ranges, and no port restriction:
// phpseclib/File/X509.php:1456-1476 (4.0 development line)
private static function fetchURL(string $url): ?string
{
if (self::$disable_url_fetch) { // default false, so fetching happens
return null;
}
$parts = parse_url($url);
switch ($parts['scheme']) {
case 'http':
$fsock = @fsockopen($parts['host'], $parts['port'] ?? 80); // attacker host and port
...
fputs($fsock, "GET $path HTTP/1.0\r\n");
fputs($fsock, "Host: $parts[host]\r\n\r\n");
Fetching is on by default:
// phpseclib/File/X509.php:110 (4.0 development line)
private static bool $disable_url_fetch = false;
Same default-enabled logic exists in released 3.0.x. In 3.0.53 it sits at $disable_url_fetch = false on line 255 and fsockopen($parts['host'], ...) on line 1136 of phpseclib/File/X509.php.
Why this is a vulnerability and not merely a feature. AIA chasing is a legitimate capability described by RFC 4325, and this report does not claim fetching is wrong in itself. Vulnerability is the combination of three properties that together match definition of SSRF:
- URL comes from untrusted input. It is read out of certificate that an application is trying to validate, which is exactly the data an attacker controls.
- Fetching is enabled by default. An integrator who simply calls validateSignature() gets outbound requests with no opt-in. Only control, X509::disableURLFetch(), is off by default, so secure behaviour requires knowing about and calling a method that most callers never see.
- No destination is restricted. Loopback, private ranges, link-local…
- Record
GHSA-m557-wrgg-6rp4- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
NVD
5.8
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
CVE-2026-55599- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSV
5.8
phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
CVE-2026-55599- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-55599
5.8
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
DEBIAN-CVE-2026-55599- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Updated
- 2026-11-02
OSVGHSA-m557-wrgg-6rp4
5.8
phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access
Summary
When an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. It is reproducible on current released LTS 3.0.53 and on 4.0 development line.
Details
When no already-trusted certificate authority is the issuer of certificate under validation, validateSignatureCountable() continues to AIA fetching. Default for validateSignature() is caonly = true:
// phpseclib/File/X509.php:1316-1327 (4.0 development line, commit 74ada1a6)
if (!isset($signingCert)) {
if ($caonly) {
return $this->testForIntermediate(true, $count) && $this->validateSignature(true);
} else {
try {
$this->testForSelfSigned();
$signingCert = $this;
} catch (BadMethodCallException) {
return $this->testForIntermediate(true, $count) && $this->validateSignature(true);
}
}
}
testForIntermediate() takes URL straight out of certificate's AIA caIssuers field and fetches it. Value comes directly from certificate content and is never restricted:
// phpseclib/File/X509.php:1357-1391 (4.0 development line)
$opts = $this->getExtension('id-pe-authorityInfoAccess');
...
foreach ($opts['extnValue'] as $opt) {
if ($opt['accessMethod'] == 'id-ad-caIssuers') {
if (isset($opt['accessLocation']['uniformResourceIdentifier'])) {
$url = (string) $opt['accessLocation']['uniformResourceIdentifier']; // attacker controlled
break;
}
}
}
...
$cert = static::fetchURL($url); // server-side request forgery
fetchURL() connects to attacker host and port. There is no destination validation: no block on loopback, link-local, private, or metadata ranges, and no port restriction:
// phpseclib/File/X509.php:1456-1476 (4.0 development line)
private static function fetchURL(string $url): ?string
{
if (self::$disable_url_fetch) { // default false, so fetching happens
return null;
}
$parts = parse_url($url);
switch ($parts['scheme']) {
case 'http':
$fsock = @fsockopen($parts['host'], $parts['port'] ?? 80); // attacker host and port
...
fputs($fsock, "GET $path HTTP/1.0\r\n");
fputs($fsock, "Host: $parts[host]\r\n\r\n");
Fetching is on by default:
// phpseclib/File/X509.php:110 (4.0 development line)
private static bool $disable_url_fetch = false;
Same default-enabled logic exists in released 3.0.x. In 3.0.53 it sits at $disable_url_fetch = false on line 255 and fsockopen($parts['host'], ...) on line 1136 of phpseclib/File/X509.php.
Why this is a vulnerability and not merely a feature. AIA chasing is a legitimate capability described by RFC 4325, and this report does not claim fetching is wrong in itself. Vulnerability is the combination of three properties that together match definition of SSRF:
- URL comes from untrusted input. It is read out of certificate that an application is trying to validate, which is exactly the data an attacker controls.
- Fetching is enabled by default. An integrator who simply calls validateSignature() gets outbound requests with no opt-in. Only control, X509::disableURLFetch(), is off by default, so secure behaviour requires knowing about and calling a method that most callers never see.
- No destination is restricted. Loopback, private ranges, link-local…
- Record
GHSA-m557-wrgg-6rp4- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-55599
5.8
phpseclib is a PHP secure communications library. From 0.1.1 until 1.0.30, 2.0.55, and 3.0.54, when an application validates an untrusted X.509 certificate with phpseclib, X509::validateSignature() reads a URL out of that certificate's Authority Information Access (AIA) extension and connects to it. Attacker who supplies certificate fully controls host, port, and path of that connection. URL fetching is enabled by default, and no destination is blocked. An unauthenticated attacker can therefore make a validating server open connections to internal hosts and ports it should never reach, for example loopback 127.0.0.1, cloud metadata address 169.254.169.254, and internal-only services. This is a server-side request forgery (SSRF) caused by an insecure default. This vulnerability is fixed in 1.0.30, 2.0.55, and 3.0.54.
- Record
UBUNTU-CVE-2026-55599- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
phpseclib/phpseclibPackagist |
0.1.1 to 1.0.29 | 1.0.30 |
phpseclib/phpseclibPackagist |
2.0.0 to 2.0.54 | 2.0.55 |
phpseclib/phpseclibPackagist |
3.0.0 to 3.0.53 | 3.0.54 |
php-phpseclibDebian:12 |
All versions, plus listed versions 2.0.42-12.0.42-1+deb12u12.0.42-1+deb12u22.0.42-1+deb12u32.0.42-1+deb12u5 Show 17 moreShow less2.0.44-12.0.45-12.0.46-12.0.47-12.0.47-22.0.47-32.0.48-12.0.48-22.0.48-32.0.49-12.0.50-12.0.51-12.0.52-12.0.53-12.0.54-12.0.55-13.0.2-1 |
None known |
php-phpseclibDebian:13 |
All versions, plus listed versions 2.0.48-32.0.48-3+deb13u12.0.48-3+deb13u32.0.49-12.0.50-1 Show 6 moreShow less2.0.51-12.0.52-12.0.53-12.0.54-12.0.55-13.0.2-1 |
None known |
php-phpseclibDebian:14 |
before 2.0.55-1, plus listed versions 2.0.48-32.0.49-12.0.50-12.0.51-12.0.52-12.0.53-12.0.54-1 |
2.0.55-1 |
php-phpseclib3Debian:12 |
All versions, plus listed versions 3.0.19-13.0.19-1+deb12u13.0.19-1+deb12u23.0.19-1+deb12u33.0.19-1+deb12u4 Show 33 moreShow less3.0.19-1+deb12u63.0.20-13.0.21-13.0.21-23.0.22-13.0.23-13.0.33-13.0.34-13.0.35-13.0.36-13.0.37-13.0.38-13.0.39-13.0.41-13.0.42-13.0.43-13.0.43-23.0.44-13.0.44-23.0.45-13.0.46-13.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-13.0.55-13.0.56-13.0.57-1 |
None known |
php-phpseclib3Debian:13 |
All versions, plus listed versions 3.0.43-23.0.43-2+deb13u13.0.43-2+deb13u33.0.44-13.0.44-2 Show 14 moreShow less3.0.45-13.0.46-13.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-13.0.55-13.0.56-13.0.57-1 |
None known |
php-phpseclib3Debian:14 |
before 3.0.55-1, plus listed versions 3.0.43-23.0.44-13.0.44-23.0.45-13.0.46-1 Show 9 moreShow less3.0.46-23.0.47-13.0.48-13.0.49-13.0.50-13.0.51-13.0.52-13.0.52-23.0.53-1 |
3.0.55-1 |
phpseclibDebian:12 |
All versions, plus listed versions 1.0.20-11.0.20-1+deb12u11.0.20-1+deb12u21.0.20-1+deb12u31.0.20-1+deb12u5 Show 16 moreShow less1.0.21-11.0.21-21.0.22-11.0.23-11.0.23-21.0.23-31.0.23-41.0.23-51.0.23-61.0.24-11.0.27-11.0.28-11.0.29-11.0.30-12.0.0-12.0.1-1 |
None known |
Show 12 moreShow less
| Package | Affected | Fixed |
|---|---|---|
phpseclibDebian:13 |
All versions, plus listed versions 1.0.23-61.0.23-6+deb13u11.0.23-6+deb13u31.0.24-11.0.27-1 Show 5 moreShow less1.0.28-11.0.29-11.0.30-12.0.0-12.0.1-1 |
None known |
phpseclib/phpseclibPackagist |
0.1.1 up to 1.0.30, plus listed versions 0.3.00.3.10.3.100.3.50.3.6 Show 33 moreShow less0.3.70.3.80.3.91.0.01.0.11.0.101.0.111.0.121.0.131.0.141.0.151.0.161.0.171.0.181.0.191.0.21.0.201.0.211.0.221.0.231.0.241.0.251.0.261.0.271.0.281.0.291.0.31.0.41.0.51.0.61.0.71.0.81.0.9 |
1.0.30 |
phpseclib/phpseclibPackagist |
2.0.0 up to 2.0.55, plus listed versions 2.0.12.0.102.0.112.0.122.0.13 Show 45 moreShow less2.0.142.0.152.0.162.0.172.0.182.0.192.0.22.0.202.0.212.0.222.0.232.0.242.0.252.0.262.0.272.0.282.0.292.0.32.0.302.0.312.0.322.0.332.0.342.0.352.0.362.0.372.0.382.0.392.0.42.0.402.0.412.0.422.0.432.0.442.0.452.0.462.0.472.0.482.0.492.0.52.0.502.0.512.0.522.0.532.0.54 |
2.0.55 |
phpseclib/phpseclibPackagist |
3.0.0 up to 3.0.54, plus listed versions 3.0.13.0.103.0.113.0.123.0.13 Show 39 moreShow less3.0.143.0.153.0.163.0.173.0.183.0.193.0.23.0.203.0.213.0.223.0.233.0.33.0.333.0.343.0.353.0.363.0.373.0.383.0.393.0.43.0.403.0.413.0.423.0.433.0.443.0.453.0.463.0.473.0.483.0.493.0.53.0.503.0.513.0.523.0.533.0.63.0.73.0.83.0.9 |
3.0.54 |
phpseclibUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 0.3.10-31.0.0-21.0.0-31.0.1-11.0.1-31.0.1-3ubuntu0.11.0.1-3ubuntu0.1+esm1 |
None known |
phpseclibUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 1.0.7-11.0.8-11.0.9-11.0.9-1ubuntu0.1~esm11.0.9-1ubuntu0.1~esm2 |
None known |
phpseclibUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 1.0.16-21.0.18-21.0.18-2ubuntu0.1~esm11.0.18-2ubuntu0.1~esm2 |
None known |
phpseclibUbuntu:22.04:LTS |
All versions, plus listed versions 1.0.19-3ubuntu21.0.19-3ubuntu31.0.20-11.0.20-1ubuntu0.1~esm11.0.20-1+deb12u3build0.22.04.1 |
None known |
phpseclibUbuntu:Pro:24.04:LTS |
All versions, plus listed versions 1.0.21-21.0.22-11.0.23-11.0.23-1ubuntu0.1~esm1 |
None known |
phpseclibUbuntu:25.10 |
All versions, plus listed versions 1.0.23-6 |
None known |
phpseclibUbuntu:26.10 |
All versions, plus listed versions 1.0.24-11.0.29-11.0.30-1 |
None known |
phpseclibUbuntu:Pro:26.04:LTS |
All versions, plus listed versions 1.0.23-61.0.24-11.0.24-1ubuntu0.1~esm1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-55599 is a medium vulnerability (CVSS 5.8) in Phpseclib, published June 16, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.21%, the 11th percentile. Fixed in phpseclib/phpseclib 1.0.30.
References
github.com/phpseclib/phpseclib/security/advisories/GHSA-m557-wrgg-6rp4
nvd.nist.gov/vuln/detail/CVE-2026-55599
github.com/advisories/GHSA-m557-wrgg-6rp4
github.com/CVEProject/cvelistV5/tree/main/cves/2026/55xxx/CVE-2026-55599.json
security-tracker.debian.org/tracker/CVE-2026-55599
github.com/phpseclib/phpseclib
ubuntu.com/security/CVE-2026-55599
cve.org/CVERecord?id=CVE-2026-55599
Left out here: 4 versions and the rest of 2 source descriptions. The JSON record has them.