Iniciando processos no Windows sem deixar rastros de quem o criou

No Windows, cada processo é criado por um invocador, chamado de processo “pai”, no qual cria este processo, para alocar algum executável, thread ou binário na memória. Nisso, este processo criado fica identificado por ter sido chamado pelo pai, e torna fácil o rastreio de threads, movimentos no registro e demais operações no sistema operacional.

Antes de começarmos, temos que entender que um processo não é apenas um programa que está sendo executado em segundo plano, mas é uma forma do sistema operacional gerenciar memória, endereços e mapeamento virtual para uma determinada tarefa.

Casualmente, a chamada de programas executáveis cria um processo para o mesmo, então, dedura o seu “pai”. É possível contornar este processo primordial, criando um processo atráves de outro processo pai. Assim, o criador do nosso processo é outro “pai”, com isso, a identidade do invocador original não é revelada diretamente no sistema.

Uma forma recentemente descoberta, nos indica que o Agendador de Tarefas do Windows é uma boa ferramenta para se aproveitar disso. A técnica é: agendar uma execução de um programa para ser iniciado milissegundos após sua criação. Assim, o invocador pai do processo será o sistema (mais precisamente o processo svchost.exe) e não o criador da tarefa.

Com isso, dificulta muito o rastreio do objeto criado, uma vez que foi criado pelo sistema operacional e não outro processo.

Uma implementação escrita em C# mostra o quão simples é reproduzir a vulnerabilidade:

using using Microsoft.Win32.TaskScheduler;
// Microsoft.Win32.TaskScheduler necessário para execução do código
...
public static void ScheduleLaunch(string filename, string arguments)
{
    // Obtém o serviço de agendador de tarefas na máquina local
    using (TaskService ts = new TaskService())
    {
        int id = new Random().Next(1, 9999);

        // Cria uma definição de tarefa com um ID aleatório
        TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = "ID " + id;
        
        string taskID = @"WS" + id;
        
        // Cria uma ação que irá executar o processo
        td.Actions.Add(new ExecAction(filename, arguments, null));

        // Registra a tarefa na pasta raiz do sistema
        ts.RootFolder.RegisterTaskDefinition(taskID, td);

        // Executa a tarefa agendada
        ts.FindTask(taskID).Run();

        // Deleta a tarefa
        ts.RootFolder.DeleteTask(taskID);
    }
}

Chamando o método acima, o aplicativo irá invocar um executável, com argumentos, através do sistema de agendamentos de tarefas. Não é necessário os privilégios de administrador para este código funcionar. Abaixo, temos um exemplo do funcionamento com o Bloco de Notas:

Execução casual: processo “4812” correspondente ao Notepad.exe corresponde ao pai “10912”, o processo “pai” original.
Execução agendada: processo “980” correspondente ao Notepad.exe corresponde ao pai “1388”, um processo de hospedagem de processos “svchost.exe” do sistema.

Uma possível vulnerabilidade para execução não desejada

A criação de processos e seu rastreio é um importante fator na transparência de segurança do sistema, uma vez que é possível:

  • rastrear programas que executam e/ou instalam malwares no sistema;
  • rastrear programas que sequestram arquivos (ransoms/lockers);
  • rastrear scripts maliciosos;
  • rastrear movimentação suspeita no sistema;
  • todos os outros demais processos.

No script da execução, a tarefa é imediatamente excluída após o disparo da mesma, desta forma, não é possível localizar quem criou a tarefa.

A vulnerabilidade já foi encaminhada a Microsoft Corporation e foi testada nas últimas versões do Windows 10 e nas anteriores. Todas tiveram sucesso em sua execução.

Contudo, além desta, existem outras demais vulnerabilidades que não podem ser divulgadas por aí. Ao descobrir uma vulnerabilidade, o ideal é comunicar a divisão de segurança de tal produto/serviço.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *