AppContainer 降权,隔离与安全

从 Windows 8 开始,微软引入了新的安全机制,AppConatiner 所有的 Store App 就是运行在应用容器之中,并且 IETab 也是运行在应用容器之中,应用容器在权限的管理上非常细致,也就是说非常“细粒度”。 微软也为传统的Desktop应用程序提供了一系列的API来创建一个AppContainer,并且使进程在AppContainer中启动。比如使用CreateAppContainerProfile创建一个容器SID,使用DeleteAppContainerProfile查找一个已知容器名的SID,删除一个容器DeleteAppContainerProfile配置文件。GetAppContainerFolderPath 获得容器目录。

通过 AppContainer 启动进程的一般流程是,通过 CreateAppContainerProfile 创建一个容器配置,得到 SID 指针,为了避免创建失败,先用 DeleteAppContainerProfile 删除此容器配置。细粒度的配置需要 WELL_KNOWN_SID_TYPE
得到容器配置后,启动进程时需要使用 STARTUPINFOEX 结构,使用 InitializeProcThreadAttributeList UpdateProcThreadAttribute 将 PSID 和 SECURITY_CAPABILITIES::Capabilities (也就是 WELL_KNOWN_SID_TYPE 得到的权限设置)添加到 STARTUPINFOEX::lpAttributeList 使用 CreateProcess 中第七个参数 添加 EXTENDED_STARTUPINFO_PRESENT,然后再用 reinterpret_cast 转换 STARTUPFINFOEX 指针变量输入到 CreateProcess 倒数第二个(C语言用强制转换)。

下面是一个完整的例子。

#include <vector>
#include <memory>
#include <type_traits>
#include <Windows.h>
#include <sddl.h>
#include <Userenv.h>
#include <iostream>

#pragma comment(lib,"Userenv")
#pragma comment(lib,"Shlwapi")
#pragma comment(lib,"kernel32")
#pragma comment(lib,"user32")
#pragma comment(lib,"Advapi32")
#pragma comment(lib,"Ole32")
#pragma comment(lib,"Shell32")

typedef std::shared_ptr<std::remove_pointer<PSID>::type> SHARED_SID;

bool SetCapability(const WELL_KNOWN_SID_TYPE type, std::vector<SID_AND_ATTRIBUTES> &list, std::vector<SHARED_SID> &sidList) {
  SHARED_SID capabilitySid(new unsigned char[SECURITY_MAX_SID_SIZE]);
  DWORD sidListSize = SECURITY_MAX_SID_SIZE;
  if (::CreateWellKnownSid(type, NULL, capabilitySid.get(), &sidListSize) == FALSE) {
    return false;
  }
  if (::IsWellKnownSid(capabilitySid.get(), type) == FALSE) {
    return false;
  }
  SID_AND_ATTRIBUTES attr;
  attr.Sid = capabilitySid.get();
  attr.Attributes = SE_GROUP_ENABLED;
  list.push_back(attr);
  sidList.push_back(capabilitySid);
  return true;
}

static bool MakeWellKnownSIDAttributes(std::vector<SID_AND_ATTRIBUTES> &capabilities,std::vector<SHARED_SID> &capabilitiesSidList)
{

    const WELL_KNOWN_SID_TYPE capabilitiyTypeList[] = {
        WinCapabilityInternetClientSid, WinCapabilityInternetClientServerSid, WinCapabilityPrivateNetworkClientServerSid,
        WinCapabilityPicturesLibrarySid, WinCapabilityVideosLibrarySid, WinCapabilityMusicLibrarySid,
        WinCapabilityDocumentsLibrarySid, WinCapabilitySharedUserCertificatesSid, WinCapabilityEnterpriseAuthenticationSid,
        WinCapabilityRemovableStorageSid,
    };
    for(auto type:capabilitiyTypeList) {
        if (!SetCapability(type, capabilities, capabilitiesSidList)) {
            return false;
        }
    }
    return true;
}

HRESULT AppContainerLauncherProcess(LPCWSTR app,LPCWSTR cmdArgs,LPCWSTR workDir)
{
    wchar_t appContainerName[]=L"Phoenix.Container.AppContainer.Profile.v1.test";
    wchar_t appContainerDisplayName[]=L"Phoenix.Container.AppContainer.Profile.v1.test\0";
    wchar_t appContainerDesc[]=L"Phoenix Container Default AppContainer Profile  Test,Revision 1\0";
    DeleteAppContainerProfile(appContainerName);///Remove this AppContainerProfile
    std::vector<SID_AND_ATTRIBUTES> capabilities;
    std::vector<SHARED_SID> capabilitiesSidList;
    if(!MakeWellKnownSIDAttributes(capabilities,capabilitiesSidList))
        return S_FALSE;
    PSID sidImpl;
    HRESULT hr=::CreateAppContainerProfile(appContainerName,
        appContainerDisplayName,
        appContainerDesc,
        (capabilities.empty() ? NULL : &capabilities.front()), capabilities.size(), &sidImpl);
    if(hr!=S_OK){
        std::cout<<"CreateAppContainerProfile Failed"<<std::endl;
        return hr;
    }
    wchar_t *psArgs=nullptr;
    psArgs=_wcsdup(cmdArgs);
    PROCESS_INFORMATION pi;
    STARTUPINFOEX siex = { sizeof(STARTUPINFOEX) };
    siex.StartupInfo.cb = sizeof(STARTUPINFOEXW);
    SIZE_T cbAttributeListSize = 0;
    BOOL bReturn = InitializeProcThreadAttributeList(
        NULL, 3, 0, &cbAttributeListSize);
    siex.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, cbAttributeListSize);
    bReturn = InitializeProcThreadAttributeList(siex.lpAttributeList, 3, 0, &cbAttributeListSize);
    SECURITY_CAPABILITIES sc;
    sc.AppContainerSid = sidImpl;
    sc.Capabilities = (capabilities.empty() ? NULL : &capabilities.front());
    sc.CapabilityCount = capabilities.size();
    sc.Reserved = 0;
    if(UpdateProcThreadAttribute(siex.lpAttributeList, 0,
        PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES,
        &sc,
        sizeof(sc) ,
        NULL, NULL)==FALSE)
    {
        goto Cleanup;
    }
    BOOL bRet=CreateProcessW(app, psArgs, nullptr, nullptr,
        FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, workDir, reinterpret_cast<LPSTARTUPINFOW>(&siex), &pi);
    ::CloseHandle(pi.hThread);
    ::CloseHandle(pi.hProcess);
Cleanup:
    DeleteProcThreadAttributeList(siex.lpAttributeList);
    DeleteAppContainerProfile(appContainerName);
    free(psArgs);
    FreeSid(sidImpl);
    return hr;
}

int wmain(int argc,wchar_t *argv[])
{
    if(argc>=2)
    {
        std::wcout<<L"Start AppContainer App: "<<argv[1]<<L"\t Return Code[HRESULT]: "<<AppContainerLauncherProcess(nullptr,argv[1],nullptr)<<std::endl;
    }
    return 0;
}

使用 Process Explorer 查看进程属性可得到下图:

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-10-14 22:51:41

AppContainer 降权,隔离与安全的相关文章

史上最全网站降权原因解析

在互联网时代飞速发展的前景下加上昂贵的竞价费用让多数企业苦不堪言于是低成本投入的职业-seo就诞生了,从业人数也每年呈递增状态,然而互联网的垃圾信息也越来越多,于是搜索引擎为了更好的迎合用户体验也频繁的展开了各项算法调整.在这期间当然也有很多网站被降权甚至被K掉,至于什么原因,有很多从职朋友还不能彻底的找到问题的根源,下面笔者以个人多年经验为大家展开一下分享,希望能帮助你早日恢复网站排名. 直接进入正题: 一.空间问题 因为空间访问速度不稳定,有时慢有时打不开的情况,因这个被降权的案列也是很多的

刘丹:改标题不会被降权的一招必杀技

  大家在运营网站的过程中,常常会由于不同的需要而改版或者改标题,但这往往会带来毁灭性的结果,大多时候会被降权,以至于很长时间内都暗无天日,苦苦等待恢复.这种情况基本上每个人都遇到过,我也不例外,最近在运营的武汉seo博客时,由于之前的一些规划需要改变,所以对网站进行了一定程度的改版,包括标题也适当的进行了调整,不幸的是三天后即赶上了大更新,瞬间被秒杀,首页已经飞到火星去了. 这迫使自己不得不反思:到底有没有能够比较安全的改版方法,于是拿另外两个新站进行试验,测试了很多,最终发现了一种非常有效的

网站降权的几种原因的分析

站长们不愿意遇到的事情就是网站被K或者被降权,网站被降权后的表现有很多,比如:搜索引擎收录减少,网页快照不更新,网站流量大幅减少,今天无忧主机(www.51php.com)小编就根据自己对seo和网络搜索引擎的理解,和大家分享下网站被降权的原因,仁者见仁智者见智,希望您通过阅读本文,能够给你带来启迪. 1.域名没有设置301跳转,权重分散 许多网站都有两个域名,一个是带www的域名,一个不带www的,如果网站没有做301跳转,网站的权重被被分散到两个不同的域名中,间接导致单个域名权重降低,影响搜

网站被百度降权的各种原因大解析

站长最痛心莫过于是自己的网站一直在同行的最前面突然有一天排名回到了解放前了,一切工作又得重新开始了,就比如你跟同行来了场比赛,就拿塞车来说吧!同行一开始对你穷追不舍,到后来因车抛锚了或者车胎坏了或者其他种种因素使你在比赛中失败了连竞争对手的车尾灯你都看不着了,这时候并不是没有机会了,也就是重新修好它,再上路,我拿着比赛来比喻,更能说明网站被降权并不是就没机会了,只要找对了问题出自何处,然后对症下药就可以慢慢回到原位,或许更好,所以有些站长因为自己的网站突然被降权了就失去了对这个站的信心,这样不对

网站被降权后怎么办

国内主要的搜索引擎是百度和Google,所以这里只以这两个搜索引擎为例.百度降权的主要表现方式是:收录大规模减少,排名迅速下降,时常伴随着首页被K;Google降权的主要表现方式是:网站排名降低,收录停滞,偶尔伴随一些页面被K. 网站被百度降权怎么办? 1:检查网站是否使用了H1标签,除博客外任何网站经历避免使用H1标签,如果网站被降权,则去掉H1标签. 2:检查是否有不良友情链接,检查这些链接的页面链接都是什么地方.IP是什么,这个IP是否被处罚过,详情可看卢松松曾经写的"如何检查同IP下的网

浅析关于网站关键词调整不降权指南

你是否看到很多站长抱怨自己修改网站关键词后被搜索引擎降权,从而一直不敢对自己的网站关键词下手? 你是否看到很多公司网站关键词布局得很糟糕,而自己却不敢接下他们的这笔订单? 现在,你可以放心的按照以下的方法来操作了.周末的时候,我去找了我的好朋友陈正杰,可能很多人都不知道他,其实,他算是国内屈指可数的SEOER,只不过为人低调,因此,很少人知道有这个人并不奇怪.我周末向他请教如何修改关键词不被搜索引擎降权的时候(网上很多人都有这个经历吧?).他给我说了以下的这个技巧.而这个技巧将告诉你如何避开搜索

搜索引擎降权与网站排名恢复

前些日子笔者的网站因为在百度知道回答问题被降权了,主要表现为:域名不在首页,一般在第二.三页上:随后几天,百度快照停滞,排名消失. 谁都碰上过降权这样的事,特别是我们这帮被度娘折磨得不成人形的人(很多SEOER喜欢熬夜,一天两天没问题,一年两年后那个黑眼圈他妈都难以相信). 笔者加入SEO这个行业不久,也不是专业做SEO的,而是从事知识产权代理服务,比如商标注册.专利申请等等.本以为以自己这种业余的玩法碰不上这么倒霉的事,但是不凑巧,还是给笔者赶上了. 域名降权原因分析,本人结合实践,分析如下:

A5营销:浅谈房产网降权后需要注意的四个要点

随着上星期四晚百度大更新,很多行业的网站都被降权.被K.被拔毛,最严重的则是比比贴分类信息网,当然还有其他的行业网站,这对于站长来说无疑又是一种毁灭性的打击,同上年的6.28事件中可以看到这次百度会有一次大变动.当然,上周四的百度大更新后部分地区房产网站受到了百度的降权,很多房产网站长也在不停的埋怨百度,为什么我们的站没有作弊优化还会受到降权呢,我们是按照正规的白帽进行优化.据调查显示,不仅房产网的站长有这样的想法,其他行业的站长也是一样. 从百度沙龙内部消息了解到,一个网站想要让百度喜欢,必须

网站标题因含有“官网”二字而被百度降权处理

昨天晚上下班自己做完饭吃,闲着没事就上A5站长网看看一些文章,在这里顺便说一下,我可是A5站长网的终极粉丝哦!在搜索栏目下我看到了A5营销黄忠写的一篇"<A5营销提醒:近期百度对信息带有"官网"的网站进行降权>"的文章,说是百度近期会对网站信息带有"官网"的字样将进行降权处理.看到这篇文章我就联想到自己手上操作的一个站点在11月22日百度的更新中被百度给降权了,现在百度权重由之前的1变为现在的0,而且首页的关键词排名全部在100名以外