- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
启用 UAC 并使用管理帐户登录后,您将获得两个 token :
提升的 token ;这已启用 Administrators 组,具有高完整性(即强制性完整性标签 SID 为 S-1-16-12288)并且具有提升类型 TokenElevationTypeFull。
有限的代币;这已禁用 Administrators 组,具有中等完整性 (S-1-16-8192) 并且具有提升类型 TokenElevationTypeLimited。
这三个因素总是以这种方式匹配吗?也就是说,内核是否要求只有启用 Administrators 组的 token 才能具有高完整性和/或 TokenElevationTypeFull?
是否存在进程不具有管理员权限但会以高完整性和/或 TokenElevationTypeFull 运行的任何情况?
(问题的基本原理:答案会影响程序员安全测试提升权限的方式。例如,it came up here。)
最佳答案
不,内核不要求 token 的完整性级别和提升类型与管理员组的状态相匹配。这意味着具有高完整性级别或 TokenElevationTypeFull
的进程不一定具有管理员访问权限。
特别是请注意,在管理命令提示符下使用 runas/truSTLevel:0x20000
将导致进程没有管理员权限,但仍然以高完整性运行并且(如果启用了 UAC)将具有 TokenElevationTypeFull
。 ( As discovered here. ) 我相信这表示 runas
中的错误。
2022 年 10 月附录:我怀疑 runas
中的错误是它只允许您指定某些完整性级别,并弄错了! 中等完整性是 0x2000,不是 0x20000。
此示例代码演示了该行为;如果以管理员权限运行,它会启动一个禁用管理员组(以及除 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: %u\n", GetLastError());
return;
}
if (!CheckTokenMembership(itoken, admins_sid, &is_enabled))
{
printf("CheckTokenMembership: %u\n", GetLastError());
CloseHandle(itoken);
return;
}
CloseHandle(itoken);
printf("Administrators group enabled: %u\n", 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 (!GetTokenInformation(token, TokenIntegrityLevel, buffer, sizeof(buffer), &dw))
{
printf("GetTokenInformation: %u\n", GetLastError());
return;
}
if (!ConvertSidToStringSidA(token_mandatory_label->Label.Sid, &stringsid))
{
printf("ConvertSidToStringSid: %u\n", GetLastError());
return;
}
printf("SID: %s\n", stringsid);
}
void get_elevation(HANDLE token)
{
TOKEN_ELEVATION_TYPE elevation;
DWORD dw;
if (!GetTokenInformation(token,
TokenElevationType, &elevation, sizeof(elevation), &dw))
{
printf("GetTokenInformation: %u\n", GetLastError());
return;
}
printf("Elevation type : %u\n", (DWORD)elevation);
}
void test(void)
{
HANDLE token1, token2;
SID_AND_ATTRIBUTES sids_to_disable;
STARTUPINFOA si = {sizeof(STARTUPINFOA)};
PROCESS_INFORMATION pi;
if (!OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &token1))
{
printf("OpenProcessToken: %u\n", 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, 0, NULL, 0, NULL, &token2))
{
printf("CreateRestrictedToken: %u\n", GetLastError());
return;
}
printf("token2:\n");
get_membership(token2);
get_integrity(token2);
get_elevation(token2);
if (!CreateProcessAsUserA(token2,
NULL, "cmd", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
printf("CreateProcessAsUser: %u\n", 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,
0, 0, 0, 0, 0, 0,
&admins_sid) )
{
printf( "AllocateAndInitializeSid: %u\n", 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
正如预期的那样,受限 token 如下所示:
token1:
Administrators group enabled: 0
SID: S-1-16-8192
Elevation type : 3
或者如果您以非管理员用户身份登录,无论 UAC 是否启用:
token1:
Administrators group enabled: 0
SID: S-1-16-8192
Elevation type : 1
(所有测试都在 Windows 7 SP1 x64 上运行。)
关于windows - 高完整性 token 是否*必须*启用管理员组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30970433/
我正在开发一个应用程序,它使用 OAuth - 基于 token 的身份验证。 考虑到我们拥有访问和刷新 token ,这就是流程的样子。 Api call -> intercepter append
如何取消标记此代码的输出? 类(class)核心: def __init__(self, user_input): pos = pop(user_input) subject = ""
当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 kubeconfig 中的管理员凭据文件。 这是我做的: NAMESPACE="default" SERVICE
我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本 token 授权的工作
我正在尝试从应用服务获取 Google 的刷新 token ,但无法。 日志说 2016-11-04T00:04:25 PID[500] Verbose Received request: GET h
我正在开发一个项目,只是为了为 java 开发人员测试 eclipse IDE。我是java新手,所以我想知道为什么它不起作用,因为我已经知道该怎么做了。这是代码: public class ecli
我正在尝试使用 JwtSecurityTokenHandler 将 token 字符串转换为 jwt token 。但它出现错误说 IDX12709: CanReadToken() returned
我已阅读文档 Authentication (来自 Facebook 的官方)。我仍然不明白 Facebook 提供的这三种访问 token 之间的区别。网站上给出了一些例子,但我还是不太明白。 每个
我的部署服务器有时有这个问题,这让我抓狂,因为我无法在本地主机中重现,我已经尝试在我的 web.config 中添加机器 key ,但没有成功远。 它只发生在登录页面。 我的布局:
我已经设法获得了一个简单的示例代码,它可以创建一个不记名 token ,还可以通过阅读 stackoverflow 上的其他论坛来通过刷新 token 请求新的不记名 token 。 启动类是这样的
如果我有以前的刷新 token 和使用纯 php 的访问 token ,没有 Google Api 库,是否可以刷新 Google Api token ?我在数据库中存储了许多用户刷新和访问 toke
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
当我有一个有效的刷新 token 时,我正在尝试使用 Keycloak admin REST API 重新创建访问 token 。 我已经通过调用 POST/auth/realms/{realm}/p
我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信。 收到消息时出现如下异常: Cannot find a token authenticator for the 'System.I
在尝试将数据插入到我的 SQl 数据库时,我收到以下错误 System.Data.SqlServerCe.SqlCeException: There was an error parsing the
使用数据库 session token 系统,我可以让用户使用用户名/密码登录,服务器可以生成 token (例如 uuid)并将其存储在数据库中并将该 token 返回给客户端。其上的每个请求都将包
我最近注册了 Microsoft Azure 并设置了认知服务帐户。使用 Text Translation API Documentation 中的说明我能够使用 interactive online
我使用 IAntiforgery API 创建了一个 ASP.Net Core 2 应用程序。 这提供了一种返回 cookie 的方法。 客户端获取该 cookie,并在后续 POST 请求中将该值放
我正在使用 spacy 来匹配某些文本(意大利语)中的特定表达式。我的文本可以多种形式出现,我正在尝试学习编写一般规则的最佳方式。我有如下 4 个案例,我想写一个适用于所有案例的通用模式。像这样的东西
我无法理解 oauth 2.0 token 的原则处理。 我的场景是,我有一个基于 web 的前端后端系统,带有 node.js 和 angular 2。用户应该能够在此站点上上传视频。然后创建一些额
我是一名优秀的程序员,十分优秀!