UNIVERSIDADE DA AMAZÔNIA – UNAMA CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICA – CCET CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Kleiton da Silva Gomes Newton Santos SEGURANÇA NO DESENVOLVIMENTO DE APLICAÇÕES WEB Belém-Pará 2006 UNIVERSIDADE DA AMAZÔNIA – UNAMA CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICA – CCET CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Kleiton da Silva Gomes Newton Santos SEGURANÇA NO DESENVOLVIMENTO DE APLICAÇÕES WEB Trabalho de Conclusão de Curso apresentado à Universidade da Amazônia, como condição parcial para obtenção de Grau de Bacharel em Ciência da Computação, sob a orientação do Prof. Msc. Cláudio Roberto de Lima Martins. Belém-Pará 2006 UNIVERSIDADE DA AMAZÔNIA – UNAMA CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICA – CCET CURSO DE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Kleiton da Silva Gomes Newton Santos SEGURANÇA NO DESENVOLVIMENTO DE APLICAÇÕES WEB Trabalho de Conclusão de curso apresentada à Universidade da Amazônia, como condição parcial para obtenção de Grau de Bacharel em Ciência da Computação, sob a orientação do Prof. Msc. Cláudio Roberto de Lima Martins. Data da defesa: ___ / ___ / _____ Nota: ______ Banca Examinadora: _____________________________________ _____________________________________ _____________________________________ Cláudio Roberto de Lima Martins Dedicamos este trabalho aos nossos queridos pais e entes familiares, que sempre acreditaram no nosso futuro e por nunca deixarem faltar nada em nossas vidas. AGRADECIMENTOS “Agradeço primeiramente a Deus por ter me guiado a escolher sempre as portas certas e por me ajudar a superar as dificuldades que a vida nos coloca. A minha mãe, Maria Ivoneide da Silva Gomes, por ter me educado e ajudado, tanto financeiramente como moralmente a chegar onde estou e principalmente pelo seu esforço em prol desta realização. A toda família Assunção e Silva, por ter me dado apoio tanto moral como financeiro. Gostaria de agradecer em especial a Delcineide Assunção e Silva pela dedicação, paciência e esforço que sempre teve na realização e concretização deste sonho, sendo uma peça de fundamental importância. Sou muito grato por tudo que você fez. Ao meu irmão Fernando da Silva Gomes, por ter me dado apoio moral e principalmente por me ajudar a vencer as dificuldades que a vida nos coloca. A toda família Braga, por ter me ajudado direta e indiretamente. Gostaria de agradecer em especial à Arivaldo Gomes Braga e Iolene das Chagas Braga por terem me acolhido em um momento difícil dando todo o apoio necessário na conclusão deste trabalho e principalmente por me ajudar nas dificuldades que a vida nos coloca. A todos os amigos e companheiros que, direta ou indiretamente, possibilitaram a realização deste trabalho. E ao meu amigo e orientador Cláudio Martins que me possibilitou atingir este objetivo principalmente pela construção e conclusão deste trabalho.” Kleiton da Silva Gomes "Há homens que lutam um dia e são bons. Há outros que lutam um ano e são melhores. Há os que lutam muitos anos e são muito bons. Porém, há os que lutam toda a vida. Esses são os imprescindíveis." Bertolt Brecht. RESUMO A construção de sistemas de software, em especial aqueles que usam a Web como ambiente, é uma das áreas mais afetadas pelos aspectos da segurança. Grande parte das vulnerabilidades de aplicações web é provocada por erros de projeto e arquitetura, bem como em falhas de programação. Existe uma grande pressão nas equipes de desenvolvimento de sistema no sentido de desenvolver sistemas seguros e dos usuários em obter garantia da segurança de um sistema. Dada a importância em tratar questões de segurança no desenvolvimento de software, alguns padrões e normas foram propostos, como é o caso da ISO/IEC 15.408, que traz as diretrizes e princípios gerais para auxiliar o desenvolvimento de sistemas, visando um produto de qualidade. O objetivo deste trabalho consiste em apresentar os principais aspectos de segurança, identificar políticas e planos de segurança, levantar e analisar riscos, ameaças e os principais meios para que se desenvolvam sistemas mais seguros. Para dar ênfase ao trabalho foi realizado um estudo das principais vulnerabilidades presentes no ambiente de aprendizado on-line da UNAMA, o Aprendiz, onde foi possível detectar algumas falhas e propor possíveis correções. PALAVRAS CHAVES: Aplicações WEB. Segurança, Vulnerabilidades, Normas, informação, ABSTRACT The construction of systems of software, in special those that use the Web as surrounding, is one of the areas more affected by the aspects of the security. Great part of the vulnerabilities of applications web is provoked by errors of project and architecture, as well as in programming imperfections. A great pressure in the teams of development of system in the direction to develop safe systems and of the users in getting guarantee of the security of a system exists. Given the importance in dealing with questions security in the software development, some standards and norms had been considered, as it is the case of ISO/IEC 15,408, that it brings the general lines of direction and principles to assist the development of systems, aiming at a quality product. The objective of this work consists of presenting the main aspects of security, identifying to politics and plans of security, uprising and to analyze risks, threats and the main ways so that safer systems are developed. To give emphasis to the work on-line of the UNAMA was carried through a study of the main vulnerabilities gifts in the environment of learning, the Apprentice, where it was possible to detect some imperfections and to consider possible corrections. WORDS KEYS: Security, Vulnerabilities, Norms, information, Applications WEB. SUMÁRIO 1 1.1 1.2 1.3 1.4 INTRODUÇÃO ...................................................................................................... 13 OBJETIVO............................................................................................................. 13 JUSTIFICATIVA DO TEMA ................................................................................... 14 RELEVÂNCIA DO TEMA....................................................................................... 14 ORGANIZAÇÃO DO TRABALHO.......................................................................... 15 2 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.3 2.3.1 2.3.2 ASPECTOS DE SEGURANÇA DA INFORMAÇÃO.............................................. 16 NORMAS E FERRAMENTAS PARA A SEGURANÇA DA INFORMAÇÃO............ 17 Orange Book ......................................................................................................... 18 Common Criteria ................................................................................................... 19 CobiT..................................................................................................................... 20 Legislação Brasileira ............................................................................................. 20 COMO USAR A ISO/IEC 15.408 ........................................................................... 21 GARANTIA DE SEGURANÇA DA APLICAÇÃO.................................................... 22 Boas Praticas de Programação ............................................................................. 23 Testes Funcionais de Segurança .......................................................................... 25 3 3.1 3.2 3.2.1 3.2.2 3.2.3 3.3 AVALIAÇÃO DO AMBIENTE E ESTRATÉGIAS DE SEGURANÇA .................... 26 LEVANTAMENTO DA POLÍTICA DE SEGURANÇA ............................................. 27 DETECTANDO AMEAÇAS.................................................................................... 27 Os Agentes............................................................................................................ 28 Os mecanismos..................................................................................................... 30 Os ativos ............................................................................................................... 31 OBJETIVO DA SEGURANÇA ............................................................................... 32 4 4.1 4.2 4.3 4.4 4.4.1 4.4.2 4.5 4.6 4.7 4.8 4.9 4.9.1 4.9.2 4.9.3 REQUISITOS FUNCIONAIS DE SEGURANÇA.................................................... 33 AUDITORIA........................................................................................................... 34 NÃO REPÚDIO ..................................................................................................... 37 CRIPTOGRAFIA.................................................................................................... 38 PROTEÇÃO DE DADOS DO USUÁRIO................................................................ 39 Controle de Acesso ............................................................................................... 40 Importação e exportação de dados........................................................................ 42 GERENCIAMENTO DE SEGURANÇA.................................................................. 43 PRIVACIDADE ...................................................................................................... 44 AUTOPROTEÇÃO ................................................................................................ 44 CONTROLE DE SESSÕES................................................................................... 46 AUTENTICAÇÃO .................................................................................................. 47 Processo de Autenticação e Identificação ............................................................. 48 Mecanismo de Autenticação.................................................................................. 48 Conformidade com a ISO/IEC 15408..................................................................... 50 5 5.1 5.2 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 ANALISANDO RISCOS ........................................................................................ 52 ANALISE DE VULNERABILIDADES ..................................................................... 52 SEGURANÇA DE APLICAÇÕES WEB ................................................................. 55 Aspectos gerais de segurança para desenvolver sistemas para Web ................... 55 SQL Injections ....................................................................................................... 56 Cross-site Scripting ............................................................................................... 60 Controle de Acesso Falho ..................................................................................... 61 Falha no Tratamento de Erros ............................................................................... 62 Command Injections/ Parâmetros Inválidos........................................................... 64 Uso de URLs “mágicas” e campos de formulário ocultos....................................... 65 Buffer Overflows .................................................................................................... 66 10 6 6.1 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8 6.2.9 6.3 ESTUDO DE CASO .............................................................................................. 68 DESCRIÇÃO DO SISTEMA .................................................................................. 68 VULNERABILIDADES VERIFICADAS NO APRENDIZ ......................................... 69 Vazamento de Informações ................................................................................... 69 Tratamento de Falhas de Autenticação ................................................................. 71 Definição de atributos do Usuário para Autenticação ............................................ 71 Métricas mínimas das Senhas............................................................................... 72 Limitação do número de Seções Simultâneas ....................................................... 72 Cross-site scripting ................................................................................................ 73 SQL Injetions......................................................................................................... 73 Controle de Acesso Falho ..................................................................................... 74 Controle de Sessão ............................................................................................... 74 CONSIDERAÇÕES FINAIS................................................................................... 75 7 7.1 CONSIDERAÇÕES FINAIS E CONTRIBUIÇÃO................................................... 80 Perspectivas futuras .............................................................................................. 80 BIBLIOGRAFIA ................................................................................................................... 82 LISTA DE ILUSTAÇÕES FIGURA 1 – FAMÍLIA FAU_GEN ......................................................................................... 35 FIGURA 2 – FAMÍLIA FAU_SEL .......................................................................................... 36 FIGURA 3 – FAMÍLIA FAU_SAR ......................................................................................... 36 FIGURA 4 – NÃO REPÚDIO DE ORIGEM .......................................................................... 37 FIGURA 5 – NÃO REPÚDIO DE DESTINO ......................................................................... 37 FIGURA 6 – FAMÍLIA FCS_COP ......................................................................................... 39 FIGURA 7 – FAMÍLIA FCS_CKM......................................................................................... 39 FIGURA 8 – FAMÍLIA FIA_UID ............................................................................................ 50 FIGURA 9 – FAMÍLIA FIA_UAU........................................................................................... 51 FIGURA 10 – EXEMPLO DE SQL INJECT (QUEBRA DA AUTENTICAÇÃO) ..................... 59 FIGURA 11 – EXEMPLO DE CROSS-SITE SCRIPTING..................................................... 60 FIGURA 12 – EXEMPLO DE FALHA NO TRATAMENTO DE ERROS ................................ 63 FIGURAS 13 – EXEMPLO DE BUFFER OVERFLOW......................................................... 66 FIGURA 14 – VISÕES DE USO DO SISTEMA APRENDIZ ................................................. 69 FIGURA 15 – MENSAGEM DE ERRO................................................................................. 70 FIGURA 16 – MENSAGEM DE ERRO................................................................................. 70 FIGURA 17 - TAMANHO MÍNIMO DAS SENHAS NÃO IMPLEMENTADO.......................... 72 FIGURA 18 – EXEMPLO DE CSS ....................................................................................... 73 LISTA DE TABELAS TABELA 1 – LISTA DE ACESSO AO SISTEMA. ................................................................. 29 TABELA 2 - CONHECIMENTO DO SISTEMA ..................................................................... 29 TABELA 3 - MOTIVAÇÃO DO AGENTE .............................................................................. 29 TABELA 4 - MOTIVAÇÃO DO AGENTE .............................................................................. 30 TABELA 5 - MECANISMOS DE ATAQUE ......................................................................... 30 TABELA 6 - ATIVOS COM VALOR...................................................................................... 31 TABELA 7 - CARACTERES MAIS UTILIZADOS ................................................................. 58 TABELA 8 - RESUMO DAS VULNERABILIDADES E POSSÍVEIS SOLUÇÕES ................. 76 13 1 INTRODUÇÃO A informação é algo de vital importância para uma organização e fundamental para o sucesso dos negócios. Para isso, é importante que seja adequadamente protegida, pois, com o crescimento da interconectividade entre ambientes de trabalho, a informação fica exposta a uma grande variedade de ameaças. Daí cresce a importância com a necessidade da segurança da informação, que é a proteção da informação contra os vários tipos de agentes ameaçadores, minimizando riscos ao negócio, garantindo que a informação se mantenha íntegra, maximizando o retorno sobre os investimentos. Para obter a segurança da informação, faz-se necessário um conjunto de controles adequados com intuito de garantir que os objetivos do negócio e da segurança da organização sejam atendidos. Esses controles vêm mudando e se aperfeiçoando com o passar do tempo, permitindo às organizações cuidarem e se prevenirem contra eventuais riscos causados pela ausência de segurança. A norma ISO/IEC 15.408 (Commom Criteria) traz as diretrizes e princípios gerais para auxiliar no desenvolvimento de software, permite desenvolver, melhorar e avaliar os aspectos de segurança da aplicação em desenvolvimento ou a ser desenvolvida, bem como do ambiente de desenvolvimento em si. Segundo Albuquerque (2002), o desenvolvimento de sistemas é uma das áreas mais afetadas pelos aspectos da segurança. Muitos dos problemas de segurança existentes hoje não são nem físicos, nem de procedimento, mas sim devidos a erros de programação ou a arquiteturas falhas. 1.1 OBJETIVO Este trabalho tem como objetivo fornecer conceitos tecnológicos voltados à segurança da informação; apresentar os principais requisitos funcionais de segurança dispostos na norma ISO/IEC15.408 (Commom Criteria for Information tecnology Security Evolution); apresentar as principais ameaças à segurança da informação, como os principais meios para que se desenvolvam sistemas menos vulneráveis. 14 Para dar ênfase ao trabalho serão analisadas as principais vulnerabilidades presentes no sistema de aprendizado on-line da UNAMA, o Aprendiz. Em seguida, serão propostas soluções para a diminuição dos riscos decorrentes das falhas detectadas. 1.2 JUSTIFICATIVA DO TEMA Ao iniciar as atividades na área de Segurança da Informação, percebe-se ao longo do tempo o quanto que as organizações sofrem para manter a sua base de informação segura, pois vários são os obstáculos existentes. A segurança no ambiente WEB sempre foi um assunto importante no desenvolvimento de sistemas e com o avanço da Internet, que possibilitou a interconexão entre computadores de todos os portes, deve-se ter preocupação redobrada com a segurança da informação, pois esse tipo de aplicação exige atenção especial quando comparada às aplicações desktop, porque à medida que a aplicação está no ambiente WEB ela se torna de domínio publico, facilitando o acesso de usuários não autorizados (hacker). Logo, não tardou para a aparição de ameaça à confidencialidade, integridade e disponibilidade da informação que neste momento tornou-se um ativo valioso e estratégico. É notório que a difusão da Internet facilitou a exploração remota de brechas de segurança, muitas vezes consideradas inofensivas durante o desenvolvimento da aplicação. 1.3 RELEVÂNCIA DO TEMA Por que se deve preocupar com a segurança da informação? É importante, pois esse tema e a informática como um todo está presente na sociedade contemporânea. Hoje as organizações guardam nos computadores os segredos de seus negócios e indivíduos trocam correspondências eletrônicas de caráter pessoal, enfim, todos têm o legítimo direito de esperar que os dados confiados às máquinas sejam mantidos intactos e confidenciais, acessíveis apenas às pessoas autorizadas. 15 Apesar de todas as ferramentas de hardware e software disponíveis no mercado há sempre uma possibilidade de falhas na segurança. Alguns especialistas defendem a idéia de que é praticamente impossível se ter um ambiente tecnológico totalmente seguro. Diante do crescimento de aplicações voltadas para a Internet surge a preocupação de termos ambientes seguros, nos quais todos possam dispor de informações verdadeiras e confiáveis. Esta pesquisa contribui na área de segurança em aplicações voltadas para a Internet, especialmente aos que irão desenvolver aplicações para o ambiente web, que devem estar atentos aos aspectos de segurança de acesso, confidencialidade e privacidade das informações. 1.4 ORGANIZAÇÃO DO TRABALHO O trabalho está organizado da seguinte forma: No capitulo 2, foram identificados na literatura às técnicas e procedimentos considerados fundamentais para a segurança da informação. Por elas, é possível estabelecer um conjunto mínimo de requisitos de segurança que, se não eliminam, visam diminuir as vulnerabilidades e melhorar a qualidade do produto (software). No capítulo 3, é apresentada uma visão sobre segurança da informação, avaliação de ambiente e definição de estratégias de segurança. O capitulo 4, apresenta uma relação de requisitos funcionais de segurança a serem considerados durante o desenvolvimento de software. O capitulo 5, faz uma abordagem da necessidade de se analisar os riscos que uma aplicação está sujeita e relaciona as principais vulnerabilidades presentes em ambiente web. O capitulo 6, apresenta um estudo de caso em uma aplicação web real, no caso o ambiente de educação a distância da UNAMA, o Aprendiz, onde é identificado algumas vulnerabilidades e proposto algumas possíveis soluções. 16 2 ASPECTOS DE SEGURANÇA DA INFORMAÇÃO Segundo Albuquerque (2002), segurança é um termo tão genérico que é melhor pensarmos em aspectos de segurança da informação. Existem vários aspectos de segurança, sendo que os três considerados centrais ou principais são: confidencialidade, integridade e disponibilidade. Além desses, existem outros aspectos tais como: autenticação, não repúdio, legalidade, privacidade e auditoria. Vale ressaltar que, embora Albuquerque considere a confidencialidade, integridade e a disponibilidade como requisitos principais, não exclui que os demais aspectos não sejam importantes, visto que essa escolha deve levar em consideração a natureza da aplicação. A seguir, é apresenta uma definição para cada aspecto citado. a) Confidencialidade: capacidade de um sistema de impedir que usuários não-autorizados vejam determinada informação que foi delegada a somente usuários autorizados a vê-la. b) Integridade: atributo de segurança que indica se uma informação pode ser alterada somente de forma autorizada. c) Disponibilidade: indica a quantidade de vezes que o sistema cumpriu uma tarefa solicitada sem falhas internas, para um número de vezes em que foi solicitado a fazer a tarefa. d) Autenticação: capacidade de garantir que um usuário, sistema ou informação é mesmo quem alega ser. e) Não repúdio: capacidade do sistema provar que um usuário executou determina ação no sistema. f) Legalidade: aderência de um sistema à legislação. g) Privacidade: Capacidade de manter incógnito um usuário, impossibilitando a ligação direta da identidade do usuário com as ações por este realizadas. h) Auditoria: capacidade do sistema de auditar tudo o que foi realizado pelos usuários, detectando fraudes ou tentativas de ataque. 17 Segundo Dias (2000), segurança é a proteção de informações, sistemas, recursos e serviços contra desastres, erros e manipulação não autorizada, de forma a reduzir a probabilidade e o impacto de incidentes de segurança. Um problema de segurança é a perda de qualquer aspecto da segurança importante para o sistema. Apesar de todos os objetivos de segurança serem importantes para um sistema, dependendo da organização, ou da utilidade do software, alguns são mais importantes do que outros. De acordo com a ISO/IEC 15.408 (Commom Criteria), o termo ameaça indica uma tríade: Agente, Vulnerabilidade (ou mecanismo) e Ativo com alto valor, o que permite um ataque. Durante a fase de desenvolvimento do software deverá ser dada atenção especial à segurança do ambiente de desenvolvimento e da aplicação desenvolvida. 2.1 NORMAS E FERRAMENTAS PARA A SEGURANÇA DA INFORMAÇÃO Na área de segurança da informação existem vários documentos e normas que tratam diretamente ou indiretamente da segurança da informação, as quais têm por objetivo maior, apresentar orientações e sugestões quanto às boas práticas da política de segurança. A segurança das informações, em função de sua grande importância para a sociedade moderna, deu origem a diversos grupos de pesquisa, cujos trabalhos, muitas das vezes, são traduzidos em padrões de segurança, ou mesmo projetos legislativos (DIAS, 2000). Essas ferramentas têm uma importância muito grande na implantação de segurança, são variados os objetivos de cada uma, tais como: autenticação, controles de acesso físico e lógico, registro de logs, monitoração e etc. A maior parte das brechas na segurança de uma aplicação é oriunda da falta de boas praticas de engenharia de software, e por isso é necessário tomar extremo cuidado durante o desenvolvimento dos sistemas. A seguir, é apresentado um histórico e uma série de normas que auxiliam na manutenção da segurança de sistemas de informação. 18 2.1.1 Orange Book1 O “Orange book” do NCSC tem como objetivo a classificação baseada nas características de segurança definidas no projeto dos sistemas computacionais (DIAS, 2000). Essas categorias são dispostas de tal forma que cada nível superior de segurança deve implementar todos os requisitos específicos para os níveis inferiores. O "The Orange Book" foi inicio de tudo; dele nasceram vários padrões de segurança, cada qual com a sua filosofia e métodos proprietários, contudo visando uma padronização mundial. Houve um esforço para a construção de uma nova norma, mais atual e que não se detivesse somente na questão da segurança de computadores, mas sim na segurança de toda e qualquer forma de informação. Este esforço foi liderado pela ISO (International Organization for Standardization). Em meados de 1977, o Departamento de Defesa dos Estados Unidos formulou um plano sistemático para tratar do problema clássico de segurança, o qual deu origem ao "DoD Computer Security Initiative", que, por sua vez, desenvolveria um centro para avaliar o quão seguro eram as soluções disponibilizadas. Para essa avaliação, fez-se necessário a criação de diversas regras para a utilização durante o processo. Mais tarde, este conjunto de regras ficaria conhecido informalmente como "The Orange Book", devido a cor da capa deste manual de segurança. Mesmo que o "Orange Book", atualmente, seja considerado um documento "ultrapassado", é considerado como o marco inicial de um processo mundial e contínuo de busca de um conjunto de medidas que permitam, a um ambiente computadorizado, ser qualificado como seguro. Esta norma de segurança permitiu e continua permitindo a classificação, por exemplo, do nível de segurança fornecido pelos sistemas operacionais atualmente utilizados. Outro ponto importante a ser lembrado é que o "Orange Book", dentro de seu conteúdo, permite, de uma maneira simples, especificar o que deve ser implementado e fornecido por um software, para que ele seja classificado em um dos níveis de segurança pré-estipulados, permitindo assim que este também seja utilizado como fonte de referência para o desenvolvimento de 1 Orange Book. Disponível em: http://www.dynamoo.com/orange/summary.htm. Acesso em: 05/09/2006 19 novas aplicações e para o processo de atualização ou refinamento de aplicações já existentes e em uso. 2.1.2 Common Criteria O objetivo da Commom Criteria (Commom Criteria for Information Tecnology Security Evolution) é fornecer um conjunto de critérios fixos que permitem especificar a segurança de uma aplicação de forma não ambígua a partir de características do ambiente da aplicação, e definir formas de garantir a segurança da aplicação para o cliente final. O Common Criteria (CC 1999) é uma norma ou padrão de indústria criado a partir de diversos padrões anteriores com o objetivo de gerar uma norma internacional no assunto. A primeira versão do Common Criteria foi lançada em janeiro de 1996. Em maio de 1998 foi liberada uma grande revisão, denominada Common Criteria 2.0. Finalmente, em dezembro de 1999 a versão 2.1 do Common Criteria foi homologada como a norma internacional ISO/IEC 15.408. O Common Criteria estabelece que qualquer sistema para ser considerado seguro, precisa ter seu Security Target (objetivo ou alvo de segurança) elaborado. O Security Target é a especificação de segurança, ou seja, indica quais aspectos de segurança foram considerados importantes e porque o foram para aquele sistema em particular. O CC (Common Criteria) define também sete níveis de garantia de segurança. A cada nível, temos um maior numero de testes e, portanto, maior garantia de que o sistema atende aos requisitos de segurança. Esses níveis são denominados EAL (Evalution Assurance Level, ou nível de garantia da avaliação), e podem ser EAL-1 a EAL-7. Assim, apenas os níveis EAL-1 a EAL-4 são reconhecidos pela ISO, pois os níveis EAL-5 a EAL-7 são considerados muito rígidos. O CC define como TOE (Targent Of Evalution, ou alvo de segurança) para diferenciar o sistema que estamos avaliando de outros sistemas. O Common Criteria pode ser usado para desenvolver um sistema seguro ou avaliar a segurança de um já desenvolvido. A exigência de avaliação por 20 laboratórios internacionais e o grande número de detalhes na implantação, como determina o processo estabelecido na norma, torna o processo caro. A idéia do Common Criteria é que ao aplicá-lo no desenvolvimento de um sistema, é possível testá-lo em um laboratório credenciado e obter um selo de certificação. Contudo, não é preciso aplicar a norma em sua totalidade para desenvolver um sistema seguro ou avaliar a segurança de um já existente. 2.1.3 CobiT2 Trata-se de uma estrutura para o gerenciamento dos processos de negócios alinhada a um modelo de governança em TI, que permite o entendimento e o gerenciamento dos riscos. O Cobit parte do princípio de que a organização requer informação para atingir seus objetivos, e que essa informação deve ter atributos como integridade, oportunidade e confiabilidade. Considerando que a informação será gerada, processada e mantida por meio de recursos tecnológicos, o Cobit define quatro domínios para a estrutura de controles da área de TI – planejamento e organização, aquisição e implementação, delivery e suporte e monitoramento –que se subdividem em 34 processos e mais de 300 objetivos detalhados de controle. 2.1.4 Legislação Brasileira A Legislação brasileira, com relação à segurança da informação, não se encontra bem estrutura como a legislação americana, porém já existem alguns dispositivos legais, ou projetos de lei sobre assuntos relativos à segurança da informação, conforme pode ser observado a seguir: a) Projeto de lei nº 84, de 1999 – dispõe sobre os crimes cometidos na área de informática e suas penalidades; b) Projeto de Lei do senado nº 234, de 1996 – dispõe sobre crime contra a inviolabilidade de comunicação de dados de computador; 2 Cobit. Disponível em: http://www.efagundes.com/Artigos/COBIT.htm. Acesso em: 10/09/2006 21 c) Decreto nº 79.099, de 06 de janeiro de 1977 – aprova o regulamento para salvaguarda de assuntos sigilosos. d) ABNT NBR ISO/IEC 17.799 – dispõe sobre normais gerais sobre segurança da informação, onde seu objetivo fundamental é assegurar a continuidade e minimizar o dano empresarial, prevenindo e minimizando o impacto de incidentes de segurança. Com referência a padrões e normas técnicas, o Brasil conta com a ABNT (Associação Brasileira de Normas Técnicas), a qual é encarregada de ditar os padrões a serem seguidos por serviços e produtos de varias áreas, inclusive segurança de informação. Trata de algoritmos de criptografia, técnicas criptográficas, gerência de senhas, controle de acesso para segurança física de instalações de processamento de dados, critérios de segurança física relativos ao armazenamento de dados, a microcomputadores e terminais. 2.2 COMO USAR A ISO/IEC 15.408 Não é preciso aplicar a norma em sua totalidade para conseguir os objetivos de se desenvolver uma aplicação segura e garantir sua segurança. Utilizando a idéia central da norma, temos um método simples que, mesmo que não tenha o mesmo nível de garantia de uma certificação ISO/IEC 15.408, apresenta resultados satisfatórios. Podemos avaliar a segurança de uma aplicação usando a ISO/IEC 15.408 como base nas aplicações em fase de projetos ou em aplicações já desenvolvidas. Como lembra Albuquerque (2002), para utilizarmos a norma ISO/IEC 15.408 em aplicações em fase de desenvolvimento devemos seguir os critérios: 1º - Especifique a segurança da aplicação na fase de análise, gerando um documento de especificação de segurança usando a ISO/IEC 15.408, como um guia. Isso significa usar os mesmos requisitos descritos na norma, a mesma estrutura de análise de ambiente, mas não necessariamente seguir o padrão do Security Target (Objetivo ou alvo de segurança). 2º - Manter um ambiente de desenvolvimento e testes suficientes seguros e capazes de atender os níveis de garantia da ISO/IEC 15.408, seguindo as 22 recomendações do EAL-3 (Evalution Assurance Level, ou nível de garantia da avaliação ), pois é um excelente começo para a maior parte das aplicações. 3º - Desenvolva utilizando boas práticas de programação e seguindo os requisitos de segurança, ou seja, crie um processo de desenvolvimento bem definido e planeje adequadamente a implementação de requisitos especificados. 4º - Escolha um dos sete níveis de garantia de segurança e teste seus sistemas internamente, gerando as evidências para verificação da aderência à especificação. Se o projeto demandar alto nível de segurança, utilize um dos laboratórios credenciados para a homologação final dentro da norma. Para aplicações já desenvolvidas pode se utilizar outra receita, conforme descrevemos a seguir: 1º - Levante a especificação de segurança para aplicação usando o CC como base. 2º - Levante quais requisitos de segurança a aplicação desenvolvida possui e quais estão presentes em seu ambiente de desenvolvimento. 3º - Verifique se os requisitos implementados atendem à necessidade de segurança verificada na especificação inicial. 4º - Escolha um nível de garantia de segurança até o nível EAL-3 (Evalution Assurance Level, ou nível de garantia da avaliação), não é possível fazer verificações mais detalhadas em aplicações prontas, ou seja, os níveis 4 a 7 exigem testes e procedimentos durante a implementação) e faça os testes para garantir a segurança da aplicação. 2.3 GARANTIA DE SEGURANÇA DA APLICAÇÃO Segundo Dias (2000) precisamos de segurança nos sistemas para atender legislações ou políticas de segurança interna que é preciso obedecer, e com a evolução tecnológica podem existir ameaças à aplicação que necessitarão ser eliminadas ou ao menos diminuir a sua gravidade em nível de aplicação. Uma vez levantadas todas as ameaças e legislações, consolidamos nossos objetivos de segurança. Esses objetivos são requisitos básicos de segurança que precisarão ser atendidos pelo sistema para que tanto a legislação quanto as ameaças sejam 23 corretamente tratadas. Boa parte dos objetivos de segurança será atendida por premissas externas de uso ou de ambiente. A Especificação de Segurança da Aplicação é um documento que visa identificar os objetivos de segurança da aplicação e, a partir das melhores práticas de mercado, estabelecer os requisitos mínimos que devem ser atendidos pela aplicação. Toda esta análise pode ser feita com base na ISO/IEC 15.408, e cada requisito é acompanhado de uma sugestão de implementação e dos testes necessários para verificar o atendimento do requisito. Alguns cuidados precisam ser levados em consideração para garantir a segurança de um sistema, como pode ser visto a seguir. 2.3.1 Boas Praticas de Programação Segundo Albuquerque (2002), as boas práticas de programação devem ser levadas em consideração quando do desenvolvimento de software, mesmo que não estejamos preocupados com a segurança em si, pois elas permitem a criação de códigos mais robustos, confiável e, evidentemente, seguro. Por mais que o código seguro implique em certa perda de desempenho, devida a maior carga de controles, é mais vantajoso para o sistema, pois garante melhor segurança e legibilidade. Albuquerque (2002) faz referência às recomendações citadas a seguir, concluindo que elas são importantes para que se possam desenvolver códigos com melhor qualidade. a) Criar funções intrinsecamente seguras – Na aplicação, devem existir funções que verifiquem os dados de entrada para impedir perda de controle do sistema, falhas gerais de proteção ou outros tipos de falhas, como o buffer overflow. b) Usar funções intrinsecamente seguras – Exemplo de uma função intrinsecamente insegura é a strcpy (C e C++, copia uma string). Essa função recebe dois ponteiros como parâmetros e copia todo o conteúdo, de uma para o outro, até encontrar 0. Se a função for chamada passando parâmetro inválido, pode gerar resultados imprevisíveis, podendo até sobrescrever áreas importantes da memória. Uma possível solução para este problema seria usar a função strncpy, que permite limitar o tamanho 24 máximo a ser copiado. Em algumas linguagens de programação tipadas, como Visual Basic e Delphi, por exemplo, minimizam problemas como esse. c) Testar o retorno de funções – Sempre que se chamar uma função, seu retorno precisa ser verificado. É preciso atentar para a falha segura, isto é, encontrar a alternativa com menor impacto, que traga menos risco. d) Documentar funções corretamente – A boa documentação da função evita mal-entendido a respeito da interpretação da mesma. e) Tratar as entradas de dados – Tratar adequadamente os dados, seja pelo usuário ou outro sistema, mesmo que se acredite que todas as funções são intrinsecamente seguras. Tendo sempre cuidado em identificar caracteres maliciosos na aplicação. f) Ter uma política de versão consistente – Utilizar uma política de versão consistente, no que diz respeito a versões liberadas, não importa se é por uma gerência de configuração ou simplesmente backup, facilitando assim a identificação de problemas e, por conseqüência, uma melhoria contínua do produto. g) Usar componentes e bibliotecas confiáveis – Toda segurança e cuidado incluído no código pode ser comprometida com o uso de bibliotecas ou sistemas auxiliares não-confiáveis. Deve-se assegurar que bibliotecas não comprometem a segurança do sistema. h) Evitar informações sensíveis em arquivos temporários – Assim, deve-se evitar que informações sigilosas tornem-se vulneráveis restringindo seu uso em arquivos dessa natureza. i) Não armazenar senhas e chaves criptográficas no código – Senhas e chaves criptográficas em códigos podem ser reveladas através de engenharia reversa. O armazenamento de chaves criptográficas deve ser alvo de análise criteriosa, assim como os algoritmos empregados. j) Operar com o privilégio necessário – As aplicações deveriam rodar com o privilégio requerido para desempenhar suas tarefas. A ISO/IEC 15.408 (Commom Criteria) aborda a segurança como uma questão de avaliação (ou investigação) da aplicação ou sistema. O Commom Criteria propõe, além da verificação dos meios tradicionais de avaliação, que a avaliação 25 seja realizada com um incremento progressivo a ênfase dada ao escopo, à profundidade e ao rigor. 2.3.2 Testes Funcionais de Segurança O Commom Criteria possui quatro famílias para tratamento de testes: ATE_COV (cobertura), ATE_DPT (profundidade), ATE_IND (teste funcionais realizados por terceiros) e ATE_FUN (testes funcionais). Os testes têm a finalidade de garantir que as aplicações estão atendendo os seus requisitos funcionais de segurança. A cobertura dos testes está relacionada ao tipo de verificação, quanto à amplitude que será realizada no sistema durante a fase de teste. A evidência de cobertura e a análise de cobertura são testes semelhantes, em que fica comprovado que as funcionalidades de segurança foram testados em relação ao que estava definido na especificação funcional. Sendo que na análise de cobertura a correspondência entre os testes, na documentação de testes, e das funções, na especificação funcional precisam ser sistemática e completa. Na profundidade dos testes, os componentes dessa família, tratam com um nível maior de detalhe em relação às funcionalidades das informações utilizadas na análise. Todavia, os testes de alto nível tem o objetivo de demonstrar a presença de qualquer falhas, fornecendo a garantia de que aqueles subsistemas foram corretamente implementados. Os testes funcionais, executados pelos desenvolvedores da aplicação, garantem que suas funcionalidades de segurança exibam as propriedades necessárias para satisfazer os requisitos funcionais da aplicação. 26 3 AVALIAÇÃO DO AMBIENTE E ESTRATÉGIAS DE SEGURANÇA O primeiro ponto a ser tratado na especificação de segurança é levantar e avaliar o ambiente no qual essa aplicação será implantada. É importante, além de levar em conta as premissas já existentes no ambiente, fazer uma análise das principais ameaças, dos pontos críticos, dos ativos valiosos e da legislação aplicada, se for o caso. Albuquerque (2002) relembra que não adianta implantarmos várias defesas, mecanismos de proteção e auditoria se não temos em mente aquilo contra o qual estamos nos defendendo, quais são as ameaças. É difícil desenvolver uma aplicação segura em um ambiente não-seguro. Conforme a análise do ambiente da aplicação – a especificação e o nível de garantia – podem ser necessários mais ou menos controles. Não pode ser esquecido que existem diversas considerações a respeito do uso do sistema, por parte dos usuários, fato que pode influenciar fortemente os aspectos de segurança. O mesmo autor relembra que várias pessoas (desenvolvedores) têm utilizado com muito sucesso a abordagem da ISO/IEC 15.408 para o levantamento dos requisitos de segurança. Baseia-se em cada um dos quatros aspectos a serem considerados: a) Política de segurança: diretrizes, normas e legislação pertinente. b) Ameaças: ativos, mecanismos de ataque e agentes. c) Objetivos de segurança: necessidades do usuário formalizadas. d) Premissas: considerações sobre o uso do sistema e sobre seu ambiente. Note que é importante considerarmos a ordem neste caso, pois levantamos primeiramente a política de segurança e as ameaças para então fornecermos subsídios à definição dos objetivos da segurança. Somente após a definição dos objetivos de segurança, levantamos o que já é atendido pelo ambiente. 27 3.1 LEVANTAMENTO DA POLÍTICA DE SEGURANÇA Segundo Dias (2000) a política de segurança é um mecanismo preventivo de proteção dos dados e processos importantes de uma organização que define um padrão de segurança a ser seguido pelo corpo técnico, gerencial e pelos usuários, internos e externos. A política de segurança deve especificar quais os princípios institucionais de como a organização irá proteger, controlar e monitorar seus recursos computacionais. É importante que a política estabeleça responsabilidades das funções relacionadas com a segurança e discrimine as principais ameaças e riscos que estão presentes. Política de segurança engloba quaisquer diretrizes, normas, legislação, manual da qualidade ou qualquer outro documento que imponha ao sistema determinadas características de segurança. Em varias outras situações existem legislação ou normas da empresa relativas a privacidade, confidencialidade e diversos outros aspectos da segurança. Assim, temos de levantar essas necessidades antes de tudo, já que representam requisitos do sistema, os quais não podemos alterar. O trabalho de levantamento dos requisitos pode ser facilitado, bastando que o cliente já tenha uma política de segurança definida. Normalmente a política funciona como uma pirâmide formada por: diretrizes, normas e procedimentos. As diretrizes são poucas e breves, mas indicam a direção geral da segurança na empresa. As normas são mais detalhadas e podem ser gerais ou especificas. Procedimentos e instruções de trabalho são detalhamentos de operações importantes do ponto de vista de segurança. 3.2 DETECTANDO AMEAÇAS Albuquerque (2002) afirma, também, que ameaça é qualquer situação que ponha em risco o sistema. É impossível levantar todas as ameaças a que um sistema está submetido, visto que elas são frutos da evolução da tecnologia ou de futuras alterações na aplicação. Dentre as inúmeras ameaças existentes, será dado um foco em um grupo de ameaças bem definido e garantir que as ameaças serão tratadas pelo sistema. Seria 28 impossível tentarmos agir contra todas, pois levaria a sistemas falhos ou a sistemas caros e pesados demais. Ainda que tenhamos uma aplicação que consiga se proteger contra um número grande de ameaças, muito provavelmente estará dificultando uma série de outras ameaças não consideradas, pois várias delas utilizam o mesmo mecanismo, partem do mesmo agente ou visam ao mesmo ativo. A garantia de segurança é uma das preocupações centrais da ISO/IEC 15.408. Não se pode garantir a um sistema proteção contra todas as ameaças, mas pode-se testá-lo e avaliá-lo, garantindo que um número tão grande quanto se queira seja inócuo ao sistema. É importante ressaltar que se deve buscar ameaças práticas e bem definidas, do tipo: “usuário altera notas quando podia somente consultá-las”, e não itens genéricos como “invasão do sistema”. Para Albuquerque (2000) as ameaças, em sua maioria, têm certas características: um ativo com valor, um mecanismo de ataque e um agente com conhecimento necessário para atingir o ativo. Assim, as ameaças são em geral tríades: Agente x Mecanismo x Ativo. Para que possamos detectar as ameaças que estão sujeitos um sistema, é fundamental o levantamento dos agentes, mecanismos e ativos. 3.2.1 Os Agentes No levantamento dos requisitos da política de segurança, uma tarefa importante é a definição dos agentes, contra quem estamos nos defendendo, ou queremos nos precaver. O agente de uma ameaça é sempre alguém que vai ganhar algo com sua eventual exploração. Existem diversos tipos de retorno ou compensação, como danos a outra pessoa e roubo de dados, entretanto, o mais esperado é o retorno financeiro. Segundo Albuquerque (2002) a classificação do agente pode se dar de acordo com as categorias: 29 Acesso ao sistema Esse tipo de agente está relacionado ao tipo de acesso disponibilizado ao sistema. Quanto maior o acesso, mais fácil para o agente realizar o ataque. A última categoria, “acesso não-autorizado”, indica que o agente não deveria ter acesso ao sistema. Se ele está realizando um ataque, certamente precisou criar algum tipo de acesso. A tabela 1 apresenta a lista de algumas categorias de acesso ao sistema. Tabela 1 – Lista de acesso ao sistema. Categoria 1 Programador 2 Administrador 3 Usuário 4 Acesso não-autorizado Descrição Acesso, eventualmente total acesso, ao código do sistema. Total acesso à operação e administração do sistema. Acesso a algumas funções do sistema Pessoas, em principio, sem acesso ao sistema. Conhecimento do sistema Para ter sucesso no ataque, é necessário que se tenha um bom conhecimento do funcionamento do sistema. Assim, quanto mais conhecimento o atacante tiver, mais fácil será para ele realizá-lo. Um exemplo pode ser visto na Tabela 2. Tabela 2 - Conhecimento do sistema Categoria 1 Grande conhecimento 2 Algum conhecimento 3 Acesso a manuais 4Nenhum conhecimento Descrição Usuários poderosos, administradores ou ex-administradores. Usuários ou ex-usuários do sistema. Embora sem conhecimento do sistema, tem acesso a manuais. Nenhum conhecimento do sistema. Capacidade do agente Mesmo um usuário comum pode ser perigoso se tiver amplo acesso e conhecimento em relação ao sistema. Assim, deve-se distinguir um usuário leigo de um hacker experiente. Um exemplo pode ser visto na Tabela 3. Tabela 3 - Motivação do agente Categoria 1 Especialista 2 Conhecedor 3 Curioso 4 Leigo Descrição Grande experiência em ataques. Uso de ferramentas sofisticadas. Alguma experiência em ataques. Ferramentas mais simples. Ferramentas básicas de ataque. Nenhum conhecimento de ferramentas de ataque. 30 A motivação não precisa ser considerada diretamente na especificação de segurança, até porque geralmente um agente pode ter múltiplas motivações. Um exemplo pode ser visto na Tabela 4. Tabela 4 - Motivação do agente Categoria Descrição 1 Financeira 2 Imagem 3 Dano Interesse em retorno financeiro. Interesse em destacar suas habilidades. Busca por vingança ou prejuízo de empresa para a qual já trabalhou ou empresa concorrente. Estudo de ferramentas de ataque. 4 Aprendizado E importante classificar o agente porque ao longo da especificação de segurança do sistema iremos utilizar essas informações para traçar as estratégias adequadas a cada ameaça. 3.2.2 Os mecanismos Inúmeros são os mecanismos conhecidos para se explorar as vulnerabilidades de um sistema, todavia deve-se lembrar que pode haver outros ainda por definir. De fato, para a concretização de uma ameaça, pode ser necessário a utilização de um conjunto de mecanismos. Temos de ressaltar que existem mecanismos tanto em baixo nível, como em nível mais alto; por exemplo, “apoderar-se de uma conta de usuário” é um mecanismo de alto nível; indica a quebra da autenticidade do usuário. Aqui, buscaremos dar ênfase as ameaças de alto nível. Na Tabela 5 destacamos alguns dos mecanismos mais comuns. Tabela 5 - Mecanismos de ataque Mecanismo Descrição Cross-site Scripting Ataque que usa uma aplicação web para atingir um outro visitante/usuário. By-pass de controle de Agente com acesso ao sistema utiliza funções externas a este acesso visando burlar o controle de acesso. 31 Força bruta Usada para quebrar senhas e criptografia. Tentativa e erro. Estouro de buffer Muito comum e incrivelmente destrutível. Quebra de autenticidade Apoderar-se da conta de um usuário ou do administrador, através de ferramentas de sniffer ou de engenharia social. Command/SQL Inject Informações enviadas para a construção de queries (consultas SQL) e interações com o banco de dados não são devidamente validadas e checadas. 3.2.3 Os ativos Os ativos variam de acordo com a aplicação, ao contrario dos agentes e mecanismos que às vezes até ocorrem com certa freqüência. Ativos são as informações importantes de um sistema, aquilo que pode ser de interesse do agente em termos de leitura, alteração ou até destruição. A Tabela 6 apresenta um conjunto de exemplos de ativos, com seu respectivo valor para os agentes. Tabela 6 - Ativos com valor Ativo Agente Valor Disponibilidade do sistema. Corrente, ex-funcionário. Dano à empresa. Hacker. Passo intermediário para outro Integridade da tabelas de usuários. ataque. Integridade da tabela notas de Hacker iniciante, alunos. administrador. usuário, Alteração de notas. Existem diversos aspectos da segurança que podem ser de interesse em um ativo, a saber: a) Confidencialidade: se o agente da ameaça conseguir simplesmente ler a informação, já obteve um ganho. A informação que resulta em lucro para o agente da ameaça quase sempre representa uma perda para os clientes do negócio. b) Integridade: o agente, para aferir valor, precisa alterar ou remover um dado no sistema. c) Disponibilidade: basta que o sistema fique “fora do ar” por algum tempo para que isso seja percebido. 32 d) Autenticação: não é preciso sequer alterar um dado, mas simplesmente questionar sua veracidade para que tenhamos um problema de autenticação. 3.3 OBJETIVO DA SEGURANÇA Para Davis (1993) a definição do objetivo da segurança inicia no levantamento das necessidades básicas de segurança, na forma de ameaças e necessidades legais. Entretanto, há de consideramos que existem objetivos que são de exclusiva escolha do cliente. É importante fazer uma lista de objetivos de segurança a qual servirá de base, previamente acertada com o cliente, dos requisitos que deverão ser abordados no momento da avaliação do ambiente. 33 4 REQUISITOS FUNCIONAIS DE SEGURANÇA Relembra Thayler (1990) que os requisitos funcionais de segurança são declarações que descrevem os controles necessários para atenuar o risco. O termo funcional é significativo: os controles devem ser expressos conforme as funções desejadas, em oposição às tecnologias estabelecidas. Soluções técnicas alternativas também são possíveis e qualquer decisão é aceitável, desde que atenda aos requisitos funcionais de segurança. A equipe de gerenciamento de riscos de segurança é responsável pela definição dos requisitos funcionais. É necessário definir os requisitos funcionais para cada risco discutido no processo de suporte às decisões. O produto resultante poderia ser chamado de definições do requisito funcional. A definição e a propriedade do requisito funcional são muito importantes no processo de análise de relação de custo/benefício. O documento definiria o que é necessário para reduzir o risco identificado, mas não especificaria como deveria ser reduzido, nem definiria os controles específicos. Essa distinção concede à equipe de gerenciamento de riscos de segurança responsabilidade na sua área de experiência, ao mesmo tempo em que permite ao proprietário da atenuação, responsável pela implementação da solução de atenuação, a propriedade das decisões relacionadas à operação e ao suporte aos negócios. Assim, organiza-se um documento de especificação da segurança pelos objetos, apontando a estratégia e os atributos utilizados. Em algumas situações os atributos estarão presentes em mais de um objetivo de segurança. Em função disso, pode-se optar por, ao final da lista de estratégias, montar uma lista com os atributos e os motivos de seu uso. A ISO/IEC 15.408 (Commom Criteria) emprega um modelo diferente que lista objetivos e atributos e descreve o porquê de um ser usado com o outro. Do ponto de vista de Albuquerque (2002), a forma usada pelo Common Criteria dificulta o entendimento da estratégia de segurança usada. Ele prefere agrupar as estratégias de forma global e, se for oportuno, acrescentar a tabela de relacionamento ao final. 34 Algumas estratégias de segurança aparecem de forma muito comum, como verdadeiros padrões de segurança da aplicação. Cada caso deve ser avaliado particularmente, mas alguns requisitos são descritos a seguir para, pelo menos, orientar a especificação da segurança do sistema. 4.1 AUDITORIA Auditoria em software incide basicamente na gravação, armazenamento e análise de informações importantes que determinem quais ações relevantes à segurança ocorreram e quem as cometeu. Aparentemente, simples rotinas de auditoria devem considerar uma série de fatores que elevam sua complexidade. É necessário registrar as ações importantes do sistema, como tratar a privacidade, como analisar as trilhas, armazená-las e compatibilizá-las com as trilhas de auditorias. Segundo Dias (2000), deve ser dada atenção especial ao volume de dados a ser armazenado e o volume de ações registradas. É preciso definir quais ações são relevantes para serem gravadas – registrar pouco pode não ser elucidativo para desvendar um problema, e registrar a mais pode comprometer o sistema e/ou gerar trilhas em volume superior à capacidade de análise. A gravação das trilhas deve considerar a finitude do espaço nas mídias adotadas, assim como o tratamento a ser dado aos dados quando o espaço se exaurir. É necessário destacar as seguintes preocupações: a) saber se os dados mais antigos serão apagados à medida que os novos são inseridos (permitindo que um atacante gere ações lícitas repetidamente após um ataque, de forma a eliminar qualquer registro das trilhas); b) se o melhor é parar de registrar (admitindo que o atacante aja incognitamente); ou, c) se travar o sistema até a intervenção do administrador para liberar espaço é atitude mais apropriada. O armazenamento da trilha de auditoria deve ser feito de forma que sua integridade, mesmo em caso de ataque ou falha do sistema, seja garantida. 35 Outro aspecto importante é o que trata da privacidade. Alguns sistemas são altamente comprometidos com a privacidade de seus usuários. A auditoria pode violar a privacidade. Nesse caso, será necessário escolher entre privilegiar a auditoria ou a privacidade. O registro e a visualização da trilha de auditoria é coberta no Commom Criteria por três atributos de segurança: FAU_GEN (geração de dados para auditoria), FAU_SEL (seleção de dados para auditoria) e FAU_SAR (revisão de dados da auditoria). Figura 1 – Família FAU_GEN A geração de dados para a auditoria é tratada na ISO/IEC 15.408 pelo atributo FAU_GEN, o qual possui dois níveis, FAU_GEN.1 (geração de dados de auditoria) e FAU_GEN.2 (associação do usuário ao evento de auditoria), conforme é visto na figura 1. Este atributo recomenda que sejam armazenados os registros de cada um dos seguintes eventos: a) Inicialização e finalização das funções de auditoria; b) Todos os eventos auditáveis para o nível [seleção: mínimo, básico, detalhado ou não especificado]; c) designação: outros eventos de auditoria; d) Para cada evento auditado deve-se registrar ao menos as seguintes informações: e) Data e hora do evento, tipo de evento, identidade do sujeito (usuário ou sistema) e resultado final (sucesso ou falha); f) Para cada tipo de evento, baseado na definição do evento na especificação de segurança, incluir [designação: outras informações necessárias. A seleção de dados para a auditoria é tratada no Commom Criteria pelo atributo FAU_SEL, o qual possui apenas um nível, conforme é mostrado na figura 2. 36 Figura 2 – Família FAU_SEL Considerando que os eventos auditáveis ao passar do tempo podem deixar de serem importantes, a ISO/IEC 15.408 sugere que se permita mudanças nos eventos auditáveis e que o sistema registre na trilha de auditoria, no nível mínimo, todas as alterações na configuração da auditoria, com base nos seguintes critérios: a) Identidade do objeto e usuário b) Hora do dia A revisão de dados da auditoria é tratada no Commom Criteria pelo atributo FAU_SAR (revisão de dados de auditoria), o qual possui três níveis, conforme é visto na figura 3: FAU_SAR.1 (revisão de auditoria), FAU_SAR.2 (revisão restrita de auditoria) e FAU_SAR.3 (revisão selecionável de auditoria). Figura 3 – Família FAU_SAR De acordo com Albuquerque (2002), a análise de trilha de auditoria manualmente é tediosa e seus resultados estão passivos a erros. Na maioria das vezes, os eventos não representam grandes problemas de segurança. Muitas vezes o verdadeiro potencial da auditoria não é aproveitado até que os dados sejam transformados em informações úteis. Dias (2000) relembra que é importante a criação de um mecanismo automático para detecção de problemas. Alarmes e respostas automáticas à tentativa de invasão permitem que, detectada uma situação suspeita, o sistema envie um e-mail, apresente uma mensagem no console do administrador, registre na tabela de suspeita de invasão, ou mesmo, tome alguma medida de auto-proteção. 37 4.2 NÃO REPÚDIO Relembra Albuquerque (2002) que repúdio é uma forma de ataque. O agente do ataque executa uma função no sistema e posteriormente nega tê-la efetuado; por exemplo, alguém faz uma compra em uma loja eletrônica e, no momento de pagar, alega que não a fez. A ISO 15.408 (Common Criteria) define dois atributos de segurança para a especificação dos mecanismos de não-repúdio utilizados, conforme figura 4 e 5. Figura 4 – Não repúdio de origem Figura 5 – Não repúdio de destino Para garantir a identificação do emissor da informação, utilizamos o atributo FCO_NRO (repúdio de origem), o qual pode ser especificado em dois níveis, FCO_NRO.1 (prova de origem seletiva) e FCO_NRO.2 (prova de origem assegurada), e para assegurar a identificação do destinatário, utiliza o atributo FCO_NRR (prova de recebimento), o qual também pode ser dividido em dois níveis, o FCO_NRR.1 (prova de recebimento seletiva) e o FCO_NRR.2 (prova de recebimento assegurada). Para evitar o não-repúdio é necessário autenticar as partes envolvidas e garantir a integridade da mensagem, para que o conteúdo não seja alterado. As assinaturas eletrônicas são eficazes para garantir o não-repúdio de origem. Entretanto, insuficiente para garantir o de recebimento. É preciso algum tipo de protocolo em que o destinatário ou uma terceira parte confiável envie ao emitente, ou armazene em base confiável, uma mensagem comprobatória do recebimento. A mensagem de resposta (prova do recebimento) deve ser também assinada eletronicamente. Uma terceira parte confiável arbitrando as trocas de mensagens é importante também para evitar que a prova de recebimento chegue ao emissor da 38 mensagem original. Nesse caso, o emissor (A) enviaria uma mensagem, o destinatário (D) acusaria seu recebimento enviando outra em resposta, porém essa prova de recebimento não chega a A. Há a hipótese de se configurar, na visão de A, que o negócio não foi fechado e D, sim. Uma terceira parte confiável permitiria ambas as partes consultar um árbitro para saber se o protocolo foi concluído com sucesso. Outra alternativa seria o emissor repetir a mensagem, notificando em caso de uma cópia, a intervalos regulares até a confirmação de recebimento. 4.3 CRIPTOGRAFIA Soares (1995) comenta que a criptografia surgiu da necessidade de se enviar informações sensíveis através de meios de comunicação não confiáveis, ou seja, em meios onde não é possível garantir que um intruso não irá interceptar o fluxo de dados para leitura (intruso passivo) ou para modificá-lo (intruso ativo). A forma de contornar esse problema é utilizar um método que modifique o texto original da mensagem a ser transmitida (texto normal), gerando texto criptografado na origem, através de um processo de codificação definido por um método de criptografia. O texto (ou a mensagem) criptografado é então transmitido e, no destino, o processo inverso ocorre, isto é, o método de criptografia é aplicado agora para decodificar o texto criptografado, transformando-o no texto normal original. Há dois tipos de criptografia: a simétrica e a assimétrica (ALBUQUERQUE, 2002). A simétrica utiliza uma chave para criptografar os dados e a mesma chave serve para decriptografá-los. Na criptografia assimétrica, as chaves são sempre produzidas em par. Para Rufino (2002), um problema da criptografia assimetria está no fato de ser dificultoso entregar a chave de forma segura a quem vai decifrar a mensagem. Existem diversos algoritmos conhecidos de criptografia simétrica, como DES, IDEA, TRIPLE-DES e BlowFish . Segundo Albuquerque (2002), a garantia da confidencialidade na criptografia deve ser baseada na segurança da chave; o ideal é usar algoritmo público conhecido. O segredo tem que estar na chave, não no algoritmo. Os algoritmos públicos mais conhecidos são desenvolvidos para evitar criptoanálise e decifração 39 do texto. Algoritmos feitos de forma amadorística são, geralmente, bastantes suscetíveis a criptoanálise. Criptoanálise é uma especialidade que busca identificar a chave ou o texto original. É preciso atentar que alguns algoritmos são protegidos por direitos autorais em alguns países do mundo. O Commom Criteria define dois atributos de segurança para a especificação do uso de criptografia: o FCS_COP (operação de criptografia) e o FCS_CKM (gerenciamento de chaves de criptografia). O atributo de segurança FCS_COP (operação de criptografia) apresenta apenas um nível, de mesmo nome, conforme visto na figura 6. Figura 6 – Família FCS_COP O atributo de segurança FCS_CKM é dividido em quatro níveis, conforme visto na figura 7: FCS_CKM.1 ( geração de chaves de criptografia), FCS_CKM.2 (distribuição de chaves de criptografia), FCS_CKM.3 (acesso a chave de criptografia) e FCS_CKM.4 (destruição de chaves de criptografia). Figura 7 – Família FCS_CKM 4.4 PROTEÇÃO DE DADOS DO USUÁRIO A proteção de dados dos usuários é regida pelo Common Criteria por funções de segurança e políticas para proteção dos dados. Esses requisitos são divididos em quatro grupos: 40 a) Políticas de funções de segurança para proteção dos dados do usuário: b) Política de controle de acesso; c) Política de controle de fluxo de informações. d) Formas de proteção dos dados do usuário: e) Funções de controle de acesso; f) Funções de controle de fluxo de informações; g) Transferências internas; h) Proteção de informação residual; i) Retorno; j) Integridade de dados armazenados. k) Armazenamento off-line, importação e exportação: l) Autenticação de dados; m) Exportação de dados para fora do controle do sistema; n) Importação de dados de fora do controle do sistema. o) Comunicação interna: p) Proteção de confidencialidade de dados do usuário; q) Integridade na transferência de dados. 4.4.1 Controle de Acesso Albuquerque (2002) comenta que proteção de dados do usuário é basicamente realizado por controle de acesso. A função de controle de acesso do sistema é utilizada para definir se o usuário tem direito a acessar ou alterar determinada informação e para garantir que apenas o usuário com esse direito pode ter acesso a essa informação. Conforme o Commom Criteria (1999), o controle de acesso, é atendido por dois níveis de atributos: FDP_ACF (funções de controle de acesso) e FDP_ACC (política de controle de acesso). O atributo FDP_ACC apresenta dois níveis, FDP_ACC.1 (controle de acesso por subconjuntos) e FDP_ACC.2 (controle de acesso completo). As funções de controle de acesso da aplicação devem considerar que diferentes usuários possuem direitos de acesso distintos. Usuários podem realizar diversos tipos de operações sobre os dados (ler, alterar, remover ou criar 41 informações). Atenção especial deve ser dada ao controle de acesso tendo em vista que é responsável por monitorar o acesso aos diversos usuários, assim, tem por principal função não deixar que usuários burlem o controle de acesso e assim tenham acesso a informações diretamente sem passar por mecanismo de autenticação/validação. Há vários tipos de controle de acesso que podem ser utilizados. Todavia, os mais comuns são: a) controle de acesso por níveis universais, o qual classifica as informações com níveis, como secreta, confidencial, restrita e pública; b) controle de acesso por proprietário e grupo de proprietário, esse muito popular em sistemas operacionais do tipo UNIX, no qual é definido o acesso amplo ao dono da informação. Um segundo nível mais restrito a um grupo de pessoas que pode precisar de informações e, em seguida, o direito de acesso a todos. Alguns, porém, indicam alguns usuários, negando-lhes explicitamente determinada operação. Comenta Albuquerque (2002) que o controle de acesso por contexto pode ser exemplificado como o objeto 'Projeto' pode ser lido e alterado pelo perfil 'Financeiro' e pelo perfil 'Equipe do Projeto'. Note que o perfil 'Equipe do Projeto' varia de projeto; não é um grupo fixo de pessoas. Isso é uma característica geralmente necessária em sistemas de controle de acesso e que gera mais custo para implementação. Ainda que o aplicativo, o sistema operacional e o firewall3 tenham a política de acesso obedecida, outros fluxos ilícitos precisam ser controlados. Entre eles, existem computadores ligados a modem, roubo de HD (disco rígido) e outras ocorrências de furto. De todas as alternativas, difíceis de serem levantadas e implementadas na totalidade, a maneira mais segura de se evitar acessos ilícitos é através do uso de criptografia das informações. 3 Firewall é um nome dado a um dispositivo de rede que tem por função regular o trafego de rede entre redes distintas e impedir a transmissão de dados nocivos ou não autorizados de uma rede a outra (SOARES, 1995). 42 4.4.2 Importação e exportação de dados A exportação ou importação de dados precisa respeitar as regras estabelecidas na política de controle de acesso e fluxo de informações. Segundo o CC (1999), essa premissa de segurança é tratada pelo atributo FDP_ITC, a qual possui os níveis FDP_ITC.1 e FDP_ITC.2. Embora óbvio, um usuário não autorizado a criar determinada informação, não deve ter oportunidade de criá-la também por importação ou exportação. As comunicações entre sistemas também devem ter os níveis necessários de segurança à proteção das informações. A política de segurança deve tratar das questões pertinentes a relatórios (saída de dado sem segurança), alertando os usuários das suas responsabilidades sobre a confidencialidade dos dados, que não será mais tarefa do sistema. Na norma ISO/IEC 15.408, importação, exportação, autenticidade e proteção da confidencialidade e da integridade são atributos separados. Isso faz sentido já que, teoricamente, é possível usar um desses atributos e não o outro. Porém segundo Albuquerque (2002), geralmente usamos apenas os atributos de importação e exportação, sem atributo de segurança, ou usamos o pacote completo, com todos os atributos especificados. As transferências internas – aplicações em locais físicos diferentes como em um ambiente cliente-servidor – necessitam, muitas vezes, de controles especiais que envolvem a criptografia ou a autenticação dos dados em virtude da possibilidade de interceptação da informação. As informações residuais, como as armazenadas em cookies4, que permanecem armazenadas mesmo depois de excluídas, precisam ser tratadas de forma adequada para que pessoas não autorizadas não possam recuperá-las. A solução mais simples é escrever zeros sobre os dados apagados. Se a informação for muito importante, pode-se escrever zero, depois um, depois zero novamente, em seguida dois e repetir o processo 128 vezes para assegurar que uma análise magnética da superfície não permita detectar a informação. A garantia de integridade dos dados armazenados requer medidas preventivas quanto a problemas de hardware e atomicidade de transações. Pouco se pode fazer quanto a problemas físicos, como interferência magnética, no 4 Cookies é um grupo de dados trocados entre o navegador e o servidor de páginas, colocando num arquivo de texto criado no computador do usuário(TORRES,2003). 43 desenvolvimento de software, mas pode-se remediar a deficiência com alertas após detectado problemas que caracterizem falhas no hardware. Albuquerque (2002) define transação como o conjunto de operações realizadas na base de dados do sistema que só faz sentido quando realizadas todas as operações em conjunto. O exemplo clássico é o de transferência entre contas, a operação só tem importância se tanto o crédito quanto o débito tenham sido feitos com segurança. Se apenas um deles for feito, a operação deve ser desfeita. Geralmente a atomicidade de transações fica sob a responsabilidade do sistema de banco de dados, nas ocasiões que são empregados. 4.5 GERENCIAMENTO DE SEGURANÇA O Common Criteria (CC 1999) define uma classe para gerenciamento de segurança que envolve atributos, informações e funções de segurança. Todo gerenciamento de segurança passa por pontos importantes como: a) Definição e gerência de papéis de segurança, que significa determinar quem possui acesso a determinadas funções ou informações de segurança. b) Capacidade de revogação e expiração de atributos de segurança, que é a capacidade do sistema revogar um direito imediatamente ou estabelecer um prazo para tal. c) Depois desses pontos, outros três tipos de funções compõem o gerenciamento: d) Gerenciamento das funções de segurança, que descreve o acesso e os atributos das funções de segurança. e) Gerenciamento dos atributos de segurança, que descreve o acesso aos atributos de segurança de outros objetos do sistema, como quem define o proprietário de um arquivo. f) Gerenciamento de dados de segurança, o qual, ao contrário dos atributos, não se liga a um objeto particular. 44 4.6 PRIVACIDADE Segundo Albuquerque (2002) privacidade é a capacidade de um usuário realizar ações em um sistema sem que seja identificado. É completamente diferente de confidencialidade, que define que apenas usuários autorizados podem ter acesso à determinada informação. O Commom Criteria define quatro atributos para a privacidade: FPR_ANO (anonimato), garante que um usuário possa usar um recurso ou serviço sem ter sua identidade revelada; FPR_PSE (pseudônimo) – garante que processos ou operações realizadas por um usuário devem identificar somente o seu pseudônimo para os usuários; FPR_UNL (não-rastreamento) - garante que um usuário possa fazer uso de vários recursos e serviços sem que outros possam ligá-lo a esses usos; e, FPR_UNO (invisibilidade) – garante que um usuário possa usar um recurso ou serviço sem que outros, principalmente terceiros, possam saber que o recurso ou serviços está sendo usado. O não-rastreamento e a invisibilidade são tratadas no Commom Criteria pelos atributos FPR_UNL e FPR_UNO, respectivamente. 4.7 AUTOPROTEÇÃO Segundo Albuquerque (2002), é importante notar que existe uma distinção entre atributos, funções e informações do sistema, para seu funcionamento específico, e atributos, funções e informações de segurança do sistema. O primeiro grupo foca na proteção dos dados do usuário, aqueles destinados à atividade fim do sistema, enquanto o segundo na proteção dos dados da segurança do sistema. Existem três pontos que podem ser destacados nas funções de segurança do sistema: a) Camada subjacente, que é a plataforma (sistema operacional ou hardware) sob a qual o sistema opera. Uma plataforma comprometida representa um risco para o sistema. 45 b) Implementação das funções de segurança, que se for possível interferir alterando-se as funções de segurança, também será atingido indiretamente os dados confidenciais sistema. c) Dados e atributos de segurança, que corresponde ao banco de dados administrativo que orienta a proteção do sistema, bem como define a política de controle de acesso. Os itens citados anteriormente devem ser implementados conjuntamente, visto que são complementares; a implementação de um e não de outro, representa um alto risco e pode comprometer a segurança como um todo. O Common Criteria define um grupo de famílias importantes para proteção da Segurança: a) Teste de camada subjacente b) Falha Segura c) Disponibilidade de dados exportados pelo sistema d) Confidencialidade dos dados exportados pelo sistema e) Integridade dos dados exportados pelo sistema f) Transferência interna de dados g) Proteção física do sistema h) Recuperação segura i) Detecção de repetição j) Monitor de referência k) Separação de domínios l) Protocolo de sincronização de estado m) Registros de tempo (time stamp) n) Consistência de dados entre funções de segurança o) Consistência de dados replicados p) Autoteste Sistemas que não implementam proteção nas funções de segurança comprometem a segurança dos dados do usuário, pois controles de proteção tornam-se vulneráveis e, dessa forma, comprometem a segurança como um todo. Albuquerque (2002) considera essencial a existência dos seguintes mecanismos: 46 a) Controle de acesso a dados de segurança b) Autoteste c) Proteção física d) Teste da camada subjacente e) Falha segura Os dados de segurança devem ser protegidos de forma análoga aos dados do usuário. Isto é, as medidas (controle de acesso, integridade, disponibilidade, informação residual e outros) que protegem os dados do usuário devem também proteger os dados de segurança. 4.8 CONTROLE DE SESSÕES Segundo ALBUQUERQUE (2002), o controle de sessões envolve desde questões como notificar o usuário sobre quais foram seus últimos acessos até o cancelamento da sessão após um período de inatividade do sistema. As notificações a respeito dos últimos acessos podem englobar informações dos acessos não só bem-sucedidos como também dos malsucedidos. As sessões também podem ser restringidas a determinados horários e dias, como o horário comercial. Se uma sessão ficar sem uso durante muito tempo, regras, como o seu cancelamento automático, podem ser estabelecidas. O acesso ao sistema envolve uma série de aspectos que podem ser usados para ajudar na estratégia de segurança: a) Limitação do acesso ao sistema – conforme o tipo de acesso (local, via rede, via Internet) e a hora do acesso (hora de trabalho normal, fora do expediente), o usuário pode ser impedido de executar o sistema. b) Limitação do escopo do sistema – conforme o tipo de acesso (local, via rede, via Internet) e a hora do acesso (hora de trabalho normal, fora do expediente), o usuário pode ser limitado a algumas funções do sistema. c) Limitação do número de acessos – restringir o número máximo de sessões de um usuário. d) Mensagem de acesso – solicitar que o usuário confirme a leitura de uma mensagem antes de liberar o acesso ao sistema. 47 e) Histórico de acesso – informar ao usuário quando foi o último acesso com sucesso e eventuais falhas na autenticação ou no estabelecimento da sessão. f) Travamento de sessão – meios de o usuário bloquear o console sem encerrar a sessão. Após um travamento, intencional ou não, a forma de se voltar a ter acesso à sessão deve ser por meio de uma nova autenticação do usuário. 4.9 AUTENTICAÇÃO Segundo Albuquerque (2002), a autenticação visa possibilitar identificar que o usuário que está acessando o sistema é de fato quem ele diz ser. É notória a importância da autenticação dos usuários para a segurança dos sistemas computacionais. Não basta apenas dispormos de mecanismos fortes de controle de acesso se um usuário pode se fazer passar por outro. Logo, ficaria difícil de responsabilizar um usuário através da auditoria, pois não temos a garantia da identificação. Segundo Albuquerque (2002) há três formas de identificar um usuário, quais sejam: a) Perguntar algo que só aquele usuário saberia responder corretamente. b) Solicitar a apresentação de algo que só aquele usuário teria. c) Identificar o usuário por características pessoais. Dessas maneiras listadas, a primeira alternativa é a mais comum. A informação que o usuário sabe é, geralmente, uma senha individual de acesso. A segunda alternativa é geralmente utilizada no sistema bancário, com os cartões magnéticos. Basta apenas apresentar o cartão e digitar a senha e este é autenticado como o usuário. A última alternativa é o sistema biométrico que visa identificar a existência de características pessoais. No momento, os métodos mais utilizados são através do reconhecimento da íris e impressões digitais. Ocorre que o uso desses dispositivos ainda é muito caro e está sujeito a erros. Além do que a impressão 48 digital, ou qualquer outro aspecto morfológico, é armazenado na forma de uma quantidade muito grande de dados (cerca de 2 Kbytes). 4.9.1 Processo de Autenticação e Identificação É importante ressaltar que existe diferença entre a identificação e autenticação do usuário. A identificação procura saber quem está operando o sistema. Enquanto que a autenticação trata de garantir que o usuário é quem ele diz ser. Até podemos identificar um usuário sem autenticá-lo, todavia a autenticação pressupõe sempre uma identificação. Existem sistemas em que apenas uma senha é solicitada e a identificação é realizada com base nos dados da autenticação, todavia isso é uma grave falha de segurança. Durante a fase de autenticação do usuário geralmente os sistemas realizam verificação das senhas informadas com a armazenada anteriormente no banco de dados. Uma senha é armazenada em um banco de dados na forma de um hash. A técnica hash é uma forma de criptografia, a qual atua em um só sentido (ALBUQUERQUE, 2002). Não existe qualquer forma de se obter a senha em claro a partir do hash, mas apenas o hash a partir da senha em claro. 4.9.2 Mecanismo de Autenticação Segundo Albuquerque (2002), independentemente da forma da autenticação, seja ela por senha, cartão, biométrica ou o que quer seja, existem diversos aspectos da autenticação que precisam ser observado: a) Momento da autenticação: a situação ideal é que o usuário só consiga fazer qualquer coisa no sistema após ter sido autenticado. Se houver a possibilidade de um usuário realizar alguma operação sem se autenticar, isso precisa ser bem limitado e definido. b) Impossibilidade de fraude do sistema: a aplicação deve impedir que qualquer outro usuário consiga usar o hash ou outra informação disponível de um outro usuário especifico para forjar a autenticação. Essa é uma preocupação adicional, já que o administrador do sistema 49 tem normalmente acesso ao hash da senha. Se ele consegue interceptar o processo de autenticação e enviar diretamente o hash (em vez da senha), ele conseguirá efetuar o login como aquele usuário. Uma outra possibilidade é o replay, ou seja, um usuário gravar todas as informações que são enviadas para autenticar outro usuário e enviá-las novamente. c) Múltiplos mecanismos de autenticação: caso o sistema permita mais de um mecanismo de autenticação, por exemplo, senha ou biometria, faz-se necessária que haja uma política bem definida sobre a interação entre os mecanismos. d) Reautenticação: muito embora a autenticação seja uma das operações inicias do sistema, é importante lembrar que o usuário pode ter deixado a máquina com a sessão aberta (desbloqueada), e um usuário mal intencionado pode se aproveitar deste fato e realizar alguma operação critica. Assim, é importante haver uma nova autenticação sempre que uma operação critica é solicitada ao sistema. e) Mensagens de erro de autenticação: eventuais mensagens de erro de autenticação podem dar pistas a um eventual agente que esteja buscando atacar o sistema. Sejam nas mensagens de login inválido ou senha inválida. Assim, é importante usarmos apenas um número reduzido de mensagens de erro na autenticação. O emprego de flag para bloqueio de conta, estipulação de prazo de validade em contas e necessidade de troca de senha ou de certificado, são atributos que contribuem para aumentar a segurança do processo de autenticação. Informações para autenticação comumente usadas pelos sistemas: a) Identificação do usuário b) Dados para autenticação c) Prazo de validade dos dados para autenticação d) Prazo a partir do qual deve-se alertar o usuário para renovar seus dados de autenticação e) Indicador de conta bloqueada (flag) f) Data e hora para liberação do bloqueio 50 As senhas, quando empregadas, devem atender critérios que determinem o número mínimo de caracteres, se são compostos por letras, números, sinais e se as letras são sensíveis à caixa (alta e baixa). Segundo Albuquerque (2002), a autenticação é recomendada sempre que o sistema exigir controle de acesso. Utilizamos a autenticação quando devemos responsabilizar usuários por seus atos e quando necessitamos manter a confiabilidade das informações, permitindo apenas seu acesso por parte do próprio usuário e do administrador. 4.9.3 Conformidade com a ISO/IEC 15408 A autenticação do usuário é tratada no Commom Criteria por três atributos: identificação do usuário (FIA_UID), autenticação do usuário (FIA_UAU) e tratamento de falhas de autenticação (FIA_AFL). A figura 8 ilustra o atributo FIA_UID. Figura 8 – Família FIA_UID A identificação do usuário pode ser definida em dois níveis: a) FIA_UID.1, ações anteriores à identificação do usuário, que permitem ao usuário algumas ações especificas antes da identificação; e, b) FIA_UID.2, identificação do usuário antes de qualquer ação, na qual a identificação do usuário deve ser feita antes de qualquer outra coisa no sistema. Os atributos FIA_UID.1 ou FIA_UID.2 são síncronos com os atributos FIA_UAU.1 e FIA.UAU.2, tendo em vista que a autenticação deve acontecer no mesmo momento da identificação. O Commom Criteria sugere que sejam consideradas possíveis funções de gerenciamento de segurança a gerência de identidade de usuários e, para o nível FIA_UID.1, o número e os tipos de ações permitidas antes da identificação. 51 Autenticação do Usuário (FIA_UAU) Figura 9 – Família FIA_UAU A autenticação do usuário é definida no Commom Criteria em dois níveis: FIA_UAU.1, ações anteriores a autenticação e FIA_UAU.2, autenticação do usuário antes de qualquer ação. Além desses dois níveis, outros cinco aspectos são definidos nesse atributo: FIA_UAU.3, autenticação a prova de fraude; FIA_UAU.4, autenticação de utilização única; FIA_UAU.5, múltiplos mecanismos de autenticação; FIA_UAU.6, reautenticação; e FIA_UAU.7, resposta restrita de autenticação, conforme visto na figura 9. 52 5 ANALISANDO RISCOS Dias (2000) relembra que muitas vezes o termo risco é utilizado como sinônimo de ameaça ou da probabilidade de uma ameaça ocorrer. Na verdade, risco é uma combinação de componentes, tais como ameaças, vulnerabilidades e impactos. Vale ressaltar que o risco é inerente a qualquer atividade, podendo seu impacto ser apenas reduzido, visto que a quebra de segurança sempre irá ocorrer, sendo apenas uma questão de tempo, recursos técnicos ou econômicos. Para Rufino (2002), o comportamento anormal de um sistema deve ser examinado para que, ao final de uma análise, possa ser ou não considerado um incidente de segurança. Essas práticas de testes visam testar à resistência dos sistemas as ameaças existentes no ambiente. A avaliação de vulnerabilidades pode ser realizada pelos próprios desenvolvedores, ou por uma equipe independente com conhecimento elevado. Nas seções seguintes, serão discutidas e apresentadas análise de vulnerabilidades em sistemas desenvolvidos para o ambiente web, bem como sugeridas dicas para melhoria na segurança para desenvolver sistemas neste ambiente. 5.1 ANALISE DE VULNERABILIDADES É recomendado por Dias (2000) que antes de decidir como proteger um sistema, atenção especial deve ser dada em saber contra quem ele será protegido. A segurança poderá ser então definida em termos de combate às ameaças identificadas. Para que se tenha sucesso na avaliação e sucesso na análise de vulnerabilidades devemos seguir as recomendações: Verificar os ambientes em que a aplicação será implementada, ou seja, analisar uma amostragem dos ambientes mais fracos; Analisar o nível de conhecimento dos principais agentes de ataque, o que pode também ser obtido da avaliação do ambiente; e, 53 Levantar toda a documentação disponível, inclusive as premissas de ambiente já levantadas. Depois de realizados esses levantamentos, o processo de análise resumese a seguir passos descritos de forma detalhada, pois qualquer detalhe não observado pode ser considerado uma falha de segurança. O analista de testes tem que assumir o papel de “chato”, registrando cada detalhe mínimo, pois o agente (atacante) terá muito mais tempo do que a equipe de testes em descobrir falhas. Segundo Dias (2000), qualidade de software é algo que todos cobiçam. Os gerentes sabem que eles precisam ter alta qualidade em seus trabalhos; desenvolvedores sabem que desejam produzir um produto de alta qualidade; os usuários, por sua vez, insistem que o seu trabalho através do uso do software deve ser confiável e consistente. Albuquerque (2002) recomenda que sejam tomadas as providencias a seguir para a realização dos testes. a) Montagem do Ambiente: o analista de testes deve criar o ambiente de acordo com as especificações enviadas ao cliente. O ideal é levantar o ambiente sem consultar a equipe de desenvolvimento. Também é necessário realizar instalações fora dos padrões especificados para testar a resistência do sistema a alguns tipos de erros e ataques. b) Execução de testes: o analista de testes deve realizar os ataques mais comuns para os agentes e ambientes selecionados. c) Estouro de campos de entrada: utilizar um número muito grande de caracteres, maior do que o esperado. Esse tipo de falha é muito comum em ambientes web. d) Execução do sistema em modo de depuração: através da marcação de pontos sensíveis no sistema, pode-se obter chaves de criptografia e outras informações sensíveis. Apenas o fato do sistema operar em modo de depuração já indica uma vulnerabilidade e) Teste de caracteres estranhos: deve-se verificar se a aplicação aceita a entrada de caracteres estranhos. Em ambientes web ou interfaces de banco de dados, deve-se, por exemplo, verificar a entrada de caracteres como aspas simples ou dupla, pois o não tratamento de eventuais erros pode fornecer informações nocivas aos possíveis agentes. 54 f) Alteração no modo de chamada do programa ou parâmetros inválidos: Este tipo de ataque é muito utilizado em ambientes web, pois se pode forjar com muita facilidade parâmetros passados pela URL buscando um comportamento anormal do sistema. g) Exploração de arquivos temporários e chaves no registro do sistema operacional: utilizando alguns tipos de aplicações que monitoram o registro e o sistema de arquivos, podemos verificar todas as chaves e arquivos acessados pelo sistema e tentar obter informações através destes. h) Exploração de portas do servidor: em casos de ambiente cliente/servidor ou em n-camadas, usar um sistema de verificação de segurança em portas. i) Comportamento de comunicação: tentar quebrar a integridade da trilha de auditoria. j) Interceptação de comunicação: verificar, com um sniffer5 ou analisador de trafego, se é possível ler a comunicação entre cliente e servidor. Ou tentar assumir o papel do servidor para verificar se o cliente aceita servidores falsos. A análise e avaliação de vulnerabilidades são tratadas no Commom Criteria (ISO 15.408) pela atributo AVA, a qual contempla a existência de ameaças passiveis de exploração, a possibilidade de um mau uso da aplicação ou de sua configuração incorreta, a possibilidade dos mecanismos de segurança falharem quando expostos à força e a exploração de quaisquer vulnerabilidades que possam ser introduzidas durante o desenvolvimento ou a operação do sistema. Comenta Albuquerque (2002) que a análise de vulnerabilidades é um tipo de avaliação que objetiva determinar se as vulnerabilidades identificadas durante qualquer período do ciclo de vida do sistema ou outra avaliação podem ser exploradas pelos usuários para violar políticas organizacionais de segurança. Esse tipo de análise trata da ameaça do usuário descobrir falhas no sistema, acessando recursos de maneira não-autorizada, alterando configurações de segurança ou prejudicando outros usuários. 5 Um sniffer é um software capaz de monitorar toda a atividade da rede do computador e capturar dados e informações sobre o uso da rede (DIAS, 2000). 55 5.2 SEGURANÇA DE APLICAÇÕES WEB Aplicação Web é o termo utilizado para designar, de forma geral, sistemas de informática projetados para utilização através de um navegador, na internet ou em redes privadas (SCAMBRAY, 2002). Os softwares desenvolvidos na arquitetura cliente-servidor em ambientes web utilizam o protocolo http (HyperText Transfer Protocol), e utilizam um navegador como cliente. Essas aplicações estão divididas, normalmente, em duas camadas de aplicação: a de apresentação e a de dados e armazenamento. Segundo Torres (2003), a arquitetura web é considerada diferente das demais arquiteturas conhecidas, porque difere justamente no controle de segurança. Assim, uma aplicação web construída de forma tradicional pode até fazer funcionar, porém para o contexto da Web, isso pode não ser o suficiente. Um desenvolvedor web não especializado, que não adota boas práticas de engenharia web, pode construir uma aplicação sem considerar a escalabilidade, sacrificando servidores, além de não considerar aspectos de segurança, propiciando “brechas” no código, acarretando invasões, por exemplo. A seguir, algumas sugestões para melhorar questões de vulnerabilidade em sistemas desenvolvidos para a Web. 5.2.1 Aspectos gerais de segurança para desenvolver sistemas para Web As dicas aqui apresentadas é uma compilação dos autores DIAS(2000), ALBUQUERQUE (2002), SHEMA(2003) e TORRES(2003). Sempre critique os parâmetros de uma requisição GET ou POST, mesmo que eles já tenham sido criticados por código JavaScript no navegador, ou seja “impossível” ao usuário digitar um valor errado (um elemento <select>, por exemplo); Estabeleça tamanhos máximos para todos os dados recebidos. Garanta que qualquer arquivo de dados utilizado por uma página esteja fora da árvore de documentos acessível ao navegador; Toda informação textual deve ser quotada antes de ser concatenada ou armazenada em outro meio, para garantir que nenhum símbolo seja interpretado 56 como tendo significado especial pela linguagem de script, banco de dados ou pelo navegador do usuário; Sempre imponha limites obrigatórios ao uso de recursos (memória, processador, espaço em disco, largura de banda) para todas as páginas. Garanta que páginas capazes de modificar informações só possam ser acessadas por meio de requisições POST; Nunca deixe informações de autenticação no navegador, seja em cookies ou em campos escondidos; utilize um tipo de identificador de sessão (a session id) não reutilizável e não seqüencial para indexar esta informação dentro do servidor web; Não dependa do controle de acesso a páginas (URLs) pelo servidor web para autorizar o acesso a informações por uma página; Nunca confie que o identificador (chave) recebido em uma requisição represente um registro autorizado ao usuário; refaça este tipo de verificação em todas as páginas; Não utilize a mesma senha de acesso à aplicação para outras conexões de rede, por exemplo, a um banco de dados; Utilize os privilégios mínimos em todas as operações, em especial não rode aplicações e servidores com logins de sistema ou administrador, e não acesse um banco com papel de administrador de banco de dados. Não reinvente a roda – uma biblioteca de larga utilização tem mais chances de ter falhas (bugs) identificados e corrigidos do que o código criado internamente em sua empresa. Nas sub-seções que se seguem, várias ocorrências de vulnerabilidades são discutidas. 5.2.2 SQL Injections SQL (Structured Query Language) é uma linguagem criada para manipulação de banco de dados permitindo a execução de consultas, obtenção de dados, inserção de novos, remoção e exclusão de registros de dados. Apesar de ser uma linguagem padronizada, ainda assim vários comandos específicos são introduzidos para atender uma tecnologia de banco de dados. Alguns gerenciadores 57 também possibilitam a interação com o sistema operacional, permitindo a execução de programas utilizando somente SQL. Segundo Torres (2003), SQL Inject é nome que se dá à alteração da instrução SQL utilizada por uma aplicação através da inserção de caracteres indevidos na entrada de dados da aplicação. Hoje em dia é uma prática comum os sites pedirem um cadastro do visitante, e criar-lhe um login, dando acesso a áreas restritas e especiais do site. Cadastro esse que na maioria das vezes é gratuito, com a intenção apenas de fidelizar o usuário e, claro, ter mais um e-mail para uma possível divulgação, que neste caso não se caracteriza spam6, pois o devido usuário previamente aceitou informações vindas daquele site. Em sites onde o cadastro é pago, aí a coisa muda de figura. O site imagina estar vendendo alguma informação ao visitante, e por isso, pode pedir alguns dados sigilosos do usuário e guardá-los seguramente no seu banco de dados. Em ambos os casos a aplicação pode estar vulnerável a uma das falhas de segurança muito utilizada hoje em dia, o SQL Inject. Um ataque baseado em injeção em SQL (SQL injection attack) é uma técnica que se aproveita da falta de filtragem das informações de entrada em sistemas que geram comandos SQL para manipular conjuntos de dados. Tipicamente, estas informações de entrada são oriundas dos próprios usuários finais do sistema. Usuários maliciosos podem então se aproveitar da falta de tratamento de entradas e inserir strings que geram, por sua vez, comandos SQL de caráter nocivo à camada de dados da aplicação. A falha provocada por SQL inject pode ocorrer através de diversos pontos de entrada: caixas comuns de entrada de dados, transmissões de dados via GET e distorções da origem de dados. Essas informações são enviadas para construção de queries e interações com o banco de dados e não são devidamente validadas e checadas quando recebidas e tratadas pela aplicação/site ou pelo banco de dados. SQL INJECTIONS NA PRÁTICA Para ilustrar o funcionamento de um SQL injection, será mostrado um exemplo de mecanismo de autenticação baseado em formulários que utiliza SQL 6 Spam é uma mensagem eletrônica não-solicitada enviada em massa (DIAS,2000). 58 para a verificação das credenciais. Após a entrada de dados do usuário, a aplicação, que neste exemplo é escrita em JSP (Java Servet Pages), efetua a operação de acordo com a instrução abaixo: String sql = "SELECT * FROM usuarios WHERE login = ’" + formusr + "’ AND password = ’" + formpwd + "’"; Esta operação, junto com os dados passados pelo usuário, resulta no seguinte comando SQL. SELECT * FROM usuarios WHERE login = ’foobar’ AND password = ’foobar123’; Caso o sistema de banco de dados retorne uma tupla (linha), a aplicação entende que a autenticação ocorreu com sucesso, caso contrário, um erro de registro não encontrado é retornado a aplicação, e esta rejeita o acesso. Em um sistema projetado e implementado visando a segurança, deveriam ser validadas as entradas de usuário e senha, permitindo somente caracteres válidos. Estes caracteres válidos são os que podem estar contidos nas respectivas strings. A Tabela 7 ilustra os caracteres mais utilizados para realizar injeções. Tabela 7 - Caracteres mais utilizados 59 Esta preocupação se deve ao fato que usuários mal intencionados podem preparar as strings de login e password de tal forma que operações ilícitas sejam efetuadas, utilizando recursos da própria linguagem SQL. Ou seja, o usuário através do que digitou nas caixas de entrada de dados, conforme figura 10, conseguiu alterar o significado da instrução SQL da aplicação. No exemplo mostrado, o usuário informou ‘ OR ’1’=’ 1 nas duas caixas, de login e senha. Veja como ficaria o resultado da concatenação: SELECT *FROM login where login=’ OR ‘1’=’1’ and senha=’OR’1’=1 Neste exemplo o significado da instrução SQL foi totalmente alterado. Estará sendo feito a busca de login e senha vazios ou ‘1’=’1’. Como sempre 1 é igual a 1, todos os registros serão retornado e o algoritmo da aplicação se verá a frente de uma situação totalmente inesperada, permitindo o acesso ao usuário. Figura 10 – Exemplo de SQL Inject (Quebra da autenticação) 60 5.2.3 Cross-site Scripting O cross-site scripting é comumente chamado de XSS ou CSS. Consiste na reprodução de informações de um cliente quando a origem desses dados pode ser uma fonte mal intencionada. Um usuário mal intencionado pode enviar determinadas informações para sites web com páginas dinâmicas, que quando forem acessadas por uma aplicação cliente, como o navegador Web, este executa operações ilícitas. Segundo Torres (2003), esse tipo de invasão, também causado por falha de programação, não é tão prejudicial ao site como o SQL INJECTION, mas pode causar prejuízos indiretos, como danos a imagem de um site. Esta invasão consiste na possibilidade de o usuário digitar, nos campos de entrada de dados normais da página, scripts HTML e/ou Java Script sem validá-los. Um exemplo típico deste problema seria a inserção de imagens ou texto depreciativos em sites de organizações governamentais e oficiais, acarretando sérios danos a imagem do site. Outro exemplo seria no envio de um formulário de e-mail, em que no campo comentário, o usuário ao invés de digitar sua mensagem, introduz códigos em script, o qual levaria o usuário a um outro destino, conforme é visto na Figura 11, modificando o fluxo normal da navegação. Figura 11 – Exemplo de Cross-site Scripting 61 As conseqüências podem ir muito além de simplesmente disparar uma janela pop-up7. Com a ajuda do XSS é possível seqüestrar uma sessão Web de um usuário já autenticado em um web site. O invasor pode injetar um código em um Web site que quando for acessado, ele envia informações sobre o cookies de determinada sessão para o e-mail do invasor ou submete-as via CGI (Common Gateway Interface)8. Depois de conseguir as informações do cookies, o invasor pode montar manualmente o seu conteúdo e driblar o mecanismo de autenticação. A idéia inicial para correção para vulnerabilidade do XSS seria impedir que determinados símbolos que devam marcar instruções de scripting, tal como os sinais de maior e menor e as aspas, sejam digitadas pelo usuário. Porém, estes símbolos podem ser digitados pelo usuário não apenas quando ele estiver tentando invadir o site, mas eventualmente em um texto comum. Se isso acontecer, será desagradável se sua validação estiver impendido a entrada do texto que o usuário precisa digitar. Desta forma a validação não deve ser feita na entrada dos dados, mas sim na saída, passando por um tratamento de segurança. As vulnerabilidades de XSS podem ser difíceis para identificar e remover de uma aplicação web. A melhor maneira é realizar revisões de segurança no código e procurar por todos os lugares onde a entrada de uma requisição HTTP pode seguir possivelmente para uma saída HTML. 5.2.4 Controle de Acesso Falho Nessa vulnerabilidade, restrições sobre o que usuários autenticados podem ou não realizar não são propriamente definidas. Isto possibilita aos atacantes (agentes) explorar ou acessar contas de outros usuários, visualizar arquivos, ou mesmo se utilizar de funções não autorizadas previamente ao seu perfil. Para encontrar esse tipo de vulnerabilidade durante a revisão de código, pode-se procurar por funções que realizam operações de entrada e saída nos arquivos para verificar a confiabilidade, não colisão de nomes, localização em que o 7 O pop-up é uma janela normalmente indesejada, na maioria das vezes usado na web como meio de exibir uma propaganda em uma janela diferente com o propósito de chamar a atenção do usuário (DIAS,2000). 8 CGI (Common Gateway Interface) é uma tecnologia que permite gerar páginas dinâmicas permitindo a um navegador passar parâmetros para um programa alojado num servidor web(TORRES,2003). 62 arquivo será criado no sistema de arquivos e se existe uma maneira do nome do arquivo ser manipulado por indivíduos maliciosos de forma a apontar para um arquivo que o intruso não deveria acessar. Para evitar esse problema, todos os arquivos de uma determinada aplicação devem ser mantidos em locais seguros, sem acessos e permissões de escrita, leitura e execução desnecessários por quem não é de direito. A seguir apresentamos alguns exemplos de controle de acesso falho: a) http://www.site.com.br/admin/modulox (?); b) http://www.site.com.br/admin/moduloy/action.asp (?); c) http://www.site.com.br/adm/pegar_arquivo.cfm?arquivo=../../../winnt/syste m32/certmgr.reg ; d) http://www.site.com.br/adm/upload_arquivo.cfm?arquivo=iislog_safado.dll &destino=../../../winnt/system32/inetserv/isslog.dll. Além disso, deve-se restringir quais nomes de arquivos serão aceitos como válidos, não aceitar que um nome de arquivo, por padrão, represente um arquivo válido e considerar o armazenamento de arquivos temporários em um diretório temporário pertencente a um usuário, fazendo com que seja mais fácil executar a aplicação no privilégio mínimo. 5.2.5 Falha no Tratamento de Erros Esse tipo de falha trata de condições de erro que ocorrem durante a operação normal e que não são tratadas apropriadamente. Se um atacante (agente) puder causar erros os quais a aplicação não saiba tratar, é possível obter informações detalhadas do sistema, indisponibilizar serviços, causar falhas em mecanismos de segurança ou tornar o servidor inoperante. O tratamento de condições de erro em um programa deve ser cuidadosamente pensado e implementado, já que a falha em lidar com qualquer erro pode fazer com que o programa termine em uma condição insegura. E quando ocorrer um erro, este deve estar previsto e a mensagem de erro deve ser controlada 63 pela aplicação. Esta vulnerabilidade pode se apresentar de várias maneiras, dentre as quais: a) Disponibilização de informação em demasia; b) Ignorar erros; c) Má interpretação dos erros; d) Utilização de valores de erros inúteis; e) Tratamento das exceções erradas. Figura 12 – Exemplo de falha no tratamento de erros Outro exemplo desse tipo erro é mostrado na figura 12, em que o excesso de informações (ou o não tratamento do erro) poderá ser utilizado para uma possível invasão. 64 5.2.6 Command Injections/ Parâmetros Inválidos A vulnerabilidade de command injection ou injeção de comando consiste da não verificação dos valores de entrada nos programas, gerando, assim, situações inesperadas como execução de programas indevidos, roubo de sessão, dentre outras. A entrada de dados em um programa pode ser realizada de inúmeras maneiras. Dentre elas, por parâmetros de execução do programa, leitura de teclado, leitura de arquivos, através de comunicação interprocessos e via sockets9. Para cada entrada deve haver uma validação específica, o que se costuma chamar de input validation ou validação de entrada. Comandos do sistema operacional também podem ser executados através das aplicações dependendo da forma como elas foram construídas. Estes comandos podem ser injetados através dos campos visíveis ou ocultos de um formulário junto com os valores de entrada. Como um dos objetivos de um invasor é obter acesso ao sistema operacional da aplicação atacada, este artifício é comumente utilizado. Este problema acontece tipicamente em aplicações CGI escritas de maneira insegura. Para se evitar o Command Injection pode se tomar as seguintes precauções/ verificações: a) Deve-se realizar validação de entrada em todas as entradas antes de passá-las para o interpretador de comandos; b) É necessário que as falhas sejam tratadas de forma segura, bem como sejam tratados os erros de checagem de validação de entradas; c) Não se deve, de forma alguma, permitir que dados não validados sejam passados como entrada para um interpretador de comandos. A seguir, alguns exemplos desse tipo de vulnerabilidade, em que usuários maliciosos podem alterar os parâmetros passados para a aplicação, refletindo na integridade dos dados e na autenticidade do usuário, visto que no primeiro exemplo o usuário pode manipular o atributo “valor”, e no segundo caso, o usuário burla o mecanismo de autenticação, não alegando quem ele possa de fato ser. 9 Sockets é a combinação de um endereço IP, um protocolo e uma porta. 65 Ex1: • http://www.site.com.br/cesta/fecha_pedido.php?IDproduto=12&valor=776 • Cookie: lang=pt-br; ADMIN=no; y=1; time=10:30GMT Cookie: lang=pt-br; Ex2: ADMIN=yes; y=1 ; time=12:30GMT 5.2.7 Uso de URLs “mágicas” e campos de formulário ocultos As denominadas URLs “mágicas” tratam-se de URLs que contêm informações sensíveis incluídas, como por exemplo, senhas de acesso codificadas com algoritmos inadequados. Se a URL em questão é utilizada para autenticar usuários, o risco de algum incidente de segurança ocorrer é alto. Já os campos de formulário ocultos são definidos por um campo, no qual dados potencialmente importantes são passados ao cliente em um formulário que se espera que o cliente não o veja, nem o manipule. Entretanto, usuários maliciosos podem subverter o sistema, visualizando o código fonte da página apresentada e enviando a versão modificada. Portanto, devemos seguir algumas recomendações que ajudam no tratamento desse tipo de falha. a) Deve-se testar todas as entradas e formulários via web com entradas maliciosas; b) Não se deve armazenar dados confidenciais em qualquer construção HTML ou HTTP, tais como URL, cookie ou formulário, se o canal não for criptografado (SSL, TLS, IPSec) ou não utilizar criptografia no nível da aplicação; c) Não se deve confiar em dados provenientes de um formulário web, dado que indivíduos maliciosos podem modificá-los facilmente, mesmo com o uso de SSL; d) Não se deve assumir que a utilização de criptografia torna o sistema seguro, pois existem outras formas de se atacar um sistema. 66 5.2.8 Buffer Overflows Buffer overflow ou extravazamento de buffer é a vulnerabilidade mais comum presente nos programas. Ela, geralmente, ocorre quando um número de dados maior do que o suportado é escrito em um buffer10. Esta vulnerabilidade pode ocorrer devida a falta de cuidados com os índices dos buffers em loops. Um buffer overflow também pode ocorrer quando o caracter ’\0’ não estiver presente no buffer ou quando ocorrer algum erro de aritmética de ponteiros ou índices dos buffers. Os buffers podem ser estáticos ou dinâmicos. Os estáticos são alocados quando o programa é carregado, loadtime, já os dinâmicos são alocados em tempo de execução. Figura 13 – Exemplo de Buffer overflow 10 Um buffer é uma área de memória contiguamente alocada que suporta inúmeras instâncias de um mesmo tipo de dado, como as cadeias de caracteres. 67 Esta vulnerabilidade ocorre quando dados são lidos e/ou armazenados fora dos limites alocados para o buffer, conforme figura 13. Além disso, em algumas linguagens como C e C++ não existem checagens automáticas de limites de um buffer, o que significa que existe a possibilidade de que um buffer seja extravazado. Segundo Dias (2000) buffer overflow depende do servidor de aplicação e continua sendo a principal vulnerabilidade explorada em um software. Essa fragilidade pode ser evitada ou minimizada com o auxilio de filtragem de dados inseridos pelo formulário. 68 6 ESTUDO DE CASO Neste capitulo mostraremos as vulnerabilidades encontradas no Ambiente de Ensino a Distância da UNAMA, o Aprendiz. Segundo Portilho, Marcelo e Silva, Marco Antonio (2005), o Aprendiz é uma aplicação WEB desenvolvida na linguagem de programação JAVA, utilizando várias soluções de software livre, como o framework STRUTS, o banco de dados MYSQL, e o conteiner web TOMCAT. Ao final, apresentaremos algumas sugestões para as correções das falhas detectadas, que possibilitarão minimizar os riscos de ameaças futuras. 6.1 DESCRIÇÃO DO SISTEMA A aplicação que será usada como exemplo é uma demonstração de um típico sistema web. Na Figura 1, é ilustrada a estrutura do sistema Aprendiz, em forma de um diagrama de contexto do sistema, enfatizando as visões e as dependências de uso entre os atores que dele participam. A modelagem de atores ilustra a classificação de generalização e especialização de atores do sistema e a dependência do sistema Aprendiz com um ator, caracterizado por um sistema externo ao contexto, chamado “SistemaAcadêmicoUnama”. O Sistema Acadêmico fornece informações ao Aprendiz como cadastro de aluno, disciplinas dos cursos, entre outras. Uma das tarefas comuns às visões e uso do sistema pelo atores, está relacionada a identificação, via login e senha, para acesso ao Aprendiz. A autenticação de acesso para os usuários determina a visão que cada um deve ter, considerando o perfil do usuário. 69 Figura 14 – Visões de uso do sistema Aprendiz 6.2 VULNERABILIDADES VERIFICADAS NO APRENDIZ O estudo constatou a existência de algumas vulnerabilidades no sistema de aprendizado on-line da UNAMA, o Aprendiz, as quais, serão discutidas e apresentadas possíveis soluções nas sub-seções que se seguem. 6.2.1 Vazamento de Informações O sistema apresenta vazamento de informações, quando do acesso da função “Conheça o Aprendiz”, tendo em vista que está sendo apresentada informações detalhadas do ambiente em que a aplicação está rodando, banco dados utilizado (MySQL) e informações do servidor web. Essas informações permitem que um possível agente (atacante), de posse delas, procure coletar tantas informações quanto possível sobre o seu alvo, ganhando em seguida facilidades na busca de exploit ou procurar por vulnerabilidades existentes no ambiente em que a aplicação está disponível. 70 Há vazamento de informações também quando a aplicação disponibiliza mensagens de erro do tipo: “senha inválida!” ou “Usuário (MATRÍCULA) inexistente no sistema (solicite cadastramento)!”, conforme figuras 15 e 16, respectivamente, durante uma tentativa de acesso a aplicação. Figura 15 – Mensagem de erro Figura 16 – Mensagem de erro O Commom Criteria (ISO/IEC 15.408) recomenda a aplicação da família FIA_UAU (autenticação do usuário), nível FIA_UAU.7 (resposta restrita da autenticação), para o tratamento das mensagens de retorno da aplicação. Onde sugere que para a segurança da aplicação devem fornecer apenas mensagens do tipo: a) Usuário ou senha inválidas. b) Falha interna do mecanismo de autenticação. A restrição a apenas essas mensagens evita que o eventual atacante do sistema saiba, por exemplo, que determinado usuário é válido, e apenas a senha 71 está errada, ou, ainda, que a retirada de uma ou mais formas de comunicação com servidores impede ou dificulta a autenticação. 6.2.2 Tratamento de Falhas de Autenticação As funções de segurança da aplicação não possuem mecanismos que predeterminam o número máximo de tentativas de acesso ao sistema sem sucesso, para fins de bloqueio da conta do usuário. Simplesmente, a aplicação permite que o usuário tente acessar o sistema realizando o método da força bruta. O Commom Criteria (ISO/IEC 15.408) recomenda a aplicação do atributo FIA_AFL.1 (tratamento de falhas de autenticação), que define a política de tratamento para tentativas falhas de autenticação sucessivas. Ressalta, essa norma, que um mecanismo simples de quebra de autenticação é através de tentativa e erro. A norma sugere que se tenha um gerenciamento do número máximo de tentativas falhas e o gerenciamento da ação a ser tomada quando o número de tentativas exceder o máximo. 6.2.3 Definição de atributos do Usuário para Autenticação No processo de autenticação, as funções de segurança da aplicação mantém armazenados somente os atributos: identificação do usuário, tipo de usuário e os dados para autenticação. O Commom Criteria (ISO/IEC 15408) recomenda a aplicação do atributo FIA_ATD.1 (definição de atributos de autenticação) para deixar claro na especificação do sistema as informações que precisam ser mantidas. A norma recomenda que alem dos atributos acima, sejam armazenados também os seguintes atributos: prazo de validade dos dados para autenticação; prazo a partir do qual se deve alertar o usuário sobre a necessidade de renovação dos dados de autenticação; indicação de conta bloqueada, e data e hora para liberação de conta bloqueada. 72 6.2.4 Métricas mínimas das Senhas Quanto à métrica mínima das senhas, as funções de segurança da aplicação Aprendiz não possuem mecanismo que predefinam tamanho mínimo das senhas válidas, conforme é mostrado no código da Figura 17. A aplicação aceita senhas de até no máximo 20 (vinte) caracteres, não há especificação quanto a necessidade de mesclagem entre caracteres alfabéticos e numéricos para composição da senha. O Commom Criteria (ISO/IEC 15.408) recomenda a aplicação do atributo FIA_SOS.1 (métrica mínima das senhas) o qual define a métrica mínima de senhas. Figura 17 - Tamanho mínimo das senhas não implementado 6.2.5 Limitação do número de Seções Simultâneas Quanto o número de acessos simultâneos por um mesmo usuário, as funções de segurança da aplicação não possuem mecanismos que permitam gerenciar o número máximo de conexões concorrentes. Está sendo permitido o acesso concorrente de um mesmo usuário. O Commom Criteria (ISO/IEC 15408) recomenda a aplicação do atributo FTA_MCS.1 (limitação básica do número de seções) e o FTA_MCS.2 (limitação básica do número de sessões por usuário) para o gerenciamento do número máximo de conexões simultâneas e das regras que definem o número máximo de conexões simultâneas para um usuário. 73 6.2.6 Cross-site scripting O sistema apresenta vulnerabilidade nos módulos do “FÓRUM“ e no “CORREIO ELETRÔNICO”. No correio eletrônico e no fórum está sendo possível encaminhar mensagens de scripts, os quais são exibidos ao destinatário através de simples janelas de pop-up, conforme figura 18. Todavia, a preocupação deve ser maior, pois um usuário malicioso, com maiores conhecimento da área, pode até mesmo realizar um seqüestro de sessão de um determinado usuário autenticado. Figura 18 – Exemplo de CSS Uma possível solução seria realizar a validação dos dados de entrada no momento da saída, tendo em vista que seu tratamento na entrada poderá inibir o usuário de utilizar os caracteres de sinais maior e menor e aspas, caracteres essenciais para a criação das tags. 6.2.7 SQL Injetions No sistema Aprendiz foi possível detectar duas vulnerabilidades a injeção de comandos SQL. Uma no módulo de “Autenticação”, onde estava sendo possível burlar o mecanismo de autenticação, permitindo o acesso não autorizado ao sistema, bem como, permitir a interação dos comandos SQL diretamente com o 74 banco de dados, sendo passivo de alteração na integridade da informação. Devido a gravidade do assunto, esta falha já foi corrigida tempestivamente. A outra está presente no módulo de “ALTERAÇÃO DE SENHA”, onde é possível a injeção de comandos SQL arbitrários. A correção da falha existente poderá ser efetuada através do tratamento dos dados de entrada por parte da aplicação permitindo somente a entrada de caracteres válidos. Também, tratando o tamanho dos campos de entrada, com vista a não permanecerem longos, em relação aos dados a serem recebidos de fato pela aplicação, pois caso ocorra, facilitam a construção de querys complexas. 6.2.8 Controle de Acesso Falho O sistema apresenta controle de acesso falho, pois possibilita que usuários não autenticados visualizem informações que não são disponibilizadas a seu perfil, fragilizando a confidencialidade da informação. O sistema possibilita que usuários visualizem arquivos disponibilizados pelos professores para downloads, mesmo sem estarem autenticados na aplicação, basta que o aluno copie a URL referente ao material e depois acesse o conteúdo. Outra falha detectada, mas já corrigida, era referente a listagem de diretórios da aplicação, possibilitando que o usuário tivesse acesso irrestrito a todo conteúdo disponibilizado pelo sistema. A correção foi realizada em nível de rede e configurando o servidor web (Tomcat, no caso). Esta vulnerabilidade pode ser corrigida mantendo os arquivos da aplicação em locais seguros, sem acessos e permissões de escrita, leitura e execução por quem não é de direito. 6.2.9 Controle de Sessão Verificamos que o controle de sessão não se encontra desenvolvido em todos os seus níveis. Não há controle de sessão no módulo “PRINCIPAL”, existindo somente no sub-módulo “DISCIPLINA”, cujo sistema de segurança deste submódulo encerra totalmente a aplicação, após um período de inatividade, redirecionando o usuário para uma nova chamada ao sistema. 75 O Commom Criteria (ISO/IEC 15408) define o travamento de sessão através de três itens independentes: FTA_SSL.1 (travamento automático da sessão) que indica os mecanismos nos quais o próprio sistema provoca o travamento da sessão devido a um grande período de inatividade; FTA_SSL.2 (travamento por requisição do usuário) que indica formas para o usuário solicitar o travamento e, finalmente, o FTA_SSL.3 (encerramento automático da sessão) que indica que o sistema deve encerrar a sessão interativa após um período de inatividade. Diante da norma, sugerimos que após o período de inatividade o sistema redirecione o usuário para se reautenticar e permanecer no mesmo local onde houve o estouro da sessão, bem como, sugerimos também que sejam desenvolvidos os outros métodos propostos pela Commom Criteria. 6.3 CONSIDERAÇÕES FINAIS Na tabela 8, apresentamos a síntese das vulnerabilidades detectadas no ambiente de aprendizado on-line da UNAMA, o Aprendiz, sua relação com a ISO/IEC 15.408 e as possíveis soluções para correção das falhas detectadas. 76 76 Tabela 8 - Resumo das vulnerabilidades e possíveis soluções Vulnerabilidade Funcionalidade Atributo de verificada acordo com a Comentário em relação a ISO/IEC 15.408 Solução proposta ISO/IEC 15.408 Vazamento de Conheço o informações Aprendiz FIA_UAU.7 - A norma recomenda que seja realizado o - Apresentar mensagens tratamento das mensagens de retorno do tipo: “usuário ou senha /autenticação invalida” ou “falha interna no mecanismo de autenticação”. Tratamento de falha de Autenticação FIA_AFL.1 autenticação - A norma recomenda que se tenha um - Aplicação da norma gerenciamento do número máximo de tentativas falhas e o gerenciamento da ação a ser tomada quando o número de tentativas exceder o máximo. Definição de atributos Autenticação FIA_ATD.1 - A norma recomenda que sejam - Complementar os dados, do usuário para armazenados os atributos: identificação do pois a aplicação somente autenticação usuário, tipo de usuário, dados para a retêm informações da autenticação, prazo de validade dos dados, identificação do usuário, prazo para alterar a renovação dos dados tipo de usuário, dados para autenticação, indicação de conta para autenticação. bloqueada e data e hora de liberação da conta bloqueada. 77 77 Vulnerabilidade Funcionalidade Atributo de verificada acordo com a Comentário em relação a ISO/IEC 15.408 Solução proposta ISO/IEC 15.408 Métricas mínimas das Redefinir senha FIA_SOS.1 senhas - A norma recomenda que seja estipulado - Aplicação da norma, pois um tamanho mínimo de caracteres para o sistema não possui composição da senha. mecanismo que predefinam o tamanho mínimo das senhas válidas. Limitação do número de Aplicação sessões simultâneas FTA_MCS.1 e FTA_MCS.2 - A norma recomenda que seja realizado o - Aplicação da norma gerenciamento do número máximo de conexões simultâneas e do número máximo de conexões simultâneas para um mesmo usuário. Cross-site scripting Fórum e correio - - eletrônico - realizar validação dos dados de entrada no momento da saída, pois seu tratamento na entrada poderá inibir o usuário de utilizar os caracteres de sinais maior e menor e aspas. SQL Injections Autenticação/Alte ração de senha - - - a correção da falha poderá ser efetuada 78 78 Vulnerabilidade Funcionalidade Atributo de verificada acordo com a Comentário em relação a ISO/IEC 15.408 Solução proposta ISO/IEC 15.408 através do tratamento dos dados por parte da aplicação, permitindo somente a entrada de caracteres válidos. Controle de acesso falho Aplicação/downlo - - ads de arquivos - a vulnerabilidade pode ser corrigida mantendo os arquivos em locais seguros, sem acesso e permissões de escrita, leitura e execução por quem não é de direito. Controle de sessão Principal/ FTA_SSL.1 - a norma recomenda o travamento - Sugerimos que após o Disciplina FTA_SSL.2 automático da sessão; o travamento por período de inatividade o FTA_SSL.3 requisição do usuário e o encerramento sistema redirecione o automático da sessão. usuário para se reautenticar e permaneça no mesmo local onde houve o estouro da sessão; - sejam desenvolvidos os 79 Vulnerabilidade 79 Funcionalidade Atributo de verificada acordo com a Comentário em relação a ISO/IEC 15.408 Solução proposta ISO/IEC 15.408 outros métodos pela norma. 80 7 CONSIDERAÇÕES FINAIS E CONTRIBUIÇÃO Este trabalho apresentou os principais aspectos de segurança, identificou políticas e planos de segurança, levantou e analisou riscos, ameaças e os principais meios para que se desenvolvam sistemas mais seguros. Durante o estudo de caso foi verificado algumas vulnerabilidades no ambiente de aprendizado on-line da UNAMA, o Aprendiz, em que alguns requisitos estão em desacordo com as normas sugeridas pela ISO/IEC 15.408 ou com as boas praticas de programação. Logo, propomos ao fim de cada sub-sessão possíveis correções das vulnerabilidades encontradas. Este trabalho contribui com os seguintes pontos; a) Define aspectos gerais de segurança; b) Ratifica a importância da segurança no desenvolvimento de aplicações; c) Apresenta fatores importantes para construção de aplicações seguras; d) Discorre sobre normas e padrões dirigidas à segurança da informação, em especial à ISO/IEC 15.408; e) Identifica algumas vulnerabilidades (e propões soluções) em uma aplicação web real, no caso o ambiente de educação a distância da UNAMA, o Aprendiz; 7.1 Perspectivas futuras Como perspectiva mais imediata, a abordagem deste trabalho pretende apoiar aqueles que desejam aperfeiçoar processos de desenvolvimento de produtos com maior segurança. Diversos trabalhos podem ser definidos e desenvolvidos com o propósito de melhorar e estender a proposta apresentada, por exemplo: a) Formulação de padrões de desenvolvimento que suportem, se não todos, alguns dos requisitos de segurança citados; 81 b) Criação de documentos para gerência de desenvolvimento de softwares aderentes à norma ISO/IEC 15.408; c) Elaboração de conteúdo pedagógico para capacitação de recursos humanos (desenvolvedores e engenheiros de software) em segurança da informação; Outros trabalhos também podem ser realizados para apoiar as atividades que sucintamente foram mencionadas e outras que não foram abordadas nesse trabalho, por exemplo: a) Fatores econômicos, como meios de viabilizar a integração da engenharia de software e segurança da informação; b) Avaliação de impactos (positivos e negativos) na adoção da norma ISO/IEC 15.408 em um processo de desenvolvimento de sistemas para a web; c) Contribuições de outros padrões, desenvolvimento de aplicações. como COBIT, podem oferecer ao 82 BIBLIOGRAFIA ALBUQUERQUE, R; RIBEIRO, B. Segurança no Desenvolvimento de Software, Editora Campus, 2002. DIAS, CLAÚDIA. Segurança e Auditória da Tecnologia da Informação, Editora Axcel Books do Brasil,2000. TORRES, DENNIS. Segurança Máxima de Software: como desenvolver soluções seguras / DENNES TORRES. – Rio de Janeiro: Brasport, 2003 DAVIS, A. Softwtare Architecture: Objects, Functions and States, Prentice-Hall, 1993. RUFINO, N. M. O. Segurança Nacional - Técnicas e Ferramentas de Ataque e Defesa de Redes de Computadores, Novatec Editora, 2002. SOARES, L. F. G.; LEMOS, G.; COLCHER, S. Redes de Computadores - Das Lans, Mans e Wans às Redes ATM, Editora Campus, 1995. THAYLER, R.; DORFMAN, M. System and Software Requirements Engineering, IEEE Computer Society Press, 1990. Portilho, Marcelo Silva e Balieiro, Marco Antonio da Silva. Técnicas de modelagem, Frameworks e padrões de projeto em Sistemas de educação à distância, Trabalho de Conclusão de Curso (Grauduação) - Bacharelado em Ciência da Computaçao, Unviersidade da Amazônia - UNAMA, 2005. ISO JTC 1/SC 27 Commitee ISO/IEC 15408-1:1999 Information Technology – Security Techniques - Evaluation Criteria for IT Security - Part 3: Security Assurance Requirements, ISO Online Catalogue, 1999. 83 G. Hoglund end G. MacGraw, exploiting software: How to break code. Addison Wesley, 2004. Shema, Mike . Hack Notes - Segurança Na Web, Editora Campus, 2003. SCAMBRAY, JOEL Hackers Expostos - Segredos e Soluções para Segurança de Redes, Editora Makron Books, 2002.