Share via


Negação de Serviço

Uma negação de serviço ocorre quando o acesso a um determinado serviço deveria ter sido concedido, mas na verdade foi rejeitado incorretamente. Por exemplo, qualquer operação que um aplicativo sem privilégios possa executar que faça com que o sistema se torne inutilizável é efetivamente uma negação de serviço. Isso incluiria qualquer operação ou sequência de operações que:

  • Falha no sistema.

  • Causa o encerramento prematuro de threads ou processos.

  • Cria uma condição de deadlock. Um deadlock ocorre quando dois ou mais threads são interrompidos aguardando em um estado permanente de impasse. Cada thread está aguardando um recurso mantido por um dos outros threads.

  • Cria uma condição de bloqueio dinâmico. Um bloqueio dinâmico pode ocorrer quando dois ou mais processadores não podem progredir porque estão esperando para adquirir um recurso (normalmente um bloqueio em uma fila) e o thread que possui esse recurso está em um estado semelhante que não está em andamento.

Esses problemas geralmente surgem em drivers porque contêm bugs latentes que podem ser explorados por aplicativos normais. Explorações desse tipo podem ser simples e são difíceis de proteger. As causas comuns desses problemas em drivers incluem:

  • Validação incorreta do buffer de usuário.

  • Estouro de buffer ou subfluxo.

Para sistemas de arquivos e drivers de filtro do sistema de arquivos, há vários casos desses problemas. Por exemplo, o valor MAX_PATH é definido como 260 por motivos históricos no subsistema Win32. Muitos componentes de driver pressupõem que isso indica o tamanho do maior caminho. Infelizmente, esse não é o caso, pois o caminho máximo em um sistema de arquivos NTFS é de 32.767 caracteres Unicode (65.534 bytes). Se um driver de filtro codificasse uma suposição de comprimento MAX_PATH em sua base de código, um ataque simples de negação de serviço surgiria de um aplicativo criando um caminho maior do que esse em um caminho gerenciado pelo driver de filtro.

Outro problema comum é que os aplicativos geralmente inserem ponteiros de modo de usuário em solicitações FSCTL privadas. Um sistema de arquivos está sujeito a três categorias amplas de ataques de negação de serviço:

  • Consumindo todo o espaço em disco disponível.

  • Usando toda a largura de banda de disco disponível.

  • Bloquear o acesso a arquivos aos quais os usuários devem ter acesso.

Normalmente, há pouco que um desenvolvedor de sistema de arquivos pode fazer para evitar esses tipos de ataques. No entanto, há etapas que podem ser executadas pelos desenvolvedores para permitir que os administradores limitem esses tipos de ataques de negação de serviço.

O ataque de negação de serviço mais simples envolvendo o sistema de arquivos é usar todo o espaço livre em disco. É simples escrever um aplicativo para fazer isso e as consequências são de longo alcance. Muitos aplicativos e serviços no sistema não funcionarão se não puderem mais gravar em disco. A tecnologia de mitigação são cotas de disco, que podem limitar a quantidade de espaço em disco disponível para arquivos pertencentes a um usuário quando usados corretamente pelos administradores. Portanto, faz sentido incluir suporte para cotas de disco ao desenvolver um sistema de arquivos.

Um aplicativo mal-intencionado ou mal escrito também pode tentar consumir toda a largura de banda do disco. As consequências para usuários regulares sujeitos a esse tipo de ataque são um sistema lento ou sem resposta. Atualmente, o sistema operacional não tem mecanismo para limitar a largura de banda consumida pelos aplicativos. Um sistema de arquivos também consome memória de kernel para cada objeto de arquivo aberto e identificador de arquivo. Um aplicativo mal-intencionado pode tentar abrir continuamente um grande número de arquivos e mantê-los abertos até que a memória seja esgotada. A principal técnica de mitigação para esses problemas é a auditoria e o registro em log para que um administrador possa monitorar o computador em busca de aplicativos que executam uma grande quantidade de E/S ou use grandes quantidades de outros recursos. Novamente, seria criterioso que os drivers de filtro do sistema de arquivos e do sistema de arquivos incluíssem o suporte à auditoria para poder minimizar esse tipo de negação de serviço.

Um aplicativo mal-intencionado pode tentar impedir que outros usuários acessem os arquivos necessários para uso normal. Uma estratégia importante para minimizar esses problemas é garantir que as informações de segurança associadas a objetos de arquivo sejam implementadas corretamente ao desenvolver sistemas de arquivos.

Por fim, todos os drivers precisam se preocupar em consumir toda a memória disponível ou outros recursos em resposta a solicitações de um aplicativo mal-intencionado ou aberrant.