Modelagem de ameaças para aplicações Node.js
31 de agosto de 2016
0 minutos de leituraEste artigo é uma publicação de convidado de Gergely Nemeth, CEO da RisingStack, que desenvolve o Trace by RisingStack para monitorar e depurar aplicações Node.js e microsserviços.
Contra o que devo proteger minha aplicação? Preciso me preocupar com ataques de Cross-Site Scripting? E com injeção de SQL? Devo me proteger contra falsificação de solicitação entre sites? A resposta curta é sim. Mas, como sempre, não é tão simples: dependendo de quem pode ser o atacante e do que ele consegue acessar (e de quanto isso vale), você precisa proteger sua aplicação de diferentes maneiras. Só faz sentido falar de segurança quando você sabe responder: “Protegido contra quem?” e “Protegido por quanto tempo?”
Por isso, você precisa modelar as ameaças à segurança do seu software. Uma das melhores soluções que você pode usar são as árvores de ataque.
O que são árvores de ataque?
As árvores de ataque oferecem uma maneira formal e metódica de descrever a segurança de sistemas diante de diferentes ataques. Basicamente, você representa os ataques contra um sistema em uma estrutura de árvore: o objetivo fica no nó raiz, e as diferentes maneiras de alcançá-lo ficam nos nós folha. - Bruce Schneier
Exemplo de árvore de ataque
Abaixo, você encontra uma árvore de ataque simplificada para um cofre físico, cujo objetivo óbvio para o atacante é abri-lo. Neste exemplo, há duas maneiras principais de fazer isso: arrombar a fechadura ou descobrir a combinação. Para descobrir a combinação, o atacante precisa subornar alguém ou escutar uma conversa às escondidas. Para conseguir isso, precisa ouvir uma conversa e fazer com que o alvo diga a combinação.

Depois de estabelecer as relações entre os objetivos, podemos atribuir valores a eles. Neste exemplo, os valores são possível (P) e impossível (I). Não se esqueça: algo é possível ou impossível do ponto de vista do atacante. Assim, se o atacante tiver muitos recursos financeiros, subornar alguém será possível. Do ponto de vista de um universitário, provavelmente seria impossível.
Depois de atribuir esses valores, você verá exatamente quais caminhos precisa proteger:

É claro que você também pode atribuir outros valores às folhas, como o custo do ataque.
Criando árvores de ataque para aplicações Node.js
Agora que você conhece o básico sobre árvores de ataque, é hora de aplicá-las às suas aplicações Node.js!
Primeiro, identifique os possíveis objetivos dos ataques: cada um deles formará uma árvore de ataque separada. Para cada objetivo, tente listar o máximo de ataques que conseguir imaginar e repita o processo para montar a árvore completa. É possível que diferentes árvores compartilhem a mesma subárvore — não tem problema.
Quando estiver satisfeito com suas árvores de ataque, você poderá usá-las para tomar decisões de segurança. Assim, será possível determinar se seu sistema está vulnerável a um determinado tipo de ataque, como Cross-Site Scripting ou falsificação de solicitação entre sites.
Você vai se surpreender com o que vai encontrar: a maioria das pessoas tenta proteger seus sistemas contra vetores de ataque que não deveriam ser prioridade, enquanto deixa grandes brechas de segurança sem solução.
Exemplo de árvore de ataque para uma aplicação Node.js
Vamos analisar a árvore de ataque de uma aplicação Node.js. Como nós, da RisingStack, desenvolvemos uma solução de monitoramento para Node.js, vou demonstrar uma árvore de ataque no universo do Trace.

A árvore de ataque que vou criar aqui tem um objetivo simples: contornar a autenticação, como no exemplo do cofre físico.

O exemplo acima mostra como alguém poderia contornar a autenticação em uma conta do Trace. A primeira subárvore mostra o caso de um cookie roubado. No nosso exemplo, o roubo do cookie seria possível devido a uma dependência insegura.
Para tornar seus cookies mais seguros, você pode ativar o modo Secure. Esse atributo informa ao navegador que ele só deve enviar o cookie quando a solicitação for feita por HTTPS.
Você também pode reduzir a duração de um cookie. Assim, mesmo que ele seja roubado, só poderá ser usado por um período limitado.
A segunda subárvore mostra o acesso a uma conta com o nome de usuário e a senha corretos. Nesse caso, o atacante teria que obter as credenciais do usuário, algo que não podemos controlar.
Você pode dificultar a vida do atacante adicionando a autenticação de dois fatores.
A terceira subárvore mostra as credenciais sendo alteradas diretamente nos bancos de dados do Trace by RisingStack. Para isso, o atacante teria que obter acesso aos bancos de dados.
Mesmo que os atacantes acessem seus dados, você ainda tem uma última proteção: adicionar criptografia ao seu conjunto de dados!
Estes exemplos estão longe de ser completos e podem ficar muito mais complexos, mas espero que tenham dado uma ideia de como começar a modelar as ameaças à segurança do seu sistema.
Comece a jogar Capture the Flag
Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.