Every CVE Search/ Get API key

CVE-2026-55599

phpseclib: X.509 certificate validation sends attacker-controlled outbound requests (server-side request forgery) via Authority Information Access

5.8 MediumFix available

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

0.21%Up 0.1 points since Jun 23, 2026
90%50%10%1%

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 MediumCVSS: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 MediumCVSS: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:

  1. 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.
  2. 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.
  3. No destination is restricted. Loopback, private ranges, link-local…
Record
GHSA-m557-wrgg-6rp4
CVSS 3.1
5.8 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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:

  1. 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.
  2. 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.
  3. No destination is restricted. Loopback, private ranges, link-local…
Record
GHSA-m557-wrgg-6rp4
CVSS 3.1
5.8 MediumCVSS: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 MediumCVSS: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

Affected packages
PackageAffectedFixed
phpseclib/phpseclib
Packagist
0.1.1 to 1.0.29
1.0.30
phpseclib/phpseclib
Packagist
2.0.0 to 2.0.54
2.0.55
phpseclib/phpseclib
Packagist
3.0.0 to 3.0.53
3.0.54
php-phpseclib
Debian: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 less
2.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-phpseclib
Debian: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 less
2.0.51-12.0.52-12.0.53-12.0.54-12.0.55-13.0.2-1
None known
php-phpseclib
Debian: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-phpseclib3
Debian: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 less
3.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-phpseclib3
Debian: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 less
3.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-phpseclib3
Debian: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 less
3.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
phpseclib
Debian: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 less
1.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
Affected packages
PackageAffectedFixed
phpseclib
Debian: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 less
1.0.28-11.0.29-11.0.30-12.0.0-12.0.1-1
None known
phpseclib/phpseclib
Packagist
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 less
0.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/phpseclib
Packagist
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 less
2.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/phpseclib
Packagist
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 less
3.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
phpseclib
Ubuntu: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
phpseclib
Ubuntu: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
phpseclib
Ubuntu: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
phpseclib
Ubuntu: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
phpseclib
Ubuntu: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
phpseclib
Ubuntu:25.10
All versions, plus listed versions
1.0.23-6
None known
phpseclib
Ubuntu:26.10
All versions, plus listed versions
1.0.24-11.0.29-11.0.30-1
None known
phpseclib
Ubuntu:Pro:26.04:LTS
All versions, plus listed versions
1.0.23-61.0.24-11.0.24-1ubuntu0.1~esm1
None known

History

History
RecordedChangedSources
first indexedCVE 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

This page doesn't list everything

Left out here: 4 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open