WIA セキュリティおよびセキュリティ記述子
「WIA セキュリティに関する一般的な問題」にリストされている解決策の多くは、該当するオブジェクトに、 LocalServiceアカウントなどの適切なエンティティへのアクセスを許可するセキュリティ記述子が必要です。
一般に、LocalService アカウントは、 LocalServiceアカウント、Everyone、または Authenticated ユーザーによるアクセスを許可する ACL を持つリソースにアクセスできます。 ユーザーまたはユーザーのグループがオブジェクトへのアクセスを許可する随意アクセス制御リスト (DACL) を作成しない限り、サービスはオブジェクト (パイプ、ファイル マッピング、同期など) を他のアプリケーションと共有できません。
次のコード例は、 セキュリティ記述子を直接設定する方法を示したものです。 この方法は、アプリケーションとドライバーが名前付きイベント オブジェクトを共有する必要がある場合に使用できます。
//
// Security descriptor in SDDL form:
// D: - Indicates what follows is a
// Discretionary Access Control List (DACL)
// (A;;GA;;;LS) - Grants generic all access to LocalService
// (A;;GA;;;BA) - Grants generic all access to Built-in Admins
// (A;;GA;;;IU) - Grants generic all access to Interactive User
//
#define MY_EVENT_DACL TEXT("D:(A;;GA;;;LS)(A;;GA;;;BA)(A;;GA;;;IU)")
//
// Allocate appropriate security attributes for the named event
// to be shared between driver and app running under
// interactive user's account.
//
SECURITY_ATTRIBUTES sa = { sizeof(sa), FALSE, NULL };
if(ConvertStringSecurityDescriptorToSecurityDescriptor(
MY_EVENT_DACL,
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor), NULL))
{
h_MyEvent = CreateEvent(&sa, // Our security descriptor
// allowing access to
// Admins, LocalService
// and the Interactive
// User
bManualReset,
bInitialState,
tszName);
if (h_MyEvent != NULL)
{
// Success!
}
else
{
// Failed. Do error cleanup...
.
.
.
}
}
else
{
// Failed. Do error cleanup...
.
.
.
}
レジストリ キーは、INF ファイルを介して適切な ACL を使用して作成することもできます。 たとえば、管理者と LocalServiceで実行されているドライバーのみがアクセスできるSOFTWARE キーにレジストリ キーを作成するには、INF ファイルに次のエントリを追加します。
[DDInstallSection]
Addreg=MyAddReg
[DDInstallSection.MyAddReg]
HKLM,"SOFTWARE\MyCompany\MySpecialKey\"
[DDInstallSection.MyAddReg.Security]
"D:(A;CIOI;GA;;;BA)(A;CIOI;GA;;;LS)"
INF ファイルの詳細は、「WIA デバイスの INF ファイル」を参照してください。
Windows セキュリティ モデルの詳細については、Windows セキュリティドキュメントを参照してください。 ドライバーライターは、破壊的ユーザーがドライバーの脆弱性を悪用する可能性を減らす一般的なセキュリティのベスト プラクティスに認識する必要があります。 Microsoft Press の "セキュリティで保護されたコードの記述" (ISBN 0-7356-1588-8) は、使用可能ないくつかの役立つリソースの 1 つです。