ユーザーインターフェイス特権の分離ユーザーインターフェイス特権の分離 (英語: User Interface Privilege Isolation, UIPI)[1] とは、Windows Server 2008/Vista以降に、シャッターアタック(Shatter Attack、壊滅的攻撃)を防ぐために導入されたセキュリティ機能である。Windows NT 4.0以降、Object Managerを介して生成されるオブジェクトにはセキュリティ記述子が与えられ、そうしたオブジェクトへのアクセス制御は可能であったが、ウィンドウオブジェクトにはセキュリティ記述子は与えられず、ウィンドウ自体へのセキュリティ制御はできなかった。 UIPIと必須整合性制御により、同じ対話型デスクトップ内において、低い整合性で実行されているプロセスは、より高い整合性で実行されているプロセスに対して、DLLインジェクションやウィンドウメッセージAPI( 機能
Windowsでは、任意のウィンドウオブジェクトを取得してそのオブジェクトに対してデータを送信する( // ウインドウクラスを元に、メモ帳のウインドウを検索
HWND hwndNotepad = FindWindow(L"notepad", NULL);
// メモ帳のウインドウからエディトコントロールを取得
HWND hWndEdit;
EnumChildWindows(hWndEdit, EnumChildProc, (LPARAM)&hWndEdit);
// エディトコントロールに任意のテキストを設定
BOOL bResult = SendMessage(hWndEdit, WM_SETTEXT, 0, (LPARAM)L"text");
ただし、 WCHAR wszBuffer[1024];
bResult = SendMessage(hWndEdit, WM_GETTEXT, sizeof(wszBuffer) / sizeof(WCHAR), (LPARAM)wszBuffer);
シャッター攻撃において、バッファーフローを引き起こせるメッセージは WCHAR wszData[] = L"message";
COPYDATASTRUCT data = { 0 };
data.cbData = sizeof(wszData); // 0xFFFFFFFFでもよい。
data.lpData = wszData;
SendMessage(hWndTarget, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&data);
無効化特定の種類のメッセージのフィルターを無効化整合性レベル「中(Medium)」以上のプロセスは、 マニフェストによる完全無効化例えば、 こうしたUIアクセシビリティソフトウェアのような、他のソフトウェアのUIにアクセスするソフトウェアはUIPIが障壁となる。そのため、Windowsは以下の条件を満たしている場合に限り、UIPIの無効化を提供する[2]。
Windows全体で完全に無効化脚注 |
Portal di Ensiklopedia Dunia