【问题标题】:Why this code can not change(lower) the integrity level of the file?为什么这段代码不能改变(降低)文件的完整性级别?
【发布时间】:2019-09-27 21:51:32
【问题描述】:

我编写了代码来更改对象(不是进程)(在本例中为文件)的完整性级别。正如我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行一个完整性低的 .txt 文件,而不是默认介质。

我主要为此目的使用 WINAPI。所以我创建了一个 .txt 文件以将其完整性从中等降低到低。

void SetLowLabelToFile()
{
    int k = 0;
    // The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity 
#define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
    DWORD dwErr = ERROR_SUCCESS;
    PSECURITY_DESCRIPTOR pSD = NULL;

    PACL pSacl = NULL; // not allocated
    BOOL fSaclPresent = FALSE;
    BOOL fSaclDefaulted = FALSE;
    LPCWSTR pwszFileName = L"C:\\Users\\Dan\\Documents\\testIntegrity\\hi1.txt";

    if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
        LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL))
    {
        k = GetLastError();
        if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl,
            &fSaclDefaulted))
        {
            k = GetLastError();

            // Note that psidOwner, psidGroup, and pDacl are 
            // all NULL and set the new LABEL_SECURITY_INFORMATION
            dwErr = SetNamedSecurityInfoW((LPWSTR)pwszFileName,
                SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION,
                NULL, NULL, NULL, pSacl);
            k = GetLastError();

        }
        LocalFree(pSD);
    }
}

我设置了 3 个 GetLastErrors 来获取错误代码,最后一个是 1008。这意味着 An attempt was made to reference a token that does not exist。我没有得到它,因为文件的方式是有效的。谁能帮忙解决这个问题?

【问题讨论】:

  • 您错误地使用 GetLastError() - 在错误的地方。如果 ConvertStringSecurityDescriptorToSecurityDescriptorW 和 GetSecurityDescriptorSacl 返回 true - 调用 GetLastError() - 没有意义。 SetNamedSecurityInfoW 根本没有设置 GetLastError() 而是直接返回错误代码。除了这个 - 你的代码是正确的

标签: c windows winapi


【解决方案1】:

数据文件没有完整性级别。流程具有完整性级别。

您不能“运行 .txt 文件”,而是运行一个“应用程序”,然后 加载 .txt 文件。 “应用程序”必须以低完整性级别运行,而不是 .txt 文件本身。

从代码中启动低完整性进程的正确方法是:

  • 让您的代码使用OpenProcessToken()DuplicateTokenEx() 复制其当前进程句柄。

  • 使用SetTokenInformation() 将该访问令牌中的完整性级别设置为低。

  • 使用CreateProcessAsUser() 创建一个使用低完整性访问令牌的新进程。

在 MSDN 上有一个这样的例子(在 C# 中):

Create low-integrity process in C# (CSCreateLowIntegrityProcess)

【讨论】:

  • ,感谢您的回答,但这是什么情况? link
  • 数据文件没有完整性级别 - 是的,但是任何具有安全描述符的对象都可以在 SACL 中具有完整性标签。我们可以设置它
  • 另一种方式-使用CreateProcess创建处于挂起状态的进程,打开它的令牌,设置低完整性级别,然后恢复
  • SACL 中的mandatory label 设置对象的完整性级别。如果未标记对象,则隐式对象处于中等完整性级别。这是强制访问控制的基本组成部分,结合了令牌的完整性级别和mandatory policy。链接的示例依赖于此来证明低完整性进程可以写入LocalAppDataLow,但不能写入LocalAppData
  • 请注意,如果可执行文件处于较低级别,则强制策略中的“new-process-min”规则会导致生成的进程的完整性级别低于父级。此策略是为标准登录设置的,在这种情况下,从中等完整性标准登录运行低完整性可执行文件将产生低完整性进程。但是,通常不会为高完整性(提升)登录设置此策略,并且不能针对正在使用的主令牌修改此策略。
猜你喜欢
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多