Vulnerabilidade é definida como uma falha de projeto, implementação
ou configuração de um software que, quando explorada por um atacante,
resulta em violação de segurança. As vulnerabilidades são resultados
das reduções de custos com mão de obra não qualificada, contratando e
formando equipes sem a competência adequada resultando, na maioria das
vezes, em aplicações problemáticas com dezenas de falhas de segurança.
Fiz
um estudo para uma possível implementação de uma aplicação web com o
perfil de um típico Home Bank e resolvi criar um artigo bem
resumido sobre assunto. Seguem abaixo os descritivos das
vulnerabilidades mais comuns e suas respectivas medidas de prevenção:
1. Validação de Dados
Ocorrem
quando a aplicação implementa as validações de dados na camada de
apresentação usando javascript. A
tecnologia que transporta as páginas, arquivos e informações pela web é
o protocolo HTTP que nada
mais que um simples texto e pode facilmente ser interceptado,
visualizado e alterado por qualquer pessoa através de uma ferramenta
sniffer e qualquer manipulador HTTP como TamperData, TamperIE
ou Spike Proxy. Outro fator é que
javascript também pode ser facilmente desabilitado ou alterado no
browser.
Solução – Replicação ou a centralização das
validações: tipo de dado, consistência e regras de negócio na camada de
negócio da aplicação.
2. Comunicação Insegura
Algumas
determinadas aplicações ou parte delas podem conter e trafegar dados
altamente confidencias como números de cartão de crédito, senhas,
saldos, movimentações bancárias etc..que não devem ser vistas por
ninguém que não contenha as credencias necessárias.
Solução –
Utilização de canal seguro criptografado SSL
garantindo a autenticidade, integridade e privacidade devido à natureza
frágil de comunicação já descrita na vulnerabilidade 1.
3. Restrições de Acesso
Liberação
de acesso as URLs onde o usuário não tenha permissão ou não esteja
autenticado, podendo ocorrer quando o atacante consegue fazer cópias
das URL gravada na memória do browser na máquina de um usuário que já
tenha acessado o aplicativo. Outro caso comum é em aplicativos que usam
o mecanismo de ocultamento de recursos na GUI que disparam processos
nos quais os usuários sem a devida permissão, porém não é implementado
validações nos processos de negócio que valide isso. Pela fragilidade
já descrita acima do protocolo HTTP, podem ocorrer casos em que o
atacante ainda consiga enviar requisições para estes determinados
recursos mesmo em oculto executando de forma indevida o processo.
Solução
– Implementação de um controle de autenticação e autorização tanto na
camada de apresentação e na camada de negócio, independentemente se o
recurso for ocultado da GUI (que é também um mecanismo recomendado).
4. Injeção de JavaScript e HTML
Ocorre
na injeção de códigos javascript e HTML maliciosos em campos texto da
aplicação. Com isso, o valor do campo é gravado no SGDB e
posteriormente usado em outras páginas na aplicação. Quando este fato
acontece, o conteúdo malicioso escrito em javascript é renderizado na
página e conseqüentemente executado, podendo abrir possibilidades de
prejudicar a aplicação. Seguem alguns dos problemas críticos que injeção
de javascript podem acarretar:
4.1 Roubo de Cookies
Aplicativos
web utilizam a tecnologia de Http Cookie para
gerenciar a sessão do usuário autenticado na aplicação e a injeção de
javascript pode acessar os cookies que estão armazenados na memória (DOM)
do browser. De posse da chave única da sessão do usuário autenticado, o
atacante pode abrir comunicação com a aplicação em diversas formas
HTTP, passando falsamente a mesma chave previamente roubada, fazendo
com que a aplicação pense que é a mesma sessão já autenticada e, assim,
tendo toda as portas abertas para manipular a aplicação e suas
informações.
Solução – Independente de toda a preocupação e
esforço implementado na questão da segurança, é recomendável que ainda
exista um mecanismo que identifique e impeça que uma sessão seja
utilizada por mais de um Cliente IP ao mesmo tempo, que neste caso
configura-se a ocorrência de um ataque.
4.2 Redirecionamento
Injeção
de javascript pode disparar a execução do redirecionamento de uma
aplicação real para uma falsa aplicação com a mesma aparência
(Engenharia
Social). Com a fraude montada, a falsa aplicação se passando pela
verdadeira consegue fazer o usuário fornecer qualquer tipo de
informações voluntariamente.
Solução – Validação na camada de
apresentação substituindo, rejeitando ou eliminando as possíveis
ocorrências de injeção de todos os campos digitados pelos clientes que
serão armazenados no SGDB.
5. Parâmetros Temporários de Controle
É
comum os aplicativos web utilizarem parâmetros temporários para
armazenar informações referentes a diversas operações dos usuários
durante a sua utilização e navegação no sistema. O problema da injeção
de javascript neste caso ocorre naqueles parâmetros que não são
armazenados no SGDB, mas que venham a ficar persistidos ao longo de
algumas interações. O fato é a fragilidade de comunicação já descrita
na vulnerabilidade 1.
Solução – Validação na camada de
apresentação substituindo, rejeitando ou eliminando as possíveis
ocorrências de injeção de todos os valores trafegados nas requisições
HTTP.
6. Injeção de SQL
Ocorrem na injeção de códigos SQL maliciosos em campos
texto da aplicação que serão concatenados como parte de instruções
maiores e executadas no SGDB da aplicação, podendo inverter
completamente a semântica da instrução.
Solução 1 – Validação
na camada de apresentação ou persistência substituindo, rejeitando ou
eliminando as possíveis ocorrências de injeção.
Solução 2 –
Utilização de instruções SQL pré compiladas do determinado SGDB,
fazendo com que os caracteres concatenados da GUI não sejam
interpretados como parte das instruções SQL.
7. Referência Direta Insegura
É
comum em aplicativos web existirem operações ou processos construídos
como Seqüencias de Operações muito conhecidos como workflow. Nestes
casos, os usuários são expostos a uma seqüência de passos ao longo de
várias páginas selecionado e acumulando valores pré-definidos em
widgets como drop-down list, radio buttons, input hidden ou qualquer um
deles desabilitados. Os valores acumulados e armazenados nas páginas
são considerados pela aplicação com valores imutáveis para a
determinada ocorrência, mas que na verdade podem ser facilmente
alterados por um atacante manipulando diretamente o pedido HTTP podendo
furar regras de negócio e até deixar o estado do SGDB inconsistente.
Solução 1 – Estado de conversação do usuário deve ser exclusivamente e completamente gerenciado no escopo da sessão.
Solução
2 – Caso sejam usados campos com valores hidden ou desabilitados
nas páginas, faça com que as operações de negócio sejam validadas
repetitivamente durante todos os intervalos das requisições necessários.
8. Falsa Requisição
Ocorrem
quando um usuário é autenticado em uma aplicação, o cookie ID é
configurado e a pessoa começa a interagir com a sistema. O atacante,
sabendo que o usuário pode estar naquele momento utilizando várias
outras aplicações simultâneas em seu browser, pode por exemplo
disponibilizar um outro site que contenha um link com uma chamada
previamente direcionada para alguma operação na outra aplicação vítima.
Quando o usuário dispara essa falso pedido, o coitado do navegador ira
manda o cookie de autenticação já confirmado e o sistema irá efetuar a
operação.
Solução 1 – Disponibilizar controle de token internos nas operações.
Solução 2 – Disponibilizar controle de parâmetros randômicos para cada link e formulário evitando pedidos estáticos.
9. Escapamento de Informações
Ocorrem
pela falta de uma adequada manipulação de erros e exceções que podem
ocorrer durante a utilização da aplicação, expondo detalhes internos de
construção como erros SQL, tecnologias etc, podendo ser utilizados pelos
atacantes.
Solução – Utilizar mecanismos de arquivos de log
ou monitoramentos de sistemas que não sejam acessíveis ou expostos aos
usuários da aplicação.
10. Ataque de Força Bruta
Ocorrem
quando os atacantes tentam descobrir senhas de usuários com o auxílio
de algumas ferramentas automatizadas que realizam incansáveis
tentativas de autenticação falhas baseados em um dicionário de dados.
Estas ferramentas geram os dicionários de dados combinando informações
dos usuários como: datas importantes, nomes de familiares, de animais,
filmes favoritos, placas de carros etc.
Solução – Desabilitar
o acesso temporário dos usuários após um número máximo de tentativas de
autenticação falha, disponibilizando políticas rápidas de reativação.
Obrigar os usuários a utilizarem senhas com números, letras, caracteres
e tamanho mínimo, exigindo a sua troca periodicamente.
11. Captura de Senhas
Ocorrem
normalmente quando um programa vírus Trojan alojado no computador do
cliente monitora a digitação da senha do usuário no aplicativo.
Solução – Utilizar mecanismos de digitação através de um teclado virtual
variável que possua dois ou mais dígitos por botão que mudam de lugar
aleatoriamente a cada acesso.
12. Token de Operação
Independentemente
de como, ainda pode ocorrer momentos em que o atacante consegue obter a
senha do usuário através de falhas de segurança da aplicação,
engenharia social, roubo de documentos, vírus alojados como Trojan etc.
Solução
– Implementação de mecanismos para que o sistema requisite seqüências
alternadas de tokens previamente cadastrados (simples cartão com os
números) ou randomicamente gerados (dispositivo automatizados) que
antecedam as operações de negócio na aplicação, fazendo com que
qualquer usuário sem a posse do token não consiga acessar ou realizar
partes da aplicação. Estes tokens são criados baseados em chaves privadas, certificados
digitais, possuindo algoritmos de criptografia como
o RSA, DES e 3DES.
O artigo fica aberto para comentários e outras dicas de vulnerabilidades. Aquele abraço!!







