UIPI – User Interface Privilege Isolation – Parte 2


Na primeira parte desse artigo (UIPI – User Interface Privilege Isolation Part 1) vimos que o isolamento de privilégios de interface de usuário (UIPI) é um recurso de segurança que impede que a maioria das mensagens sejam recebidas de um remetente que possui nível de integridade inferior.

Vimos também que aplicação Broken Ping Pong, disponível em: http://msdn.microsoft.com/en-us/gg465097, não funciona quando o nível de integridade dos processos é diferente. O problema pode ser corrigido através do uso da API ChangeWindowMessageFilter que permite filtrar as mensagens que são exceção à regra e que consequentemente podem ser transmitidas entre processos com diferentes níveis de integridade.

Após a correção a aplicação irá funcionar independentemente se as duas instâncias possuírem o mesmo nível de integridade. Entretanto, não é sempre que temos acesso ao código da aplicação para realizar as alterações. Nesses casos, podemos contar com dois SHIMs para contornar a incompatibilidade, sendo:

Shim

Descrição

UIPIEnableStandardMsgs

Permite que a troca de mensagens comuns entre os processos

UIPIEnableCustomMsgs

Permite a troca de mensagens específicas entre os processos

 Vamos imaginar que não temos acesso ao código-fonte da aplicacao Broken Ping Pong. Antes de utilizar o SHIM, devemos identificar qual é a mensagem que é trocada entre os processos.

Uma maneira fácil de identificar a troca de mensagens entre processos é utilizar a ferramente SPY++ (SPYXX.EXE) que faz parte do Visual Studio. Para maiores detalhes da ferramenta acesse: http://msdn.microsoft.com/en-us/library/dd460725.aspx.

Execute a aplicação BrokenManagedPingPong.exe e depois o SPYXX.EXE. Siga as instruções da imagem a seguir para selecionar a tela da aplicação PingPong:

Clique com o botão direito no item selecionado que corresponde a tela do PingPong e clique no item Message do menu de contexto, conforme:

Na tela que será exibida, clique no item Logging Options do menu Message, conforme:

Na aba Messages, marque apenas o checkbox Registered para filtrarmos as mensagens que serão exibidas, conforme:

Observe que a mensagem que é trocada é BALL, conforme:

Uma vez que sabemos qual é a mensagem trocada pela aplicação, podemos utilizar o SHIM UIPIEnableCustomMsgs para permitir que a aplicação que estiver sendo executada elevada aceite a mensagem da aplicação executada com o nível de privilégio médio.

Siga os seguintes passos para criar o SHIM:

  1. Execute a ferramenta Compatibility Administrator que faz parte das ferramentas Microsoft Application Compatibility Toolkit 5.6
  2. Clique no ícone Fix ou pressione CTRL+P, conforme:

3. Informe a localização da aplicação:

4. Clique no botão Next, e na tela seguinte no botão Next novamente. Na tela a seguir, selecione o SHIM UIPIEnableCustomMsgs (não esqueça de selecionar o checkbox) e clique no botão Parameters (na imagem ficou um parcialmente sobreposto). Na tela de parametros, digite no primeiro campo o texto BALL que corresponde a mensagem que é trocada pela aplicação. No campo module name, digite * e clique no botão Add. Clique no botão OK, Next e Finish.

5. Salve o SHIM. Será exibida uma tela solicitando o nome do SHIM. Nomeie, por exemplo, para UIPIEnableCustomMsgsPingPong e salve por exemplo em C:\temp\UIPIEnableCustomMsgsPingPong.sdb.

6. Para instalar o SHIM, execute o prompt de comando elevado (run as administrator) e digite o seguinte comando:

sdbinst.exe c:\temp\UIPIEnableCustomMsgsPingPong.sdb

7. Execute duas instâncias da aplicação, sendo uma com o nível de privilégio default e a outra elevada.

Observe que a troca de mensagem irá ocorrer com sucesso independentemente do nível de privilégio das aplicações. 🙂

Comments (2)

  1. PT says:

    Muito bom Demétrio! Excelente artigo!

  2. Valeu PT! Existem também os artigos:

    http://bit.ly/1fEpblX – Controles de Integridade

    http://bit.ly/1eVBclU – UIPI – User Interface Privilege Isolation

Skip to main content