Baixe o app para aproveitar ainda mais
Prévia do material em texto
Capítulo I :GESTÃO DA SEGURANÇA NO SDLC -Security Development 4 Introdução ao Desenvolvimento Seguro ......................................................... 4 Segurança em desenvolvimento .................................................................... 6 Papéis e responsabilidades ............................................................................ 9 Revisores ..................................................................................................... 9 Especialistas............................................................................................... 10 Auditores ................................................................................................... 11 Facilitadores ............................................................................................... 11 Conclusão .................................................................................................. 12 1.1Capítulo II ...................................................................................... 13 Introdução à modelagem de ameaças ......................................................... 13 As vulnerabilidades do OWASP Top 10 ......................................................... 16 Injeção ...................................................................................................... 17 Quebra de Autenticação e Gerenciamento de Sessão .................................... 18 Cross-Site Scripting (XSS) ........................................................................... 18 Referência Insegura e Direta a Objetos........................................................ 18 Configuração Incorreta de Segurança .......................................................... 19 Exposição de Dados Sensíveis ..................................................................... 20 Falta de Função para Controle do Nível de Acesso ........................................ 20 Cross-Site Request Forgery (CSRF) .............................................................. 21 Utilização de Componentes Vulneráveis Conhecidos ...................................... 21 Redirecionamentos e Encaminhamentos Inválidos ........................................ 22 1.1.................................................................... Erro! Indicador não definido. 1.2 Capítulo III.................................................................................... 23 Segurança por Código ................................................................................ 23 Métricas dos processos ............................................................................... 26 1.1........................................................................................................ 32 1.2Capítulo IV ..................................................................................... 32 Suporte na Revisão e Desenvolvimento........................................................ 32 Capítulo I :GESTÃO DA SEGURANÇA NO SDLC -Security Development ............................................................................................................. 37 Introdução ao Desenvolvimento Seguro ....................................................... 37 Segurança em desenvolvimento .................................................................. 39 Papéis e responsabilidades .......................................................................... 42 Revisores ................................................................................................... 42 Especialistas............................................................................................... 43 Auditores ................................................................................................... 44 Facilitadores ............................................................................................... 44 Conclusão .................................................................................................. 45 1.1Capítulo II ...................................................................................... 46 Introdução à modelagem de ameaças ......................................................... 46 As vulnerabilidades do OWASP Top 10 ......................................................... 49 Injeção ...................................................................................................... 50 Quebra de Autenticação e Gerenciamento de Sessão .................................... 50 Cross-Site Scripting (XSS) ........................................................................... 51 Referência Insegura e Direta a Objetos........................................................ 51 Configuração Incorreta de Segurança .......................................................... 52 Exposição de Dados Sensíveis ..................................................................... 52 Falta de Função para Controle do Nível de Acesso ........................................ 53 Cross-Site Request Forgery (CSRF) .............................................................. 54 Utilização de Componentes Vulneráveis Conhecidos ...................................... 54 Redirecionamentos e Encaminhamentos Inválidos ........................................ 55 1.1........................................................................................................ 55 1.2 Capítulo III.................................................................................... 55 Segurança por Código ................................................................................ 55 Métricas dos processos ............................................................................... 58 1.2........................................................................................................ 64 1.1Capítulo IV ..................................................................................... 64 Suporte na Revisão e Desenvolvimento........................................................ 64 Capítulo I :GESTÃO DA SEGURANÇA NO SDLC -Security Development Introdução ao Desenvolvimento Seguro O software, além do conceito de uma sequência de instruções que controlam o computador, do processamento de dados e informações é tido como uma tecnologia evolucionária e, por isso, já não é mais o mesmo, pois não utilizamos mais as linguagens de programação de décadas anteriores, e assim podemos perceber sua ampla transformação, além dos novos conceitos que surgem a cada momento no cenário mundial. Desse modo seu âmbito de aplicação é muito abrangente, já que se encontra presente desde o software de sistema, para fins de aplicações, pesquisas científicas, embarcados, linhas de produtos, aplicações para Web, inteligência artificial, entre outros, os quais são utilizados por pessoas, pela indústria ou pelo governo. A Engenharia de Software cuida da criação e do suporte dos programas e, desse modo, é vista como uma área muito importante, pois estamos cercados de sistemas a nossa volta, desde os mais simples até aqueles que se caracterizam por sua altíssima complexidade, onde também nos vemos marcados por inúmeras tecnologias que tornam sua utilização cada vez mais fácil no dia-a-dia. O software está presente em vários tipos de dispositivos como computadores, impressoras, celulares, tablets, games, marcapassos, na engenharia, eletrodomésticos, em redes sociais além de incontáveis sistemas e equipamentos, que passam por vezes despercebidos pelas pessoas. Há um tempo, tínhamos que instalar o software no computador pessoal e por incontáveis vezes fazer sua manutenção por meio de atualizações que corrigiam problemas como bugs e vulnerabilidades, mas hoje com a Internetcada vez mais presente no cotidiano, percebe-se que há uma tendência migratória das aplicações para servidores on-line, e com isso, temos os avanços percebidos pelo cloud computing, onde não se sabe sua localização e a maneira que rodam, por isso vemos que a modificação, correção e atualização são feitas de forma praticamente imperceptível aos olhos do usuário, marcando sua evolução de produto para serviço. O software como componente lógico produz, gerencia, adquire, modifica, exibe ou transmite informações úteis para gerenciar o processo de tomada de decisão, o que vai mais além do tratamento de dados, marcando sua presença na vida das pessoas. Com as mudanças no hardware e seus aprimoramentos, como uma maior capacidade de armazenamento, a ampliação da memória, as alterações ocorridas nas arquiteturas dos computadores, a criação de sistemas mais sofisticados e robustos, o software tem atingido patamares inimagináveis há bem pouco tempo. No desenvolvimento de software é comum ocorrer erros, por isso as tarefas de manutenção são mais complexas que as de hardware. Para se ter uma ideia de valores, um erro de software no início do projeto custa à empresa aproximadamente US$140 para ser corrigido, enquanto que um erro detectado na fase pós-implantação chega a custar impressionantes US$14.000. (http://www.isixsigma.com/industries/software-it/defect-prevention-reducing- costs-and-enhancing-quality/) (https://www.cs.umd.edu/projects/SoftEng/ESEG/papers/82.78.pdf) Segurança em desenvolvimento Com a evolução da Internet, o software hoje oferece funcionalidades imediatas (just-in-time), que podem ser acessadas por meio do navegador web e, para isso, é importante que seja implantado um processo de gestão de segurança da informação confiável, para garantir a manutenção de um nível aceitável de risco e operação. A reutilização dos componentes do software é uma prática que permite focar nas inovações do projeto, podendo-se implementar funções comuns por meio de partes repetidas de código, onde as estruturas de dados e detalhes de processamento são armazenadas em uma biblioteca de componentes para a construção de interfaces futuras. Com isso permite-se ganhar mais tempo nas partes importantes da aplicação, em vez de “reinventar a roda”. O custo para a correção de vulnerabilidades identificadas aumenta de maneira substancial a cada fase do ciclo de desenvolvimento do software (levantamento de requisitos, design, implementação, verificação, lançamento e suporte e manutenção), portanto, o quanto antes forem identificadas falhas de segurança, mais econômico ficará realizar sua manutenção, porque qualquer problema posterior acarretará um valor maior, podendo até inviabilizar o projeto. Por isso, é necessário que o profissional conheça as boas práticas de desenvolvimento e de segurança nesse contexto. Investir em segurança traz um retorno amplo não só para o projeto, mas também para os usuários. Além disso, há um menor investimento no tratamento de bugs, fazendo com que sejam reduzidos nesse processo tempo e recursos. Uma das propostas da disciplina é quebrar alguns dos paradigmas mais engessados, fazendo com que haja uma mudança na cultura dos profissionais do software, refletindo inclusive na própria organização, de maneira ampla, para que se possa obter qualidade e segurança nos produtos entregues. A maior parte das aplicações que estão em produção são vulneráveis a diversos tipos de ataques, por isso não se pode falar em um software completamente seguro ou blindado, mas pode-se tentar reduzir ao máximo o comprometimento das informações e o risco de ataques. Devido a isso, a OWASP (The Open Web Application Security Project) apresenta um ranking a partir de uma análise das falhas mais comuns em aplicações web, as quais estão presentes em praticamente todas as versões não testadas e adequadas do software. O processo de segurança denota a importância do software, e por isso deve-se visualizar todas as fases componentes do desenvolvimento de software (levantamento de requisitos, design, implementação, verificação, lançamento da aplicação e suporte e manutenção), para que se possa estudar o gerenciamento das principais metodologias utilizadas no mercado e, com isso, traçar uma base para as estratégias de uso empregadas pelas organizações, já que com as vulnerabilidades, a correção, adaptação e a expansão demandam mais pessoas e recursos do que o processo de criação em si. Para relembrar as fases do desenvolvimento de uma aplicação temos que na fase inicial, no Levantamento de Requisitos, se faz as listagens de recursos necessários, especificando as diretrizes de qualidades, além de documentar a arquitetura e fazer o agendamento de entrevistas. Na parte de Design da aplicação são realizadas as especificações funcionais e o desenho do software. A implementação é a fase onde se desenvolve o código, e na Verificação que se faz uma busca, além das correções de bugs, mas em ambas podem ser feitos testes e avaliações. No lançamento que se faz a assinatura do código e seu “encerramento”. Para a fase de suporte e manutenção, são feitas as atualizações segurança e correções de vulnerabilidades observadas. A arquitetura caracteriza-se por ser uma adaptação do software para atender às necessidades de novos ambientes e tecnologias, sendo realizada de maneira a trazer um aperfeiçoamento para que se possa implementar novos requisitos de um modelo de negócio, e com isso ser responsável pela expansão e interoperabilidade. Os recursos e funções das aplicações podem ser reutilizados muito facilmente, e levando em consideração a importância de projetar, e também de segurança, falhas, importância da qualidade, funcionalidade, há uma necessidade em poupar tempo e recursos para se concentrar no desenvolvimento da aplicação. O desenvolvedor deve levar em conta a tecnologia, os requisitos complexos, e a tomada de decisões estratégicas e táticas para proteger a aplicação dos riscos de segurança. Por isso é importante que se utilize uma metodologia prática, onde haja comunicação, pois é fundamental ouvir as necessidades dos clientes e interessados com fins de compreender seus objetivos e aplicá-los de modo preciso ao projeto, fazendo o levantamento das necessidades que definirão funções e características, além do planejamento (trabalho de engenharia de software, com as tarefas, riscos, recursos, produção e o cronograma), análise de requisitos, modelagem de projeto (esboço para compreender o problema e resolvê-lo, entendendo as necessidades do software através do projeto), construção de programa (criação de código e testes para descobrir os erros na codificação), até chegar aos testes e suporte. Papéis e responsabilidades Os profissionais do desenvolvimento seguro de software são responsáveis em apresentar e implantar um conjunto de práticas e metodologias aos programadores, o que resulta em melhores aplicações, com um nível muito maior de confiabilidade, maturidade, integridade e inviolabilidade. Os papéis apresentados se referem às responsabilidades, por isso as atividades de cada membro do projeto de desenvolvimento de software são essenciais em todas as etapas do planejamento da aplicação, especificando os requerimentos básicos para que cada função seja desempenhada da forma mais segura possível. As responsabilidades da equipe em relação ao Software Development Lifecycle são desenvolver, manter e aprimorar a aplicação, definindo aspectos obrigatórios do processo, fornecendo o treinamentoadequado aos engenheiros e supervisores, além de direcionar as equipes durante todo o processo, supervisionando e revisando a segurança por meio de equipes, e de maneira a fazer com que os especialistas abordem os aspectos de proteção do software, para que os supervisores de segurança possam se informar através de análises das respostas, oportunas e precisas, além de revisar a segurança antes que a aplicação seja lançada, buscando as vulnerabilidades que podem comprometer sua segurança, garantindo assim que as respostas sejam desejadas. Revisores Nesse cenário, os revisores são aqueles que examinam o código do aplicativo e sugerem correções ou adições, verificando e atestando sua qualidade, garantindo assim um alto nível de qualidade e integridade do software para que possa ser considerado robusto e seguro. Dessa forma por meio de sua análise e avaliação estão aptos a encontrar discrepâncias entre os procedimentos adotados e as metodologias adotadas, para colocá-los em conformidade com as necessidades da aplicação, além de participar de forma a verificar o impacto que as interferências propostas podem vir a causar. Também são responsáveis por diagnosticar através de testes e monitoramento simulações de execução do aplicativo no ambiente proposto da aplicação, o que pode fazer com que se ateste a existência de bugs e que aprendam com os resultados obtidos através dos erros encontrados nas fases de testes, os quais podem até ser documentados, para posterior verificação. O revisor realiza uma extensa análise da aplicação através do ponto de vista do desenvolvedor, testador e do usuário final, onde estuda os cenários possíveis e define questões importantes em relação às funções, o ajudando a documentar problemas surgidos e estabelecer procedimentos operacionais para elaborar estratégias por meio das perspectivas examinadas. As atribuições do revisor são: documentar cenários e detalhes, verificar as interfaces e interpretar os caos de testes de acordo com suas funcionalidades além de conferir os padrões e metodologias de desenvolvimento que são estabelecidos pela empresa, de maneira a informar se a aplicação está funcionando dentro do que foi proposto e compreendendo o processo de forma a aumentar a performance do software em suas verificações, onde irá detectar e corrigir os problemas e erros causados pelas inconsistências. Especialistas O especialista é o profissional de TI responsável por determinar se a segurança está presente na produção do software, descobrindo falhas por meio de análises, realizando atualizações e fazendo o controle de versões, por meio de correções das falhas conhecidas, o que deve acontecer o mais rápido possível após suas descobertas. Um dos papéis do especialista é o de conhecer e avaliar as diversas tecnologias disponíveis além de analisar as vantagens e desvantagens de sua aplicação no software para as soluções propostas, e na implementação do aplicativo, ajudando a aprimorar os requisitos. Uma de suas responsabilidades fundamentais é avaliar e preparar a rotina dos acontecimentos na fase de testes, devendo observar os comportamentos possíveis, prováveis e remotos do usuário relacionados com a aplicação, de maneira a realizar um amplo diagnóstico, crítico e preciso com informações objetivas sobre eventuais problemas ou erros percebidos para a equipe desenvolvedora, assegurando o cumprimento das finalidades planejadas através de análises dos resultados observados, buscando prevenir a ocorrência de quaisquer vulnerabilidades. Auditores Os auditores são os profissionais que dentre suas responsabilidades se utilizam das ferramentas de auditoria para verificar se a aplicação atingiu as metas e critérios definidos no planejamento, sendo responsáveis pelo procedimento de investigação do processamento, simulação, análise e avaliação dos dados. Além disso, o auditor deve compreender o ambiente de desenvolvimento da aplicação de forma a realizar uma análise mais ampla, entendendo e determinando as situações ocorridas, conferindo o planejamento e os objetivos da aplicação, de forma a verificar e elaborar os testes e simulações necessários mais adequados ao software, emitindo opiniões e acompanhando propostas de melhorias e correção, bem como sua implantação. Facilitadores O facilitador também é conhecido como o coordenador das atividades, ou seja, em outras palavras, é o líder do projeto, e por isso uma de suas funções mais importantes é garantir que as metodologias de segurança serão aplicadas de forma correta ao processo de desenvolvimento do software. Uma de suas responsabilidades é trabalhar junto com o gestor, de modo a realizar o planejamento da aplicação em todo o ciclo de desenvolvimento, em todos os seus aspectos, devendo ter uma visão expandida do software, de seus processos, técnicas além de boas práticas, gerenciando a equipe do projeto e administrando o relacionamento com o cliente. Uma das funções do facilitador é sempre estar próximo aos desenvolvedores e ao cliente, esclarecendo as questões primordiais de risco relacionadas à aplicação, verificando arduamente a aplicabilidade de métricas, as necessidades surgidas e os recursos indispensáveis, além de estar ciente de todos os erros descobertos e trabalhar dentro dos padrões de segurança exigidos. Conclusão Portanto, podemos perceber que no ciclo do processo de desenvolvimento da aplicação sempre será necessário efetuar correções, onde cada empresa pode adotar o modelo que entender mais adequado para suprir suas exigências, por isso é ideal que se prepare e administre esse processo de uma maneira a aperfeiçoá-lo, realizando adaptações para que se mostre sempre seguro, e para isso vislumbra-se necessária a interferência dos profissionais de modo a executar análises e testes que objetivam deixá-lo menos vulneráveis, por isso seus papéis são de grande importância. Nos primórdios da Internet, os sites eram conjuntos de arquivos de hipertexto onde as informações usavam textos e gráficos, porém, com o aumento e popularização das ferramentas de desenvolvimento voltadas para a Web surgiram os sistemas e aplicações baseados na Internet, que posteriormente evoluíram para ferramentas computacionais com funções especializadas com foco no usuário, e o próximo passo a ser alcançado é o Software como Serviço. Falar em desenvolvimento seguro no ciclo de vida do software requer um planejamento estruturado forte, pois os WebApps apresentam características como o uso intenso da rede, a simultaneidade, carga de usuários não previsível, desempenho, disponibilidade, orientação a dados, sensibilidade de conteúdo, evolução contínua, imediatismo, segurança e estética, por isso é necessário que os profissionais estejam sempre atualizados, porque o risco de ameaças é iminente. Como estão disponíveis na Internet de forma duradoura, a problemática é limitar os acessos pelos usuários finais para que se possa proteger os conteúdos sensíveis e oferecer modos seguros de transmissão de dados, sendo prioridade a implementação medidas para a proteção na infraestrutura do software. 1.1Capítulo II Introdução à modelagem de ameaças A modelagem de ameaças tem suas origens estabelecidas a partir de um conceito militar surgido nos Estados Unidos, sendo que atualmente sua estruturação é voltada ao software, por meio de documentações desenvolvidas pela Microsoft, onde através de uma ferramenta proprietária são mapeados os riscos associados a aplicação aprendendo a tratá-los. Para os militares dos Estados Unidos essa conceituaçãoda modelagem de ameaças envolve a análise de riscos, sua motivação, a capacidade, sua viabilidade e cenários de defesa em face de um possível ataque, que traduzidos para a linguagem de segurança da aplicação são realizados estudos a partir da compreensão do correto mapeamento de exploits (uma sequência de comandos elaborados por hackers que conseguem tirar proveito de um defeito ou vulnerabilidade). Podemos definir a modelagem de ameaças como um processo estratégico que considera a possibilidade de inúmeros cenários de ataque e vulnerabilidades as quais podem ocorrem dentro de um ambiente de aplicação, com o propósito de identificar os níveis de risco e impacto que podem comprometer a proteção do software, para fins de melhorá-lo. Com essa visão é primordial que se aprenda a administrar sistematicamente quaisquer ameaças e ataques em potencial, por meio de uma abordagem estruturada e precisa, que aplique os recursos de segurança de forma estratégica, sem causar um desperdício financeiro na busca de ameaças improváveis. A documentação referente ao tratamento das vulnerabilidades de segurança da aplicação deve ser executada a partir da análise e um estudo das ameaças e riscos potenciais, onde é classificada por ordem lógica, começando pela identificação das mais específicas e prováveis, das que apresentam os maiores riscos até as que são vistas como improváveis, mas que podem afetar o software. O profissional de Tecnologia da Informação que trabalha com segurança de software deve ter em mente que desde o momento em que a aplicação foi lançada e está disponibilizada na Internet, é considerado um ambiente hostil, portanto deve-se perceber os diversos tipos de ameaças que podem ocorrer, e por isso é necessário administrar os riscos através de avaliações e análises regulares. O processo de modelagem de ameaças engloba o desenvolvimento da análise e elaboração de técnicas para que se possa identificar e quantificar os riscos envolvidos, começando com: a “Identificação dos bens da aplicação” onde serão listados todos os recursos que o sistema deve proteger mantendo-os em segurança; depois deve-se “criar um panorama de desenho da arquitetura” descrevendo como a aplicação funciona; seguido da “decomposição do software” em partes e tipos de dados lidos da aplicação e dos usuários, para que se possa cobrir qualquer tipo de vulnerabilidade; logo após será necessário “identificar a ocorrência de ameaças potenciais” que podem prejudicar o sistema e comprometer os recursos; seguido da “documentação das ameaças” em um modelo que defina os atributos do software; e por fim deve-se “classificar as ameaças” começando pelas mais prováveis e os possíveis danos causados em caso de ataque. A documentação sobre as ameaças potenciais à segurança da aplicação é realizada através de um processo iterativo, ou seja, que se repete estrategicamente, de forma contínua, e pode ser utilizado pelos designers, desenvolvedores e testadores, pois dessa forma ajuda na tecnologia empregada, nas funcionalidades, na redução dos riscos e vulnerabilidades. É importante realizar uma análise de riscos de um projeto de desenvolvimento de aplicações, onde é necessário visualizar e identificar os recursos disponíveis, saber onde estão localizadas as ameaças e vulnerabilidades que podem quebrar a segurança do software, para que seja possível tratá-las, evitando os ataques e para que se possa assumir um maior controle através da proteção implementada. Para isso deve-se criar uma arquitetura padronizada, além de estabelecer uma documentação em conformidade com as metodologias estipuladas pela equipe, sendo de fundamental importância identificar a proposta da aplicação e o que ela faz, além de elaborar um diagrama e identificar as tecnologias empregadas, porque isso pode ajudar bastante a reduzir os esforços da equipe nas etapas do ciclo de vida do desenvolvimento do software. Depois de toda essa parte de documentação dos objetivos deve-se decompor o software, de maneira onde serão identificados os limites de confiança, além do fluxo de dados, os pontos de entrada e também do código privilegiado para que se possa documentar o perfil de segurança da aplicação e poder ajustar a proteção com base nos tipos de riscos mais prováveis. A próxima etapa é a de identificar as ameaças, que podem ser feitas por meio de um método, por exemplo, o STRIDE (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege), que pode conter a verificação das ameaças de redes, de hosts e de aplicação. No Spoofing um atacante tenta se passar por alguém que não é para invadir o software. Já no Tampering o atacante tenta modificar dados trocados por uma aplicação e um usuário autorizado. Quando o atacante consegue penetrar na aplicação sem que sua autoria seja reconhecida, é chamado de Repudiation. No Information Disclosure o atacante pode ler dados particulares que a aplicação transmite ou armazena. Caso o atacante impossibilite o acesso dos usuários a aplicação ou o serviço ocorre o Denial of Service. Ao se conseguir privilégios não autorizados por um meio não permitido pelo atacante, chama-se Elevation of Privilege. Enquanto o STRIDE faz uma análise e classificação das ameaças, propondo a redução dos riscos, o modelo DREAD (Damage Potential, Reproducibility, Exploitability, Affected Users, Discoverability) é utilizado para calcular a estimativa do risco total que é associado a uma ameaça de segurança na aplicação. Para que se aplique o modelo DREAD deve-se verificar o potencial de danos causado (Damage), a extensão do dano caso a vulnerabilidade seja explorada pelo invasor, depois a facilidade com a qual um ataque é reproduzido (Reprodution), e para a capacidade de exploração, a simplicidade quando ocorre o lançamento de um ataque (Exploration), os usuários afetados pela ameaça (Affected), e por fim a agilidade a qual é descoberta a vulnerabilidade (Discovery). O profissional do desenvolvimento seguro deve documentar as ameaças, pois é a melhor prática, tendo em vista que servirá de apoio a futuras verificações de vulnerabilidades na aplicação pela equipe, já que dessa forma é mais fácil analisar os riscos e determinar os recursos necessários para suprir qualquer brecha que a aplicação possa conter, além de possibilitar que as correções sejam feitas com base nessa informação. As vulnerabilidades do OWASP Top 10 A OWASP é uma organização sem fins lucrativos, que tem como objetivo disseminar a segurança voltada a aplicações web. Seu Top 10 é composto pelas vulnerabilidades que mais ocorrem nos WebApps, onde se busca identificar os riscos mais graves das aplicações através de informações comuns sobre a probabilidade de ocorrência e impacto técnico. A Metodologia de Classificação de Riscos da OWASP deriva do tipo de ataque, tipo de vulnerabilidade ou do tipo de impacto causado pela invasão, demonstrando que os pontos fracos da aplicação podem acontecer por meio de Agentes de Ameaça ou Controles de Segurança. Os ataques a aplicações podem ocorrer por diferentes maneiras, causando danos e representando um risco que pode ser grave e causador de danos, o que pode ter consequências graves. Para determinar o impacto do risco é necessário avaliar a probabilidade associada a cada agente de ameaça, vetor de ataque, vulnerabilidade de segurança e combinar com uma estimativa dos impactos técnicos e negociais, onde juntos esses fatores determinam o risco total. Injeção As falhas de injeção ocorrem quando dados não confiáveis sãoenviados para um interpretador como parte de um comando ou consulta. Nesse cenário os dados são manipulados pelo atacante de maneira que podem burlar o interpretador para que sejam executados comandos indesejados ou mesmo para que se permita o acesso não autorizado. Para prevenir que aconteça uma falha de injeção é necessário separar os dados não confiáveis dos comandos e consultas, através da utilização de uma API segura que não utilize o interpretador inteiramente ou que tenha uma interface parametrizada, mas o ideal é realizar a filtragem dos caracteres especiais utilizando uma sintaxe para o interpretador e também se recomenda-se uma validação de entrada positiva. Quebra de Autenticação e Gerenciamento de Sessão As funções da aplicação estão relacionadas a autenticação e gerenciamento de sessão quando são implementadas de maneira errada permitem que os atacantes comprometam as senhas, chaves e tokens de sessão ou mesmo para explorar alguma falha de implementação assumindo a identidade de outros usuários. Para evitar essa vulnerabilidade, deve-se disponibilizar aos desenvolvedores um conjunto de controles fortes para autenticação e gerenciamento de sessão, que se enquadrem em um padrão de verificação de segurança da aplicação, além de impedir falhas de XSS que podem roubar os Identificadores de sessão. Cross-Site Scripting (XSS) As falhas de XSS ocorrem quando uma aplicação recebe e envia ao navegador dados não confiáveis sem validação ou sem um filtro adequado, permitindo que os atacantes executem scripts no navegador da vítima, desfigurar sites, podendo inclusive “sequestrar” sessões do usuário ou redirecioná-lo para sites maliciosos. É necessário separar os dados não confiáveis do conteúdo ativo no navegador, por meio de filtro com base no HTML e o contexto o qual serão colocados através de técnicas de filtro de dados, uma validação de entrada positiva que ajuda na proteção, já que muitas aplicações requerem caracteres especiais na entrada, também deve ser considerado o uso de bibliotecas de auto-sanitização e a Content Security Policy no site para defesa contra esse tipo de vulnerabilidade. Referência Insegura e Direta a Objetos Uma referência insegura e direta a um objeto ocorre quando o programador expõe um arquivo, diretório ou registro da base de dados. Quando é feita uma referência à implementação interna de um objeto sem a verificação do controle de acesso ou outra proteção os atacantes podem inclusive manipular e acessar dados não autorizados. Para que haja a prevenção à referência insegura e direta a objetos deve haver uma abordagem para proteger os objetos acessíveis ao usuário ou sessão, impedindo que o atacante acesse recursos não autorizados, e fazendo com que a aplicação mapeie as referencias indiretas por cada usuário retornando a chave do banco de dados real no servidor, dessa forma recomenda-se a utilização de mapas de referencia de acesso sequencial e aleatório para eliminar as referências diretas a objetos, e também a verificação do acesso quando se utilizar uma origem não confiável, incluindo um controle de acesso que garanta que o usuário esteja autorizado em sua requisição. Configuração Incorreta de Segurança Quando se utiliza uma configuração pré-definida de segurança implementada na aplicação (frameworks, servidor de aplicação, servidor web, banco de dados e plataforma) um risco exponencial pode ocorrer, pois o invasor conhece o formato dos padrões facilitando uma possível vulnerabilidade. Dessa maneira o mais indicado é que todas as configurações devam ser bem definidas, implementadas e mantidas, porque a configuração padrão é insegura por ser previsível, sendo outra medida importante a atualização do software. O processo de hardening recorrente é de fácil e rápida implantação em um ambiente blindado, onde estes devem ser configurados identicamente e de forma automatizada, mas respeitando as questões de segurança, de forma de se realizar a manutenção de atualizações e correções em tempo hábil para cada ambiente. Outra forma é implementar uma arquitetura forte que promova a separação segura e eficaz entre os componentes. Realizar auditorias e varreduras periódicas para detectar erros de configuração ou correções necessárias. Exposição de Dados Sensíveis A não proteção dos dados sensíveis como cartões de crédito, Identificadores fiscais e credenciais de autenticação pode expor e comprometer a segurança do usuário. Os atacantes podem roubar ou modificar dados desprotegidos com o propósito de realizar fraudes, roubos de identidades ou outros crimes. Por isso os dados sensíveis merecem proteção como criptografia no armazenamento ou tráfego e precauções especiais em relação a sua utilização pelo navegador. Para a proteção dos dados sensíveis frente a ameaças deve-se contar com uma criptografia inibitória, que tenham algoritmos especializados e chaves fortes, além de boas práticas de gerenciamento, onde não é recomendado o armazenamento de dados sensíveis desnecessariamente. Outra ajuda é desabilitar o cache e o recurso de auto completar em formulários em páginas que manipulam dados sensíveis. Falta de Função para Controle do Nível de Acesso A maioria das aplicações web verificam os direitos de acesso em nível de função antes de tornar a funcionalidade visível na interface do usuário, e depois precisam executar as mesmas verificações de controle de acesso no servidor quando a função é invocada. Se as requisições não forem verificadas, os atacantes podem forjar as requisições para acessar funcionalidades sem a autorização adequada. A aplicação deve contar com um módulo de autorização implementado que seja de fácil análise e efetue chamadas pelas funções de negócio, por isso, é necessário que os processos de gerenciamento de direitos sejam de simples atualização e auditoria, onde para a execução de qualquer mecanismo deve ter seu acesso negado por padrão, exigindo direitos necessários para que se permita o acesso através de uma lógica do controlador ou do negócio. Cross-Site Request Forgery (CSRF) O ataque CSRF força a vítima que possui uma sessão ativa em um navegador a enviar uma requisição HTTP forjada, incluindo o cookie da sessão da vítima e qualquer outra informação e dados de autenticação incluídos na sessão a uma aplicação web vulnerável. A falha permite o atacante forçar o navegador da vítima a criar requisições que a aplicação vulnerável aceita como legítimas e realizadas pela vítima. Esse tipo de ataque pode ser facilmente evitado quando se implementa um token único imprevisível em cada requisição HTTP, que pode ser incluído em um campo oculto e evitando ser enviado na URL, o que pode comprometer a segurança por meio de sua exposição direta, pode-se também incluir tokens automaticamente com métodos preventivos para as vulnerabilidades ou exigir uma nova autenticação do usuário para que prove sua identidade. Utilização de Componentes Vulneráveis Conhecidos A utilização de Componentes como Bibliotecas, Frameworks e outros módulos de software quase sempre são executados com privilégios elevados. O Componente vulnerável é explorado por meio de um ataque que pode causar perdas de dados ou comprometimento do servidor. As aplicações que utilizam componentes com vulnerabilidades conhecidas podem minar as suas defesas permitindo ataques e impactos. Utilizar componentes vulneráveis é um risco crítico, pois podem estar desatualizados e sem correções para as vulnerabilidades, por isso no projeto de um software é necessárioque todos os componentes sejam identificados, além das versões e dependências, para que se possa monitorar a segurança em um banco de dados público, mantendo-os sempre atualizados, estabelecer políticas de seguranças que definam o uso do componente e exigir práticas no desenvolvimento de software que passaram nos testes de segurança e que tenham licenças aceitáveis, e também desabilitar funcionalidades não utilizadas para proteger falhas ou aspectos vulneráveis dos componentes. Redirecionamentos e Encaminhamentos Inválidos As aplicações web frequentemente redirecionam e encaminham usuários para outras páginas e sites, utilizando dados não confiáveis para determinar as páginas de destino. Sem uma validação adequada os atacantes podem facilmente redirecionar as vítimas para sites de phishing, malware ou usar encaminhamentos para acessar páginas não autorizadas. Para os redirecionamentos e encaminhamentos, pode-se simplesmente não utilizá-los, ou caso usados, evitar envolver parâmetros do usuário para calcular o destino, ou caso esses parâmetros não possam ser evitados, deve-se assegurar que o valor fornecido é válido e autorizado para o usuário, além de recomendar que os parâmetros de destino sejam mapeados e não estejam na URL, de maneira que o servidor traduza para seu destino, pois as aplicações podem utilizar métodos de redirecionamento seguro, evitando fraudes que tentam obter a confiança do usuário. Para a Segurança no Ciclo de Vida do Desenvolvimento o OWASP recomenda que para a melhoria dos processos nas aplicações se utilize o Modelo de Maturidade de Garantia do Software (SAMM), que ajuda a formular e implementar estratégias para a segurança do software feita de forma personalizada para os riscos específicos enfrentados. 1.1 1.2 Capítulo III Segurança por Código Pode-se conceituar a segurança por código como o conjunto de técnicas criadas para o tratamento de vulnerabilidades, além dos cuidados necessários que devem ser tomados no desenvolvimento seguro de software, já que em toda a etapa do ciclo de vida existem erros de programação. Dentro desse contexto visualizamos as práticas listadas pela OWASP Top 10 que ajudam os profissionais a se proteger contra as vulnerabilidades de segurança mais comuns nas aplicações Web, fornecendo técnicas para aprimorar a salvaguarda do software desenvolvido. Na fase de desenvolvimento devem ser elaborados requisitos de processo para garantir que as técnicas de segurança utilizadas por código sejam implementadas através de boas práticas, Validação de Entradas e Codificação de Saída, Autenticação e Gerenciamento de Senhas, Autorização e Gerenciamento de Acesso, Gerenciamento de Sessão, Transmissão e Armazenamento de Informações Sensíveis, Interação com o Banco de Dados, Tratamento adequado de erros e Logging. Como práticas adotadas que visam um código seguro, vemos simples exemplos como não armazenar senhas diretamente, não utilizar códigos copiados sem entender seu funcionamento, não utilizar funções ou recursos desatualizados, por isso deve-se buscar sempre a implementação de segurança na etapa de validação dos dados. A Validação de Entradas e Codificação de Saída é uma técnica onde a validação de qualquer interação realizada entre a aplicação e o usuário deve ser feita na entrada e na apresentação dos dados recebidos, com as de segurança adequadas, sempre realizadas no servidor para evitar riscos, sendo que no cliente é opcional, mas sempre de maneira a adotar validação positiva, nunca se esquecendo que há possibilidade de um by-pass nessa etapa. Para a Autenticação e Gerenciamento de Senhas, deve-se utilizar o HTTP POST para fazer uma requisição de autenticação, e o HTTPS para o envio de credenciais, sempre pedindo uma nova autenticação em ações críticas, usando o hash e o salt para codificar as senhas armazenadas, utilizando um algoritmo de hash público e forte, e implementando um grau de complexidade nas senhas, além de desaconselhar usuários a utilizar senhas fracas, por meio de uma classe ou mecanismo de validação que possa garantir uma política de senhas como a do DECEA, desabilitar os lembretes de senha e o recurso de auto-completar dados nos navegadores, utilizar mensagens genéricas nas tentativas de login ou senhas incorretas, bem como ter um bom planejamento dos processos de recuperação de senha, para não expor os dados sensíveis do software. A Autorização e Gerenciamento de Acesso da aplicação deve ser elaborada por meio de restrições de acesso dos perfis em relação aos conteúdos ou operações, que devem apresentar uma política de segurança forte e não apenas utilizada através de links ocultos, devendo ser feita a validação no servidor a cada requisição, garantindo dessa forma que os arquivos e diretórios não sejam acessados diretamente, e também que não seja armazenada nenhuma informação que comprometa o controle de acesso do usuário, onde é prioridade que deva ser realizado um novo login quando houver alguma alteração no perfil do usuário, para que não permaneça com o acesso no caso de serem retirados privilégios de acesso. O Gerenciamento de Sessão e seu controle devem ser feitos pelo servidor, por meio de um método de time-out por sessão e que se seja gerado um novo identificador após a autenticação, pois não se deve passar identificadores de sessão por HTTP GET. Além disso, deve ser implementado um token de sessão aleatório a cada nova requisição para evitar ataques CSRF. Na Transmissão e Armazenamento de Informações os dados sensíveis devem ser transmitidos via HTTPS, pois não se deve armazenar senhas ou dados importantes sem uma boa criptografia, bem como não se deve enviar informações sensíveis para logs, sendo recomendável que os comentários de código não devam conter qualquer tipo de informações que possam comprometer a segurança, dessa forma garantindo que a lógica do código não crie vulnerabilidades ou exposições pelo lado do usuário, porque os campos ocultos não devem armazenar dados sensíveis, devendo utilizar os cabeçalhos HTTPS, onde as senhas podem ser revertidas pelo lado do usuário, mas não se deve apresentar dados sensíveis com esse recurso. A Interação com o Banco de Dados deve adotar Stored Procedures ou Prepared Statement, ou então validar todas as interações realizadas com o banco, evitando as concatenações para realizar consultas no banco, desabilitar os recursos não utilizados, acessar o banco com um usuário com privilégio necessário para realizar as operações necessárias, além de não deixar o banco ser acessado por outro canal que não a aplicação. Para o Tratamento adequado de erros deve-se usar uma estrutura confiável em qualquer método onde um erro possa ocorrer, além de utilizar funções como a finally para realizar as ações de limpeza corretamente, garantindo assim uma redução nas vulnerabilidades do software. O Logging como parte da concepção do sistema, deve demonstrar claridade em seu uso na aplicação, porque seu objetivo é o de viabilizar auditorias e investigações de fraude e casos de abuso em sua implementação errática, portanto é altamente recomendável que seja utilizado. Mais além dos recursos explicados, a segurança por código envolve muitos aspectos de segurança, e segundo o disposto pelo Common Weakness Enumeration, que descreve as vulnerabilidades publicamente conhecidas, vemos que podem ocorrer: as Falhas na lógica, os Erros numéricos, a Conversão de Signed para Unsigned, o Uncontrolled Format String, o Information Exposure, os Buffers Overflows, os Races Conditions, o CovertTiming Channel e os Cryptographic Problems. Métricas dos processos No ciclo de vida do software, as métricas são caracterizadas como um conjunto de metodologias sistematicamente elaboradas para determinar padrões no processo de desenvolvimento seguro, e também servem como um modelo para a administração de referências, o qual pode ser utilizado pelos responsáveis pelo projeto para suportar um processo de maturidade crescente. Dessa maneira, desenvolvimento de aplicações seguras a métrica se caracteriza como uma metodologia serve para ajudar os engenheiros de software, desde as etapas mais iniciais de visualização do projeto até as posteriores como construção do sistema e reparos, sempre visualizando os atributos específicos e mensuráveis da aplicação. Por isso é fundamental sua utilização, pois ajuda os engenheiros de software a controlar a criação de aplicativos com padrões que conferem alta qualidade. Aí entra outro fator de sua importância, porque somente a avaliação quantitativa mostra-se insuficiente, e nesse escopo é necessário o estabelecimento de critérios que possam ser utilizados para a orientação do projetos, sua arquitetura, interface e componentes utilizados. Na fase de testes existe a orientação quantitativa, que serve para ajudar na seleção dos casos, além de apresentar seus objetivos relacionados especificamente a aplicação, sendo assim, a métrica possibilita a definição de padrões, onde a análise, projeto, codificação e testes possam ser executados de forma mais precisa e focada no software. Para que se possa implantar o processo de métricas com sucesso, primeiro é necessário sua definição, para depois aplicá-las e posteriormente realizar uma análise de acordo com as diretrizes preestabelecidas, de acordo com os dados avaliados, onde os resultados das análises são estudados e interpretados de forma a obter o máximo de informações sobre a qualidade da aplicação, podendo levar a alterações no projeto, primando a segurança como fato essencial. As métricas do software são desenvolvidas por meio de dados coletados dos requisitos e modelos de projeto, código-fonte e dos casos de teste, estabelecendo os objetivos do projeto antes da coleta de dados, desse modo não podem ser ambíguas, e devem ser utilizadas para obter informações sobre a qualidade da segurança de um software. No desenvolvimento seguro de software mesmo que as métricas da aplicação sejam imperfeitas, elas representam uma forma sistemática de avaliar a qualidade com base em um conjunto de regras claramente definidas, proporcionando uma visão objetiva da segurança, permitindo descobrir e corrigir potenciais problemas antes que se tornem falhas e vulnerabilidades. As medidas utilizadas para avaliar a qualidade da aplicação são determinantes na eficácia dos modelos de requisitos, projeto e código, além dos casos de teste e na qualidade geral da aplicação criada, porque enquanto está sendo projetada, sempre haverá um processo de avaliação interno do software. Entretanto, para que se possa alcançar a melhor qualidade de software em relação a segurança da aplicação é necessário estabelecer os requisitos com precisão para evitar a ocorrência de falhas, pois quando os objetivos estão mal definidos ou há erros no ciclo de vida do software, o risco de acontecerem vulnerabilidades aumenta substancialmente. Por isso os teste de software se mostram essenciais, porque se revelam como um elemento crítico para a garantia de qualidade da aplicação, já que representam as revisões de especificação, projeto e codificação, segundo as observações analisadas pela equipe de desenvolvimento. Ao se aprofundar mais no estudo de métricas, vemos que elas são classificadas regularmente como métricas do processo ou métricas do produto, de maneira que são criadas e aplicadas durante o processo de desenvolvimento seguro e também para a aplicação já desenvolvida. As métricas surgiram dentro da engenharia de software e seu objetivo principal é garantir a qualidade do software através da definição e normalização de processos no desenvolvimento de aplicações. Mesmo que os modelos aplicados nas mesmas circunstâncias atuem principalmente no processo, o propósito mais importante no estabelecimento de métricas é a garantia de que a criação do software corresponda às expectativas e possa suprir as necessidades do cliente, dentro do que foi acordado no projeto. Dessa maneira tem-se um processo de busca constante pela qualidade, não apenas no início ou no final projeto, através da execução de testes, mas sim de uma forma que visa abranger toda a engenharia de software, de forma permanente e contínua, contando com a colaboração de todos os membros do time do projeto. Para se falar na melhor qualidade no desenvolvimento de software e seu foco em segurança, dentro desse escopo deve haver uma fase de Revisão do Produto, constituída por etapas de manutenção, flexibilidade e testabilidade, depois uma fase Transição do produto, onde é feita a portabilidade, reutilização e interoperabilidade, e logo após na fase de Operação do Produto, que ocorrem as análises e verificações, correção, confiabilidade, usabilidade, Integridade e eficiência do software. Vemos que para a aplicação funcionar da melhor forma, deve apresentar várias características operacionais, para que a equipe possa garantir sua qualidade com base no projetado, a começar com as matérias mais críticas do ciclo de vida do software, como: correção, confiabilidade, eficiência, integridade, usabilidade, manutenibilidade, flexibilidade, testabilidade, portabilidade, reusabilidade e interoperabilidade. Na fase de Operação do Software, a correção determina o quanto um programa satisfaz as especificações definidas no projeto e cumpre os objetivos visados pelo cliente. Em relação a confiabilidade, é a delimitação de quanto um programa executa a função pretendida com a precisão exigida. Já a eficiência é uma propriedade essencial que vislumbra a quantidade dos recursos computacionais da aplicação e de seu código exigidas para que um programa execute suas funções corretamente. Em relação a integridade da aplicação, esta se manifesta nas permissões de acesso ao software ou aos dados por pessoas não autorizadas, além de seu controle. A usabilidade indica a quantidade de esforço necessária para que se possa aprender e preparar a entrada e interpretar a saída de um programa. Quando se fala na fase de Revisão do Software, a manutenção se mostra como necessária para reconhecer a quantidade de esforço que é indispensável para localizar e eliminar erros na aplicação. A flexibilidade da aplicação exprime a quantidade de esforço necessária para modificar um software. E a Testabilidade demonstra o quanto de empenho é necessário para se testar uma aplicação garantindo que ela execute suas funções pretendidas. A fase de Transição do Software mostra que a portabilidade é o potencial de diligência indispensável para transferir o software de uma plataforma para outra. O fator da Reusabilidade demonstra o quanto uma aplicação ou sua parte podem ser reutilizadas em outros softwares. E por fim, a interoperabilidade define o grau de esforço necessário para que se possa acoplar uma aplicação a outra. Dessa forma, podemos perceber que a aplicação de métodos, padrões, técnicas e ferramentas que determinam a qualidade do software, por isso é necessário que os desenvolvedores utilizem métodos e ferramentas que os ajudem a obter êxito na formulação de métricas de maior qualidade. Os padrões estabelecidos podem ser utilizados para determinar modelos aos documentos,registro do código e estilo de codificação, mas também podem ser estabelecidos pelo cliente, seja por meio de normas internacionais ou mesmo pela empresa de desenvolvimento. As Métricas do Processo quantificam atributos do ambiente e do processo de desenvolvimento do aplicativo com segurança, por isso, são aquelas que possuem os recursos, como a experiência do programador e o custo de manutenção e criação do software, além daquelas de nível de experiência de pessoal, onde é calculado o tempo de experiência de uma equipe em uma determinada linguagem de programação, de maneira individual ou coletiva. Dentro da disciplina podemos citar inúmeros fatores relacionados diretamente ao desenvolvimento e o ciclo de vida do software, como a aplicação das técnicas de desenvolvimento, o auxílio na programação, as técnicas de supervisão, as quais são de extrema importância no âmbito da equipe. Dessa forma entendemos que as métricas do produto são medidas do software, e podem não revelar nenhum detalhe sobre como o software foi desenvolvido, mas incluem e levam em consideração para sua análise e elaboração o tamanho do produto em linhas de código, a complexidade de sua estrutura lógica, como os métodos de recursão, o fluxo de controle e a profundidade dos laços aninhados, a complexidade da estrutura de dados, as funções. Para a segurança do software há métricas explícitas, que podem variar no cicio de vida do desenvolvimento da aplicação, desde as vulnerabilidades descobertas pela equipe até as existentes na aplicação lançada, por isso é importante monitorar sua implementação. As métricas dever estar presentes na sua implementação, desde a modelagem de ameaças, revisão por código, os testes de segurança e a segurança do código, e devem ser gradativamente implantadas, permitindo que as equipes acompanhem seu desempenho. A metodologia para a construção de métricas deve ser desenvolvida para medir o processo de segurança em desenvolvimento e como a administração de referências pode ser utilizada pelos responsáveis para suportar um processo de maturidade crescente, dessa forma, podemos falar em dos tipos de métricas, aquelas utilizadas para o estabelecimento dos processos e as elaboradas para o acompanhamento de processos. Ao se falar na utilização métricas no ciclo de vida do software, deve-se ter em mente a qualidade da segurança da aplicação, por meio de um processo que deve ser analisado individualmente, onde seu objetivo é ter um controle da situação a partir de uma melhoria contínua. Mesmo com as mudanças e a variabilidade causada é necessidade de primeira ordem se ter um controle maior sobre a aplicação, definir as métricas dos principais processos e os fatores que influenciam na qualidade, pois cuidar da segurança é primordial nos dias atuais, e para comprometer a aplicação os atacantes se utilizam quaisquer brechas ou vulnerabilidades. Os processos de métricas devem ser definidos e documentados, para que sejam seguidos de forma correta, lembrando que existem diversas metodologias e normas de qualidade presentes na engenharia de software, o que ajudara definir e implementar as boas práticas. As métricas servem para proporcionar o suporte nos projetos, podem até ser reutilizadas, mas com o devido cuidado, pois são feitas para se tomar decisões importantes, por isso que demandam qualidade. O processo documentado é seguido igualmente por todos e garante que os dados tenham um padrão, objetivo, sentido, além de frequência, evidências, validação e rastreabilidade, para que se possa verificar uma evolução no objeto medido e os problemas. Na engenharia de software reutilizar processos de forma a criar metodologias ou boas práticas, auxiliam na diminuição do trabalho repetitivo de criação de novos processos, o que influencia diretamente na melhoria da qualidade, por isso, há a necessidade de se implementar métricas, as quais por meio de suas técnicas, tornam a gestão de aplicações mais eficaz para o controle de processos. 1.1 1.2Capítulo IV Suporte na Revisão e Desenvolvimento O profissional que se utiliza do desenvolvimento seguro do software deve levar em consideração que mesmo com as ferramentas mais atualizadas não é possível localizar e corrigir todos os erros, e ainda assim são recomendadas as revisões manuais de código, até para o aperfeiçoamento da aplicação. Para o estudo das Ferramentas de Suporte a Análise, podemos visualizar uma sugestão de modelo que a Microsoft divulga, a qual é aplicada aos processos, também muito utilizada para o treinamento para segurança em desenvolvimento, executada a análise estática, testes e revisão de código, para localizar erros na codificação que podem revelar vulnerabilidades de segurança. Há uma tendência atualmente orientada a verificação por meio de ferramentas de testes difusos, que ao contrário daquelas utilizadas para o código estático, são customizadas para a aplicação, fazendo com que se possam localizar erros que as demais não são capazes, por sua capacidade de encontrar determinados bug que seriam considerados como vulnerabilidades de segurança. Ao se falar em desenvolvimento seguro no âmbito de aplicações voltadas para a Web, deve haver uma administração efetiva para que haja o cumprimento dos requisitos de qualidade estabelecidos, como: Privacidade e Segurança, Definição de Especialistas e Revisores e Requisitos Mínimos, para que seja possível completar todas as tarefas, encontrar os profissionais capacitados para que possam fazer a validação, além do acompanhamento dos requisitos requeridos. Em relação ao suporte a análise, para o cumprimento de requisitos é altamente recomendável nessa fase a utilização de uma ferramenta de bug tracking para o acompanhamento de falhas, além de outra, a de quality gates e por fim realizar uma Análise de Riscos de Segurança e de privacidade individualmente na situação. Depois de cumprida essa fase se verificará o design do software, onde é necessária uma investigação, que dirá se todos os Requisitos foram completados através de um checklist, passando para a Segurança, com a revisão de especialistas, e por fim a Privacidade individualmente para depois realizar um processo de revisão. Essa fase é precedida pela Implementação de Criptografia, além de testes para reduzir Superfície de Ataque e implementação de defesas em camadas e também privilégios mínimos aos usuários para restringir seu acesso a funções não autorizadas. Logo após essa fase, deve ser feita a Modelagem de Ameaças e análise de riscos utilizando o STRIDE e o DREAD para identificação de algum comprometimento na aplicação ou em sua estrutura. O próximo passo é o de implementação voltada para desenvolvimento. Ocorre quando está sendo criada a aplicação e os Testes, são executados por meio de ferramentas para especificar compiladores, flags e as opções do software, seguido de uma validação das APIs e, depois da definição de funções inseguras, recomendando-se ao término realizar uma Análise Estática Constante, que é a revisão de todo o código desenvolvido por meio de sink e source. No âmbito do desenvolvimento seguro é responsabilidade do programador a leitura do código através de uma ferramenta de suporte, para que possa ser feita uma verificação, por meio de uma Análise Dinâmica que correrá em tempo de execução, para inserir e processar informações avaliando o comportamento da aplicação, que será precedida pelos Testes Fuzzing, que irão inserir e gerar um grande volume de conteúdo malformado, desconhecido e fora do padrão injetado no software para verificaçãode seu comportamento, seguido de uma Revisão de Ameaças (Time Modelling/Application Security Review) que irá validar os módulos contra código completo e depois será executado uma Pentest que simulará um comportamento malicioso com a finalidade de comprometer a aplicação. Por fim, após passar por todos esses testes será lançada a aplicação. Após o lançamento da aplicação, será elaborado um Plano de Resposta para verificar quando a aplicação dá problema e documentar os procedimentos, passando para a Revisão Final dos Aspectos e Requisitos de Segurança onde depois é feito o Arquivamento do Release com todos os dados técnicos relevantes da documentação para que se possa emitir uma resposta final. A revisão do código verificará se os mecanismos de segurança da aplicação apresentam um nível suficiente de robustez e também para encontrar problemas de complexidade na identificação ao examinar os resultados da aplicação. Por isso os testes da aplicação são métodos de extrema importância para determinar as falhas e posteriormente atualizar o software, corrigindo-as. Nesse âmbito os profissionais envolvidos nas análises são os desenvolvedores e especialistas em seguranças, que podem revisar uma aplicação de modo eficiente e eficaz, já que há incontáveis problemas e falhas, principalmente na área de segurança, que pode comprometer e expor dados de grande importância. Por isso a revisão de código é importante, porque pode encontrar diversas vulnerabilidades, demonstrando que um bom código e com técnicas efetivas os risos são evitados caso haja um diagnóstico realizado efetivamente dos problemas de segurança. O ideal é seguir as métricas do guia de revisão de código, além de documentar os problemas encontrados, pois é considerada como uma prática que pode ajudar bastante no Desenvolvimento Seguro no Ciclo de Vida, prevenindo contra vulnerabilidades substanciais. Revisar o código é uma maneira de complementar os testes e as ferramentas utilizadas, ajudando na detecção e remoção de vulnerabilidades de segurança, pois são uma etapa indispensável durante o processo de desenvolvimento, com a finalidade de se alcançar uma versão final mais estável e protegida, permitindo a correção precoce de problemas críticos. No desenvolvimento de uma aplicação é necessário que os profissionais estejam familiarizados com o processo de manipulação de todas as documentações de segurança, para remover vulnerabilidades de segurança rapidamente, evitando gastos excessivos, além de fornecer um software mais resguardado, por meio de verificações definidas. A equipe de segurança deve estar preparada para reiteradas interações no desenvolvimento da aplicação, os quais são: o levantamento de requisitos, design, implementação, verificação, lançamento e suporte e manutenção, e para isso devem ser utilizadas ferramentas para auxiliar o programador a desenvolver códigos com mais qualidade e segurança. Ainda nesse sentido o Continuous Delivery é uma técnica de Implantação Contínua da Aplicação, ou seja, são práticas de entrega do software atualizando-o em seu ambiente de produção, de forma previsível, rápida, confiável e realizada a qualquer instante. Assim o tempo entre a codificação pronta e sua utilização pelos usuários é reduzida por meio dos processos de desenvolvimento automatizados. Dessa forma há uma rápida entrega do código pronto, que depois é colocado produção, através de seu ciclo de vida, estando sempre pronto para o ambiente, proporcionando feedback rápido, além de uma maior integração entre as equipes de desenvolvimento e operação. As principais vantagens são a redução do custo, tempo e risco de entrega do software, onde é necessário haver um alto grau de automatização para garantir que a aplicação poderá ser implantada sem problemas no ambiente de produção a qualquer instante, o que é feito através do desenvolvimento em ciclos curtos, possibilitando com isso uma maior qualidade, devido a melhoria contínua dos processos. Um dos objetivos da técnica é uma exponencial redução do tempo nas fases do ciclo de vida até a implantação do aplicativo a ser produzido, de modo a realizar a entrega de novas versões continuamente, implantando novas funcionalidades ao software, agilizando os negócios, ou seja, é um processo automatizado que busca a diminuição do risco de erros a cada instante. Isso tudo é possível porque todo o código é imediatamente implantado na produção, havendo a necessidade da equipe de estar permanentemente preparada para o lançamento de uma nova versão, o que implica na redução de riscos com a codificação ajustada em pequenas partes, porque haverá o monitoramento de operações e métricas além de mudanças rápidas. Os pequenos trechos de código são testados de maneira automatizada e depois enviados a um servidor de homologação, onde posteriormente passarão pela etapa de integração, testando a infraestrutura e o banco de dados do software, pois caso haja algum problema há uma facilidade para que se faça um rollback de uma versão. Dessa forma a Implantação Contínua, promove os testes de mudanças ainda em produção, sendo necessário um monitoramento continuado da experiência do usuário em tempo real, o que pode não ser indicado para modelos de negócios que tenham uma aplicação com um alto grau de complexidade, porque pode haver a criação de gargalos na entrega de mudanças. Capítulo I :GESTÃO DA SEGURANÇA NO SDLC -Security Development Introdução ao Desenvolvimento Seguro O software, além do conceito de uma sequência de instruções que controlam o computador, do processamento de dados e informações é tido como uma tecnologia evolucionária e, por isso, já não é mais o mesmo, pois não utilizamos mais as linguagens de programação de décadas anteriores, e assim podemos perceber sua ampla transformação, além dos novos conceitos que surgem a cada momento no cenário mundial. Desse modo seu âmbito de aplicação é muito abrangente, já que se encontra presente desde o software de sistema, para fins de aplicações, pesquisas científicas, embarcados, linhas de produtos, aplicações para Web, inteligência artificial, entre outros, os quais são utilizados por pessoas, pela indústria ou pelo governo. A Engenharia de Software cuida da criação e do suporte dos programas e, desse modo, é vista como uma área muito importante, pois estamos cercados de sistemas a nossa volta, desde os mais simples até aqueles que se caracterizam por sua altíssima complexidade, onde também nos vemos marcados por inúmeras tecnologias que tornam sua utilização cada vez mais fácil no dia-a-dia. O software está presente em vários tipos de dispositivos como computadores, impressoras, celulares, tablets, games, marcapassos, na engenharia, eletrodomésticos, em redes sociais além de incontáveis sistemas e equipamentos, que passam por vezes despercebidos pelas pessoas. Há um tempo, tínhamos que instalar o software no computador pessoal e por incontáveis vezes fazer sua manutenção por meio de atualizações que corrigiam problemas como bugs e vulnerabilidades, mas hoje com a Internet cada vez mais presente no cotidiano, percebe-se que há uma tendência migratória das aplicações para servidores on-line, e com isso, temos os avanços percebidos pelo cloud computing, onde não se sabe sua localização e a maneira que rodam, por isso vemos que a modificação, correção e atualização são feitas de forma praticamente imperceptível aos olhos do usuário, marcando sua evolução de produto para serviço. O software como componente lógico produz, gerencia, adquire, modifica, exibeou transmite informações úteis para gerenciar o processo de tomada de decisão, o que vai mais além do tratamento de dados, marcando sua presença na vida das pessoas. Com as mudanças no hardware e seus aprimoramentos, como uma maior capacidade de armazenamento, a ampliação da memória, as alterações ocorridas nas arquiteturas dos computadores, a criação de sistemas mais sofisticados e robustos, o software tem atingido patamares inimagináveis há bem pouco tempo. No desenvolvimento de software é comum ocorrer erros, por isso as tarefas de manutenção são mais complexas que as de hardware. Para se ter uma ideia de valores, um erro de software no início do projeto custa à empresa aproximadamente US$140 para ser corrigido, enquanto que um erro detectado na fase pós-implantação chega a custar impressionantes US$14.000. (http://www.isixsigma.com/industries/software-it/defect-prevention-reducing- costs-and-enhancing-quality/) (https://www.cs.umd.edu/projects/SoftEng/ESEG/papers/82.78.pdf) Segurança em desenvolvimento Com a evolução da Internet, o software hoje oferece funcionalidades imediatas (just-in-time), que podem ser acessadas por meio do navegador web e, para isso, é importante que seja implantado um processo de gestão de segurança da informação confiável, para garantir a manutenção de um nível aceitável de risco e operação. A reutilização dos componentes do software é uma prática que permite focar nas inovações do projeto, podendo-se implementar funções comuns por meio de partes repetidas de código, onde as estruturas de dados e detalhes de processamento são armazenadas em uma biblioteca de componentes para a construção de interfaces futuras. Com isso permite-se ganhar mais tempo nas partes importantes da aplicação, em vez de “reinventar a roda”. O custo para a correção de vulnerabilidades identificadas aumenta de maneira substancial a cada fase do ciclo de desenvolvimento do software (levantamento de requisitos, design, implementação, verificação, lançamento e suporte e manutenção), portanto, o quanto antes forem identificadas falhas de segurança, mais econômico ficará realizar sua manutenção, porque qualquer problema posterior acarretará um valor maior, podendo até inviabilizar o projeto. Por isso, é necessário que o profissional conheça as boas práticas de desenvolvimento e de segurança nesse contexto. Investir em segurança traz um retorno amplo não só para o projeto, mas também para os usuários. Além disso, há um menor investimento no tratamento de bugs, fazendo com que sejam reduzidos nesse processo tempo e recursos. Uma das propostas da disciplina é quebrar alguns dos paradigmas mais engessados, fazendo com que haja uma mudança na cultura dos profissionais do software, refletindo inclusive na própria organização, de maneira ampla, para que se possa obter qualidade e segurança nos produtos entregues. A maior parte das aplicações que estão em produção são vulneráveis a diversos tipos de ataques, por isso não se pode falar em um software completamente seguro ou blindado, mas pode-se tentar reduzir ao máximo o comprometimento das informações e o risco de ataques. Devido a isso, a OWASP (The Open Web Application Security Project) apresenta um ranking a partir de uma análise das falhas mais comuns em aplicações web, as quais estão presentes em praticamente todas as versões não testadas e adequadas do software. O processo de segurança denota a importância do software, e por isso deve-se visualizar todas as fases componentes do desenvolvimento de software (levantamento de requisitos, design, implementação, verificação, lançamento da aplicação e suporte e manutenção), para que se possa estudar o gerenciamento das principais metodologias utilizadas no mercado e, com isso, traçar uma base para as estratégias de uso empregadas pelas organizações, já que com as vulnerabilidades, a correção, adaptação e a expansão demandam mais pessoas e recursos do que o processo de criação em si. Para relembrar as fases do desenvolvimento de uma aplicação temos que na fase inicial, no Levantamento de Requisitos, se faz as listagens de recursos necessários, especificando as diretrizes de qualidades, além de documentar a arquitetura e fazer o agendamento de entrevistas. Na parte de Design da aplicação são realizadas as especificações funcionais e o desenho do software. A implementação é a fase onde se desenvolve o código, e na Verificação que se faz uma busca, além das correções de bugs, mas em ambas podem ser feitos testes e avaliações. No lançamento que se faz a assinatura do código e seu “encerramento”. Para a fase de suporte e manutenção, são feitas as atualizações segurança e correções de vulnerabilidades observadas. A arquitetura caracteriza-se por ser uma adaptação do software para atender às necessidades de novos ambientes e tecnologias, sendo realizada de maneira a trazer um aperfeiçoamento para que se possa implementar novos requisitos de um modelo de negócio, e com isso ser responsável pela expansão e interoperabilidade. Os recursos e funções das aplicações podem ser reutilizados muito facilmente, e levando em consideração a importância de projetar, e também de segurança, falhas, importância da qualidade, funcionalidade, há uma necessidade em poupar tempo e recursos para se concentrar no desenvolvimento da aplicação. O desenvolvedor deve levar em conta a tecnologia, os requisitos complexos, e a tomada de decisões estratégicas e táticas para proteger a aplicação dos riscos de segurança. Por isso é importante que se utilize uma metodologia prática, onde haja comunicação, pois é fundamental ouvir as necessidades dos clientes e interessados com fins de compreender seus objetivos e aplicá-los de modo preciso ao projeto, fazendo o levantamento das necessidades que definirão funções e características, além do planejamento (trabalho de engenharia de software, com as tarefas, riscos, recursos, produção e o cronograma), análise de requisitos, modelagem de projeto (esboço para compreender o problema e resolvê-lo, entendendo as necessidades do software através do projeto), construção de programa (criação de código e testes para descobrir os erros na codificação), até chegar aos testes e suporte. Papéis e responsabilidades Os profissionais do desenvolvimento seguro de software são responsáveis em apresentar e implantar um conjunto de práticas e metodologias aos programadores, o que resulta em melhores aplicações, com um nível muito maior de confiabilidade, maturidade, integridade e inviolabilidade. Os papéis apresentados se referem às responsabilidades, por isso as atividades de cada membro do projeto de desenvolvimento de software são essenciais em todas as etapas do planejamento da aplicação, especificando os requerimentos básicos para que cada função seja desempenhada da forma mais segura possível. As responsabilidades da equipe em relação ao Software Development Lifecycle são desenvolver, manter e aprimorar a aplicação, definindo aspectos obrigatórios do processo, fornecendo o treinamento adequado aos engenheiros e supervisores, além de direcionar as equipes durante todo o processo, supervisionando e revisando a segurança por meio de equipes, e de maneira a fazer com que os especialistas abordem os aspectos de proteção do software, para que os supervisores de segurança possam se informar através de análises das respostas, oportunas e precisas, além de revisar a segurança antes que a aplicação seja lançada, buscando as vulnerabilidades que podem comprometer
Compartilhar