diff --git a/src/ssh_audit/hostkeytest.py b/src/ssh_audit/hostkeytest.py index b4dfe0b3..2f91ac26 100644 --- a/src/ssh_audit/hostkeytest.py +++ b/src/ssh_audit/hostkeytest.py @@ -52,6 +52,9 @@ class HostKeyTest: 'ssh-ed25519': {'cert': False, 'variable_key_len': False}, 'ssh-ed25519-cert-v01@openssh.com': {'cert': True, 'variable_key_len': False}, + + 'ssh-ed448': {'cert': False, 'variable_key_len': False}, + # 'ssh-ed448-cert-v01@openssh.com': {'cert': True, 'variable_key_len': False}, } TWO2K_MODULUS_WARNING = '2048-bit modulus only provides 112-bits of symmetric strength' diff --git a/src/ssh_audit/kexdh.py b/src/ssh_audit/kexdh.py index 85beb8ec..7335334a 100644 --- a/src/ssh_audit/kexdh.py +++ b/src/ssh_audit/kexdh.py @@ -134,6 +134,9 @@ def recv_reply(self, s: 'SSH_Socket', parse_host_key_size: bool = True) -> Optio if self.__hostkey_type == 'ssh-ed25519': self.out.d("%s has a fixed host key modulus of 32." % self.__hostkey_type) self.__hostkey_n_len = 32 + elif self.__hostkey_type == 'ssh-ed448': + self.out.d("%s has a fixed host key modulus of 57." % self.__hostkey_type) + self.__hostkey_n_len = 57 else: # Here is the modulus size & actual modulus of the host key public key. hostkey_n, self.__hostkey_n_len, ptr = KexDH.__get_bytes(hostkey, ptr) diff --git a/src/ssh_audit/software.py b/src/ssh_audit/software.py index f13ebeb8..21e22ca0 100644 --- a/src/ssh_audit/software.py +++ b/src/ssh_audit/software.py @@ -224,4 +224,8 @@ def parse(cls, banner: 'Banner') -> Optional['Software']: mx = re.match(r'^PuTTY_Release_(.*)', software) if mx: return cls(None, Product.PuTTY, mx.group(1), None, None) + mx = re.match(r'^lancom(.*)', software) + if mx: + v, p = 'LANcom', 'LCOS sshd' + return cls(v, p, mx.group(1), None, None) return None diff --git a/src/ssh_audit/ssh2_kexdb.py b/src/ssh_audit/ssh2_kexdb.py index f65e014c..e5841dfc 100644 --- a/src/ssh_audit/ssh2_kexdb.py +++ b/src/ssh_audit/ssh2_kexdb.py @@ -68,6 +68,7 @@ class SSH2_KexDB: # pylint: disable=too-few-public-methods INFO_DEPRECATED_IN_OPENSSH88 = 'deprecated in OpenSSH 8.8: https://www.openssh.com/txt/release-8.8' INFO_DISABLED_IN_DBEAR67 = 'disabled in Dropbear SSH 2015.67' INFO_DISABLED_IN_OPENSSH70 = 'disabled in OpenSSH 7.0: https://www.openssh.com/txt/release-7.0' + INFO_RFC8709_NOT_OPENSSH = 'described in RFC8709 but never implemented in OpenSSH' INFO_NEVER_IMPLEMENTED_IN_OPENSSH = 'despite the @openssh.com tag, this was never implemented in OpenSSH' INFO_REMOVED_IN_OPENSSH61 = 'removed since OpenSSH 6.1, removed from specification' INFO_REMOVED_IN_OPENSSH69 = 'removed in OpenSSH 6.9: https://www.openssh.com/txt/release-6.9' @@ -245,7 +246,7 @@ class SSH2_KexDB: # pylint: disable=too-few-public-methods 'ssh-dss-sha512@ssh.com': [[], [FAIL_1024BIT_MODULUS]], 'ssh-ed25519': [['6.5,d2020.79,l10.7.0']], 'ssh-ed25519-cert-v01@openssh.com': [['6.5']], - 'ssh-ed448': [[]], + 'ssh-ed448': [[], [], [], [INFO_RFC8709_NOT_OPENSSH]], 'ssh-ed448-cert-v01@openssh.com': [[], [], [], [INFO_NEVER_IMPLEMENTED_IN_OPENSSH]], 'ssh-gost2001': [[], [FAIL_UNTRUSTED]], 'ssh-gost2012-256': [[], [FAIL_UNTRUSTED]],