フォティーンフォティ技術研究所 技術戦略室の鈴木です。

今回の社内勉強会では、以前弊社Monthly ResearchでレポートしたWindows 8のSnadbox "AppContainer"について紹介しました。

新しい仕組みではありますが、ほとんど情報がなく、Microsoftの公式のドキュメントもほとんどないため、実際どのように動くのかを知ってもらうことを目的としました。

特にDesktopアプリとAppContainerプロセス間で のやり取りの制限や、調査中に実験的に行ったDesktopアプリでAppContainerからアクセス可能な名前付きオブジェクトの作成 方法の解説を行いました。

一般的な方法としては、Desktopアプリ側でオブジェクトを作成する場合に、対象となるAppContainerプロセスのSIDに対してアクセス許可を与えるか、またはALL APPLICATION PACKAGESグループに対してアクセス権を与えるという方法があるようです。

今回は後者の方法を実際にコードで書き試してみました。

この方法の場合、すべてのAppContainerプロセスからアクセスが可能となってしまうため、実際に利用する頻度は少ないかもしれませんが、少なくともこの方法でアクセス可能であることがわかりました。

コードは以下のようになります。

// All Application PackageのSIDの作成
SID_IDENTIFIER_AUTHORITY SIDAuthAppPackage = SECURITY_APP_PACKAGE_AUTHORITY;
AllocateAndInitializeSid(&SIDAuthAppPackage,
SECURITY_BUILTIN_APP_PACKAGE_RID_COUNT,
SECURITY_APP_PACKAGE_BASE_RID,
SECURITY_BUILTIN_PACKAGE_ANY_PACKAGE,
0, 0, 0, 0, 0, 0,
&pPackageSID);

// ACEの作成
EXPLICIT_ACCESS ea[1];
ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = EVENT_ALL_ACCESS;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pPackageSID;

// ...
// Security Descriptorの作成を行った後
// ...

CreateEvent( &sa, FALSE, FALSE, L“MyEvent” ); // セッション内名前空間 にオブジェクト作成

一般的なオブジェクトに対するアクセス権限の設定と同じで、マイクロソフト社のデベロッパー センター デスクトップのサイトにある情報を参考にしていますが、SIDの作成部分がAppContainer用になっています。

関連記事

FFRI-Tech-Meeting #2

FFRI-Tech-Meeting #3-1「DBとtabaruの話」

FFRI-Tech-Meeting #3-2「Android解析入門~IDA ProによるARMアセンブリ解析~」

情報提供: FFRI BLOG