
OpenSSH 7.7 までは、無効な認証ユーザーに対するベイルアウトを、リクエストを含むパケットが完全に解析されるまで遅延させないため、ユーザー列挙の脆弱性が存在します。これは auth2-gss.c、auth2-hostbased.c、auth2-pubkey.c に関連しています。
CVE: CVE-2018-15473
解説記事元: https://www.openwall.com/lists/oss-security/2018/08/15/5
パッチを適用していない現行バージョンでは、リモートの攻撃者が対象の OpenSSH サーバー上で特定のユーザーが存在するかどうか(ユーザー名列挙)を簡単にテストできます。
87 static int
88 userauth_pubkey(struct ssh *ssh)
89 {
101 if (!authctxt->valid) {
102 debug2("%s: disabled because of invalid user", __func__);
103 return 0;
104 }
105 if ((r = sshpkt_get_u8(ssh, &have_sig)) != 0 ||
106 (r = sshpkt_get_cstring(ssh, &pkalg, NULL)) != 0 ||
107 (r = sshpkt_get_string(ssh, &pkblob, &blen)) != 0)
108 fatal("%s: parse request failed: %s", __func__, ssh_err(r));
攻撃者は、不正なパケット(例えば、切り詰められたパケット)でユーザー認証を試みることができ、次のようになります。
usage: ssh-check-username.py [-h] [-t HOSTNAME] [-p PORT] [-u USERNAME] [-w WORDLIST]
options:
-h, --help show this help message and exit
-t HOSTNAME Single target
-p PORT port to connect on: Default port is 22
-u USERNAME username you want to enumerate
-w WORDLIST enumerate multiple users
このスクリプトは責任を持って、アクセス許可のあるシステムでのみ使用してください。許可のないシステムへの不正アクセスは、重大な法的結果を招く可能性があります。