Почему этот код не может изменить (понизить) уровень целостности файла? - PullRequest
0 голосов
/ 28 сентября 2019

Я написал код для изменения уровня целостности объекта (не процесса) (в данном случае файла).Как мы знаем, мы начинаем со среднего целочисленного уровня, но я хочу понизить его до «низкого».Я хочу запустить файл .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.Я не получил его, потому что путь к файлу действителен.Может ли кто-нибудь помочь решить проблему?

1 Ответ

1 голос
/ 28 сентября 2019

Файлы данных не имеют уровней целостности.Процессы имеют уровни целостности.

Вы не можете «запустить файл .txt», вы запускаете «приложение», которое затем загружает файл .txt.«Приложение» должно запускаться с низким уровнем целостности, а не сам файл .txt.

Правильный способ запустить процесс с низким уровнем целостности из вашего кода:

  • Сделайте так, чтобы ваш код дублировал свой текущий дескриптор процесса, используя OpenProcessToken() и DuplicateTokenEx().

  • Используйте SetTokenInformation(), чтобы установить уровень целостности в этом токене доступа дляНизкий.

  • Используйте CreateProcessAsUser() для создания нового процесса с использованием этого маркера доступа с низким уровнем целостности.

Есть пример этого (вC #) в MSDN:

Создание процесса с низким уровнем целостности в C # (CSCreateLowIntegrityProcess)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...