2011-06-22 7 views
9

J'ai des parties de mon programme qui nécessitent un accès administratif (les paramètres qui affectent tous les utilisateurs, stockés dans HKLM, et sont limités à l'accès administratif).Comment faire IPC avec élévation UAC en toute sécurité?

j'ai changé mon logiciel pour indiquer que l'altitude est nécessaire:

enter image description here

En réponse, je vais lancer mon exécutable en demande d'élévation:

SHELLEXECUTEINFO shExecInfo; 
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
shExecInfo.fMask = NULL; 
shExecInfo.hwnd = NULL; 
shExecInfo.lpVerb = L"runas"; 
shExecInfo.lpFile = L"myapp.exe"; 
shExecInfo.lpParameters = NULL; 
shExecInfo.lpDirectory = NULL; 
shExecInfo.nShow = SW_MAXIMIZE; 
shExecInfo.hInstApp = NULL; 
ShellExecuteEx(&shExecInfo); 

ce que je aller faire est de passer le nom d'un tuyau nommé sur la ligne de commande, en me disant où il peut se connecter à nouveau afin d'obtenir des instructions sur ce qu'il est censé faire:

myapp.exe /uac 6C844671-E262-46DD-939E-47517F105FB6 

(Oui, en utilisant un GUID comme nom du tuyau).

A travers ce tuyau, je voudrais dire à mon clone élevé que la base de données, par exemple:

  • quelle base de données serveur, il est censé être connecté à
  • l'utilisateur qu'il doit dire faire les changements
  • la chose Je devais ajouter/modifier/supprimer

Mon souci était alors que n'importe qui pouvait lancer myapp.exe, et ensuite le nourrir toutes sortes de demandes - les choses que je ne veux pas qu'il d o causer i n'a pas le lancer, par exemple:

MaliciousProgram.exe:

ShellExecute("myapp.exe /uac HahaYouDoWhatISayNow") 

Je me souviens au cours de la bêta Longhorn il y avait une vidéo Channel9, ou un article, en parlant de contrôle de compte et les dangers du mal de faire IPC (communication inter-processus). Je ne veux pas réinventer la roue, en faisant des erreurs de sécurité qui ont déjà été résolues. Mais je ne peux pas trouver de conseils existants sur la façon "correcte" de faire IPC avec UAC élévation. Qu'est-ce qu'il a accepté modèle pour faire IPC de communiquer avec processus élevé engendré pour les actions élevées temporaires?

Quoi?


Edit: disciples combinés de uac et ipc tags: 53

+0

Je me demande - cela fait environ cinq ans que vous avez posé la question. Avez-vous déjà trouvé une solution satisfaisante? –

Répondre

2

Je ne crois pas qu'il y ait un problème de sécurité ici (avec certaines mises en garde comme il est indiqué ci-dessous). Si l'utilisateur ne peut pas élever, cette solution ne fonctionnera pas de toute façon; Si l'utilisateur peut s'élever et est malveillant, la machine est déjà compromise. Par exemple, si un utilisateur malveillant souhaite effectuer des modifications dans HKLM, pourquoi utiliser myapp.exe lorsque regedit est disponible? Cependant, je suis confus par votre mention d'une base de données de serveur; Comment cela correspond-il à l'exigence d'élévation? En général, l'élévation n'est pas nécessaire pour accéder aux ressources distantes. (Si soit myapp.exe ou HKLM contient un mot de passe pour la base de données du serveur.)

En ce qui concerne le choix de l'IPC: je ne suis pas expert en programmation UAC, mais en recherchant MSDN, j'ai remarqué que les objets COM élevés sont mentionnés à plusieurs reprises, par exemple:

http://msdn.microsoft.com/en-us/magazine/cc163486.aspx

pouvez aussi consulter les diapositives powerpoint à la cinquième lien dans cet article:

http://msdn.microsoft.com/en-us/library/bb756996.aspx

Toutefois, si vous n'êtes pas satisfait de COM (joindre à la club!) puis en utilisant un tuyau nommé comme vous le suggérez devrait être tout aussi efficace. Vous devez cependant prendre les précautions habituelles nécessaires pour les canaux nommés - assurez-vous de créer l'extrémité serveur du canal nommé avant de lancer le processus élevé, de vérifier si le canal existe déjà et de le créer avec une liste de contrôle d'accès appropriée. .

+0

Le problème est que si mon processus ** élevé ** écoute sur un canal: rien n'empêche un processus ** non-élevé ** d'envoyer des commandes sur le même canal. Pire encore serait le processus non-élevé exploitant un bogue de débordement de tampon dans mon code. Maintenant, un processus non-élevé est capable d'exécuter du code arbitraire élevé. –

+0

Vous avez juste besoin de régler l'ACL sur le tuyau correctement. Définir nMaxInstances sur 1 serait également une précaution raisonnable. Si vous vous sentez particulièrement paranoïaque, vous pouvez hacher les instructions que vous allez envoyer au processus privilégié et inclure le hachage sur la ligne de commande. –

+0

Rappelez-vous également que tout processus non-élevé s'exécutant dans le même compte utilisateur sera toujours capable de subvertir votre processus non-élevé s'il veut envoyer des instructions malveillantes au processus élevé. Par conséquent, vous devez seulement protéger le canal contre d'autres comptes d'utilisateur; essayer de le protéger contre d'autres processus dans le même compte serait inutile. –

Questions connexes