Segurança da Biblioteca Dynamic-Link
Quando um aplicativo carrega dinamicamente uma biblioteca de vínculo dinâmico sem especificar um nome de caminho totalmente qualificado, o Windows tenta localizar a DLL pesquisando um conjunto bem definido de diretórios em uma ordem específica, conforme descrito em Dynamic-Link Ordem de Pesquisa de Biblioteca. Se um invasor ganhar o controle de um dos diretórios no caminho de pesquisa da DLL, ele poderá colocar uma cópia mal-intencionada da DLL nesse diretório. Isso às vezes é chamado de de ataque de pré-carregamento de DLL de ou de ataque de plantio binário . Se o sistema não encontrar uma cópia legítima da DLL antes de pesquisar o diretório comprometido, ele carrega a DLL maliciosa. Se o aplicativo estiver sendo executado com privilégios de administrador, o invasor poderá ter êxito na elevação de privilégios locais.
Por exemplo, suponha que um aplicativo foi projetado para carregar uma DLL do diretório atual do usuário e falhar normalmente se a DLL não for encontrada. O aplicativo chama LoadLibrary com apenas o nome da DLL, o que faz com que o sistema procure a DLL. Supondo que o modo de pesquisa DLL segura esteja habilitado e o aplicativo não esteja usando uma ordem de pesquisa alternativa, o sistema pesquisa diretórios na seguinte ordem:
- O diretório do qual o aplicativo foi carregado.
- O diretório do sistema.
- O diretório do sistema de 16 bits.
- O diretório do Windows.
- O diretório atual.
- Os diretórios listados na variável de ambiente PATH.
Continuando o exemplo, um invasor com conhecimento do aplicativo ganha o controle do diretório atual e coloca uma cópia maliciosa da DLL nesse diretório. Quando o aplicativo emite a chamada LoadLibrary, o sistema procura a DLL, localiza a cópia maliciosa da DLL no diretório atual e a carrega. A cópia maliciosa da DLL é executada dentro do aplicativo e ganha os privilégios do usuário.
Os desenvolvedores podem ajudar a proteger seus aplicativos contra ataques de pré-carregamento de DLL seguindo estas diretrizes:
Sempre que possível, especifique um caminho totalmente qualificado ao usar o LoadLibrary, LoadLibraryEx, CreateProcessou funções ShellExecute.
Use os sinalizadores de LOAD_LIBRARY_SEARCH com a funçãoLoadLibraryEx ou use esses sinalizadores com a funçãoSetDefaultDllDirectoriespara estabelecer uma ordem de pesquisa de DLL para um processo e, em seguida, use o AddDllDirectory ou funções de SetDllDirectory para modificar a lista. Para obter mais informações, consulte Dynamic-Link Ordem de Pesquisa de Biblioteca.
Windows 7, Windows Server 2008 R2, Windows Vista e Windows Server 2008: Esses sinalizadores e funções estão disponíveis em sistemas com KB2533623 instalados.
Em sistemas com KB2533623 instalados, use os sinalizadores de LOAD_LIBRARY_SEARCH com a funçãoLoadLibraryEx ou use esses sinalizadores com a funçãoSetDefaultDllDirectoriespara estabelecer uma ordem de pesquisa de DLL para um processo e, em seguida, use o AddDllDirectory ou funções de SetDllDirectory para modificar a lista. Para obter mais informações, consulte Dynamic-Link Ordem de Pesquisa de Biblioteca.
Considere usar de redirecionamento de DLL ou uma de manifesto para garantir que seu aplicativo use a DLL correta.
Ao usar a ordem de pesquisa padrão, certifique-se de que o modo de pesquisa DLL segura está ativado. Isso coloca o diretório atual do usuário mais tarde na ordem de pesquisa, aumentando as chances de que o Windows encontre uma cópia legítima da DLL antes de uma cópia maliciosa. O modo de pesquisa Safe DLL é ativado por padrão a partir do Windows XP com Service Pack 2 (SP2) e é controlado pelo HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode valor do Registro. Para obter mais informações, consulte Dynamic-Link Ordem de Pesquisa de Biblioteca.
Considere remover o diretório atual do caminho de pesquisa padrão chamando SetDllDirectory com uma cadeia de caracteres vazia (""). Isso deve ser feito uma vez no início da inicialização do processo, não antes e depois das chamadas para LoadLibrary. Lembre-se de que SetDllDirectory afeta todo o processo e que vários threads chamando SetDllDirectory com valores diferentes podem causar comportamento indefinido. Se o seu aplicativo carregar DLLs de terceiros, teste cuidadosamente para identificar quaisquer incompatibilidades.
Não use a função SearchPath para recuperar um caminho para uma DLL para uma chamadaLoadLibrarysubsequente, a menos que o modo de pesquisa de processo seguro esteja habilitado. Quando o modo de pesquisa de processo seguro não está habilitado, a função SearchPath usa uma ordem de pesquisa diferente da LoadLibrary e é provável que primeiro pesquise o diretório atual do usuário para a DLL especificada. Para habilitar o modo de pesquisa de processo seguro para a função SearchPath, use a funçãoSetSearchPathMode com BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Isso move o diretório atual para o final do SearchPath lista de pesquisa durante a vida útil do processo. Observe que o diretório atual não é removido do caminho de pesquisa, portanto, se o sistema não encontrar uma cópia legítima da DLL antes de chegar ao diretório atual, o aplicativo ainda estará vulnerável. Tal como acontece com SetDllDirectory, chamar SetSearchPathMode deve ser feito no início da inicialização do processo e afeta todo o processo. Se o seu aplicativo carregar DLLs de terceiros, teste cuidadosamente para identificar quaisquer incompatibilidades.
Não faça suposições sobre a versão do sistema operacional com base em uma chamada de LoadLibrary que procura uma DLL. Se o aplicativo estiver sendo executado em um ambiente onde a DLL não está legitimamente presente, mas uma cópia maliciosa da DLL está no caminho de pesquisa, a cópia maliciosa da DLL pode ser carregada. Em vez disso, use as técnicas recomendadas descritas em Obtendo a versão do sistema.
A ferramenta Process Monitor pode ser usada para ajudar a identificar operações de carregamento de DLL que podem ser vulneráveis. A ferramenta Process Monitor pode ser descarregada a partir de https://technet.microsoft.com/sysinternals/bb896645.aspx.
O procedimento a seguir descreve como usar o Process Monitor para examinar operações de carregamento de DLL em seu aplicativo.
Para usar o Process Monitor para examinar as operações de carregamento de DLL em seu aplicativo
- Inicie o Monitor de Processo.
- No Process Monitor, inclua os seguintes filtros:
- A operação é CreateFile
- A operação é LoadImage
- O caminho contém .cpl
- O caminho contém .dll
- O caminho contém .drv
- O caminho contém .exe
- O caminho contém .ocx
- O caminho contém .scr
- O caminho contém .sys
- Exclua os seguintes filtros:
- O nome do processo é procmon.exe
- O nome do processo é Procmon64.exe
- Nome do processo é Sistema
- A operação começa com IRP_MJ_
- A operação começa com FASTIO_
- Resultado é SUCESSO
- O caminho termina com pagefile.sys
- Tente iniciar seu aplicativo com o diretório atual definido para um diretório específico. Por exemplo, clique duas vezes em um arquivo com uma extensão cujo manipulador de arquivos é atribuído ao seu aplicativo.
- Verifique a saída do Process Monitor para caminhos que pareçam suspeitos, como uma chamada para o diretório atual para carregar uma DLL. Esse tipo de chamada pode indicar uma vulnerabilidade em seu aplicativo.