当启用UAC并且使用pipe理帐户login时,您会得到两个令牌:
boost的令牌; 这有Administrators组启用,高完整性(即,强制完整性标签SID是S-1-16-12288)并具有海拔typestokenElevationTypeFull。
有限的令牌; 这使pipe理员组被禁用,中等完整性(S-1-16-8192),并具有海拔typestokenElevationTypeLimited。
这三个因素总是以这种方式匹配吗? 也就是说,内核是否要求只有启用pipe理员组的令牌可以具有较高的完整性和/或TokenElevationTypeFull?
如何检测login屏幕或UAC是否处于活动状态
Win C#:以pipe理员身份运行应用程序,无需UAC提示
以编程方式为Windows上的特定程序select性地禁用UAC
需要UAC保护资源的整个列表以标准用户身份运行我的应用程序(unlevated)
testingpipe理运行权VB.NET的应用程序
有什么情况下进程不具有pipe理员权限,但将以高完整性和/或TokenElevationTypeFull运行?
(这个问题的理由:答案会影响到程序员可以安全地testing升级权限的方式,例如, 这里提到了 )
如何获得%temp% Low的位置作为低整合度过程运行时
检查另一个进程在.NET中是否具有pipe理员权限
在Windows Vista上以pipe理员身份运行时,如何在其他目录中启动快捷方式?
不,内核不要求令牌的完整性级别和高程类型与管理员组的状态相匹配。 这意味着具有高完整性级别或TokenElevationTypeFull的进程不一定具有管理员访问权限。
尤其要注意的是,从管理命令提示符使用runas /trustlevel:0x20000将导致进程没有管理员权限,但仍然以高完整性运行(如果启用UAC)将具有TokenElevationTypeFull。 ( 正如我们在这里所发现的 )我相信这代表了runas一个bug。
这个示例代码演示了这个行为。 如果以管理员权限运行,它将启动管理员组(除了SeChangeNotifyPrivilege之外的所有权限)的子流程,但仍然以高完整性和TokenElevationTypeFull运行。
#include <Windows.h> #include <Sddl.h> #include <stdio.h> PSID admins_sid; void get_membership(HANDLE token) { BOOL is_enabled; HANDLE itoken; if (!Duplicatetoken(token,SecurityIdentification,&itoken)) { printf("Duplicatetoken: %un",GetLastError()); return; } if (!CheckTokenMembership(itoken,admins_sid,&is_enabled)) { printf("CheckTokenMembership: %un",GetLastError()); CloseHandle(itoken); return; } CloseHandle(itoken); printf("Administrators group enabled: %un",is_enabled); return; } void get_integrity(HANDLE token) { char buffer[4096]; char * stringsid; TOKEN_MANDATORY_LABEL *token_mandatory_label = (TOKEN_MANDATORY_LABEL *)buffer; DWORD dw; if (!GetToken@R_737_4045@ion(token,TokenIntegrityLevel,buffer,sizeof(buffer),&dw)) { printf("GetToken@R_737_4045@ion: %un",GetLastError()); return; } if (!ConvertSidToStringSidA(token_mandatory_label->Label.Sid,&stringsid)) { printf("ConvertSidToStringSid: %un",GetLastError()); return; } printf("SID: %sn",stringsid); } void get_elevation(HANDLE token) { TOKEN_ELEVATION_TYPE elevation; DWORD dw; if (!GetToken@R_737_4045@ion(token,TokenElevationType,&elevation,sizeof(elevation),GetLastError()); return; } printf("Elevation type : %un",(DWORD)elevation); } void test(void) { HANDLE token1,token2; SID_AND_ATTRIBUTES sids_to_disable; STARTUPINFOA si = {sizeof(STARTUPINFOA)}; PROCESS_@R_737_4045@ION pi; if (!OpenProcesstoken(GetCurrentProcess(),MAXIMUM_ALLOWED,&token1)) { printf("OpenProcesstoken: %un",GetLastError()); return; } printf("token1:n"); get_membership(token1); get_integrity(token1); get_elevation(token1); sids_to_disable.Attributes = 0; sids_to_disable.Sid = admins_sid; if (!CreateRestrictedToken(token1,disABLE_MAX_PRIVILEGE,1,&sids_to_disable,NULL,&token2)) { printf("CreateRestrictedToken: %un",GetLastError()); return; } printf("token2:n"); get_membership(token2); get_integrity(token2); get_elevation(token2); if (!CreateProcessAsUserA(token2,"cmd",FALSE,CREATE_NEW_CONSOLE,&si,&pi)) { printf("CreateProcessAsUser: %un",GetLastError()); return; } } int main(int argc,char ** argv) { { SID_IDENTIFIER_AUTHORITY SIDAuth = Security_NT_AUTHORITY; if(! AllocateAndInitializeSid( &SIDAuth,2,Security_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,&admins_sid) ) { printf( "AllocateAndInitializeSid: %un",GetLastError()); return 1; } } test(); return 0; }
token1: Administrators group enabled: 1 SID: S-1-16-12288 Elevation type : 2 token2: Administrators group enabled: 0 SID: S-1-16-12288 Elevation type : 2
如果再次从子进程运行示例代码,则可以确认子进程确实保留了这些属性:
token1: Administrators group enabled: 0 SID: S-1-16-12288 Elevation type : 2
如果UAC被禁用,那么海拔类型是TokenElevationTypeDefault,否则结果是相同的:
token1: Administrators group enabled: 1 SID: S-1-16-12288 Elevation type : 1 token2: Administrators group enabled: 0 SID: S-1-16-12288 Elevation type : 1
正如所料,有限的令牌看起来像这样:
token1: Administrators group enabled: 0 SID: S-1-16-8192 Elevation type : 3
token1: Administrators group enabled: 0 SID: S-1-16-8192 Elevation type : 1
(所有测试都在Windows 7 SP1 x64上运行。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。