Привилегия Windows Vista/Windows 7: SeDebugPrivilege & OpenProcess

Все, что я смог найти в отношении перехода к соответствующим привилегиям для моих нужд, согласуется с моими нынешними методами, но проблема существует. Я надеюсь, что у кого-то есть опыт работы с внутренними компонентами Windows Vista/Windows 7, который может пролить свет на темноту. Я уверен, что это будет долго, но, пожалуйста, потерпите меня.

контекст

Я работаю над приложением, которое требует доступа к памяти других процессов на текущем компьютере. Это, очевидно, требует прав администратора. Это также требует SeDebugPrivilege (нет, это не опечатка SetDebugPrivilege), который, как я считаю, я получаю правильно, хотя я сомневаюсь, что больше привилегий не нужно и, следовательно, причина моих проблем. До сих пор код успешно работал во всех версиях Windows XP, а также в моей тестовой 64-битной среде Vista и Windows 7.

Процесс

  • Программа всегда будет работать с правами администратора. Это можно предположить на протяжении всего этого поста.
  • Эскалация текущего процесса Access Token включать SeDebugPrivilege прав.
  • С помощью EnumProcesses создать список текущих PID в системе
  • Открытие ручки с помощью OpenProcess с PROCESS_ALL_ACCESS права доступа
  • С помощью ReadProcessMemory читать память другого процесса.

Проблема:

Все работало нормально во время разработки и моего личного тестирования (включая Windows XP 32 и 64, Windows Vista 32 и Windows 7 x64). Однако во время тестового развертывания на компьютерах Windows Vista (32-разрядной) и Windows 7 (64-разрядной) коллеги, кажется, возникает проблема с привилегиями / правами OpenProcess терпеть неудачу с общим Access Denied ошибка. Это происходит как при работе от имени ограниченного пользователя (как и следовало ожидать), так и при явном запуске от имени администратора (щелкните правой кнопкой мыши → Запуск от имени администратора и при запуске из командной строки уровня администратора).

Однако эта проблема была невоспроизводимой для меня в моей тестовой среде. Я был свидетелем проблемы из первых рук, поэтому я верю, что проблема существует. Единственное различие, которое я могу различить между фактической средой и моей тестовой средой, заключается в том, что настоящая ошибка возникает при использовании учетной записи администратора домена в приглашении UAC, тогда как в моих тестах (которые работают без ошибок) используется учетная запись локального администратора на UAC подскажите.

Похоже, что хотя используемые учетные данные позволяют UAC "работать от имени администратора", процесс все еще не получает правильные права, чтобы иметь возможность OpenProcess на другом процессе. Я недостаточно знаком с внутренними компонентами Vista / Windows 7, чтобы знать, что это может быть, и я надеюсь, что кто-то имеет представление о том, что может быть причиной.

Кикер

Человек, который сообщил об этой ошибке, и окружение которого может регулярно воспроизводить эту ошибку, имеет небольшое приложение, названное так: RunWithDebugEnabled это небольшая программа начальной загрузки, которая, по-видимому, наращивает свои собственные привилегии, а затем запускает исполняемый файл, переданный ей (таким образом, наследуя расширенные привилегии). При запуске с этой программой, используя те же учетные данные администратора домена в приглашении UAC, программа работает правильно и может успешно вызвать OpenProcess и работает как задумано.

Так что это определенно проблема с получением правильных привилегий, и известно, что учетная запись администратора домена является учетной записью администратора, которая должна иметь доступ к правильным правам. (Очевидно, что получить этот исходный код было бы здорово, но я не был бы здесь, если бы это было возможно).

Заметки

Как отмечается, ошибки, о которых сообщают OpenProcess попытки Access Denied, Согласно документации MSDN OpenProcess:

Если вызывающая сторона включила привилегию SeDebugPrivilege, запрошенный доступ предоставляется независимо от содержимого дескриптора безопасности.

Это приводит меня к мысли, что, возможно, в этих условиях существует проблема либо с (1) получением SeDebugPrivileges или (2) Требование других привилегий, которые не были упомянуты в какой-либо документации MSDN, и которые могут отличаться между учетной записью администратора домена и учетной записью локального администратора

Образец кода:

void sample()
{
   /////////////////////////////////////////////////////////
   //   Note: Enabling SeDebugPrivilege adapted from sample
   //     MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
   // Enable SeDebugPrivilege
   HANDLE hToken = NULL;
   TOKEN_PRIVILEGES tokenPriv;
   LUID luidDebug;
   if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
   {
      if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
      {
         tokenPriv.PrivilegeCount           = 1;
         tokenPriv.Privileges[0].Luid       = luidDebug;
         tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
         if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
         {
            // Always successful, even in the cases which lead to OpenProcess failure
            cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
         }
         else
         {
            cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
         }
      }
   }
   CloseHandle(hToken);
   // Enable SeDebugPrivilege
   /////////////////////////////////////////////////////////

   vector<DWORD> pidList = getPIDs();  // Method that simply enumerates all current process IDs

   /////////////////////////////////////////////////////////
   // Attempt to open processes
   for(int i = 0; i < pidList.size(); ++i)
   {
      HANDLE hProcess = NULL;
      hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
      if(hProcess == NULL)
      {
         // Error is occurring here under the given conditions
         cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
      }
      CloseHandle(hProcess);
   }
   // Attempt to open processes
   /////////////////////////////////////////////////////////
}




Спасибо!

Если у кого-то есть представление о возможных разрешениях, привилегиях, правах и т. Д., Которые мне могут не хватать, чтобы правильно открыть другой процесс (при условии, что исполняемый файл был правильно запущен с правами "Запуск от имени администратора") в Windows Vista и Windows 7 при указанных выше условиях., это было бы очень высоко ценится.

Я не был бы здесь, если бы не был полностью озадачен, но я надеюсь, что снова опыт и знания группы сияют ярко. Я благодарю вас за то, что вы нашли время прочитать эту стену текста. Мы ценим только добрые намерения, спасибо за то, что вы такой тип людей, который делает переполнение стека таким полезным для всех!

1 ответ

Решение

Так что после долгих отладок и беспокойства большого количества людей об информации, я наконец смог отследить парня, который написал RunWithDebugEnabled приложение и получить краткое изложение того, как оно работает.

Проблема в этом случае заключается в том, что Debug programs привилегия в локальной политике для администратора домена была удалена, и, таким образом, SeDebugPrivilege токен отсутствует в токене доступа процесса. Его нельзя включить, если его вообще нет, и я до сих пор не знаю, как добавить привилегию к существующему токену доступа.


Как работает текущая магия:
Итак RunWithDebugEnabled Волшебное приложение будет использовать свои права администратора, чтобы установить себя в качестве службы и запустить себя, таким образом, работая под SYSTEM учетная запись пользователя, а не администратор домена. С SYSTEM привилегии, приложение затем создает новый токен доступа, который идентичен токену администратора, только с SeDebugPrivilege токен присутствует. Этот новый токен используется для CreateProcessAsUser() и запустите программу с новым включенным SeDebugPrivilege чего раньше не было

На самом деле мне здесь не нравится это "решение", и я продолжаю поиски "более чистого" способа получения этой привилегии. Я буду публиковать это как еще один вопрос здесь, на SO, который я постараюсь не забыть, чтобы связать здесь также, чтобы помочь другим следовать и для дальнейшего использования.

РЕДАКТИРОВАТЬ: олицетворять СИСТЕМУ (или эквивалент) из учетной записи администратора



Я благодарю всех вас за ваше время и силы, помогающие отладить и решить эту проблему. Это действительно высоко ценится!

Другие вопросы по тегам