gpt4 book ai didi

c - 临时冒充和启用特权?

转载 作者:可可西里 更新时间:2023-11-01 10:40:33 26 4
gpt4 key购买 nike

我们维护一个 DLL,做很多与系统相关的事情;遍历文件系统、注册表等。此 DLL 的调用者可能使用也可能不使用模拟。为了更好地支持所有可能的场景,我正在尝试将其修改为更智能。我将使用删除文件的示例。目前我们只调用 DeleteFile(),如果失败,那就结束了。我想出了以下内容:

BOOL TryReallyHardToDeleteFile(LPCTSTR lpFileName)
{
// 1. caller without privilege
BOOL bSuccess = DeleteFile(lpFileName);
DWORD dwError = GetLastError();
if(!bSuccess && dwError == ERROR_ACCESS_DENIED)
{
// failed with access denied; try with privilege
DWORD dwOldRestorePrivilege = 0;
BOOL bHasRestorePrivilege = SetPrivilege(SE_RESTORE_NAME, SE_PRIVILEGE_ENABLED, &dwOldRestorePrivilege);
if(bHasRestorePrivilege)
{
// 2. caller with privilege
bSuccess = DeleteFile(lpFileName);
dwError = GetLastError();
SetPrivilege(SE_RESTORE_NAME, dwOldRestorePrivilege, NULL);
}
if(!bSuccess && dwError == ERROR_ACCESS_DENIED)
{
// failed with access denied; if caller is impersonating then try as process
HANDLE hToken = NULL;
if(OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_IMPERSONATE, TRUE, &hToken))
{
if(RevertToSelf())
{
// 3. process without privilege
bSuccess = DeleteFile(lpFileName);
dwError = GetLastError();
if(!bSuccess && dwError == ERROR_ACCESS_DENIED)
{
// failed with access denied; try with privilege
bHasRestorePrivilege = SetPrivilege(SE_RESTORE_NAME, SE_PRIVILEGE_ENABLED, &dwOldRestorePrivilege);
if(bHasRestorePrivilege)
{
// 4. process with privilege
bSuccess = DeleteFile(lpFileName);
dwError = GetLastError();
SetPrivilege(SE_RESTORE_NAME, dwOldRestorePrivilege, NULL);
}
}
SetThreadToken(NULL, hToken);
}
CloseHandle(hToken);
hToken = NULL;
}
}
}
if(!bSuccess)
{
SetLastError(dwError);
}
return bSuccess;
}

所以首先它会尝试作为调用者。如果访问被拒绝而失败,它会暂时启用调用者 token 中的特权并重试。如果由于访问被拒绝而失败并且调用者正在模拟,它会暂时取消模拟并重试。如果因访问被拒绝而失败,它会暂时启用进程 token 中的特权并重试。我认为这几乎可以处理任何情况,但我想知道是否有更好的方法来实现这一点?有很多操作我们可能希望使用此方法(即几乎所有访问安全对象的操作)。

最佳答案

备份和恢复权限一起将提供对所有文件的完全访问,句号。这些对 LocalSystem 可用。您必须使用 FILE_FLAG_BACKUP_SEMANTICS 打开文件才能使用它。某些 Win32 API 并非设计用于此,并且不会将标志传递给内核,尽管在某些情况下您可以使用 CreateFile 打开目录。 (对于内核而言,目录只是另一种文件)。

如果您真的需要能够访问所有内容,我会说启用这些权限并执行应该成功的扫描操作,而不管未模拟调用者的安全性如何。

一个突出的问题是文件可以被锁定或打开但不能共享访问权限。没有办法从用户模式解决这个问题(如果不杀死拥有该资源的进程,可能会矫枉过正)。这就是为什么我所知道的主流扫描器都使用内核模式文件系统过滤器驱动程序来实现此功能。

此外,请考虑审计:您是否希望审计条目显示给 LocalSystem 或与调用进程关联的用户?

关于c - 临时冒充和启用特权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com