
Symantec Endpoint Protectionのクライアントユーザーインターフェースパスワードのバイパス
Symantec Endpoint Protection 14.3.5351 クライアントユーザーインターフェースパスワードの認証バイパス
Symantec Endpoint Protection では、UI にパスワード保護を設定して、設定変更を防止することができます。 このパスワードチェックは、Protected Process Light (PPL) やカーネルドライバのいずれにも該当しないロジックによって実装されています。メモリ内の戻り値を変更したり、バイナリをパッチすることで、攻撃者はパスワードをバイパスできます。 これは、Tamper Protection が有効になっていても機能します。
攻撃者が管理者権限でコードを実行できる場合、悪意のあるポリシー XML や、中央 SEP 管理用の接続設定をインポートできます。 これにより、実質的にクライアントを完全に制御できるようになります。 ポリシーのインポートを使用すると、除外ルールの追加、UI オプションのロック解除、管理者パスワードの無効化や変更、保護の完全な無効化、クライアントのアンインストールなどが可能です。
攻撃者に管理者権限がない場合でも、トラブルシューティング情報のエクスポート、ログの読み取り、クライアント設定の表示に使用できます。 バージョン 14.0 では、管理者権限なしでポリシーをエクスポートし、タンパープロテクションを無効にすることができました。これは 14.3.5413.3000 では不可能でした。
14.3.5351 では、次のコードがパスワードの一致をチェックします:
.text:00438021 loc_438021: ; CODE XREF: sub_437FA0+73↑j
.text:00438021 mov ecx, offset ServiceName ; "SepMasterService"
.text:00438026 call sub_43DDF0
.text:0043802B test eax, eax
.text:0043802D jnz short loc_4380A5
.text:0043802F push ecx ; Src
.text:00438030 lea eax, [ebp+var_14]
.text:00438033 mov ecx, esp
.text:00438035 push eax
.text:00438036 call ds:??0?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@QAE@ABV01@@Z ; ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>(ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>> const &)
.text:0043803C call sub_4380F0
.text:00438041 test al, al
.text:00438043 jz short loc_43804F
.text:00438045 mov ecx, esi
.text:00438047 call ds:__imp_?OnOK@CDialog@@MAEXXZ ; CDialog::OnOK(void)
.text:0043804D jmp short loc_4380AD
SymCorpUI.exe 内のすべてのパスワード試行の成功を制御していると思われるジャンプは、.text:00438043 に示されている JZ 命令です。 これを JNZ (命令 0x74 → 0x75) に変更するとジャンプが反転し、任意のパスワードが受け入れられるようになります。
Python スクリプトは、SEP のインストールフォルダを見つけ、SymCorpUI.exe を読み込み、スクリプトと同じフォルダにパッチ済みのコピーを作成し、元の作業ディレクトリでパッチ済みバージョンを実行します。 特権で実行すると、間違ったパスワードを受け入れる SEP UI が起動します。
攻撃者は、[ヘルプ] → [トラブルシューティング] からポリシー XML をエクスポートする可能性があります。この XML には、管理者パスワードのハッシュを含む設定が含まれています。 攻撃者は XML を編集して、クライアントの任意の設定を変更できます。たとえば、パスワードハッシュの置き換えやパスワード要件の無効化などです。 この悪意のあるポリシー XML は、[エクスポート] の横にあるボタンを使用して再度インポートできます。
このスクリプトは、昇格されているかどうかをチェックします。昇格されていない場合は、パッチ済みバイナリを管理者権限なしで強制的に実行します。 UI を管理者として実行するには、Python スクリプトを管理者として実行するか、as_admin 変数を True にハードコードします。
ビルドごとに特定のオフセットを保存する手間を避けるために、スクリプトは私がテストした 3 つのバージョンで一意であることが確認された命令シーケンスを汎用的に検索/置換します。 異なるバージョンで複数の一致が見つかり、PoC が壊れる可能性があります。その場合は、一致結果を調べて、mov ecx, offset ServiceName ; "SepMasterService" で始まるブロックを見つけ、その近くの下部にあるパッチ対象の該当 JZ 命令を特定してください。
パスワード機能をテストするには、次の内容をポリシー XML の GlobalGroups と同じレベルに追加して保護を有効にします。 ハッシュは文字列 "test" の MD5 です。
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec はこの問題に迅速に対応し、CVE が登録され、修正は 14.3 RU6 として公開されました。
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014