CVE-2026-40194
phpseclib has a variable-time HMAC comparison in SSH2::get_binary_packet() using != instead of hash_equals()
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- 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
3.7
phpseclib has a variable-time HMAC comparison in SSH2::get_binary_packet() using != instead of hash_equals()
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
CVE-2026-40194- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-208
- Updated
- 2026-11-02
EUVDEUVD-2026-21597
3.7
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
EUVD-2026-21597- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-r854-jrxh-36qx
3.7
phpseclib has a variable-time HMAC comparison in SSH2::get_binary_packet() using != instead of hash_equals()
phpseclib SSH2: Variable-time comparison in HMAC verification
Summary
phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks.
The finding is Low severity (defense-in-depth), not Critical. Practical exploitation over the network is prevented by SSH's disconnect-on-MAC-failure behavior combined with per-connection session keys. The fix is a one-liner: replace != with hash_equals(), which the codebase already uses in 9 other places.
- Target:
phpseclib/phpseclib - File:
phpseclib/Net/SSH2.php - Lines (master
e819a163c): 3405 and 3410 - CWE: CWE-208 (Observable Timing Discrepancy)
- CVSS v3.1: 3.7 —
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Severity: Low (cryptographic hygiene / defense-in-depth)
- Affected branches:
master,3.0,2.0,1.0(all supported versions)
Root cause
phpseclib/Net/SSH2.php lines 3399-3415 (master at e819a163c):
if ($this->hmac_check instanceof Hash) {
$reconstructed = !$this->hmac_check_etm ?
pack('Na*', $packet->packet_length, $packet->plain) :
substr($packet->raw, 0, -$this->hmac_size);
if (($this->hmac_check->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') {
$this->hmac_check->setNonce("\0\0\0\0" . pack('N', $this->get_seq_no));
if ($hmac != $this->hmac_check->hash($reconstructed)) { // <-- line 3405
$this->disconnect_helper(DisconnectReason::MAC_ERROR);
throw new ConnectionClosedException('Invalid UMAC');
}
} else {
if ($hmac != $this->hmac_check->hash(pack('Na*', $this->get_seq_no, $reconstructed))) { // <-- line 3410
$this->disconnect_helper(DisconnectReason::MAC_ERROR);
throw new ConnectionClosedException('Invalid HMAC');
}
}
}
Both $hmac (read from the socket via Strings::pop($raw, $this->hmac_size) at line 3348) and the computed hash are equal-length binary strings. PHP's != operator on equal-length strings dispatches to zend_binary_strcmp() which internally calls memcmp(). Modern libc memcmp short-circuits on the first differing byte, producing a timing signal that scales linearly with the number of matching leading bytes.
The same bug exists on every supported branch
| Branch | File | Line(s) | Expression |
|---|---|---|---|
| master (@ e819a163c) | phpseclib/Net/SSH2.php | 3405, 3410 | $hmac != $this->hmac_check->hash(...) |
| 3.0 | phpseclib/Net/SSH2.php | 3741, 3746 | $hmac != $this->hmac_check->hash(...) |
| 2.0 | phpseclib/Net/SSH2.php | 3796 | $hmac != $this->hmac_check->hash(...) |
| 1.0 | phpseclib/Net/SSH2.php | 3810 | $hmac != $this->hmac_check->hash(...) |
Verified with git show <branch>:phpseclib/Net/SSH2.php.
Reachability
The HMAC verification path at lines 3399-3415 is reached on every received SSH packet when the negotiated cipher is not AEAD — i.e., any of:
aes128-cbc,aes192-cbc,aes256-cbcaes128-ctr,aes192-ctr,aes256-ctr3des-cbc,3des-ctrblowfish-cbc,blowfish-ctrtwofish-*-cbc,twofish-*-ctrarcfour,arcfour128,arcfour256
combined with any non-AEAD MAC (hmac-sha2-256, hmac-sha2-512, hmac-sha1, hmac-sha1-96, hmac-md5, hmac-md5-96, umac-64, umac-128, and their -etm variants — full list at getSupportedMACAlgorithms() around line 4754).
AEAD ciphers ([email protected], [email protected], [email protected]) go through a different path (lines 3353-3381) and do not reach the != comparison — their authentication tag is checked inside the AEAD implementation.
$this->hmac_check is set during key exchange at SSH2.php:1812:
if…
- Record
GHSA-r854-jrxh-36qx- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-208
- Updated
- 2026-11-02
NVD
3.7
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
CVE-2026-40194- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-208
- Updated
- 2026-11-02
OSV
3.7
phpseclib has a variable-time HMAC comparison in SSH2::get_binary_packet() using != instead of hash_equals()
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
CVE-2026-40194- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-208
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-40194
3.7
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
DEBIAN-CVE-2026-40194- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
Show 4 moreShow less
OSVGHSA-r854-jrxh-36qx
3.7
phpseclib has a variable-time HMAC comparison in SSH2::get_binary_packet() using != instead of hash_equals()
phpseclib SSH2: Variable-time comparison in HMAC verification
Summary
phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks.
The finding is Low severity (defense-in-depth), not Critical. Practical exploitation over the network is prevented by SSH's disconnect-on-MAC-failure behavior combined with per-connection session keys. The fix is a one-liner: replace != with hash_equals(), which the codebase already uses in 9 other places.
- Target:
phpseclib/phpseclib - File:
phpseclib/Net/SSH2.php - Lines (master
e819a163c): 3405 and 3410 - CWE: CWE-208 (Observable Timing Discrepancy)
- CVSS v3.1: 3.7 —
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Severity: Low (cryptographic hygiene / defense-in-depth)
- Affected branches:
master,3.0,2.0,1.0(all supported versions)
Root cause
phpseclib/Net/SSH2.php lines 3399-3415 (master at e819a163c):
if ($this->hmac_check instanceof Hash) {
$reconstructed = !$this->hmac_check_etm ?
pack('Na*', $packet->packet_length, $packet->plain) :
substr($packet->raw, 0, -$this->hmac_size);
if (($this->hmac_check->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') {
$this->hmac_check->setNonce("\0\0\0\0" . pack('N', $this->get_seq_no));
if ($hmac != $this->hmac_check->hash($reconstructed)) { // <-- line 3405
$this->disconnect_helper(DisconnectReason::MAC_ERROR);
throw new ConnectionClosedException('Invalid UMAC');
}
} else {
if ($hmac != $this->hmac_check->hash(pack('Na*', $this->get_seq_no, $reconstructed))) { // <-- line 3410
$this->disconnect_helper(DisconnectReason::MAC_ERROR);
throw new ConnectionClosedException('Invalid HMAC');
}
}
}
Both $hmac (read from the socket via Strings::pop($raw, $this->hmac_size) at line 3348) and the computed hash are equal-length binary strings. PHP's != operator on equal-length strings dispatches to zend_binary_strcmp() which internally calls memcmp(). Modern libc memcmp short-circuits on the first differing byte, producing a timing signal that scales linearly with the number of matching leading bytes.
The same bug exists on every supported branch
| Branch | File | Line(s) | Expression |
|---|---|---|---|
| master (@ e819a163c) | phpseclib/Net/SSH2.php | 3405, 3410 | $hmac != $this->hmac_check->hash(...) |
| 3.0 | phpseclib/Net/SSH2.php | 3741, 3746 | $hmac != $this->hmac_check->hash(...) |
| 2.0 | phpseclib/Net/SSH2.php | 3796 | $hmac != $this->hmac_check->hash(...) |
| 1.0 | phpseclib/Net/SSH2.php | 3810 | $hmac != $this->hmac_check->hash(...) |
Verified with git show <branch>:phpseclib/Net/SSH2.php.
Reachability
The HMAC verification path at lines 3399-3415 is reached on every received SSH packet when the negotiated cipher is not AEAD — i.e., any of:
aes128-cbc,aes192-cbc,aes256-cbcaes128-ctr,aes192-ctr,aes256-ctr3des-cbc,3des-ctrblowfish-cbc,blowfish-ctrtwofish-*-cbc,twofish-*-ctrarcfour,arcfour128,arcfour256
combined with any non-AEAD MAC (hmac-sha2-256, hmac-sha2-512, hmac-sha1, hmac-sha1-96, hmac-md5, hmac-md5-96, umac-64, umac-128, and their -etm variants — full list at getSupportedMACAlgorithms() around line 4754).
AEAD ciphers ([email protected], [email protected], [email protected]) go through a different path (lines 3353-3381) and do not reach the != comparison — their authentication tag is checked inside the AEAD implementation.
$this->hmac_check is set during key exchange at SSH2.php:1812:
if…
- Record
GHSA-r854-jrxh-36qx- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-208
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-40194
3.7
phpseclib is a PHP secure communications library. Starting in 0.1.1 and prior to 3.0.51, 2.0.53, and 1.0.28, phpseclib\Net\SSH2::get_binary_packet() uses PHP's != operator to compare a received SSH packet HMAC against the locally computed HMAC. != on equal-length binary strings in PHP uses memcmp(), which short-circuits on the first differing byte. This is a real variable-time comparison (CWE-208), proven by scaling benchmarks. This vulnerability is fixed in 3.0.51, 2.0.53, and 1.0.28.
- Record
UBUNTU-CVE-2026-40194- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVCLSA-2026-1779410885 No score
TuxCare security update for phpseclib/phpseclib (1 CVE)
TuxCare rebuilt phpseclib/phpseclib to address 1 CVE. Fixed in 0.3.10-p2+tuxcare.
- Record
CLSA-2026-1779410885- Updated
- 2026-11-02
OSVUSN-8830-1 No score
php-phpseclib vulnerabilities
It was discovered that phpseclib did not perform constant-time padding validation when using AES in CBC mode. A remote attacker could possibly use this issue to obtain sensitive information. (CVE-2026-32935)
It was discovered that phpseclib did not use a constant-time comparison when validating SSH packet authentication codes. A remote attacker could possibly use this issue to obtain sensitive information. (CVE-2026-40194)
It was discovered that phpseclib did not properly limit object identifier lengths when parsing ASN.1 data. An attacker could possibly use this issue to cause phpseclib to use excessive resources, leading to a denial of service. (CVE-2026-44167)
- Record
USN-8830-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
phpseclib/phpseclibPackagist |
2.0.0 up to 2.0.53 | 2.0.53 |
phpseclib/phpseclibPackagist |
3.0.0 up to 3.0.51 | 3.0.51 |
phpseclib/phpseclibPackagist |
0.1.1 up to 1.0.28 | 1.0.28 |
phpseclib/phpseclibTuxCare:Packagist |
0.3.10 up to 0.3.10-p2+tuxcare, plus listed versions 0.3.10-p1+tuxcare |
0.3.10-p2+tuxcare |
php-phpseclibDebian:12 |
before 2.0.42-1+deb12u4, plus listed versions 2.0.42-12.0.42-1+deb12u12.0.42-1+deb12u22.0.42-1+deb12u3 |
2.0.42-1+deb12u4 |
php-phpseclibDebian:13 |
before 2.0.48-3+deb13u2, plus listed versions 2.0.48-32.0.48-3+deb13u1 |
2.0.48-3+deb13u2 |
php-phpseclibDebian:14 |
before 2.0.53-1, plus listed versions 2.0.48-32.0.49-12.0.50-12.0.51-12.0.52-1 |
2.0.53-1 |
php-phpseclib3Debian:12 |
before 3.0.19-1+deb12u5, plus listed versions 3.0.19-13.0.19-1+deb12u13.0.19-1+deb12u23.0.19-1+deb12u33.0.19-1+deb12u4 |
3.0.19-1+deb12u5 |
php-phpseclib3Debian:13 |
before 3.0.43-2+deb13u2, plus listed versions 3.0.43-23.0.43-2+deb13u1 |
3.0.43-2+deb13u2 |
php-phpseclib3Debian:14 |
before 3.0.51-1, plus listed versions 3.0.43-23.0.44-13.0.44-23.0.45-13.0.46-1 Show 5 moreShow less3.0.46-23.0.47-13.0.48-13.0.49-13.0.50-1 |
3.0.51-1 |
Show 31 moreShow less
| Package | Affected | Fixed |
|---|---|---|
phpseclibDebian:12 |
before 1.0.20-1+deb12u4, plus listed versions 1.0.20-11.0.20-1+deb12u11.0.20-1+deb12u21.0.20-1+deb12u3 |
1.0.20-1+deb12u4 |
phpseclibDebian:13 |
before 1.0.23-6+deb13u2, plus listed versions 1.0.23-61.0.23-6+deb13u1 |
1.0.23-6+deb13u2 |
phpseclib/phpseclibPackagist |
0.1.1 up to 1.0.28, plus listed versions 0.3.00.3.10.3.100.3.50.3.6 Show 31 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.31.0.41.0.51.0.61.0.71.0.81.0.9 |
1.0.28 |
phpseclib/phpseclibPackagist |
2.0.0 up to 2.0.53, 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.62.0.7 |
2.0.53 |
phpseclib/phpseclibPackagist |
3.0.0 up to 3.0.51, plus listed versions 3.0.13.0.103.0.113.0.123.0.13 Show 36 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.63.0.73.0.83.0.9 |
3.0.51 |
php-phpseclibUbuntu:Pro:16.04:LTS |
before 2.0.1-1ubuntu0.1~esm1, plus listed versions 2.0.1-12.0.1-1build1 |
2.0.1-1ubuntu0.1~esm1 |
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 |
php-phpseclibUbuntu:Pro:18.04:LTS |
before 2.0.9-1ubuntu0.1~esm3, plus listed versions 2.0.6-12.0.7-12.0.9-12.0.9-1ubuntu0.1~esm2 |
2.0.9-1ubuntu0.1~esm3 |
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 |
php-phpseclibUbuntu:Pro:20.04:LTS |
before 2.0.23-2ubuntu0.1~esm3, plus listed versions 2.0.21-22.0.23-22.0.23-2ubuntu0.1~esm2 |
2.0.23-2ubuntu0.1~esm3 |
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 |
php-phpseclibUbuntu:Pro:22.04:LTS |
before 2.0.36-1ubuntu0.1~esm3, plus listed versions 2.0.30-2ubuntu12.0.34-12.0.35-12.0.36-12.0.36-1ubuntu0.1~esm2 |
2.0.36-1ubuntu0.1~esm3 |
php-phpseclib3Ubuntu:Pro:22.04:LTS |
All versions, plus listed versions 3.0.9-13.0.10-13.0.12-23.0.13-13.0.13-1ubuntu0.1~esm1 |
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 |
php-phpseclib3Ubuntu:24.04:LTS |
All versions, plus listed versions 3.0.21-23.0.33-13.0.34-13.0.35-13.0.37-1 |
None known |
php-phpseclibUbuntu:Pro:24.04:LTS |
before 2.0.47-1ubuntu0.1~esm1, plus listed versions 2.0.44-12.0.45-12.0.46-12.0.47-1 |
2.0.47-1ubuntu0.1~esm1 |
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 |
php-phpseclibUbuntu:25.10 |
All versions, plus listed versions 2.0.48-3 |
None known |
php-phpseclib3Ubuntu:25.10 |
All versions, plus listed versions 3.0.43-2 |
None known |
phpseclibUbuntu:25.10 |
All versions, plus listed versions 1.0.23-6 |
None known |
php-phpseclib3Ubuntu:26.10 |
All versions, plus listed versions 3.0.49-1ubuntu13.0.57-1 |
None known |
phpseclibUbuntu:26.10 |
All versions, plus listed versions 1.0.24-11.0.29-11.0.30-1 |
None known |
php-phpseclib3Ubuntu:26.04:LTS |
All versions, plus listed versions 3.0.43-23.0.44-13.0.47-13.0.49-13.0.49-1ubuntu1 |
None known |
php-phpseclibUbuntu:Pro:26.04:LTS |
before 2.0.51-1ubuntu0.1~esm1, plus listed versions 2.0.48-32.0.49-12.0.51-1 |
2.0.51-1ubuntu0.1~esm1 |
phpseclibUbuntu:Pro:26.04:LTS |
All versions, plus listed versions 1.0.23-61.0.24-11.0.24-1ubuntu0.1~esm1 |
None known |
php-phpseclibUbuntu:Pro:16.04:LTS From an advisory covering 3 CVEs |
before 2.0.1-1ubuntu0.1~esm1, plus listed versions 2.0.1-12.0.1-1build1 |
2.0.1-1ubuntu0.1~esm1 |
php-phpseclibUbuntu:Pro:18.04:LTS From an advisory covering 3 CVEs |
before 2.0.9-1ubuntu0.1~esm3, plus listed versions 2.0.6-12.0.7-12.0.9-12.0.9-1ubuntu0.1~esm2 |
2.0.9-1ubuntu0.1~esm3 |
php-phpseclibUbuntu:Pro:20.04:LTS From an advisory covering 3 CVEs |
before 2.0.23-2ubuntu0.1~esm3, plus listed versions 2.0.21-22.0.23-22.0.23-2ubuntu0.1~esm2 |
2.0.23-2ubuntu0.1~esm3 |
php-phpseclibUbuntu:Pro:22.04:LTS From an advisory covering 3 CVEs |
before 2.0.36-1ubuntu0.1~esm3, plus listed versions 2.0.30-2ubuntu12.0.34-12.0.35-12.0.36-12.0.36-1ubuntu0.1~esm2 |
2.0.36-1ubuntu0.1~esm3 |
php-phpseclibUbuntu:Pro:24.04:LTS From an advisory covering 3 CVEs |
before 2.0.47-1ubuntu0.1~esm1, plus listed versions 2.0.44-12.0.45-12.0.46-12.0.47-1 |
2.0.47-1ubuntu0.1~esm1 |
php-phpseclibUbuntu:Pro:26.04:LTS From an advisory covering 3 CVEs |
before 2.0.51-1ubuntu0.1~esm1, plus listed versions 2.0.48-32.0.49-12.0.51-1 |
2.0.51-1ubuntu0.1~esm1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| 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-40194 is a low vulnerability (CVSS 3.7) in Phpseclib, published April 10, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.37%, the 30th percentile. Fixed in phpseclib/phpseclib 2.0.53.
References
github.com/phpseclib/phpseclib/security/advisories/GHSA-r854-jrxh-36qx
github.com/phpseclib/phpseclib/commit/ffe48b6b1b1af6963327f0a5330e3aa004a194ac
github.com/phpseclib/phpseclib/releases/tag/1.0.28
github.com/phpseclib/phpseclib/releases/tag/2.0.53
github.com/phpseclib/phpseclib/releases/tag/3.0.51
nvd.nist.gov/vuln/detail/CVE-2026-40194
Show 9 moreShow less
github.com/advisories/GHSA-r854-jrxh-36qx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/40xxx/CVE-2026-40194.json
security-tracker.debian.org/tracker/CVE-2026-40194
github.com/phpseclib/phpseclib
ubuntu.com/security/CVE-2026-40194
cve.org/CVERecord?id=CVE-2026-40194
ubuntu.com/security/notices/USN-8830-1
ubuntu.com/security/CVE-2026-32935
ubuntu.com/security/CVE-2026-44167
Left out here: 2 versions and the rest of 2 source descriptions. The JSON record has them.