Hello @Spencer Wagemann ,
Thank you for clearly outlining the requirements and constraints of the proposed design.
I checked the published Win32 documentation for the contract you described. Based on that documentation, I cannot verify the complete contract for an unchanged, zero-capability LPAC.
For the four points you listed:
-
GetAppContainerRegistryLocationsays that the returnedHKEYidentifies the registry storage location for the current profile. It also says that the function gets registry storage for the current user and that accessing another user's storage requires impersonation.TOKEN_INFORMATION_CLASSandSECURITY_CAPABILITIESdocument the AppContainer SID and capability list separately. However, I could not find a statement that the package SID alone allows a zero-capability LPAC to open its private registry store.Launch an AppContainerstates that “LPAC cannot open any keys in the registry unless it has the registryRead capability.” I could not find a documented exception for the LPAC's own private registry store. The general WOW64 documentation explainsKEY_WOW64_32KEYandKEY_WOW64_64KEY. However,Accessing an Alternate Registry Viewdoes not listGetAppContainerRegistryLocationamong the APIs for which those flags are documented. I therefore cannot establish the exact registry view returned by this API from the published documentation. - The documentation for
GetAppContainerRegistryLocationdoes not say whether the function can create, initialize, or modify storage when the expected store is absent.CreateAppContainerProfileseparately documents the creation of a per-user, per-app profile containing folders and registry storage. That tells me which API creates the profile, but it does not guarantee thatGetAppContainerRegistryLocationhas no side effects when the storage is absent. -
RegCreateKeyExWconfirms your concern aboutKEY_READ. It states that key-creation access is checked against the parent key's security descriptor, not the access mask used to obtain the handle. It also states that a handle obtained withKEY_READmay still be used to create keys if the security descriptor permits it. I could not find published documentation for the security descriptor or effective package-SID grants on the private registry root in this scenario. For that reason, I cannot use aKEY_READrequest alone to establish that the returned reference has no effective subkey-creation authority. - I could not find documentation that defines or supports the named-subkey denial operation you described through a handle returned by
GetAppContainerRegistryLocation. I also could not find a guarantee that such an operation can be performed without first obtaining any authority excluded by your contract.
In summary, I found documentation for the current-user/profile scope, the separation between the AppContainer SID and capabilities, the general LPAC registryRead requirement, and the security-descriptor check used for subkey creation. I did not find documentation for a private-store exception to registryRead, the exact registry view returned by this API, non-mutating behavior when storage is absent, the private root's effective creation rights, or the named-subkey denial semantics.
Because those points are not documented, I cannot confirm the complete contract as stated.
Hope these information help. If you found my response helpful or informative, I would greatly appreciate it if you could follow this guide for your confirmation.
Thank you.