Cisco Japan Blog

注目の脆弱性:CVE-2018-3952 / CVE-2018-4010 – 複数プロバイダの VPN クライアントで発見された特権昇格の脆弱性

1 min read



概要

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-10169popup_icon)に似ています。いずれの VPN クライアントでも、脆弱性を修正した更新プログラムが発見と同じ月にリリースされています。しかし Talos では、それらの修正を回避する方法を特定しました。このため、管理者権限でコードを実行できる可能性が依然として残っていました。今回の記事の後半では、最初の更新プログラムとそれらの問題点、および最終的に問題が修正された仕組みについて詳述します。

詳細

VPN クライアントの設計

今回の脆弱性を理解するには、まず各 VPN クライアントの設計を把握する必要があります。どちらの VPN クライアントも同じ設計です。

  • ユーザ インターフェイス部:この部分のバイナリは、ログインしているユーザの許可で実行されます。バイナリの目的は、VPN 構成(プロトコルや VPN サーバの所在地など)をユーザが選択できるようにすることです。ユーザが「接続」ボタンをクリックすると、情報(実際は OpenVPN 設定ファイル)が VPN サービスに送信されます。
  • サービス部:この部分のバイナリは、ユーザ インターフェイスからの指示を受け取ります。たとえば、ユーザから VPN 構成ファイルを受信します。このバイナリの目的は、OpenVPN クライアント バイナリを(管理者権限を持つ)ユーザ設定ファイルで実行することです。

今回の脆弱性ではこのサービス部を悪用することで、OpenVPN を介して標準ユーザが管理者権限で任意コマンドを実行できました。

当初発見された脆弱性

VerSprite 社が発見した当初の脆弱性は CVE-2018-10169popup_icon です。同社によると、次の内容で 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 設定ファイルを生成するよう変更されました。標準ユーザによるテンプレートの改ざんも防止されています。

詳細は以下の脆弱性レポートに記載されています。

検証済みバージョン

  • 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 Grouppopup_icon のブログに投稿された「Vulnerability Spotlight: CVE-2018-3952 / CVE-2018-4010 – Multi-provider VPN Client Privilege Escalation Vulnerabilitiespopup_icon」の抄訳です。

コメントを書く