From 3b932f5fee4640ff5020b029d346eb93a076a57d Mon Sep 17 00:00:00 2001 From: Daiyuu Nobori Date: Thu, 28 Sep 2023 19:18:58 +0900 Subject: [PATCH] Fix Vulnerability: CVE-2023-27516 TALOS-2023-1754 and CVE-2023-32634 TALOS-2023-1755 SoftEther VPN CiRpcAccepted () authentication bypass vulnerability and SoftEther VPN CiRpcServerThread () MitM authentication bypass vulnerability https://www.softether.org/9-about/News/904-SEVPN202301 https://jvn.jp/en/jp/JVN64316789/ --- src/Cedar/Client.c | 51 ++++++++++++++++++++++++++++++--- src/Cedar/Client.h | 1 + src/bin/hamcore/strtable_cn.stb | 6 ++-- src/bin/hamcore/strtable_en.stb | 6 ++-- src/bin/hamcore/strtable_ja.stb | 6 ++-- 5 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/Cedar/Client.c b/src/Cedar/Client.c index 1432228e..fd0496e8 100644 --- a/src/Cedar/Client.c +++ b/src/Cedar/Client.c @@ -5155,6 +5155,22 @@ void CiRpcAccepted(CLIENT *c, SOCK *s) retcode = 0; } + if (retcode == 0) + { + if (IsLocalHostIP(&s->RemoteIP) == false) + { + // If the RPC client is from network check whether the password is empty + UCHAR empty_password_hash[20]; + Sha0(empty_password_hash, "", 0); + if (Cmp(empty_password_hash, hashed_password, SHA1_SIZE) == 0 || + IsZero(hashed_password, SHA1_SIZE)) + { + // Regard it as incorrect password + retcode = 1; + } + } + } + Lock(c->lock); { if (c->Config.AllowRemoteConfig == false) @@ -5258,14 +5274,21 @@ void CiRpcServerThread(THREAD *thread, void *param) // Open the port listener = NULL; - for (i = CLIENT_CONFIG_PORT;i < (CLIENT_CONFIG_PORT + 5);i++) + if (c->Config.DisableRpcDynamicPortListener == false) { - listener = Listen(i); - if (listener != NULL) + for (i = CLIENT_CONFIG_PORT;i < (CLIENT_CONFIG_PORT + 5);i++) { - break; + listener = ListenEx(i, !c->Config.AllowRemoteConfig); + if (listener != NULL) + { + break; + } } } + else + { + listener = ListenEx(CLIENT_CONFIG_PORT, !c->Config.AllowRemoteConfig); + } if (listener == NULL) { @@ -9028,6 +9051,12 @@ void CiInitConfiguration(CLIENT *c) c->Config.UseKeepConnect = false; // Don't use the connection maintenance function by default in the Client // Eraser c->Eraser = NewEraser(c->Logger, 0); + +#ifdef OS_WIN32 + c->Config.DisableRpcDynamicPortListener = false; +#else // OS_WIN32 + c->Config.DisableRpcDynamicPortListener = true; +#endif // OS_WIN32 } else { @@ -9174,6 +9203,19 @@ void CiLoadClientConfig(CLIENT_CONFIG *c, FOLDER *f) c->AllowRemoteConfig = CfgGetBool(f, "AllowRemoteConfig"); c->KeepConnectInterval = MAKESURE(CfgGetInt(f, "KeepConnectInterval"), KEEP_INTERVAL_MIN, KEEP_INTERVAL_MAX); c->NoChangeWcmNetworkSettingOnWindows8 = CfgGetBool(f, "NoChangeWcmNetworkSettingOnWindows8"); + + if (CfgIsItem(f, "DisableRpcDynamicPortListener")) + { + c->DisableRpcDynamicPortListener = CfgGetBool(f, "DisableRpcDynamicPortListener"); + } + else + { +#ifdef OS_WIN32 + c->DisableRpcDynamicPortListener = false; +#else // OS_WIN32 + c->DisableRpcDynamicPortListener = true; +#endif // OS_WIN32 + } } // Read the client authentication data @@ -9748,6 +9790,7 @@ void CiWriteClientConfig(FOLDER *cc, CLIENT_CONFIG *config) CfgAddBool(cc, "AllowRemoteConfig", config->AllowRemoteConfig); CfgAddInt(cc, "KeepConnectInterval", config->KeepConnectInterval); CfgAddBool(cc, "NoChangeWcmNetworkSettingOnWindows8", config->NoChangeWcmNetworkSettingOnWindows8); + CfgAddBool(cc, "DisableRpcDynamicPortListener", config->DisableRpcDynamicPortListener); } // Write the client authentication data diff --git a/src/Cedar/Client.h b/src/Cedar/Client.h index 533996d9..13e44d32 100644 --- a/src/Cedar/Client.h +++ b/src/Cedar/Client.h @@ -87,6 +87,7 @@ struct CLIENT_CONFIG UINT KeepConnectProtocol; // Protocol UINT KeepConnectInterval; // Interval bool NoChangeWcmNetworkSettingOnWindows8; // Don't change the WCM network settings on Windows 8 + bool DisableRpcDynamicPortListener; }; // Version acquisition diff --git a/src/bin/hamcore/strtable_cn.stb b/src/bin/hamcore/strtable_cn.stb index fa462554..14486000 100644 --- a/src/bin/hamcore/strtable_cn.stb +++ b/src/bin/hamcore/strtable_cn.stb @@ -2482,7 +2482,7 @@ STATIC1 您可以更改 VPN Client 的设置 STATIC2 远程管理(&E) STATIC3 您可以通过使用 VPN Client 管理器远程模式从另一台计算机上远程管理 VPN Client 服务程序。 R_ALLOW_REMOTE_CONFIG 允许 VPN Client 服务的远程管理(&R) -S_WARNING 建议您在允许远程管理时设置密码。在菜单里选择“工具” >“设置密码”来设置密码。 +S_WARNING 如果你允许远程管理,你必须设置一个密码。在菜单里选择“工具” >“设置密码”来设置密码。必须重新启动 VPN Client 服务,以应用远程管理可用性的配置变化。 STATIC4 在通讯闲置一段时间后自动断开互联网连接的环境下,可以通过向互联网上任意主机发送假数据包的方式来保持互联网连接。 R_USE_KEEP_CONNECT 使用保持 Internet 连接功能(&K) S_HOSTNAME 主机名(&H): @@ -7028,13 +7028,13 @@ CMD_AccountImport_OK 连接设置 "%s" 已导入。 # RemoteEnable 命令 CMD_RemoteEnable 允许 VPN 客户服务的远程管理 -CMD_RemoteEnable_Help 对 VPN Client 服务,从本地主机以外的远程计算机上,允许通过命令行管理设施或 VPN Client 管理器员进行连接和管理。 +CMD_RemoteEnable_Help 对 VPN Client 服务,从本地主机以外的远程计算机上,允许通过命令行管理设施或 VPN Client 管理器员进行连接和管理。必须重新启动 VPN Client 服务,以应用远程管理可用性的配置变化。如果你允许远程管理,你必须设置一个密码。 CMD_RemoteEnable_Args RemoteEnable # RemoteDisable 命令 CMD_RemoteDisable 禁止 VPN 客户服务的远程管理 -CMD_RemoteDisable_Help 对 VPN Client 服务,从本地主机以外的远程计算机上,禁止通过命令行管理设施或 VPN Client 管理器员进行连接和管理。 +CMD_RemoteDisable_Help 对 VPN Client 服务,从本地主机以外的远程计算机上,禁止通过命令行管理设施或 VPN Client 管理器员进行连接和管理。必须重新启动 VPN 客户端服务,以应用远程管理可用性的配置变化。 CMD_RemoteDisable_Args RemoteDisable diff --git a/src/bin/hamcore/strtable_en.stb b/src/bin/hamcore/strtable_en.stb index 5634379f..be3f9aa5 100644 --- a/src/bin/hamcore/strtable_en.stb +++ b/src/bin/hamcore/strtable_en.stb @@ -2466,7 +2466,7 @@ STATIC1 You can modify the settings for VPN Client. STATIC2 R&emote Management: STATIC3 You can remotely manage the VPN Client Service Program from another computer by using VPN Client Manager Remote Mode. R_ALLOW_REMOTE_CONFIG Allow &Remote Management of VPN Client Service -S_WARNING It is recommended to set a password if you allow remote management. From the menu bar, choose Tools -> Set Password to set the password. +S_WARNING You must set a password if you allow remote management. From the menu bar, choose Tools -> Set Password to set the password. The VPN Client service must be restarted to apply the change of remote management availability. STATIC4 For environments where Internet connections will automatically be disconnected when idle, you can keep alive the Internet connection by sending dummy packets to any host on the Internet. R_USE_KEEP_CONNECT Use &Keep Alive Internet Connection Function S_HOSTNAME &Host Name: @@ -7016,13 +7016,13 @@ CMD_AccountImport_OK The VPN Connection Setting "%s" has been imported. # RemoteEnable command CMD_RemoteEnable Allow Remote Management of VPN Client Service -CMD_RemoteEnable_Help Use this to allow management of a VPN Client service from a remote computer that is not localhost, via a remote connection by Command Line Management Utility or VPN Client Manager. +CMD_RemoteEnable_Help Use this to allow management of a VPN Client service from a remote computer that is not localhost, via a remote connection by Command Line Management Utility or VPN Client Manager. The VPN Client service must be restarted to apply the change of remote management availability. You must set a password if you allow remote management. CMD_RemoteEnable_Args RemoteEnable # RemoteDisable command CMD_RemoteDisable Deny Remote Management of VPN Client Service -CMD_RemoteDisable_Help Use this to deny management of a VPN Client service from a remote computer that is not localhost, via a remote connection by Command Line Management Utility or VPN Client Manager. +CMD_RemoteDisable_Help Use this to deny management of a VPN Client service from a remote computer that is not localhost, via a remote connection by Command Line Management Utility or VPN Client Manager. The VPN Client service must be restarted to apply the change of remote management availability. CMD_RemoteDisable_Args RemoteDisable diff --git a/src/bin/hamcore/strtable_ja.stb b/src/bin/hamcore/strtable_ja.stb index 3e195742..12021c36 100644 --- a/src/bin/hamcore/strtable_ja.stb +++ b/src/bin/hamcore/strtable_ja.stb @@ -2469,7 +2469,7 @@ STATIC1 VPN Client の動作に関する設定を変更できます。 STATIC2 リモート管理の設定(&E) STATIC3 VPN Client サービスプログラムを別のコンピュータ上から VPN クライアント接続マネージャによってリモート管理することが可能です。 R_ALLOW_REMOTE_CONFIG VPN Client サービスのリモート管理を許可する(&R) -S_WARNING リモート管理を許可する場合、パスワードを設定しておくことを強くお勧めします。パスワードは [ツール] メニューの [パスワードの設定] をクリックして設定することができます。 +S_WARNING リモート管理を許可する場合、パスワードを設定する必要があります。パスワードは [ツール] メニューの [パスワードの設定] をクリックして設定することができます。リモート管理の可否の変更の設定適用には、VPN Client サービスを再起動する必要があります。 STATIC4 一定期間無通信状態が続くと接続が自動的に切断されるようなネットワーク接続環境の場合、インターネット上の任意のサーバーに対して一定間隔ごとにパケットを送信することにより、インターネット接続を維持することができます。 R_USE_KEEP_CONNECT インターネット接続の維持機能を使用する(&K) S_HOSTNAME ホスト名(&H): @@ -7022,13 +7022,13 @@ CMD_AccountImport_OK 接続設定 "%s" としてインポートしました。 # RemoteEnable コマンド CMD_RemoteEnable VPN Client サービスのリモート管理の許可 -CMD_RemoteEnable_Help VPN Client サービスに、localhost 以外のリモートコンピュータから、コマンドライン管理ユーティリティまたは VPN クライアント接続マネージャでリモート接続して管理することを許可します。 +CMD_RemoteEnable_Help VPN Client サービスに、localhost 以外のリモートコンピュータから、コマンドライン管理ユーティリティまたは VPN クライアント接続マネージャでリモート接続して管理することを許可します。注意: リモート管理の可否の変更の設定適用には、VPN Client サービスを再起動する必要があります。リモート管理を許可する場合、パスワードを設定する必要があります。 CMD_RemoteEnable_Args RemoteEnable # RemoteDisable コマンド CMD_RemoteDisable VPN Client サービスのリモート管理の禁止 -CMD_RemoteDisable_Help VPN Client サービスに、localhost 以外のリモートコンピュータからコマンドライン管理ユーティリティまたは VPN クライアント接続マネージャでリモート接続して管理することを禁止します。 +CMD_RemoteDisable_Help VPN Client サービスに、localhost 以外のリモートコンピュータからコマンドライン管理ユーティリティまたは VPN クライアント接続マネージャでリモート接続して管理することを禁止します。注意: リモート管理の可否の変更の設定適用には、VPN Client サービスを再起動する必要があります。 CMD_RemoteDisable_Args RemoteDisable