Question

Tout ce que je suis en mesure de trouver l'escalade des privilèges appropriés pour mes besoins a accepté avec mes méthodes actuelles, mais le problème existe. J'espère peut-être que quelqu'un a une / Windows Vista Windows 7 expérience qui pourrait internals briller un peu de lumière là où il n'y a que l'obscurité. Je suis sûr que cela va être longue, mais faire preuve de patience.

Contexte

Je travaille sur une application qui nécessite l'accès à la mémoire des autres processus sur la machine actuelle. Cela, évidemment, des droits d'administrateur. Elle exige également SeDebugPrivilege (non, ce n'est pas une faute d'orthographe SetDebugPrivilege), que je me crois être correctement acquiert, bien que je me demande si plus de privilèges ne sont pas nécessaires et donc la cause de mes problèmes. Code a jusqu'à présent travaillé avec succès sur toutes les versions de Windows XP et Vista sur mon test 32 bits et Windows 7 64 bits environnements.

Procédés

  • Programme Toujours être exécuté avec des droits d'administrateur. On peut supposer tout au long de ce poste.
  • Access Token de l'escalade du processus actuel pour inclure les droits SeDebugPrivilege.
  • Utilisation EnumProcesses pour créer une liste de PID en cours sur le système
  • Ouverture d'une poignée à l'aide OpenProcess avec des droits d'accès PROCESS_ALL_ACCESS
  • Utilisation ReadProcessMemory pour lire la mémoire de l'autre processus.

Problème:

Tout a fonctionné très bien au cours du développement et de mes tests personnels (y compris Windows XP 32 et 64, Windows Vista 32 et 64 bits de Windows 7). Cependant, lors d'un déploiement de test sur les deux machines Windows Vista (32 bits) et Windows 7 (64 bits) d'un collègue, il semble y avoir un problème privilège / droit avec OpenProcess défaut avec une erreur de Access Denied générique. Cela se produit à la fois lors de l'exécution en tant qu'utilisateur limité (comme on pouvait s'y attendre) et aussi lorsqu'il est exécuté explicitement en tant qu'administrateur (clic droit ? Exécuter en tant qu'administrateur et lorsqu'il est exécuté à partir d'une commande de niveau administrateur rapide).

Cependant, ce problème pour moi-même a été unreproducible dans mon environnement de test. J'ai été témoin du problème de première main, donc je fais confiance que le problème existe. La seule différence que je peux discerner entre l'environnement réel et mon environnement de test est que la réelle erreur se produit lorsque vous utilisez un compte administrateur de domaine à l'invite UAC, alors que mes tests (qui fonctionnent sans erreur) utiliser un compte d'administrateur local à l'invite UAC.

Il semble que même si les informations d'identification utilisées permettent de contrôle de compte « Exécuter en tant qu'administrateur », le processus est toujours pas obtenir les droits appropriés pour pouvoir OpenProcess sur un autre processus. Je ne suis pas assez familier avec le fonctionnement interne de Vista / Windows 7 pour savoir ce que cela pourrait être, et j'espère que quelqu'un a une idée de ce qui pourrait être la cause.

Le Kicker

La personne qui a signalé cette erreur, et qui est l'environnement peut régulièrement reproduire ce bogue, a une petite application nommée le long des lignes de RunWithDebugEnabled qui est un petit programme d'amorçage qui semble intensifier ses propres privilèges, puis lancez l'exécutable est passé à elle (héritant ainsi les privilèges élevés). Lors de l'exécution de ce programme, en utilisant les mêmes informations d'identification administrateur de domaine à l'invite UAC, le programme fonctionne correctement et est en mesure d'appeler avec succès OpenProcess et fonctionne comme prévu.

C'est donc sans aucun doute un problème avec l'acquisition des droits d'accès appropriés,et il est connu que le compte administrateur de domaine un compte administrateur qui devrait être en mesure d'accéder aux droits corrects. (Il est évident que l'obtention de ce code source serait génial, mais je ne serais pas ici si cela était possible).

Remarques

Comme indiqué, les erreurs signalées par l'échec les tentatives de OpenProcess sont Access Denied. Selon la documentation MSDN de OpenProcess :

  

Si l'appelant a permis le privilège SeDebugPrivilege, l'accès demandé est accordé quel que soit le contenu du descripteur de sécurité.

Cela conduit moi à croire que peut-être il y a un problème dans ces conditions, soit avec (1) Obtenir SeDebugPrivileges ou (2) exiger d'autres privilèges qui ne sont pas mentionnés dans la documentation MSDN, et qui peut varier entre un compte administrateur de domaine et un compte d'administrateur local

Exemple de code:

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
   /////////////////////////////////////////////////////////
}



Merci!

Si quelqu'un a une idée de ce que les autorisations possibles, les privilèges, les droits, etc. que je manquerai d'ouvrir correctement un autre processus (en supposant que l'exécutable a été correctement ed « Exécuter en tant qu'administrateur ») sous Windows Vista et Windows 7 sous les conditions ci-dessus, il serait plus grandement apprécié.

Je ne serais pas ici si je ne absolument perplexe, mais je suis plein d'espoir qu'une fois de plus l'expérience et la connaissance du groupe BRILLE. Je vous remercie d'avoir pris le temps de lire ce mur de texte. Les bonnes intentions seules sont appréciées, merci d'être le genre de personne qui fait le débordement de pile si utile à tous!

Était-ce utile?

La solution

Donc, après beaucoup de débogage et dérange beaucoup de gens pour l'information, j'ai enfin pu retrouver le gars qui a écrit l'application RunWithDebugEnabled et obtenir un aperçu de la façon dont il fonctionne.

Le problème, dans ce cas, est que le privilège Debug programs dans la politique locale pour l'administrateur de domaine avait été supprimé, et donc le jeton SeDebugPrivilege n'a pas été présent dans le jeton d'accès du processus. Il ne peut pas être activé si ce n'est pas présent du tout, et je sais encore aucun moyen d'ajouter le privilège d'un jeton d'accès existant.


Comment fonctionne la magie actuelle: Ainsi, l'application magique RunWithDebugEnabled utiliserait ses droits d'administrateur pour installer lui-même en tant que service et se lancer, en cours d'exécution ainsi sous l'utilisateur SYSTEM compte plutôt que l'administrateur de domaine. Avec des privilèges SYSTEM, l'application crée alors un nouveau jeton d'accès qui est identique au jeton Administrateur, uniquement avec le SeDebugPrivilege présent jeton. Ce nouveau jeton est utilisé pour CreateProcessAsUser() et exécuter le programme avec le nouveau permis SeDebugPrivilege qui manquait auparavant.

Je ne fait pas comme cette « solution » ici, et ont poursuivi ma recherche d'un moyen de « propre » pour obtenir ce privilège. Je vais poster cela comme une autre question ici sur le SO, que je vais essayer de se rappeler de lien ici et d'aider les autres suivent le long et pour référence future.

EDIT: Impersonate SYSTEM (ou équivalent) de compte administrateur


Je vous remercie tous pour votre temps et d'énergie pour aider à déboguer et à résoudre ce problème. Il est vraiment très apprécié!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top