Thiago Augusto Alves
Professor
Nome: Thiago Augusto Alves
Graduação: Bacharelado em Sistemas de
Informação pela Faculdade COTEMIG – 2004-2007
Pôs Graduação Lato Sensu:
Gerenciamento de Projetos de Software pela PUC Minas – 2009- Junho de 2010.
Professor
Atuação Profissional:
◦ Consultor Freelance de Analise de Sistemas
desde 2008;
◦ Consultor Freelance de Gerencia de Projetos
desde 2009;
Distribuição de Pontos
Primeiro Bimestre Segundo Bimestre Tipo Pontos Prova 7 Trabalhos + ATPS 3 Tipo Pontos Prova 7 Trabalhos + ATPS 3Prova
Matéria da Primeira Prova: Toda Disciplina
lecionada ate a realização da mesma;
Matéria da Segunda Prova: Toda Disciplina
do Semestre;
Matéria da Prova Substitutiva: Toda
Disciplina do Semestre; (Prova aberta de 20 Questões).
Contato
https://sites.google.com/site/thiagoaalves/ [email protected]
No assunto especificar seu nome e o nome da disciplina e a sala.
Disciplina
Bibliografia Básica Padrão
CAMPOS, André L.. Sistema de Segurança
da Informação : Controlando Os Riscos. 3ª ed. Florianópolis: Visual Books, 2014.
Bibliografia Básica Unidade: Faculdade
Anhanguera de Belo Horizonte (FAB)
FERREIRA, Fernando Nicolau; ARAUJO,
Marcio (orgs.). Política de Segurança da Informação. 1ª ed. Rio de Janeiro: Ciência Moderna, 2008. 2)
PAINE, Stephen; BURNETT, Steven.
Criptografia e segurança : o guia oficial RSA. 2ª ed. Rio de Janeiro: Campus - Elsevier,
2002. 3)
HOWARD, Michael. Escrevendo codigo
seguro : : estratégias e técnicas práticas para codificação segura de aplicativos em um
mundo em rede. 2ª ed. Porto Alegre: Bookman, 2005.
Bibliografia Complementar: Faculdade
Anhanguera de Belo Horizonte (FAB)
STALLINGS, William. Criptografia e segurança de
redes : princípios e práticas. 4ª ed. São Paulo: Pearson, 2010. 2)
TORRES, Dennes. Segurança Máxima de Software
: Como Desenvolver Soluções Seguras. 1ª ed. Rio de Janeiro: Brasport, 2003. 3)
CARUSO, Carlos A. A.. A Segurança em
Informática e de Informações. 2ª ed. São Paulo: Senac, 1999. 4)
TERADA, Routo. Segurança de dados : criptografia
em redes de computador. 2ª ed. São Paulo: Edgard Blücher, 2008. 5)
BURNETT, Steve; PAINE, Stephen. Criptografia e
Segurança : o guia oficial RSA. 1ª ed. São Paulo: Campus - Elsevier, 2002.
Bibliografia Complementar
Noticias a relacionados ao tema; Artigos relacionados ao tema;
Conteúdo Programático
Apresentação da disciplina. Segurança Atualmente.
Técnicas Seguras de Codificação: Estouro
de Buffer, Controle de Acesso Apropriado.
Técnicas Seguras de Codificação:
Privilégios de Execução: Executando com o Menor Privilégio.
Técnicas Seguras de Codificação:
Conteúdo Programático
Técnicas Seguras de Codificação: Protegendo
Dados Secretos.
Técnicas Seguras de Codificação: Entrada
Mal-intencionada, Entrada no Banco de Dados, Entrada Específicas da Web.
Técnicas Seguras de Codificação: Questões
de Internacionalização.
Técnicas de Codificação ainda mais Seguras:
Segurança de Soquete.
Técnicas de Codificação ainda mais Seguras:
Conteúdo Programático
Técnicas de Codificação ainda mais
Seguras: Proteção de Ataques de Negação de Serviço.
Teste de Segurança.
Instalação de Softwares Seguros. Escrevendo Documentação sobre
Segurança e Mensagens de Erro.
Datas Importantes – A definir
Data Tema
OBS. As datas estão com possíveis alterações de acordo com o calendário da faculdade.
ATPS
Grupos com de 2 a 4 pessoas;
Entregar os nomes dos integrantes do
grupo por e-mail;
◦ Cada grupo deve escolher um nome para o
Projeto, Ex: Projeto XYZ;
Livro Texto da Disciplina. PLT do Curso.
Reflexão
O que vocês entendem por Segurança? Por que ao se desenvolver Softwares e
importantes termos estes conceitos?
Se não pensarmos na segurança quais podem
Segurança
Segundo o Dicionário Aurélio podemos definir segurança como:
◦ 1 Ato ou efeito de segurar.
◦ 2 Qualidade do que é ou está seguro.
◦ 3 Conjunto das ações e dos recursos utilizados para proteger algo ou alguém.
◦ 4 O que serve para diminuir os riscos ou os perigos.
◦ 5 Aquilo que serve de base ou que dá estabilidade ou apoio.
◦ 6 Sentimento de força interior ou de crença em si mesmo.
◦ 7 Afoiteza, ousadia.
◦ 8 Força ou convicção nos movimentos ou nas ações.
◦ 9 Certeza demonstrada.
◦ 10 Caução.
◦ 11 Pessoa cuja atividade profissional consiste em proteger pessoas, instalações ou bens, ou em controlar o acesso de pessoas a determinado local.
◦ 12 segurança social: sistema público de proteção dos cidadãos, segundo a legislação produzidas, os direitos, os deveres e as contribuições efetuadas, notadamente em caso de doença, desemprego, reforma, etc.
Segurança Atualmente
Necessidade de sistemas seguros;
O processo desenvolvimento: segurança
preventiva;
Aplicativos na Internet
Em Janeiro /2009 a Internet tinha
aproximadamente 1 trilhão usuários (CIA Word Factbook)
Aplicativos
◦ Banco de dados: manipular, armazenar
e proteger dados confidenciais dos usuários e empresas;
◦ Dados de cartões de crédito;
◦ Infectados por vírus.
Invasão de privacidade
Tempo de inatividades e perda de dados
A Necessidade de uma Computação
Confiável
A necessidade das empresas e da maioria
das pessoas estarem conectadas a Internet hoje é uma realidade imprescindível.
Internet hoje é essencial, semelhante a energia
elétrica ou ao telefone.
Os sistemas precisam estar sempre disponíveis e
executar tarefas exatamente para o que foram adquiridos.
Os dados devem ser confiáveis.
Não pode ocorrer o travamento do computador. Não pode ocorrer um acesso não autorizado.
É necessário uma “infra-estrutura forte“ em que o
A Necessidade de uma
Computação Confiável
Belo Horizonte São Paulo Rio de Janeiro Paris Itália Ganhei! !!!A Necessidade de uma
Computação Confiável
Software de
Qualidade
Software Seguros Software Confiáveis Produto Seguro = Produto com QualidadeReflexão
O que e considerado um Software
Seguro?
O que e considerado um Software
A Necessidade de uma
Computação Confiável
As pessoas fogem de produtos que não
funcionam adequadamente Perda de clientes
Corrigir a segurança de um sistema após seu
desenvolvimento tem um alto custo ◦ Coordenação da correção
◦ Desenvolvedores que descobrem o código vulnerável
◦ Desenvolvedores que corrigem o código
◦ Testadores que testam o código
◦ Publicar a correção no site
◦ Escrever a documentação de suporte
◦ Tratar as relações públicas arruinadas
Microsoft Security Response Center
A Cultura da Segurança
nas Empresas
A cultura de segurança tem que
partir da alta administração.
E-mail de Jim Allchin, vice-presidente
do Grupo Windows na Microsoft:
◦ “Quero que os clientes esperem que o Windows XP seja o mais seguro sistema operacional disponível. Quero que as pessoas utilizem nossa plataforma sem se preocuparem com ataques mal-intencionados que dominem a conta do administrador...”
◦ “A segurança do Windows XP é responsabilidade de todo mundo. Essa segurança não está relacionada apenas
aos recursos de segurança – é sobre a qualidade do código de todos os recursos”.
A Vantagem do Invasor e a Luta do
Defensor
It. Invasor Defensor
1 Pode escolher o ponto mais fraco Deve defender todos os pontos O castelo medieval 2 Investigar vulnerabilidades desconhecidas Defender somente de ataques conhecidos Cavalo de Tróia
3 Pode atacar a qualquer momento
Deve estar constantemente vigilante
Monitoramento do sistema
4 Pode jogar sujo Deve jogar de acordo com as regras
Firewalls Logs de auditoria
Aprimoramento do Processo
Fase de Projeto Fase de
Desenvolvimento Fase de Testes Fase de Distribuição e manutenção Educação sobre segurança Revisão da equipe de segurança Questões sobre segurança nas entrevistas Campanha de segurança Modelagem das ameaças Diretrizes seguras de codificação Revisão externa Processo de resposta
Fase de Projeto
Quem é o público do aplicativo? Quais as necessidades de comunicação do produto? O que você esta tentando proteger? Quem vai gerenciar o aplicativo? Onde o aplicativo será executado? O usuário precisa ser protegido de suas próprias ações?Fase de Desenvolvimento
Diretrizes seguras codificação:
buffers, dados não
confiáveis, criptografia Revisão de segurança por outro analista Revisão externa da segurança Conscientização em segurança em toda equipe Acompanhamento de bugs de segurança
Fase de Testes
Verificar se o código e o projeto do sistema podem suportar um ataque Plano de Teste de Segurança
1. Decomponha o aplicativo em componentes fundamentais
2. Identifique as interfaces dos componentes
Soquetes TCP, dados sem fio, arquivos, área de transferência, slots de correio e outros
3. Classifique as interfaces por vulnerabilidade em potencial
4. Determine as estruturas de dados em cada interface
5. Localize os problemas de segurança com mutação de dados
Fase de Manutenção e Distribuição
Processo de Resposta
◦ Depois que o sistema foi
distribuído, falhas de segurança podem ser descobertas. É
necessário uma política e um
processo prontos para responder a essas questões à medida que
surgem.
◦ Não corrija apenas o bug
isoladamente, corrija todos os problemas relacionados ao bug.
Segurança por Projeto
Nomeie um líder para a segurança do projeto. Exija treinamento para toda a equipe.
Analise se o aplicativo esta de acordo com a Lista
de Verificação para Segurança do Projeto. Por exemplo:
◦ Se criar novas contas de usuário, elas tem privilégios baixos e senhas fortes?
◦ Falas de segurança registradas e, log para análise posterior
Corrija todos os bugs.
Simplifique o código e o seu modelo de segurança. Após o aplicativo pronto, instale servidores de
teste e convide uma equipe externa para tentar quebrá-lo.
Princípios de Segurança
Aprenda com os erros
Minimize sua área de ataque
◦ Número de páginas da WEB com conteúdo dinâmico
◦ Número de contas que você adiciona a um grupo administrador
◦ Número de arquivos e diretórios com listas fracas de controle de acesso
Utilize a defesa com profundidade, por exemplo o
Banco:
◦ Sempre existe um guarda na porta do banco
◦ Sempre existem guardas dentro do banco
◦ Várias câmeras em circuito fechado monitoram os movimentos das pessoas
◦ Os caixa não tem acesso aos cofres privilégio
◦ Acesso ao cofre:
Só abre em determinados horários
É fabricado com metal grosso
Múltiplos compartimentos para acesso dentro do cofre
Utilize o menor privilégio
Se descobrir um bug no código de segurança,
corrija-o e procure outros semelhantes e relacionados.
Assuma que sistemas externos são inseguros
arquivos de clientes, servidores externos e aplicativos
Planeje-se para falhas
◦ O que acontece se o site for desconfigurado?
◦ O que acontece se o aplicativo estiver comprometido?
Princípios de Segurança
Arquitetura interna do computador
Placa Mãe
UNIDADE CENTRAL DE PROCESSAMENTO (CPU – Microprocessador) Unidade de ControleUnidade Lógica e Aritmética
MEMÓRIA PRINCIPAL
RAM – Random Acess
Memory
ROM – Read Only
Memory
BARRAMENTO
UNIDADE DE ENTRADA E SAÍDA
Memória RAM
RAM (Random Acess Memory
Memória de acesso randômico, aleatório)
◦ Memória utilizada pelo processador para
guardar temporariamente os dados.
◦ É uma memória volátil, se desligarmos o
computador e não gravarmos em um dispositivo de armazenamento de dados, a informação será perdida.
Memória RAM
Sistema
Operacional Microsoft Word
Microsoft Excel
Buffer
Buffer
É uma região de memória temporária
(RAM), utilizada para escrita e leitura de dados.
Espaço alocado na memória RAM onde
os dados são armazenados
temporariamente até ser transferido para outra parte do sistema ou banco de
Estouro de Buffer
Buffer Overflow
Ocorre quando um processo tenta
armazenar dados além dos limites de um buffer de comprimento fixo. O
resultado é que os dados extras
sobrescrevem os locais da memória adjacente.
Os buffers são alocados com tamanhos fixos
de memória previamente determinados e a utilização deste espaço para armazenar uma quantidade de dados que ultrapasse este
Estouro de Buffer
Buffer Overflow
Os dados sobrescritos podem incluir outros
buffers, variáveis, dados de fluxo do programa.
Sobrescrever esses dados podem causar
problemas como:
◦ Comportamento errado do programa
◦ Exceções de acesso de memória
◦ Finalizações de programa
◦ Travamento do sistema e computador
◦ Resultados retornados incorretamente
Estouro de Buffer
Buffer Overflow
Sistemas em linguagem C e C++ são
propensos a estouros, pois não fornecem nenhuma proteção para parar o acesso ou a sobrescrição de dados em qualquer parte da memória e não verificam
automaticamente se os dados gravados em uma matriz de buffer interna estão dentro dos limites dessa matriz.
Estouro de Buffer
Buffer Overflow
Dados do NIST (National Institute of Standards and
Technology) - Agência federal de tecnologia dos EUA
que trabalha com a indústria para desenvolver e aplicar tecnologias, medidas e normas), mostram que no ano de 2004 uma grande porcentagem dos problemas de segurança encontradas em sistemas é devida a má codificação dos mesmos.
De janeiro até agosto de 2004, 52% dos erros eram
devidos aos erro de validação de entradas, que envolvem problemas de estouro de buffers.
Do total de vulnerabilidades encontradas, pelo menos
Estouro de Buffer
Buffer Overflow
Os estouros de buffer podem ser classificados de
duas formas de acordo com a forma em que foram criados:
◦ Alocados estaticamente (stack) utilizada para o armazenamento de variáveis locais e parâmetros passados por valor em funções.
A alocação é estática porque acontece antes que o programa comece a ser executado:
Estouro de Buffer
Buffer Overflow
• Alocadas dinamicamente (heap)
armazenadas variáveis alocadas dinamicamente e variáveis globais.
Em determinado circunstâncias, a quantidade de memória a alocar só se torna conhecida
durante a execução do programa. Para lidar
com essa situação é preciso recorrer à alocação
dinâmica de memória. A alocação dinâmica é
gerenciada pelas funções malloc (memory
allocation) e free, que estão na biblioteca stdlib.
Estouro de Buffer
Buffer Overflow
Estouro de Pilha Estouro de Heap
Erros de indexação de array Bugs de string de formatação Estouro de números inteiros
Estouro de Pilha
Ocorre quando um buffer declarado na
pilha é sobrescrito copiando-se um
Estouro de Pilha
#include <stdio.h> #include <stdio.h> #include <string.h> int main() { char palavra[10]; char destino[5];printf ("Digite uma palavra: "); gets (palavra);
strcpy(destino,palavra);
printf ("\n\nVoce digitou: %s",palavra);
printf ("\n\nDestino tem agora: %s",destino); printf ("\n\nA primeira letra: %c\n",palavra[0]); return(0);
Estouro de Pilha
#include <stdio.h> #include <stdio.h> #include <string.h> int main() { char palavra[10]; char destino[5];printf ("Digite uma palavra: "); gets (palavra);
strcpy(destino,palavra);
printf ("\n\nVoce digitou: %s",palavra);
printf ("\n\nDestino tem agora: %s",destino); printf ("\n\nA primeira letra: %c\n",palavra[0]); return(0);
Estouro de Heap (Memória
dinâmica)
Vamos imaginar a seguinte situação:
◦ Sistema em Java de Controle de Patrimônio
◦ Após um determinado tempo de utilização do sistema o banco de dados fica com um
grande número de dados;
◦ A emissão de relatórios do sistema não tem filtro de dados que diminua a quantidade de informações retornadas
Estouro de Heap (Memória dinâmica)
Quando o usuário emite o relatório sem a utilização de
um filtro de dados pode ocorrer um estouro no Heap, por causa da quantidade de dados retornados.
A mensagem de exceção que aparece é a seguinte:
OutOfMemoryException: Java heap space.
Para resolver o problema uma classe no Java
chamada JRFileVirtualizer cria arquivos swap em
disco rígido, evitando que todas as informações
sejam jogadas na memória e prevenindo que aconteça uma exceção do
Erros de Indexação de Array
Se um índice de array está fora dos limites,
ou seja, um índice que é menor que 0 ou maior que o comprimento do array, ocorre um
erro de indexação.
A exceção ArrayBoundsError é lançada se
detectado em tempo de execução.
O programa deve ser
desenvolvido verificando os limites do array, o programa ao lado está incorreto: { for (i = 0; ; i++) { array[i] = 5; } }
Erros de Indexação de Array
O programa correto deveria ser da forma
abaixo:
for (i = 0; i < array.length; i++) {
array[i] = 5; }
Bugs de string de formatação
O bug ocorre quando o desenvolvedor deseja
imprimir uma String que contém dados fornecidos pelo usuário.
Se for utilizado o comando printf (buffer), o
sistema interpreta o buffer como uma string de formatação e obedece a qualquer informação de formatação que essa contiver
Se for utilizado o comando printf(“%s”, buffer),
o sistema imprime a string na tela, exatamente como o desenvolvedor desejava
Para evitar ataques por essa falha, o programador
deve formatar a entrada do usuário antes de utiliza-la
Estouro de Nº Inteiros- Turbo C++
#include <stdio.h> int main() { int a, b; a = 32766; b = 1; printf("\n%d + %d é %d\n", a, b, a+b); return 0; }Este programa
funcionou !!!!!
Estouro de Nº Inteiros- Turbo C++
#include <stdio.h> int main() { int a, b; a = 32766; b = 2; printf("\n%d + %d é %d\n", a, b, a+b); return 0; }Este programa não
funcionou !!!!!
O tipo inteiro vai do valor
-32.768 até 32.767. O resultado foi truncado, ou seja, houve um
overflow no resultado Qual é o problema?
Estouro de Nº Inteiros – Visual
Studio C#
private void button1_Click(object sender, EventArgs e)
{ int a, b, c; a = 2147483646; b = 1; c = a + b; tbC.Text = c.ToString(); }
Este programa
funcionou !!!!!
E agora no Visual Studio C# o problema foi resolvido?
Estouro de Nº Inteiros – Visual
Studio C#
Prof: Virgil Almeida 61
private void button1_Click(object sender, EventArgs e)
{ int a, b, c; a = 2147483646; b = 10; c = a + b; tbC.Text = c.ToString(); }
O resultado foi truncado
novamente, houve um overflow no
resultado
Este programa
Referências
Barbato, Luiz Gustavo C.; Duarte, Luiz Otávio, Montes, antônio.
Artigo: Programação Segura: Um estudo de falhas e
ferramentas de auxílio. Instituto Nacional de Pesquisas Espaciais
– INPE, São José dos Campos, SP.
Catching Integer Overflows in C. Disponível em:
<http://www.fefe.de/intof.html>. Acesso em: 14/03/2011.
CWE - Common Weakness Enumeration. Disponível em:
<http://nvd.nist.gov/cwe.cfm> Acesso em: 14/03/2011.
Howard, Michael; LeBlanc, David. Escrevendo Código Seguro. 2.
Ed.
Porto Alegre: Bookman, 2005.
Improper Restriction of Operations within the Bounds of a
Memory Buffer. Disponível em:
<http://cwe.mitre.org/data/definitions/119.html>. Acesso em: 14/03/2011.
Turbo C++
Referências
Howard, Michael; LeBlanc, David.
Escrevendo Código Seguro. 2. Ed. Porto
Alegre: Bookman, 2005
Material Professor Kleber Netto Fonseca
2011
Material Professor Virgil Almeida