Engenhariasoftwareseguro Renatopessanha
Engenhariasoftwareseguro Renatopessanha
Engenhariasoftwareseguro Renatopessanha
SOFTWARE
Por:
Renato Pessanha da Silva
Rio de Janeiro
2005
DEDICATÓRIA
ii
AGRADECIMENTOS
iii
EPÍGRAFE
Fernando Pessoa
iv
RESUMO
v
ABSTRACT
vi
SUMÁRIO
DEDICATÓRIA ............................................................................................................................................. II
AGRADECIMENTOS ..................................................................................................................................III
RESUMO .........................................................................................................................................................V
ABSTRACT ................................................................................................................................................... VI
SUMÁRIO.....................................................................................................................................................VII
I- INTRODUÇÃO ................................................................................................................................... 7
1.1. MOTIVAÇÃO ............................................................................................................................................ 7
1.2. OBJETIVO ................................................................................................................................................ 9
1.3. METODOLOGIA DO TRABALHO ................................................................................................................ 9
1.4. ESTRUTURA DO TEXTO ...........................................................................................................................10
II - ENGENHARIA DE SOFTWARE SEGURO...................................................................................11
2.1. INTRODUÇÃO ..........................................................................................................................................11
2.2. CRISE DO SOFTWARE ..............................................................................................................................12
2.3. ENGENHARIA DE SOFTWARE ..................................................................................................................13
2.3.1. Requisitos .......................................................................................................................................14
2.3.2. Metodologia....................................................................................................................................16
2.3.3. Aspectos de Segurança em Metodologias.......................................................................................16
2.4. DIFERENÇA ENTRE SOFTWARE SEGURO E DE QUALIDADE......................................................................20
III - GARANTIA DE SEGURANÇA........................................................................................................21
3.1. INTRODUÇÃO ..........................................................................................................................................21
3.2. AMBIENTE SEGURO DE DESENVOLVIMENTO ...........................................................................................21
3.2.1. Gerência de Configuração .............................................................................................................22
3.2.2. Distribuição....................................................................................................................................22
3.2.3. Desenvolvimento.............................................................................................................................23
3.2.4. Documentação................................................................................................................................23
3.2.5. Suporte ao Ciclo de Vida................................................................................................................24
3.2.6. Testes de Segurança .......................................................................................................................24
3.2.7. Avaliação de Vulnerabilidades.......................................................................................................24
3.3. NORMA ISO/IEC 17.799 ........................................................................................................................25
3.4. NORMA ISO/IEC 15.408 ........................................................................................................................27
3.5. CICLO DE VIDA DE DESENVOLVIMENTO SEGURO ...................................................................................30
3.5.1. O Processo .....................................................................................................................................32
3.5.2. Visão Geral.....................................................................................................................................33
3.5.3. Fase Requisitos (Requirements) .....................................................................................................34
3.5.4. Fase de Design ...............................................................................................................................35
3.5.5. Fase de Implementação ..................................................................................................................36
3.5.6. Fase de Verificação ........................................................................................................................37
3.5.7. Fase de Liberação ..........................................................................................................................38
3.5.8. Fase de Manutenção (Support and Servicing) ...............................................................................38
IV - REQUISITOS FUNCIONAIS DE SEGURANÇA ..........................................................................40
vii
4.1. INTRODUÇÃO ..........................................................................................................................................40
4.2. AUDITORIA .............................................................................................................................................41
4.3. COMUNICAÇÃO - REPÚDIO .....................................................................................................................43
4.4. CRIPTOGRAFIA .......................................................................................................................................44
4.5. PROTEÇÃO DE DADOS DO USUÁRIO .........................................................................................................47
4.6. IDENTIFICAÇÃO E AUTENTICAÇÃO .........................................................................................................52
4.7. GERENCIAMENTO DE SEGURANÇA ..........................................................................................................54
4.8. PRIVACIDADE .........................................................................................................................................55
4.9. AUTOPROTEÇÃO .....................................................................................................................................56
4.10. UTILIZAÇÃO DE RECURSOS ...................................................................................................................58
4.11. CONTROLE DE SESSÕES ........................................................................................................................59
4.12. CANAIS SEGUROS .................................................................................................................................60
V- ARQUITETURA DE SOFTWARE SEGURO ................................................................................62
5.1. INTRODUÇÃO ..........................................................................................................................................62
5.2. BOAS PRÁTICAS DE PROGRAMAÇÃO.......................................................................................................64
5.3. PADRÕES DE DESENVOLVIMENTO ...........................................................................................................68
5.4. TESTES DE SEGURANÇA..........................................................................................................................70
VI - GESTÃO DO DESENVOLVIMENTO DE SOFTWARE SEGURO ............................................75
6.1. INTRODUÇÃO ..........................................................................................................................................75
6.2. MÉTRICA DE SEGURANÇA ......................................................................................................................76
6.2.1. Superfície de Ataque.......................................................................................................................76
6.2.2. Outras Métricas..............................................................................................................................79
6.3. MONITORIZAÇÃO DE VULNERABILIDADES .............................................................................................80
6.3.1. Divulgação de Vulnerabilidade ......................................................................................................81
6.3.2. Resposta a incidentes......................................................................................................................82
6.4. COMPORTAMENTO SEGURO ....................................................................................................................84
VII - CONCLUSÃO .......................................................................................................................................87
7.1. INTRODUÇÃO ..........................................................................................................................................87
7.2. CONCLUSÃO E CONTRIBUIÇÃO................................................................................................................87
7.3. PERSPECTIVAS FUTURAS.........................................................................................................................88
VIII - REFERÊNCIAS...................................................................................................................................90
viii
I - INTRODUÇÃO
1.1. Motivação
1
Segurança pode ser decomposta em vários aspectos distintos, porém complementares. Entre os
aspectos mais importantes estão confidencialidade, integridade e disponibilidade.
2
Programador, analista de sistemas, testador, engenheiro e arquiteto de software são termos
usados indistintamente nesse trabalho e o seu conjunto é chamado de desenvolvedor. Porém,
em alguns momentos, desenvolvedor representará programador e analista de sistemas.
7
A engenharia de software foi eficaz na criação e aperfeiçoamento de metodologias
que permitissem o desenvolvimento de sistemas seguros – sendo segurança um atributo de
qualidade –, porém a prática demonstra que a cultura de segurança não foi assimilada
totalmente ou os processos e arquiteturas não foram aplicados à maioria dos projetos para a
geração de produtos conceitualmente seguros – ou o mais próximo disso, dado que
segurança total é considerada como inalcançável. O êxito dessas metodologias retringem-
se aos sistemas denominados críticos – aqueles que prevêem segurança como um requisito
essencial. Normas específicas para avaliar a segurança foram criadas, mas sua aplicação
também tem, aparentemente, sido restrita a sistema de missão crítica.
if n2a(X) ∩ n2a(Y) ≠ Ø
then ∃x ∈ n2a(X) ∃y ∈ n2a(Y)
tal que connect(x, y)
O modelo descrito espera por dois endereços como parâmetros de origem e destino.
A falha permitia que applets se conectassem a máquinas distintas das suas de origens,
passando-se o parâmetro de destino também como de origem. A correção da Netscape foi
armazenar o endereço IP (i) do servidor de origem, eliminando a primeira verificação, e
mudar a checagem de interseção para associação: i ∈ n2a(Y).
8
Manifestações sobre a importância da readequação da engenharia de software
aumentam e a comunidade da engenharia de software começa a formular processos que
concebam sistemas naturalmente seguros.
1.2. Objetivo
9
Em seguida, foram levantadas na literatura as metodologias de qualidade mais
empregadas na engenharia de software. As metodologias englobam, mas não se restringem
a, normas e procedimentos relacionados ao processo de desenvolvimento ou avaliação de
software. Além das metodologias, pesquisou-se a profundidade na qual o tema segurança é
tratado na literatura tradicionalmente acadêmica.
2.1. Introdução
11
2.2. Crise do software
Nas décadas de 1960 e 1970, o desafio primordial era desenvolver hardware que
reduzisse o custo de processamento e de armazenamento de dados [PRESSMAN 1992]. As
décadas seguintes foram as que tiveram um avanço significativo da microeletrônica
[CARVALHO 2001], tornando o custo do hardware e armazenamento inferior ao do
software. Na década de 1960, os custos com hardware representavam mais de oitenta por
cento do custo total, enquanto, atualmente, estima-se que sejam aproximadamente dez por
cento do custo total. Nos primórdios o desenvolvimento de software era uma atividade
puramente artesanal. Como conseqüência, errava-se constantemente nas estimativas de
custos e tempo, os sistemas desenvolvidos continham muitos erros e, consertá-los
geralmente produziam novos. Esse é o cenário vigente desde a chamada Crise do Software
[BARROS 2002].
12
Segurança transformou-se um fator relevante para as organizações
desenvolvedoras, justificado pelo crescente aumento no número de ataques a
vulnerabilidades presentes nos softwares por elas criados.
Carvalho et al. [CARVALHO 2001] define que "a engenharia de software é uma
disciplina que reúne metodologias, as quais são compostas por métodos que se utilizam de
ferramentas automatizadas, para viabilizar a produção, da percepção do problema até o
momento em que o sistema desenvolvido deixa de ser operacional, visando resolver
problemas inerentes ao processo de desenvolvimento e ao produto de software,
enfrentando os efeitos advindos com o que se denominou crise do software".
A demanda por funções cada vez mais sofisticadas nos software tem também
crescido de forma consistente, o que leva a um aumento na complexidade de
desenvolvimento, com conseqüente aumento do custo.
São muitos os problemas a ser tratados pela engenharia de software, pois tanto o
processo quanto o produto possuem vários atributos que devem ser considerados para que
se tenha sucesso, como a complexidade, a visibilidade, a aceitabilidade, a confiabilidade, a
13
manutenibilidade, a segurança etc. Por exemplo, para a especificação de sistemas de
controle de tráfego aéreo e ferroviário, a confiabilidade é um atributo fundamental
[FARINES 2000].
2.3.1. Requisitos
• Requisito funcional – cada requisito que especifica uma função que deve
ser realizada. São requisitos que definem o comportamento de sistema, isto
é, o processo ou transformação que componentes de software ou hardware
efetuam sobre as entradas para gerar as saídas [THAYLER 1990].
14
• Requisito não-funcional – descreve não o que o software fará, mas como
fará. Assim, por exemplo, temos requisitos de desempenho, requisitos da
interface externa, restrições de projeto e requisitos da qualidade. Requisitos
não-funcionais são difíceis de testar. Portanto, eles geralmente são avaliados
de maneira subjetiva [THAYLER 1990].
3
Revisão da publicação de 1984 (Guide to Software Requirements Specifications). Uma nova
revisão foi publicada em 1998 (IEEE Std 830-1998).
4
A classificação apresentada em Sommerville (1996) ainda considera os requisitos de processo e
requisitos externos como sendo os requisitos não-funcionais, além dos requisitos de produtos.
15
requisitos externos, de produto e de processo [SOMMERVILLE 1992]; foi estendida por
Mendes [MENDES 2002].
2.3.2. Metodologia
Dos cinco processos cobertos pela norma, apenas o de operação não faz referência
à segurança. A NBR ISO/IEC 12207 orienta seus usuários a proceder com sua aplicação
criteriosamente. Nesse sentido, delegar às normas mais especializadas tarefas que lhes são
mais apropriadas é uma prática recomendada. Por exemplo, o processo de fornecimento
guia o seu planejamento a desenvolver planos de proteção e segurança (5.2.4.5e), ao qual a
norma ISO/IEC 15408 [ISO/IEC 15408] pode ser mais apropriada para avaliá-lo, e a
17
atender ao especificado na política de segurança a que se submete o projeto, cuja norma
NBR ISO/IEC 17799 [ISO/IEC 17799] pode auxiliar a atingir melhores resultados.
19
2.4. Diferença entre Software Seguro e de Qualidade
Diz-se que toda organização – não apenas as comerciais, mas as sem fins lucrativos
e também instituições governamentais – que sobreviver no século 21 terá algum
envolvimento com e-commerce. Entendendo e-commerce como negociação entre grupos e
indivíduos em sociedade. O acesso via Internet tem se tornado um requisito para que as
organizações modernas negociem com fornecedores, parceiros e clientes. Assim, toda
organização enfrenta as mesmas ameaças eletrônicas.
5
O autor emprega “computador de Murphy” numa alusão a um computador supostamente
pertencente ao autor das Leis de Murphy para demonstrar a dificuldade de atender aos seus
requisitos, visto que a primeira Lei de Murphy afirma que “se algo pode falhar, falhará”.
20
III - GARANTIA DE SEGURANÇA
3.1. Introdução
Organizações que têm os códigos fonte de seus aplicativos como um ativo de alto
valor, necessitam principalmente de um ambiente que, não só apóie o desenvolvimento de
softwares seguros, mas que, principalmente, não insira vulnerabilidades neles. Usando uma
definição mais precisa da ISO, pode-se dizer que garantia é a base para a confiança que um
21
sistema atinge os objetivos de segurança para ele definidos. Essa garantia é mais
facilmente obtida nas vezes em que o ambiente de desenvolvimento é adequado, isto é,
emprega-se as boas práticas de desenvolvimento, a quais, apesar do rigor, não requerem
conhecimento especialista substancial, habilidades e outros recursos. Um alto nível de
garantia de segurança permite que um desenvolvedor obtenha o máximo de garantia
através da engenharia de segurança.
3.2.2. Distribuição
22
3.2.3. Desenvolvimento
• Especificação funcional
• Projeto de alto nível
• Projeto de baixo nível
• Representação da implementação
3.2.4. Documentação
23
3.2.5. Suporte ao Ciclo de Vida
A ISO define que testes de segurança visam garantir que o sistema atende aos
requisitos funcionais de segurança. Porém, os testes sozinhos não são suficientes para
garantir que o sistema faz somente aquilo a que ele se propõe, de maneira que
comportamentos imprevistos poderão existir. A cobertura dos testes de segurança não pode
ser confundida com teste de cobertura. O objetivo da cobertura dos testes é definir se os
testes realizados foram suficientes para demonstrar que o sistema funciona conforme às
especificações. A profundidade que os testes terão serão definidos de acordo o grau de
exigência estabelecido, isto é, um teste profundo permitirá a descoberta de códigos
maliciosos inseridos durante o desenvolvimento.
Após uma revisão, as duas normas (a de 1995 e a de 1998) foram publicadas com o
nome de BS7799-1999. Neste mesmo ano a primeira parte deste documento foi submetida
à ISO para homologação, sobre o mecanismo de "Fast Track". Em maio de 2000 a BSI
(British Standard Institute) homologou a primeira parte da norma BS7799. Na reunião do
comitê da ISO em Tóquio, a norma foi votada e aprovada pela maioria dos representantes.
Embora sem unanimidade, em primeiro de dezembro de 2000 houve a homologação da
"BS" como ISO/IEC 17799:2000.
26
Segundo a NBR ISO/IEC 17799 [NBR ISO/IEC 17799], a segurança de um
ambiente é caracterizada pela manutenção de três fatores primordiais: a confidencialidade,
a integridade e a disponibilidade das informações críticas. Para a NBR, a informação é "um
ativo que, como qualquer outro ativo importante para os negócios, tem um valor para
organização e conseqüentemente necessita ser adequadamente protegido"
27
O Common Criteria for Information Technology Security Evaluation (Critério
Comum para Avaliação de Segurança da Tecnologia da Informação) é o nome do padrão
que originou a norma ISO/IEC 15408 [ISO/IEC 15408], muitas vezes chamada apenas de
Common Criteria. A norma objetiva 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 Livro Laranja [DOD 1985] foi escrito para os órgãos do governo dos Estados
Unidos, porém tornou-se um padrão comercial de uso geral, pois, de um lado os
fabricantes começaram a utilizar seus critérios para classificar seus produtos, e do outro, os
compradores a dispor de um meio que permitiria uma melhor avaliação da segurança
fornecida pelos produtos.
Para não causar confusão com o emprego do termo sistema, o Common Criteria
emprega o termo TOE (Target of Evaluation – Alvo da Avaliação). O TOE é, então, o
sistema que está se desenvolvendo ou avaliando. O TOE tem funções de segurança que
constituem o conjunto de rotinas responsáveis por garantir sua conformidade com a
política de segurança. Em algumas ocasiões as funções de segurança são designadas pela
sigla TSF (Target Security Functions – Funções de Segurança do Sistema Alvo). TSP é,
portanto, a política de segurança do TOE, que são as regras que definem a política de
acesso e controle dos ativos do sistema.
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 laboratórios
internacionais e o grande número de detalhes na implantação, como determina o processo
estabelecido na norma, torna o processo caro.
Não existe uma NBR (norma brasileira) correspondente. Porém há iniciativas nesse
sentido, sobretudo pela importância que o tema tem e pelas preocupações vem despertando
nos últimos anos.
30
Para a indústria de software, a forma de satisfazer as demandas atuais de reforçar a
segurança é implementando processos repetíveis que resulte em produtos com segurança
reforçada. Assim, a indústria de software deverá fazer a transição para um processo de
desenvolvimento de software mais severo que trate adequadamente, em uma forma ampla,
a segurança. Tal processo deve reduzir o número de vulnerabilidades existentes nas fases
de projeto e codificação, além da elaboração de documentação, permitindo que se
identifique e remova tais vulnerabilidades do ciclo de vida de desenvolvimento o mais
rápido possível.
6
Legislação americana aprovada em 2001 – provavelmente a legislação mais abrangente que
afeta as empresa de comércio público dos Estados Unidos desde o Securities Exchange Act
de 1934 – para restaurar a confiança nos relatórios financeiros de empresas públicas. Entre
outras medidas, responsabiliza pessoalmente os funcionários pelo fornecimento de
informações financeiras precisas. Foi criada após os fiascos contábeis da Enron, WorldCom e
Global Crossing.
31
por contratar terceiros, a experiência demonstrou – na visão de Lipner et al. – que a
existência de um grupo interno de segurança é um fator vital para o sucesso na
implementação de um ciclo de vida de desenvolvimento.
3.5.1. O Processo
O processo de uma forma geral é similar aos praticados pela indústria de software.
Seu fluxo é mostrado na Figura 1.
Figura 1
32
série de builds que podem ser testadas e usadas operacionalmente (pela equipe de
desenvolvimento) de uma forma contínua.
• Seguro por Design: Uma arquitetura pode ser desenhada para utilizar
criptografia 3DES (triplo DES) para dados sensíveis antes de serem
armazenados no banco de dados e o uso do protocolo SSL para transportar o
dado através da Internet. Todo código é bastante verificado em busca de
vulnerabilidades comuns usando ferramentas manuais e automáticas. A
modelagem de ameaças é criada durante o processo de design do software.
Figura 2
34
a equipe de projeto revisando planos, fazendo recomendação e garantindo que o grupo de
segurança planeja os recursos necessários para oferecer suporte ao cronograma da equipe
de projeto. O conselheiro de segurança permanece como intermediário da equipe de
projeto com o grupo de segurança até a Revisão Final de Segurança e liberação do
software. O conselheiro de segurança é o elo entre a equipe de projeto e o grupo de
segurança, nos dois sentidos, pois depois de liberada a versão a equipe de segurança pode
necessitar estabelecer contato com a equipe de projeto visando evitar surpresas
relacionadas às falhas de segurança.
36
O levantamento das ameaças guiam a fase de implementação. Desenvolvedores
atentam para garantir com exatidão que o código mitiga as ameaças mais graves e os
testadores investigam se cada ameaça está realmente bloqueada ou abrandada.
7
Fornece estruturas de entradas inválidas para a API (Application Programming Interfaces) do
software e interface de rede de maneira que se aumente a probabilidade de detectar falhas
que possam resultar em vulnerabilidades.
37
3.5.7. Fase de Liberação
38
Parte do processo de resposta a incidentes envolve a necessidade de preparação
para avaliar relatórios de vulnerabilidades e liberar notificações e atualizações de
segurança quando apropriado. O outro componente do processo de resposta é conduzindo
um post-mortem de vulnerabilidade relatada e tomando as medidas necessárias. As ações
em resposta a uma vulnerabilidade variam de emitir uma atualização em resposta a um erro
isolado até a atualizar ferramentas de verificação de código para iniciar revisões dos
subsistemas principais. O objetivo durante a fase de resposta é aprender com os erros e
usar a informação fornecida nos relatórios de vulnerabilidades para ajudar a detectar e
eliminar vulnerabilidades adicionais, antes que sejam descobertos na prática. O processo
de resposta ajuda também a equipe do projeto e a equipe de segurança a adaptar processos
para que erros similares não sejam repetidos no futuro.
39
IV - REQUISITOS FUNCIONAIS DE SEGURANÇA
4.1. Introdução
4.2. Auditoria
42
Os eventos auditáveis podem, com o passar do tempo, deixar de ser relevante para
registro e outros podem tornar-se. O Common Criteria sugere que permita-se 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:
Albuquerque et al. [ALBUQUERQUE 2002] diz que "o 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". O Common Criteria, preocupada em garantir a identificação
das partes envolvidas em uma troca de dados, emprega duas famílias de classes para
garantir a identificação do emissor da informação (prova de origem) e assegurar a
identificação do destinatário (prova de recebimento). 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.
43
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.
4.4. Criptografia
Soares et al. [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".
44
"Existem basicamente dois tipos de criptografia: a simétrica e a assimétrica"
[ALBUQUERQUE 2002]. Júlio César empregava um método de criptografia que consistia
em substituir as letras de uma mensagem pela terceira letra após sua posição no alfabeto
(sendo a sucessor de z) [TANENBAUM 1989]. Esse é um exemplo de criptografia
simétrica ou baseada em chave secreta, pois a mesma chave será usada para cifrar e
decifrar a mensagem. O problema clássico dessa solução é a dificuldade de entregar a
chave de forma segura a quem vai decifrar a mensagem [RUFINO 2002]. Existem diversos
algoritmos conhecidos de criptografia simétrica, como DES, IDEA, TRIPLE-DES e
BlowFish [ALBUQUERQUE 2002]. O algoritmo DES codifica blocos de 64 bits de texto
normal gerando 64 bits de texto criptografado [TANENBAUM 1989].
Lima [LIMA 2002] conclui que a "a criptografia de chave pública não é uma
panacéia. Nenhum sistema criptográfico além da 'chave-de-uma-só-vez' é
incondicionalmente seguro, e é preciso que não nos iludamos com argumentos falaciosos
que 'comprovam matematicamente' a segurança dos sistemas assimétricos. Talvez seja o
caso de fazermos com sistemas assimétricos o que se tem feito com sistemas simétricos,
seguindo a sugestão de Shannon [SHANNON 1948] - combinar vários passos de
substituição e de transposição".
46
assimétricas RSA, com base em semente gerada pela função time(), conforme descrito a
seguir, com tamanho da chave de 1024, que atendam aos seguintes padrões: PKCS#12.
d) Comunicação interna:
- Proteção de confidencialidade de dados do usuário;
- Integridade na transferência de dados.
O controle de acesso deve considerar que diferentes usuários têm direitos de acesso
distintos. Usuários podem ler, alterar, remover ou criar informações. A dificuldade
existente é prevenir que usuários não burlem o controle de acesso, acessar diretamente a
informação sem passar pelo sistema, e ao mesmo tempo os meios preventivos não
degradem a velocidade do sistema. A maneira mais fácil de evitar o acesso aos dados por
outros meios é aproximando proteção e informação. Assim, o banco de dados ou o sistema
de arquivo (file system) tem sido escolhido como a forma ideal para proteger os dados, em
virtude da proximidade da informação.
Entre os diversos tipos de controle de acesso, os mais comuns são por níveis
universais, por proprietário e grupo proprietário; e discriminado (discritionary). O
universal classifica as informações com níveis, por exemplo, secreta, confidencial, restrita
e pública. Os usuários são também classificados em função dos níveis que terão acesso. O
usuário terá acesso a seu nível e os inferiores a este. O controle de acesso por proprietário e
grupo proprietário é comum em sistemas UNIX. Nele, o dono da informação, o grupo a
que pertence e os demais usuários podem ter privilégios distintos entre si. No controle de
48
acesso discriminado cada usuário ou grupo tem direito de acesso específico a uma
informação.
O sistema misto requer que regras de solução de conflitos sejam fixadas. Por
exemplo, se um usuário pertencer a dois perfis (A e B) e determinado sistema permitir
acesso de leitura ao perfil A e negar leitura ao perfil B, o direito que terá esse usuário
deverá ser definido por algum critério. A tendência é que primeiro se considera as
permissões e depois as negações. No exemplo apresentado, o usuário teria acesso de leitura
negado.
O controle de acesso por contexto pode ser exemplificado como o "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” [ALBUQUERQUE 2002].
49
mais segura de se evitar acessos ilícitos é através do uso de criptografia das informações"
[ALBUQUERQUE 2002].
50
As informações residuais, aquelas 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 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. Outros cuidados envolvem as
camadas, especialmente as fornecidas por terceiros, que manipulam as informações. Um
banco de dados lê dados do disco rígido e envia para o driver do banco de dados acessado
pelo servidor de aplicações, que, por sua vez, retorna para a função de leitura e envia à
camada de apresentação, por exemplo, um navegador. O cache da rede ou navegador pode
manter informações depois de manipulá-las.
51
4.6. Identificação e Autenticação
Além da forma de autenticação, seja por senha, cartão, biometria ou qualquer outra
forma, aspectos como momento da autenticação, impossibilidade de fraude do sistema,
múltiplos mecanismos de autenticação e reautenticação devem ser considerados. As
mensagens de erro de autenticação não deveriam dar pistas ao agente de um eventual
ataque. Por exemplo, se o sistema exibir mensagens de erro distintas para usuário e senha
errada, o agente pode descobrir mais facilmente quais usuários são válidos no sistema.
• Identificação do usuário
• Dados para autenticação
• Prazo de validade dos dados para autenticação
• Prazo a partir do qual deve-se alertar o usuário para renovar seus
dados de autenticação
8
Um resumo do artigo, a versão completa não está disponível ainda, pode ser encontrado em
http://theory.csail.mit.edu/~yiqun/shanote.pdf
53
• Indicador de conta bloqueada (flag)
• Data e hora para liberação do bloqueio
É possível que o sistema que autenticou o usuário faça acesso a outros sistemas
para realizar ações definidas por esse usuário. Se houver controle de acesso nesses outros
sistemas, o acesso deveria ter privilégio compatível com os do usuário autenticado no
sistema autenticador. Uma solução é ligar o usuário à instância do sistema a ser acessado
por meio de uma nova autenticação, gerando um token assinado eletronicamente pelo
autenticador, que seria uma entidade aceita por todos os sistemas. A autenticação nesse
caso seria feita em um único local e uma única vez, processo conhecido como single sign
on.
54
Depois desses pontos, outros três tipos de funções compõem o gerenciamento:
4.8. Privacidade
55
• 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.
• 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.
4.9. Autoproteção
Existem três pontos que podem ser destacados nas funções de segurança do
sistema:
56
A implementação de um dos itens acima sem os demais representa um alto risco e
pode comprometer a segurança como um todo. É importante cuidar dos três aspectos.
57
• Controle de acesso a dados de segurança – a integridade,
disponibilidade e confidencialidade devem ser controladas e
garantidas pelo sistema.
• Autoteste – todo sistema de segurança precisa ter sua integridade
verificada no início de execução.
• Proteção física – o hardware sob o qual o sistema opera, precisa ter
um nível mínimo de segurança para evitar comprometimento do
sistema.
• Teste da camada subjacente – deve-se verificar se a plataforma ou o
sistema operacional é seguro e não foi comprometido.
• Falha segura – erros no próprio sistema ou na camada subjacentes
devem ter seus efeitos atenuados pelo sistema.
O controle de sessões envolve desde questões como notificar o usuário sobre quais
foram seus últimos acessos, geralmente informando quando e de qual local, até o
cancelamento automático de sessões quando um mesmo usuário estiver simultaneamente
conectado em equipamentos distintos. As notificações a respeito dos últimos acessos
podem englobar informações dos acessos não só bem-sucedidos como também dos
malsucedidos, para que o usuário saiba se houve tentativa de acesso através de sua
identificação. As sessões também podem ser restringidas a determinados horários e dias,
como o horário comercial. Se uma sessão ficar parada – sem uso – durante muito tempo,
regras como o seu cancelamento automático podem ser estabelecidas [WHEELER 2003].
O acesso ao sistema envolve uma série de aspectos que podem ser usados para
ajudar na estratégia de segurança:
60
• Os dados de segurança são isolados dos dados do usuário
• Os canais devem ser iniciados de forma específica, seja pelo
sistema, seja pelo usuário
• O canal provê não-repúdio de origem e recebimento, garantindo para
cada uma das partes que a outra é quem afirma ser”
61
V - ARQUITETURA DE SOFTWARE SEGURO
5.1. Introdução
62
comportamentais nos subsistemas progressivamente maiores e o estilo arquitetural que
guia essa organização – esses elementos e suas interfaces, colaborações e composições”.
63
têm surgido. Mendes [MENDES 2002] aponta alguns possíveis benefícios em que a
arquitetura pode:
64
A necessidade de escrever códigos capazes de resistir a perspicácia de atacantes é
sobremaneira importante devido a pouca importância que o tema desperta mesmo em
organizações que supunham-se fortemente interessadas. Howard [HOWARD 2002] alerta
que o verdadeiro problema de muitas empresas desenvolvedoras de software é que
segurança não é vista como uma função geradora de receita no processo de
desenvolvimento. Por isso, ainda segundo Howard, a gerência não quer gastar dinheiro
treinando desenvolvedores para escrever códigos seguros, mas gasta com tecnológias de
segurança, porém geralmente após sofre algum tipo de ataque.
66
• Tratar as entradas de dados – Todo dado informado, seja pelo usuário ou
outro sistema, deve ser tratado adequadamente, mesmo que se acredite que
todas as funções são intrinsecamente seguras. Um cuidado a se ter é com
relação a caracteres especiais. Identificar caracter malicioso permite,
principalmente, evitar que perpetre-se ataques como, por exemplo, SQL
Injection [TORRES 2003]. Esse ataque explora características da linguagem
SQL que permite o uso de caracteres com funções especiais, como comentário.
Um exemplo seria:
67
armazenamento de chaves criptográficas deve ser alvo de análise criteriosa, assim
como os algoritmos empregados.
6. Operar com o privilégio necessário – As aplicações deveriam rodar com o
privelégio requerido para desempenhar suas tarefas. Qualquer falha séria, como
estouro de buffer, comprometeriam menos se a aplicação operasse com poucos
privilégios [HOWARD 2002].
Uma das considerações preliminares sobre padrões é que embora possa parecer que
se resolva problemas completamente diferentes a todo momento, a maioria dos problemas
que enfrentamos são gerados pelas ferramentas que usamos e não pelo problema externo
que temos [CHRISTOPHER 1970]. Por isso, não se pode esperar encontrar problemas
comuns com soluções comuns, mesmo com a enorme diversidade de contextos externos de
solução de problemas.
9
Refatoração (Refactoring) é o processo de alteração de um sistema de software de modo que
seu comportamento externo não mude.
68
na manutenção, maior produtividade, rapidez no desenvolvimento, reduzir a quantidade de
código e facilitar a detecção de erros.
• Código Duplicado
• Método Longo
• Classes Grandes
• Lista de Parâmetros Longa
• Alteração Divergente
• Cirurgia com Rifle
• Inveja dos Dados
• Grupos de Dados
• Obsessão Primitiva
• Comandos Switch / Case
• Hierarquias Paralelas de Herança
• Classe Ociosa
• Generalidade Especulativa
• Campo Temporário
• Cadeia de Mensagens
• Intermediário
• Intimidade Inadequada
• Classes Alternativas com Interfaces diferentes
• Biblioteca de classe incompleta
• Classe de Dados
• Herança Recusada
• Comentários
69
Os padrões de desenvolvimento, como fora comentado anteriormente, não se
restringem a etapa de criação (codificação inicial). Os padrões servem também à etapa de
manutenção e testes. Por exemplo, sempre que houver adição de novas funcionalidades que
altere trechos de código, revisão de código e correção de bugs os padrões poderão ser
aplicados.
Stott et al. [STOTT 2004] argumenta que a maioria dos processos parte do
princípio que o design pode ser feito no início e o software criado ao longo do
desenvolvimento. Um padrão similar a de linha de produção, que prioriza a uniformidade e
simplifica as variações. A dificuldade em projetar o sistema todo no início deve-se a
prematuridade do conhecimento, ainda ser muito cedo para entender toda a complexidade
do projeto.
Antes de se pensar em testes, algumas perguntas básicas devem ser feitas [BECK
2002]:
71
Com o tempo, a atividade de testar passou a fazer parte de um processo
independente do processo de desenvolvimento de software, embora continuassem
integradas. A criação de um processo independente de teste demandou algumas
necessidades de metodologias, métricas e de melhorias, que já existiam no processo
original, mas que precisavam ser adaptadas para o novo [RIOS 2002].
Testes de Verificação
Processo de avaliação de documentos e informações coletadas em cada fase do
processo de desenvolvimento do software.
• Verificação de Requisitos: Garantir a qualidade das informações geradas
durante o processo de levantamento, análise e especificação de requisitos.
• Verificação da Modelagem Funcional: Avaliar se todos os requisitos
identificados foram incorporados na modelagem funcional.
• Verificação da Modelagem Interna: Avaliar se os diagramas da modelagem
interna traduzem todos os aspectos da modelagem funcional, assim como,
analisar a estrutura dos dados.
• Verificação de Código: Garantir que os códigos fonte obedecem as normas
e padrões determinados pela organização.
Testes de Validação
Processo de avaliação de um sistema ou seus componentes, visando garantir a
qualidade do produto final.
• Validação de Unidade: Garantir que as diversas unidades do software estão
contempladas na totalidade de linhas de código.
• Validação de Integração: Garantir que os diversos componentes do software
não apresentem erros quando integrados.
72
• Validação de Funcionalidade: Garantir que não existam diferenças entre os
requisitos funcionais e o comportamento do software.
• Validação de Sistemas: Detectar erros de natureza não funcional,
certificando-se que o comportamento está de acordo com os requisitos
especificados. Seu propósito é testar os requisitos tecnológicos, entre eles:
o Carga e Stress – determinar o limite máximo de carga e stress que o
software poderá suportar;
o Configuração – identificar e testar as configurações de software e
hardware;
o Segurança – identificar formas de quebra de segurança do software;
o Desempenho (performance) – determinar se o desempenho em
situações normais e de pico estão em conformidade aos requisitos de
desempenho especificados;
o Confiabilidade e disponibilidade – determinar as medidas de
confiabilidade e disponibilidade do software;
o Recuperação – avaliar o comportamento do software após a
ocorrência de um erro ou outras condições anormais;
• Validação de Usabilidade: Garantir que os requisitos de usabilidade (acesso,
navegação, clareza de informações e terminologia adequada) estejam sendo
cumpridos e conforme às especificações.
• Validação de Aceite: Permitir ao cliente executar testes, validando as
categorias de testes aplicadas anteriormente (funcionalidade, usabilidade e
sistemas), reduzindo os riscos na implantação em produção.
73
Alguns modelos de avaliação da maturidade do processo de testes foram criados
nos últimos anos. Alguns, como o TPI (Test Process Improvement), são mais usados na
Europa e outros como, o TMM (Teste Maturity Model) e TCMM (Test Capability Maturity
Model), são mais populares nos Estados Unidos. Existem esforços no sentido de integrar
os modelos de maturidade de teste, como o TMM, com os modelos de maturidade da
capacitação para software como o CMMI [RIOS 2002].
74
VI - GESTÃO DO DESENVOLVIMENTO DE SOFTWARE
SEGURO
6.1. Introdução
Não se pode controlar o que não se pode medir [DEMARCO 1989]. O que é
medido é conseguido [KAPLAN 2004]. Segundo DeMarco [DEMARCO 1989], a métrica
é um número que vincula a uma idéia. Mais precisamente, é uma indicação dimensível de
algum aspecto quantitativo do sistema. As métricas recomendadas para um software
comum são: escopo, tamanho, custo, risco e tempo empregado. Segurança, como seria de
se esperar, talvez pela novidade do tema, não é citada. Ainda que fosse, as dúvidas sobre as
técnicas usadas e as novas propostas são relativamente obscuras em engenharia de
software.
75
vulneráveis com os que projetam –, permitir que a engenharia de software possa aprender
com a experiência de outras áreas.
Os ataques registrados nos últimos anos mostraram que certos recursos dos
sistemas têm mais tendência de serem oportunidades de ataque que outros. Por exemplo,
serviços executados com privilégio de root estão mais sujeitos de virarem alvos de ataques
que serviços operando sem altos privilégios. Arquivos com controle total (rwxrwxrwx no
Unix) são mais prováveis de serem atacados que arquivos com privilégios mais restritos. A
nova métrica proposta considera que nem todos os recursos do sistema devem ser tratados
de forma igual. A identificação dos recursos do sistema que são oportunidades de ataque é
feita por um conjunto de propriedades associadas com os recursos e categorizadas em
classes de ataque. Tais propriedades referem-se à oportunidade de ataque – ou
"atacabilidade" (attackability) – de um tipo de recurso, isto é, alguns tipos de recursos são
mais vulneráveis a ataques que outros.
O método dessa nova métrica é mais eficaz para comparar sistemas similares do
que dois sistemas completamente diferentes, pois sistemas diferentes podem ter conjuntos
de classes de ataque distintos.
77
Michael Howard foi o primeiro a aplicar informalmente a superfície de ataque
como métrica de segurança para o sistema operacional Windows [HOWARD 2003b].
Howard, Pincus e Wing definiram uma lista de vinte classes de ataque para o sistema
operacional e as compararam em sete versões do mesmo sistema operacional [HOWARD
2003a]. Inspirados pelo Quociente da Superfície Relativa de Ataque (RASQ, em inglês) de
Howard [HOWARD 2003b], Pratyusa Manadhata e Jeannette M. Wing empregaram a
métrica na medição das classes de segurança do sistema operacional Linux e comparam
com as classes do Windows [MANADHATA 2004].
78
identificar os pontos de entrada do sistema. A análise permitirá identificar
se há a necessidade de aumentar o nível de autorização nesses pontos.
• Cuidado com protocolos – aplicar a regra 80/20 a todos os protocolos.
• Reduzir a superfície de ataque preventivamente – descrever na fase de
projeto como será a superfície de ataque, preferencialmente registrando em
um documento. Alguns itens a serem considerados são: protocolos de rede,
pontos (endpoints) que devem suportar autenticação ou autorização (atenção
redobrada nos endpoints anônimos), desligar recursos por default,
componentes reutilizáveis usados, identidades de processos de todos os
códigos executados e contas de usuários instaladas. Dessa forma, os
desenvolvedores conhecerão desde o início como será a superfície de
ataque.
• Medir a superfície de ataque – determine a superfície de ataque mínima no
início e meça-a ao longo do desenvolvimento.
• Grande superfície de ataque resulta em grande trabalho de segurança – se
uma grande superfície de ataque for inevitável, o código deveria ser de boa
qualidade, conservador e defensivo.
Segundo Howard [HOWARD 2004], todo código tem uma probabilidade diferente
de zero de conter uma ou mais vulnerabilidades. Algumas delas resultarão em
comprometimento do usuário. Logo, não se deve perder o controle dos usuários, pois são
eles que precisarão aplicar todas as atualizações de segurança. Se houver uma falha no
código, o usuário precisará corrigir as máquinas que usam o recurso defeituoso.
Os boletins deveriam ser numerados e titulados de maneira que seu conteúdo seja
facilmente compreendido. Datar e controlar versão a versão são itens importantes, pois é
possível que o conserto de uma vulnerabilidade possa levar a criação de outra ou atrapalhar
o funcionamento de algum recurso diferente do objeto de reparo [HOWARD 2003a].
É importante que também exista um resumo que indique quem deve ler o
documento, o impacto da vulnerabilidade, a classificação máxima de gravidade, a
recomendação aos usuários, se é substituição da alguma atualização de segurança,
advertências, lista de softwares afetados, lista softwares não afetados (de acordo com a
política de suporte a versões da organização).
81
A parte central do boletim de divulgação deveria conter uma sinopse, perguntas
freqüentes relacionadas à atualização, detalhes da vulnerabilidade e informações adicionais
sobre a atualização divulgada.
Um CSIRT pode ser um grupo formal ou um grupo ad hoc. Um grupo formal tem
no trabalho de resposta a incidentes a sua principal função. Um grupo ad hoc é reunido
quando há um incidente de segurança em andamento ou para responder a um quando
necessário.
82
De acordo com Pricola [PRICOLA 2005], O primeiro grupo de resposta a
incidentes de segurança foi criado em 1988, após o incidente que ficou conhecido como
"The Morris Worm Incident". O worm, criado e disseminado da rede do MIT por Robert
Morris, um estudante de 23 anos e filho de um diretor de segurança da agência americana
NSA (National Security Agency), foi responsável por uma das paradas de maior impacto
na Internet até então, atingindo mais de nove mil computadores da rede.
83
6.4. Comportamento seguro
A segurança é tão forte quanto for o sistema mais fraco [SCHNEIER 2000].
Geralmente o elo mais fraco envolve interação do sistema com humanos. Se o problema é
com a escolha de boas senhas, interfaces difíceis de serem usadas, rotinas de instalação
complicadas, procedimentos para gerenciamento de patches confusos ou ataque de
engenharia social, o elo humano estará sempre presente [WING 2003a].
A engenharia social é uma técnica que não requer “prática nem tão pouco
habilidade”, basta ter poder de convencimento e um pouco de psicologia comportamental.
Quando bem executada é bastante eficiente e normalmente não deixa rastros que permitam
a identificação do autor [RUFINO 2002].
10
Iniciantes que não criam suas próprias ferramentas de exploração, mas usam scripts de
terceiros para os ataques. [HONEYNET 2002]
84
trabalho; no meio estão os usuários com conhecimento de computação que não têm, ou não
deveriam ter, tempo ou interesse para lidar com as configurações; no nível mais baixo
estão os administradores que tem a tarefa de instalar sempre as mais recentes correções de
segurança sem poderem adivinhar as conseqüências decorrentes dessa instalação. “É
preciso possibilitar que seres humanos normais usem sistemas facilmente, mas de maneira
segura” [WING 2003a].
86
VII - CONCLUSÃO
7.1. Introdução
Este trabalho apresentou meios para o desenvolvimento de software seguro após ter
sido realizada uma revisão da literatura nas áreas de engenharia de software e segurança da
informação. Os meios consistem-se na adequação dos processos de melhoria da qualidade
aos requisitos de segurança, à criação de projetos arquiteturais genuinamente seguros e
aculturação organizacional de práticas de gerência voltadas à segurança.
87
• Especificar técnicas determinantes para a criação de projeto arquitetural
seguro;
• Mostrar particularidades que aperfeiçoam questões de segurança na
condução do desenvolvimento de software.
88
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:
89
VIII - REFERÊNCIAS
ASTELS, D.; MILLER, G.; NOVAK, M. Extreme Programming – Guia Prático, Editora
Campus, 2002.
BEATTIE, S.; ARNOLD, S.; COWAN, C.; WAGLE, P.; WRIGHT, C.; SHOSTACK, A.
Timing the Application of Security Patches for Optimal Uptime, LISA XVI,
Novembro, 2002.
90
BROCKLEHURST, S.; LITTLEWOOD, B.; OLOVSSON, T.; JOHSSON, E. On
Measurement of Operational Security, Proceedings of the 9th Annual Conference
on Computer Assurance, 1994.
CHOU, A.; YANG, J.; CHELF, B.; HALLEN, S.; ENGLER, D. An Empirical Study of
Operation Systems Errors, ACM Symposium on Operating Systems Principles,
Outubro, 2001.
DACIER, M.; DESWARTE, Y. Privilege Guide: An Extention to the Typed Access Matrix
Model, Proceedings of the Third European Symposium on Research in Computer
Security, 1994.
DEAN, D.; FELTEN, E. W.; WALLACH, DS. Java Security: From HotJava to Netscape
and Beyond, IEEE Symp. Security and Privacy, IEEE Press, 1996.
FARINES, J.; FRAGA, J. S.; OLIVEIRA, R. S. Sistemas de tempo real, São Paulo: Escola
de Computação, jul., 2000.
GAMMA, E.; HELM, R.; JOHNSON, R.; VLISSIDES, J. Design Patterns: Elements of
Reusable Object Oriented Software, Addison-Wesley, 1995.
GARDNER, M. Mathematical Games: A New Kind of Cipher that Would Take Millions of
Years to Break, Scientific American 237, Agosto, 1977.
GRAY, J. A Census of Tandem System Availaby Between 1985 and 1990, IEEE
Transactions on Software Engineering, Vol. 39, No. 4, Outubro, 1990.
HOWARD, M.; PINCUS, J.; WING, J. M. Measuring Relative Attack Surface, Proceeding
of Workshop on Advanced Developments in Software and System Security, 2003.
HOWARD, M. Fending Off Future Attacks by Reducing Attack Surface, Secure Windows
Initiative, Fevereiro, 2003.
HOWARD, M. Mitigate Security Risks by Minimizing the Code You Expose to Untrusted
Users, MSDN Magazine, Novembro, 2004.
93
ISO JTC 1/SC 27 Commitee ISO/IEC 15408-1:1999 Information Technology - Security
Techniques - Evaluation Criteria for IT Security - Part 2: Security Functional
Requirements, ISO Online Catalogue, 1999.
ISO JTC 1 ISO/IEC 17799 Code of Practice for Information Security Management, ISO
Online Catalogue, 1999.
LEE, I.; IYER, R. Faults, Symptoms, and Software Fault Tolerance in the Tandem
GUARDIAN Operationg System, Proceeding of the International Symposium on
Faut Tolerant Computing, 1993.
MYERS, G. The Art of Software Testing, John Wiley & Sons, 1979.
NERY, F.; PARANHOS, M. Cobit ou ISO 17799? Iniciando a Reflexão, Módulo Security
Magazine Portal, Módulo Security, http://www.modulo.com.br, 2005. Último
acesso em 10/04/2005.
PALLEN, L.; DOURISH, P. Unpacking Privacy for a Networked World, Proc. Conf.
Human Factors in Computing Systems, ACM Press, 2003.
95
PRESSMAN, R. Software engineering: a practitioner´s approach, 3ª ed., Mc-Graw Hill,
1992
RFC 2142 – CROCKER, D. Mailbox Names For Common Services, Roles And Functions,
Request For Comments, Maio, 1997.
RFC 2828 – SHIREY, R. Internet Security Glossary, FYI 36, Request For Comments,
Maio, 2000.
RFC 3227 – BREZINSKI, D. Guidelines for Evidence Collection and Archiving, BCP 55,
Request For Comments, Fevereiro, 2002.
ROSS, R.; SWANSON, M.; STONEBURNER, G.; KATZKE, S.; JOHNSON, A. Guide
for the Security Certification and Accreditation of Federal Information Systems,
NIST, Maio, 2004.
SCHNEIER, B. Secrets and Lies: Digital Security in a Networked World, John Wiley &
Sons, 2000.
SCHNEIER, B. Crypto-gram - March 15, 2005, Counterpane Internet Security Inc., 2005.
STOTT, W.; NEWKIRK, J. Improve the Design and Flexibility of Your Project with
Extreme Programming Techniques, MSDN Magazine, Vol. 4, No. 4, 2004.
SULLIVAN, M.; CHILLARGE, R. Software Defects and Their Impact on System 118
Availability, Proceeding of the International Symposium on Faut Tolerant
Computing, June, 1991.
VIEGA, J.; MESSIER, M. Secure Programming Cookbook for C and C++, O'Reilly, 2003.
VOAS, J.; GHOSH, A.; MCGRAW, G.; CHARRON, F.; MILLER, K. Defining an
Adaptive Software Security Metric from a Dynamic Software Failure Tolerance
Measure, Proceedings of the 11th Annual Conference on Computer Assurance,
1996.
WHITTEN, A.; TYGAR, D. Why Johnny Can’t Encrypt, Proceeding of 8th Usenix Security
Symposium, 1999.
WING, J. M. Beyond the Horizon: A Call to Action, IEEE Security and Privacy.
Novembro/Dezembro 2003.
98