概要
Cisco Talos は、ProtonVPN と NordVPN VPN クライアントで類似した 2 件の脆弱性を発見しました。
これらの脆弱性により、Microsoft Windows の標準ユーザが管理者権限でコードを実行できる危険性があります。脆弱性の CVE ID は、TALOS-2018-0622 / CVE-2018-3952(NordVPN)および TALOS-2018-0679 / CVE-2018-4010(ProtonVPN)です。
各脆弱性は、2018 年 4 月に VerSprite 社によって発見されたバグ(CVE-2018-10169)に似ています。いずれの VPN クライアントでも、脆弱性を修正した更新プログラムが発見と同じ月にリリースされています。しかし Talos では、それらの修正を回避する方法を特定しました。このため、管理者権限でコードを実行できる可能性が依然として残っていました。今回の記事の後半では、最初の更新プログラムとそれらの問題点、および最終的に問題が修正された仕組みについて詳述します。
詳細
VPN クライアントの設計
今回の脆弱性を理解するには、まず各 VPN クライアントの設計を把握する必要があります。どちらの VPN クライアントも同じ設計です。
- ユーザ インターフェイス部:この部分のバイナリは、ログインしているユーザの許可で実行されます。バイナリの目的は、VPN 構成(プロトコルや VPN サーバの所在地など)をユーザが選択できるようにすることです。ユーザが「接続」ボタンをクリックすると、情報(実際は OpenVPN 設定ファイル)が VPN サービスに送信されます。
- サービス部:この部分のバイナリは、ユーザ インターフェイスからの指示を受け取ります。たとえば、ユーザから VPN 構成ファイルを受信します。このバイナリの目的は、OpenVPN クライアント バイナリを(管理者権限を持つ)ユーザ設定ファイルで実行することです。
今回の脆弱性ではこのサービス部を悪用することで、OpenVPN を介して標準ユーザが管理者権限で任意コマンドを実行できました。
当初発見された脆弱性
VerSprite 社が発見した当初の脆弱性は CVE-2018-10169 です。同社によると、次の内容で OpenVPN 設定ファイルを作成できます。
plugin path\\OpenVPN_PoC.dll
設定ファイルはサービスに送信され、設定内容が OpenVPN に反映されます。その結果、OpenVPN_POC.dll は管理者権限で OpenVPN によって読み込まれて実行されます。
当初の更新プログラムと制限
ProtonVPN と NordVPN の各サービスは、同じ更新プログラムを作成しました。この更新プログラムでは、ユーザが送信した OpenVPN 設定ファイルの内容を確認する機能を設けています。
if ( !text.StartsWithIgnoringCase("<tls-auth>") && !text.StartsWithIgnoringCase("<ca>") && OpenVpnConfigSecurityValidator.StartsWithName(text, "plugin") || OpenVpnConfigSecurityValidator.StartsWithName(text, "script-security") || OpenVpnConfigSecurityValidator.StartsWithName(text, "up") || OpenVpnConfigSecurityValidator.StartsWithName(text, "down"))) { reason = string.Format("Invalid configuration file. Reason: {0}", text); return false; }
確認機能では、プラグイン、スクリプトセキュリティ、またはアップ/ダウン(つまり、OpenVPN を介してコードやコマンドを実行する全メソッド)から始まる行が含まれていないか、設定ファイルを検証します。
確認コードは次のとおりです。
private static bool StartsWithName(string line, string name) return line.StartsWithIgnoringCase(name + " ") || line.StartsWithIgnoringCase(name + "\t") || line.EqualsIgnoringCase(name); }
当初の更新プログラムでは、キーワードの前に挿入されたタブやスペースを無視するためのテストが追加されています。
ただし、ここで設定ファイル パーサーの OpenVPN ソースコードを読むことによって、キーワードが引用符で囲まれた parse_line() 関数を読み込めます。そのため、次のテキストを OpenVPN 設定ファイルに追加できます。
"script-security" 2 "up" C:\\WINDOWS\\system32\\notepad.exe
これは OpenVPN に対して有効で、VPN サービスによる確認を通過できます。
上の例ではサービスから OpenVPN を実行し、notepad.exe を実行できます。
新しい更新プログラム
新しい更新プログラムは同じ問題を抱えていません。ProtonVPN の場合、OpenVPN 設定ファイルをインストール ディレクトリに移動させたため、標準ユーザはそれを変更できなくなりました。このため、悪意のある文字列も追加できません。NordVPN では、XML モデルを使用して OpenVPN 設定ファイルを生成するよう変更されました。標準ユーザによるテンプレートの改ざんも防止されています。
詳細は以下の脆弱性レポートに記載されています。
- NordVPN の脆弱性レポート:: TALOS-2018-0622/ CVE-2018-3952
- ProtonVPN の脆弱性レポート:TALOS-2018-0679/ CVE-2018-4010
検証済みバージョン
- ProtonVPN VPN Client 1.5.1
- NordVPN 6.14.28.0
カバレッジ
この悪意ある試行は、以下の Snort ルールにより検出可能です。今後、脆弱性に関する新たな情報が追加されるまでの間は、ルールが追加されたり、現行の Snort ルールが変更されたりする場合がありますのでご注意ください。最新のルールの詳細については、Firepower Management CONSOLE または Snort.org を参照してください。
Snort ルール:47035 ~ 47036
本稿は 2018年9月7日に Talos Group のブログに投稿された「Vulnerability Spotlight: CVE-2018-3952 / CVE-2018-4010 – Multi-provider VPN Client Privilege Escalation Vulnerabilities」の抄訳です。