Problema sério de falta de segurança numa aplicação web

4 respostas
J

Galera,

nossa aplicação estava com um furo grande de segurança, fiz uma correção pra barrar o problema, mas o usuário malicioso ainda consegue ao tentar, entendam o que algum usuário pilantra estava fazendo(a mesma pessoa conseguiu 2 logins e senhas)

  • Meliante com o Usuario 1 com perfil X, loga na aplicação e consulta pessoas do seu departamento e deixa a lista de resultado na tela(browser aba 1).

No mesmo browser, numa outra aba:

  • Meliante com o Usuario 2 com perfil Y, somente loga na aplicação(browser aba 2).

  • Meliante volta na aba 1 com a listagem de usuários na tela (consultada com o usuário 1), porém por trás quem está na sessão agora é o usuário 2 que logou por último, aí o pilantra seleciona vários usuários manda deletar, e o usuário pumba deletou todos estando logado com um cara que não tinha permissão deletar.

No nosso sistema, o problema que ficou registrado quem executou a remoção foi o usuário 2, mas ele nem deveria ter conseguido consultar tais usuários(e na verdade ele não consultou, ele apenas usou a tela consultada pelo usuário 1)…(daqui pra frente gerou vários problemas de negócios na aplicação… que não vem ao caso).

O que fizemos foi fazer uma segunda validação e reconferir se quem estava deletando tinha permissão.

Como vocês fazem na aplicação de vocês pra evitar isso?

Usa uma pré e pós validação, igual está meu sistema hoje?

Fazem algo pra não deixar esse tipo de compartilhamento de sessão com mesmo browser e abas diferentes?

O que vocês tem feito?

4 Respostas

A

Acho esse um assunto importantee muitas vezes subestimado no desenvolvimento…

No seu caso de exemplo: se o cara tinha 2 logins e 1 deles já possuia acesso, o único dano foi que ele jogou a culpa no outro usuário?

Eu parto do seguinte conceito quando desenvolvo:
Segurança só existe se você checar a ação propriamente dita.
Deixar de mostrar ao usuário o link de Excluir, por ele não possuir acesso, é simplesmente conveniência…

Por exemplo: monte uma requisição na mão, logado com o usuário 2, com a action para excluir usuários.
Se você não chegar o nível de acesso dele na ação de excluir, o sistema não está seguro. Ele nem precisa de 2 logins.

A forma pode variar conforme arquitetura da sua aplicação, mas você deve criar um componente que atue no meio de campo da requisição.

Esse componente deve analisar cada requisição do usuário e verificar se ele possui acesso a aquela fucnionalidade ou não.

Recentemente tinha aqui no fórum um exemplo de componente assim para vraptor (o título é MInha Contribuição, acho).

kzar.razk

O que está acontecendo já acontecia no tempo dos terminais burros, no grande porte. O usuário ia tomar cafezinho e … Não há como lutar contra o usuário, além das medidas mínimas de praxe: validar o comando antes de executar; validar a url para evitar ataques de url, utilizar sempre SQLs parametrizados…

bombbr

JavaTux:
Galera,
O que vocês tem feito?

A segurança pode ser dividida em autenticação, autorização, confidencialidade e integridade dos dados.

Autenticação: Neste ponto verificamos se quem esta tentando acessar o sistema é mesmo quem deveria ter acesso ao sistema, normalmente através de um usuário e senha. Um sistema também pode verificar a autenticação através de biometria (impressão digital / íris), smartcards, tokens, etc.

Autorização: Aqui verifica-se se o usuário já autenticado possuí privilégios para acessar determinado recurso do sistema.

Seu problema estava na autorização, que deve ser verificada toda a vez que o recurso restrito do sistema for solicitado.
Você pode fazer isto utilizando filtros ou utilize JAAS que é padrão JEE.

Exemplo: Segurança com uma simples configuração no web.xml de sua aplicação

//Aqui o ADMINISTRADOR e o VISITANTE podem acessar o recurso /consultar.action
     <security-constraint>  
         <display-name>Consultar</display-name>  
         <web-resource-collection>  
             <web-resource-name>Consultar</web-resource-name>  
             <url-pattern>/consultar.action</url-pattern>  
         </web-resource-collection>  
         <auth-constraint>  
             <role-name>ADMINISTRADOR</role-name>  
             <role-name>VISITANTE</role-name>  
         </auth-constraint>  
     </security-constraint>


     //Aqui  o ADMINISTRADOR pode acessar o recurso /excluir.action
     <security-constraint>  
         <display-name>Excluir</display-name>  
         <web-resource-collection>  
             <web-resource-name>Excluir</web-resource-name>  
             <url-pattern>/excluir.action</url-pattern>  
         </web-resource-collection>  
         <auth-constraint>  
             <role-name>ADMINISTRADOR</role-name>  
         </auth-constraint>  
     </security-constraint>

Perceba que mesmo o VISITANTE conhecendo a URL (recurso) /excluir.action ele não terá acesso.

G

Fique um pouco confuso nessa parte:

Quando o usuário faz o login novamente, você não cria uma nova sessão?

Abs.

Criado 17 de fevereiro de 2011
Ultima resposta 19 de fev. de 2011
Respostas 4
Participantes 5