web-dev-qa-db-ja.com

Windowsの「Secure Desktop」モードはどのように機能しますか?

Windowsの「Secure Desktop」モードとは何か、およびそれがどのように機能するかについて誰かが説明(または簡単な説明へのリンクを提供)できますか?

KeePassのドキュメント( KeePass-セキュアデスクトップでのマスターキーの入力 )で聞いたところ、理解を深めたいと思います。

59
snth

短い答え

「Secure Desktop」の名前を主張する3つの個別の問題があります。

  • GINAや Credential Provider Model などのWindows組み込み関数。
  • 同じユーザーとして実行されている特権アプリケーションと非特権アプリケーションの分離(通常、特権の昇格を防止します)。
  • SwitchDesktop()、これはKeePassが使用しているもので、DLLインジェクションに耐性があるかどうかはわかりません)。

詳細な回答

Windows GUIの構築方法の手引きとして、基本的にすべてがCreateWindow()という関数(つまり、すべて、すべてのボタン、すべてのメニュー、すべて)を実行し、hWndまたはウィンドウが与えられます扱う。これらのウィンドウの変更は、別の関数SendMessage()を介して行われます。

これが問題です。ユーザーモードアプリケーションとして、適切なAPI呼び出しを行うことで、他のWindowsにかなり簡単にメッセージを送信できます。ボタンを他の人のフォームから非表示にするのはかなり簡単です。 DLLインジェクションを実行し、メッセージを受信するメッセージループをフックする(OSは、何かが発生するとOSがWindowsメッセージを送信する))のは少し難しいですが、それほど難しくはありません。これらのイベントをフックできる場合、「はい/いいえ」フォームを自動的に送信できます。または、ラベルをReallyDodgyVirus.exeからExplorer.exeに変更すると、あなたは賢くなりません。

挿入本当に良い記事 実行中のプロセスのアドレス空間にコードを取り込むさまざまな手法について。

さて、キーパスは何をしていますか?

ソースの非常に短い熟読は、彼らがCreateDesktop()SwitchDesktop()およびCloseDesktop()を使用して、現在使用している物理表示デバイスに接続された2番目のデスクトップを作成していることを示しています。英語では、hWndオブジェクトが他のアプリケーションのSendMessage()の検索可能な範囲外にある分離されたデスクトップを作成するようカーネルに要求しています。

SwitchDesktopがデフォルトデスクトップのUIの更新を一時停止することを指摘しておきます。メッセージループも凍結されているかどうかはわかりません。デスクトップが新しいスレッドとして作成されているので、そうではないと思います。

この例では、KeePass is UIを描画しているため、実行はnotです(私が理解しているように、NT AUTHORITY/SYSTEM)。代わりに、新しいデスクトップは基本的に現在のデスクトップの残りから分離して作成され、それを保護します。修正させていただきます。ただし、 SwitchDesktopのMSDN を参照してください。

デスクトップが非表示のウィンドウステーションに属している場合、SwitchDesktop関数は失敗します。また、WinLogonやScreenSaverデスクトップなどのセキュリティで保護されたデスクトップに関連付けられているプロセスから呼び出された場合にも、SwitchDesktopは失敗します。セキュリティで保護されたデスクトップに関連付けられているプロセスには、カスタムのUserInitプロセスが含まれます。このような呼び出しは通常、「アクセス拒否」エラーで失敗します。

これは、これらのダイアログ(スクリーンセーバー、Windowsログオン)がWindowsにより深く組み込まれているため、常にNT AUTHORITY\SYSTEMとして実行され、UserInitプロセスが必要な特権レベルで有効な認証でサブプロセスを作成することを意味します。

私がこれを取り上げたのは、2つの問題があると信じているからです。異なるデスクトップと権限の分離です。 Mark Russinovichの Secure Desktopのトピックの議論 から:

Windowsの整合性メカニズムとUIPIは、昇格したアプリケーションの周囲に保護壁を作成するように設計されています。当初の目標の1つは、ソフトウェア開発者がショートカットを利用したり、既に昇格したアプリケーションを利用して管理タスクを実行したりするのを防ぐことでした。標準のユーザー権限で実行されているアプリケーションは、合成マウスまたはキーボード入力を昇格されたアプリケーションに送信して、入札を実行させたり、昇格されたアプリケーションにコードを挿入して管理操作を実行したりすることはできません。

SteveSが言うように、UACは別のデスクトッププロセスをNT AUTHORITY/SYSTEMとして実行します。プロセスエクスプローラーを介してUACの動作(consent.exe)をキャッチできる場合、次のようになります。

UAC under process Explorer

詳細がわからないプロセスとして特権をエスカレートしますが、これは私が理解していると思います:Windows APIの特権昇格のプロセスは、NT AUTHORITY/SYSTEMとして実行されるプロセスを引き起こします(したがって、どのプロセスでも新しいプロセスを実行できます)必要な権限(この場合は管理者)。アプリケーションがより高い特権を要求すると、ローカルで新しいデスクトップでその質問が表示され、どのアプリケーションもデスクトップハンドルまたはGUI要素ハンドルを取得できません。同意すると、consent.exeが特権ユーザーとしてプロセスを作成します。したがって、NT AUTHORITY\SYSTEMとして実行されているプロセスは、安全なデスクトップを作成する方法としてではなく、新しい特権プロセスを作成する必要性の結果です。 デスクトップがデフォルトと異なるという事実は、どちらの場合でもセキュリティを追加するものです。

上記のマークが意味するところは、これらの安全なデスクトップに加えて、2つのことが起こっているということです。

  • Windows XP以前とは異なり、
  • 非特権アプリケーションと特権アプリケーションが別々のデスクトップに存在するようになりました(免責事項:メモリ内のオブジェクトのACLである可能性があります。よくわかりません)。非特権コードが特権オブジェクトにアクセスできないようにします。

WindowsログオンUIは、Vista/7では再び異なります。

明らかに、これらの方法はどれもカーネルモードルートキットからユーザーを保護しませんが、特権付きアプリケーション、またはKeePassの場合は機密ダイアログを分離することにより、特権の昇格とUIの完全性の侵害を防ぎます。

編集

KeePassのコードをよく見て、この便利なC#の部分を見ました。

Bitmap bmpBack = UIUtil.CreateScreenshot();
if(bmpBack != null) UIUtil.DimImage(bmpBack);
/* ... */

SecureThreadParams stp = new SecureThreadParams();
stp.BackgroundBitmap = bmpBack;
stp.ThreadDesktop = pNewDesktop;

これから、実際に承諾.exeを模倣するために、KeePassは背景のスクリーンショットを取り、それを暗くして、古いデスクトップの背景で新しいデスクトップを作成することがわかります。したがって、レンダリングされていないときでも、古いデスクトップは引き続き実行されていると思います。これは、KeePassとNT AUTHORITY\SYSTEMの両方で魔法のconsent.exeアクションが発生していないことを確認していると思います(con承諾.exeはUIに関して同じことをしていると思いますが、NT AUTHORITY\SYSTEMのコンテキストで起動されるだけです)。

編集2

DLLインジェクションと言うとき、UIを破壊するためにDLLインジェクションを考えています。DLLインジェクションは可能ですKeePassをプロセスとして使用すると、それを使用してその安全なUIに影響を与えることができるかどうかはわかりませんが、プロセスとそのスレッドのメモリにアクセスして、入力されたパスワードを事前に暗号化するために使用される可能性があります。難しいですが、可能だと思います。知っている人がいれば、アドバイスをいただければ幸いです。

63
user2213

「セキュアデスクトップ」は、システム自体でのみ実行できるデスクトップです。それは少し奇妙に聞こえ、おそらくあまり説明しません。

Windowsでは、デスクトップはプロセスと対話するためのビューです。 Windows(ログインプロンプト)にログインすると、デスクトップが表示されます。ログインしてスタートメニューを表示すると、別のデスクトップにいます。 PCをロックすると、さらに別のデスクトップが表示されます。 UACがポップアップすると、別のデスクトップにいます。 Windowsにはかなり多くの異なるデスクトップがあります。

セキュアデスクトップは、他のアプリケーションのアクセシビリティの範囲外のデスクトップです。ログインデスクトップは、UACデスクトップと同様に、安全なデスクトップ(winlogon.exeによって作成)です。他のプロセスはデスクトップと対話できないため、ボタンをアクティブ化したり、テキストボックスの内容を読み取ったりすることはできません。これが、UACが(理論的には)役立つ理由です。

サードパーティのアプリケーションは、安全なデスクトップを作成して情報(マスターパスワードなど)を要求し、それを問題のアプリケーションに渡すことができます。この方法では、理論上、他のプロセスがパスワードを盗聴することはできません。

安全なデスクトップの良い出発点は、安全なデスクトップでUACがどのように機能するかについてのこの記事の前半です http://blogs.msdn.com/b/uac/archive/2006/05/03/589561 .aspx

16
Steve

セキュアデスクトップはローカルシステムアカウントで実行され、OSK、ナレーターなどを除いて他のプロセスはそれと対話できません。winlogon.exeによって開始され、レジストリHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Systemを変更することで無効にできますPromptOnSecureDesktopの値が1から0の場合、システムアカウントでcmd.exeを実行しても、セキュリティで保護されたデスクトップと対話しません。UACプロンプトの下の[管理者として実行]をクリックすると表示される薄暗いデスクトップと、Ctrl +を押すと表示されます。 Alt + Delと、このコンピューターをロックするなどのいくつかのオプションで表示されるスカイブルースクリーンも安全なデスクトップです。デフォルトでは、Windowsには3つのデスクトップがあります1 winlogon 2スクリーンセーバー3 userdesktop

1
Mudasir