faculdade do litoral sul paulista - fals leonardo almeida dos santos

Transcrição

faculdade do litoral sul paulista - fals leonardo almeida dos santos
FACULDADE DO LITORAL SUL PAULISTA - FALS
LEONARDO ALMEIDA DOS SANTOS
TRABALHO DE CONCLUSÃO DE CURSO
TÉCNICAS DE PROGRAMAÇÃO SEGURA
PRAIA GRANDE
2010
2
LEONARDO ALMEIDA DOS SANTOS
TRABALHO DE CONCLUSÃO DE CURSO
TÉCNICAS DE PROGRAMAÇÃO SEGURA
Trabalho apresentado como exigência de conclusão de curso
Objetivo atender meu conhecimento sobre o assunto e ou
até mesmo proporcionar dentro de uma empresa formas
segura dentro do ciclo de informações onde serão aplicadas
algumas técnicas de programação segura. Faculdade Litoral
Sul Paulista, sobre orientação do educador Caio Sales.
PRAIA GRANDE
2010
3
LEONARDO ALMEIDA DOS SANTOS
TRABALHO DE CONCLUSÃO DE CURSO
TÉCNICAS DE PROGRAMAÇÃO SEGURA
Trabalho apresentado como exigência de conclusão de curso
Objetivo atender meu conhecimento sobre o assunto e ou
até mesmo proporcionar dentro de uma empresa formas
segura dentro do ciclo de informações onde serão aplicadas
algumas técnicas de programação segura. Faculdade Litoral
Sul Paulista, sobre orientação do educador Caio Sales.
AVALIAÇÃO:________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
NOTA: ____(________)
_____________,de_________________de_.
local
data
4
DEDICATÓRIA
Dedico este trabalho primeiramente a Deus, pois sem Ele, nada seria possível e não
estaríamos aqui reunidos, desfrutando, juntos, destes momentos que nos são tão
importantes.
Aos meus pais Gilson e Marli; pelo esforço, dedicação e compreensão, em todos os
momentos desta e de outras caminhadas.
Em especial, à minha grande companheira, esposa Edivania Vasconcelos por me
focar nos estudos me apoiando nos momentos difíceis agradeço por tudo e pelo
mútuo aprendizado de vida, durante nossa convivência, no campo no aprendizado
nos estudos e na vida particular.
Amor , gratidão eterna!!!
Leonardo A.Santos
5
AGRADECIMENTO
À Edivania, Marli, Gilson , por todo o apoio e carinho recebido durante minha vida e
ao extra destes últimos quatros anos. A todos os meus irmãos, Luiz, Carlos, pela
alegria e inspiração que despertam. À minha grande família, pela confiança que
sempre depositou em mim.
Às minhas inseparáveis companheiras Fábio, Alessandro pelas longas
conversas, idéias e desabafos, que ajudaram a me tornar uma pessoa melhor.
Guardarei estas lembranças pelo resto da vida, por mais longe que estivermos.
Ao professor Caio Sales, que abriram as portas do mundo da informação e me e
aceitou me orientar neste trabalho.
A Faculdade Fals , a todos os professores que fizeram parte da minha
formação e aos pacientes com os quais aprendi de alguma forma, por contribuírem
para o melhor entendimento.
Grato á todos.
6
RESUMO
A programação defensiva é algumas vezes referida como programação segura pelos
cientistas de computação os quais localizam este enfoque minimizando bugs.
Os erros de software (bugs) podem ser potencialmente usados por um cracker para
uma injeção de códigos e ataques indesejáveis.
Uma diferença entre programação defensiva e práticas normais é que poucas
hipóteses são feitas pelo programador, o qual tenta manejar todos os possíveis
estados de erro. Em resumem, o programador nunca assume que um telefonema a
uma função particular ou livraria trabalhará baixo as entradas previstas.
A segurança da Informação e o mundo globalizado e informatizado,fez com que a
visão que tinham sobre segurança da informação teve que se adequar as novas
tecnologias e antigamente a segurança de sistemas de informação era sinônimo
exclusivamente de proteção, assumindo sempre uma posição puramente defensiva
e o em dia número de vulnerabilidades encontradas em softwares é um problema
em expansão. Esta expansão é decorrente tanto do aumento no número de
sistemas no mercado.
O uso de técnicas e ferramentas para a proteção dos dados de qualquer ameaça
que venha a ocorrer, pois devemos proteger os ativos contra qualquer ameaça de
todos os tipos.
A programação defensiva é um enfoque que procura melhorar o software e o código
fonte, em termos de:
Qualidade Geral - reduzindo o número de falhas de software e problemas.
Fazendo o código fonte comprensilvel - o código fonte deve ser legivel e
entendido, a prova de uma auditoría de código.
7
ABSTRACT
Defensive programming is Sometimes Referred to the secure computer programming
by
Scientists
who
located
this
approach
Minimizes
bugs.
Software errors (bugs) can Potentially Be used by an attacker to a code injection
attacks
and
undesirable.
One Difference Between normal practice and defensive programming Is That few
Assumptions are made by the programmer, Which Attempts to handle all Possible
error states. In sum, the programmer who never takes a phone call to a particular
function
or
bookstore
Will
work
down
the
entries.
The security of information and computerized and globalized world, led to the view
That information security HAD HAD to Adapt to new technology and once the
security of information systems was synonymous only protection, always assuming
the Purely defensive position and in number of day vulnerabilities found in software is
an expanding problem. This expansion is due to BOTH Increased the number of
systems
on
the
market.
The use of techniques and tools for Protecting data from any threat That May Occur
because
we
must
protect
the
assets
from
any
threat
of
all
kinds.
Defensive programming is an approach That Seeks to Improve the software and
source
code,
in
terms
of:
• Overall Quality - by reducing the number of software flaws and problems.
• Making comprensilvel source - the source code should be readable and
understood, evidence of a code audit.
8
SUMÁRIO
INTRODUÇÃO.......................................................................................................09
1. TÉCNICAS PARA SEGURANÇA DA INFORMAÇÃO......................................12
1 1.1 FIREWALL.....................................................................................................13
1.2 IDS....................................................................................................................14
2. VULNERABILIDADE DE PROGRAMAÇÃO.....................................................18
2.1 - EXPLORANDO VULNERABILIDADES..........................................................18
2.2 - ARQUITETURA DE SISTEMAS.....................................................................19
2.3 - GERENCIAMENTO DE MEMÓRIA................................................................20
2.4 - PROCESSAMENTO DE ENTRADAS.............................................................20
2.5 - BUFFER OVERFLOW....................................................................................21
2.5.1 -STACK OVERFLOW....................................................................................21
2.5.2 - HEAP OVERFLOW......................................................................................25
3. A VULNERABILIDADE NA WEB.......................................................................26
3.1 WEB APPLICATION FIREWALL.......................................................................27
3.2 - IMPLEMENTAÇÕES DE UM WAF.................................................................27
3.3 - TÉCNICAS DE DETECÇÃO DE ATAQUES DE UM WAF.............................28
3.4 - TÉCNICAS DE NORMALIZAÇÃO..................................................................28
3.5 - MODELO DE SEGURANÇA NEGATIVO.......................................................27
3.6 - MODELO DE SEGURANÇA POSITIVO........................................................29
3. 7 - ATAQUES A APLICAÇÕES WEB.................................................................29
3.8 - VULNERABILIDADE DOS SERVIÇOS WEB.................................................30
3.8.1 - TIPOS DE VULNERABILIDADES...............................................................31
3.9 - VERIFICAÇÃO DOS DADOS DE ENTRADA................................................31
3.10 - IMPACTO DOS ATAQUES WEB.................................................................32
3.11 - INTRODUÇÃO ÀS URL...............................................................................32
3.11.1 - MANIPULAÇÃO DE URL..........................................................................33
3.12 - TENTATIVAS ÀS CEGAS............................................................................34
3.13 - CRUZAMENTO DE DIRECTÓRIOS............................................................35
3.13.1 – DESFILES................................................................................................36
3.13.2 - ATAQUES POR FALSIFICAÇÃO DE DADOS..........................................37
3.13.3 - PARÂMETROS DAS APLICAÇÕES WEB................................................37
CONCLUSÃO.........................................................................................................38
REFERÊNCIAS BIBLIOGRÁFICAS......................................................................39
9
INTRODUÇÃO
A segurança da Informação é um dos temas mais discutidos em nossa
sociedade, o mundo globalizado e informatizado, especialmente para o mundo
corporativo. O uso da informática tem sido freqüente em todos os setores produtivos
e até mesmo de lazer. Deste modo faz-se necessário criar uma infra-estrutura de
comunicação que suporte todas as transações executadas e que sejam
armazenadas e utilizadas de modo seguro.
Porém, o valor da informação em muitos casos não é passiveis de
mensurar devido a crescente quantidade de dados que uma organização possui, por
conta disso, se torna imprescindível identificar todos os elementos que compõem a
comunicação de dados.
Existem normas e metodologias de desenvolvimento de software que
permitem produzir programas visando diminuir a ocorrência de vulnerabilidades.
Algumas são práticas gerais, independentes de linguagem, enquanto outras são
específicas a uma dada linguagem.
Há bem pouco tempo, segurança de sistemas de informação era sinônimo
exclusivamente de proteção, assumindo sempre uma posição puramente defensiva.
O número de pessoas tentando violar a segurança de sistemas, passando
dias e noites em busca de vulnerabilidades nos sistemas com intuito de desenvolver
ferramentas que permitam o acesso ao sistema alvo, é muito grande.
Além disso, se para cada organização existem alguns
poucos
profissionais dedicados a estudar e manter os sistemas seguros, por outro lado,
existem inúmeras pessoas tentando encontrar uma maneira de penetrar e
comprometer os mesmos.
Atualmente, o número de vulnerabilidades encontradas em softwares é
um problema em expansão. Esta expansão é decorrente tanto do aumento no
número de sistemas no mercado, da forma como estes softwares são concebidos e
da maneira como são mantidos, configurados e utilizados.
A má codificação do software é a causa imediata das vulnerabilidades do
mesmo. Muitas empresas desenvolvem sistemas com códigos inseguros mesmo
sem intenção. Existe um grande número de razões para isto.
10
Na maior parte das vezes, empresas que desenvolvem software são
contratadas para especificar, projetar, desenvolver, testar e documentar em um
tempo pré-determinado. Esta pressão induz, muitas vezes, a erros graves, como, por
exemplo, a não preocupação com a escolha de funções seguras para exercer
determinadas tarefas, ou a utilização incorreta das interfaces de programação que a
linguagem utilizada disponibiliza.
Além do que, muitas das vezes a segurança não faz parte do projeto. Um
outro aspecto que deve ser levado em consideração é a má formação dos
desenvolvedores de sistemas.
São poucas as universidades que ensinam seus alunos a programarem
de maneira correta, aplicando técnicas de programação segura. E são em menor
número ainda as que fornecem a disciplina de programação segura em suas grades
curriculares.
Algumas ferramentas de auxilio a auditoria de códigos estão disponíveis
hoje e servem como apoio aos analistas de sistemas. Entender como estas
ferramentas funcionam, o que podem induzir e o que de fato são capazes é muito
importante para qualquer profissional ligado direta ou indiretamente com segurança
e programação de sistemas.
A Política de Segurança é a formalização de todos os aspectos considerados
relevantes por uma organização para proteção, controle e monitoramento de seus
recursos computacionais. Também deve ser vista como um canal de comunicação
entre usuários e o comitê Corporativo de Segurança da Informação. A
documentação gerada precisa explicar a importância da segurança para motivar as
pessoas envolvidas a praticá-la.
A divulgação da política de segurança é uma das ferramentas responsáveis
pelo sucesso da sua implantação. Seu objetivo é disseminar a política de segurança
da informação na empresa, conscientizando os colaboradores e prestadores de
serviço para a política de segurança que está sendo implantada.
A
política
de
segurança
não
define
procedimentos
específicos
de
manipulação e proteção da informação, mas atribui direitos e responsabilidades às
pessoas (usuários, administradores de redes e sistemas, funcionários, gerentes,
etc.) que lidam com essa informação. Desta forma, elas sabem quais as
expectativas que podem ter e quais são as suas atribuições em relação à segurança
dos recursos computacionais com os quais trabalham.
11
Além disso, a política de segurança também estipula as penalidades às quais
estão sujeitos àqueles que a descumprem.
Antes que a política de segurança seja escrita, é necessário definir a
informação a ser protegida. Usualmente, isso é feito através de uma análise de
riscos, que identifica:

Recursos protegidos pela política;

Ameaças às quais estes recursos estão sujeitos;

Vulnerabilidades
que
podem
viabilizar
a
concretização
ameaças, analisando-as individualmente.
Uma política de segurança deve cobrir os seguintes aspectos:

Política de senhas;

Direitos e responsabilidades dos usuários;

Direitos e responsabilidades do provedor dos recursos;

Ações previstas em caso de violação da política.
destas
12
1. TÉCNICAS PARA SEGURANÇA DA INFORMAÇÃO:
CONCEITO E FUNÇÃO
Diante deste contexto torna-se imperativo o uso de técnicas e ferramentas
para a proteção dos dados de qualquer ameaça que venha a ocorrer, pois devemos
proteger os ativos contra qualquer ameaça de todos os tipos. Porém os princípios
básicos da segurança da informação são: confidencial idade; integridade e
disponibilidade.

Confidencialidade – as informações são conhecidas somente pelas
pessoas que possuem as permissões de acesso, prevenindo deste
modo, o vazamento de informações e evitando a espionagem
industrial;

Integridade – normalmente as informações precisam ser mantidas em
seu estado original, sem nenhuma alteração, garantindo a quem as
recebe a certeza de que não são ou foram falsificadas, corrompidas ou
modificadas;

Disponibilidade – garantir a todos os dados no momento que for
necessário para utilização.
Entretanto, os ativos estão continuamente expostos às ameaças
existentes, que podem colocar em risco a confidencial idade, integridade e
disponibilidade.
Dentro desse contexto, a confidencialidade oferece suporte à prevenção
de revelação não autorizada de informações, além de manter dados e recursos
ocultos a usuários sem privilégio de acesso. Já a integridade previne a modificação
não autorizada de informações.
Por outro lado, a disponibilidade prover suporte a um acesso confiável e
prontamente disponível a informações. Isto implica em dados e sistemas
prontamente disponíveis e confiáveis. Adicionalmente, o não repúdio e autenticidade
compreendem o que poderia ser denominado de responsabilidade final e, dessa
13
forma, busca-se fazer a verificação da identidade e autenticidade de uma pessoa ou
agente externo de um sistema a fim de assegurar a integridade de origem.
Neste sentido a ferramenta para segurança da informação tem como
definição o conjunto de software, hardware e técnicas que possuem o escopo
principal em prevenir e combater os ataques, segundo Cheswick (2005, p. 134-334),
normalmente são encontradas para diversas plataformas de sistemas operacionais
como Microsoft Windows, Linux, normalmente muitas dessas técnicas são
empregadas em conjunto para que possam suprir as necessidades de segurança de
seus usuários.
A seguir serão alocads as técnicas de segurança que podem ser utilizadas e
implantadas nas empresas ou para usuários, são elas:
1.1 FIREWALL
a) Firewall é um tipo de software que pode ser dividido em várias
categorias, mas que tem sempre a mesma finalidade como o de não
permitir a entrada de pacotes IP, impedindo as possíveis ameaças, os
tipos disponíveis são:

Filtro de pacotes faz uso de regras estáticas para filtrar pacotes
que tem origem em servidores externos, é muito comum e
considerado simples de ser configurado (CHESWICK, 2005, p.
175-226), um exemplo de filtro de pacote é o Iptables, originário
do Linux;

Proxy é um tipo de firewall que tem a finalidade de filtrar os
pacotes que são gerados na rede interna da empresa (LAN)
impedindo a conexão com servidores externos que podem ser
prejudiciais ao sistema de informação, normalmente estão nas
redes de compartilhamento de arquivos que contém diversas
ameaças denominadas como trojans, worms e vírus, estas
ameaças geralmente utilizam nomes e extensões de arquivos
como MP3, JPEG entre outros, podemos exemplificar essa
14
ocorrência com o conhecido Squid, que é um pacote que vem
na maioria das distribuições Linux;

Firewall pessoal é um software que intercepta as conexões de
entrada e saída em um computador, está baseado em regras
padrões ou definidas pelo usuário e decide quais conexões
podem ser aceitas e quais devem serem recusadas, um
exemplo é o sygate e o zone alarm como softwares pessoais;

Firewall reativo possui funções que permitem reconhecer
ataques e emitir alarmes quando encontrar seqüências de
pacotes IP chamadas de assinaturas e bloqueia o acesso
indevido automaticamente.
1.2 IDS
Outra técnica utilizada para a segurança da informação é o sistema de
detecção de intrusos – IDS, que são software cuja finalidade é de funcionar em
conjunto com um sistema de firewall a fim de dar maior segurança na comunicação
envolvendo tráfego IP (ROESCH, 2006, p. 131), tendo como exemplo o snort e o
airsnort, sendo este para redes wirelles.
Estes sistemas (IDS) permite a verificação do conteúdo de um pacote por
intermédio de um sistema de assinaturas, após a verificação, o sistema pode emitir
um alerta caso as assinaturas dos IDS não sejam compatíveis com o conteúdo do
pacote que chega, permitindo desta forma, aprimorar as configurações do firewall.
Os sistemas de IDS, igualmente os firewall possuem diversos tipos de configuração,
os mais conhecidos são: host-based detection (HIDS) e network-based intrusion
detection (NIDS).

Host-Based Intrusion Detection – HIDS, faz o monitoramento de um
sistema com base nos eventos registrados nos arquivos de log, os
eventos mais freqüentes monitorados são a utilização do
processados do computador, a modificação de privilégios em
15
arquivos e usuários além de processos do sistema operacional e
software que estão em execução;

Network-Based Intrusion Detection (NIDS), monitora o trafego por
intermédio da captura dos pacotes IP e da análise dos seus
cabeçalhos e conteúdo.
As possibilidades de aplicação de um IDS são as mais variadas, podendo
serem exploradas outras configurações, em função das necessidades de cada
empresa.
Outra técnica utilizada para a segurança da informação é a criptografia
que cifra uma informação, tornando-a incompreensível, exceto para os destinatários
e o transmissor, que sabem como decifra-la (KUROSE, 2003, p. 610).
A criptografia se faz necessária normalmente para uso em operações
bancárias e em compras on-line, operações estas que vem crescendo cada vez mais
nos dias de hoje.
Segundo Fitzgerald (2005), existe dois tipos diferentes de criptografia, a
simétrica e a assimétrica.
A criptografia simétrica é um algoritmo que utiliza a mesma chave para
criptografar e descriptografar uma mensagem.
Um algoritmo bastante difundido de criptografia simétrica é o DES – Data
Encryption Standard, de 56 bits desenvolvido pela International Bussiness Machines
– IBM e mantido pelo Nacional Institute of Standars and Tecnology – NIST. Outro
algoritmo também conhecido é o RC4, que possui uma chave de 256 bits
desenvolvido pela RSA Data Security.
Já a criptografia assimétrica também denominada como criptografia de
chave pública e possui um conjunto de duas chaves, uma que serve para
criptografar a mensagem e outra para descriptografá-la (KUROSE, 2003, p. 623).
Essa criptografia, o responsável por criptografar não transmite a chave para a
descriptografia e, deste modo, se a mensagem for capturada na transmissão, a
mesma não poderá ser entendida.
Um dos algoritmos assimétrico mais conhecido é o RSA que é mantido
pelo Massachusetts Institute of Technology – MIT, esta técnica forma a base para o
16
Public Key Infrastructure – PKI, que permite a utilização de chaves de até 1024 bits,
segundo Fitzgerald (2005, p. 263).
Segundo Stallings (1999), outra técnica bastante utilizada é Hash que é
uma função matemática aplicada em algoritmos que fazem uso de mensagens de
texto para criação de um código conhecido como menssage digest ou resumo de
mensagens.
Aplicação em um arquivo a função hash representa a execução de um
algoritmo de cálculo sobre o arquivo para geração de um número como resultado,
toda alteração pode produzir mudança do resultado calculado, possibilitando saber
se o arquivo foi alterado, este método pode ser aplicado para se ter a ciência se um
arquivo foi contaminado por um vírus ou se está corrompido.
As funções mais conhecidas deste sistema são: MD4 que permite valor
hash de 128 bits – RFC-1320; MD5 sendo um aprimoramento do MD4, utilizado pelo
pretty Good Privacy – PGP, RFC -1321; SHA-1, permite valor hash de 160 bits.
Estas funções hash são empregadas nos mecanismo de assinaturas
digitais, que podem ser definidas como um código utilizado para verificar a
integridade de uma informação ou mensagem. Neste caso a assinatura digitai pode
ser utilizada para a verificação de uma mensagem, ou seja, se o remetente de uma
mensagem é realmente quem diz ser, sendo feito por meio de criptosistemas
assimétricos, segundo relata Fitzgerald (2005, p. 250). Normalmente os algoritmos
mais conhecidos para este processo são o RSA e o DSS (TANENBAUM, 2003).
Entretanto
uma
das
técnicas
fundamentais
com
propriedades
criptográficas da segurança da informação é a autenticação que está relacionada a
proteção contra modificação acidental ou não de uma mensagem; atraso ou re-envio
de mensagens e; repúdio da autoria de uma mensagem. A autenticação pode ser
dividida em três grandes grupos: autenticação baseada no eu o usuário sabe;
autenticação com base no que o usuário possui e autenticação com base nas
características do usuário.

Autenticação baseada no que o usuário sabe – método baseado
em algum conhecimento do usuário, como as senhas, sendo
consideradas as chaves criptográficas nesta categoria, no entanto,
todas as técnicas relacionadas ao que o usuário sabe, são
passíveis de ataques originados por monitoramento de software
17
espiões como o CAIN, que vasculham o conteúdo das informações
recebidas e transmitidas pelo usuário, senha podem serem
descobertas caso o usuário não tome os devidos cuidados;

Autenticação com base no que o usuário possui – neste grupo
podemos incluir itens como crachás e cartões magnéticos, este
método é muito usual, mas está sujeito a ação do homem para a
sua execução;

Autenticação com base nas características do usuário – pode-se
incluir neste grupo as digitais do usuário, controle por íris, retina,
voz, padrões de escrita entre outros, este grupo encontram-se uma
variedades de dispositivos para implantar a segurança dentro das
empresas, que em alguns casos estão se tornando muito comum,
como a identificação por voz ou digitais.
Entretanto para este tipo de sistema as empresas devem escolher as
opções que mais de adaptem as necessidades das mesmas e que se amoldem as
necessidades estratégicas e financeiras, já que o mercado esta sempre em
evolução.
Considerando
o
cenário
apresentado
acima,
encontramos
uma
necessidade em proporcionar um suporte a segurança da informação às múltiplas
organizações e comunidades que muitas vezes têm interesses sobrepostos. Em tal
situação, o controle de acesso às informações é condição essencial nos sistemas
atuais.
Vale observar que, atualmente, a grande maioria das informações
disponíveis nas organizações encontra-se armazenadas e são trocadas entre os
mais variados sistemas automatizados. Neste sentido, inúmeras vezes decisões e
ações tomadas são procedentes das informações manipuladas por esses sistemas.
Dentro deste contexto, toda e qualquer informação deve ser fidedigna,
precisa e estar disponível, a fim de ser armazenada, recuperada, manipulada ou
processada, além de poder ser trocada de forma segura e confiável. É adequado
destacar que, nos dias atuais, a informação constitui uma mercadoria, ou até mesmo
uma commodity, de extrema importância para as organizações dos diversos
18
segmentos. Por esta razão, segurança da informação tem sido uma questão de
elevada prioridade nas organizações.
2. VULNERABILIDADE DE PROGRAMAÇÃO
Em concordância com Staa (2006), pode-se dizer que uma falta em um
programa é um defeito concentrado que, quando exercitado, tem o potencial de
gerar um erro.
Erros são caracterizados pelo acontecimento de uma ação, cálculo ou
resultado incorreto produzido pelo programa, e podem ser classificados segundo a
causa da incorretude, por exemplo: erros de produção são causados ao designar ou
alterar elementos de um sistema; erros de processamento ocorrem quando há um
estado ou resultado indesejado; erros de uso são gerados a partir da operação do
software e podem ser esperados ou excepcionais.
Os erros esperados são aqueles conjeturados na codificação; por exemplo,
alguns erros humanos, erros de transmissão de dados, esgotamento de memória,
dentre outros. Os erros excepcionais são aqueles que violam as assertivas
implementadas.
Um erro, quando observado por um observador de erros, se torna uma falha;
em outras palavras, falhos são erros compreendidos por mecanismos capazes de
compreender a ocorrência de um comportamento deficiente do programa sejam
estes observadores pessoas ou quaisquer instrumentos de verificação. Aqui dizemos
que existem uma falta de segurança quando é possível obter informações ou
permissões privilegiadas do sistema, ou simplesmente torná-lo indisponível, por
meio da exploração do defeito.
De forma mais genérica, pode-se dizer que uma vulnerabilidade é qualquer
aspecto da informação, ou sistema, que permita a violação da sua segurança. As
vulnerabilidades de software são, na maioria das vezes, ou faltas de segurança, ou
problemas intrínsecos à sua arquitetura.
O que caracteriza um software seguro de acordo com os conceitos de
fidedignidade (STAA, 2006).
19
2.1 - EXPLORANDO VULNERABILIDADES
A melhor forma de entender a criticidade dos erros de programação é ver na
prática como são explorados.
2.2 - ARQUITETURA DE SISTEMAS
A compilação do código fonte explana sua linguagem para opcodes, e
armazena em disco no formato do binário ELF (Executable and Linkable Format).
Para ser executado o código é lido do binário (disco) para a memória
principal. Em seguida, o processador transporta e executa seqüencialmente os
opcodes. Na arquitetura x86 64-bits, o conteúdo dos segmentos é passado para o
processador por meio do ponteiro (registrador) de instrução %rip. Este registrador é
extraordinariamente importante porque, como referência a próxima instrução a ser
executada, pode ser usado para violar a segurança do sistema desde que possamos
apontá-lo para uma área de memória arbitrária.
Cabe, deste modo, encontrar uma forma de transgredir a segurança.
Imaginemos que um servidor de e-mails tem uma vulnerabilidade que permita
sobrescrever seu frame pointer (%eip). Ao enviarmos no corpo da mensagem uma
seqüencia de opcodes que, quando executada, é capaz de abrir um shell em uma
porta TCP, pode-se ter acesso total ao sistema com os direitos de acesso do
processo explorado.
Assumindo que a máquina é vulnerável, basta marcar o %rip para o início da
seqüência no corpo da mensagem. O sistema operacional, inicialmente, não pode
compreender que este segmento da memória não deve ser executado; e com isso
sua segurança é fatalmente corrompida.
O conhecimento da arquitetura do computador atacado é, quase sempre,
muito útil para quem quer desenvolver o exploit.
20
2.3 - GERENCIAMENTO DE MEMÓRIA
No início da primeira década as principais vulnerabilidades encontradas em
softwares empreendiam erros de gerenciamento de memória (os buffer overflows).
Os overflows são estouros de espaços reservados para alocar informação.
Alguma detonação ocorre por causa do tamanho do segmento e podem alcançar
áreas críticas do processo que podem ser utilizadas para execução de código
arbitrário.
Outros tipos de overflows ultrapassam os limites de representação numérica,
e podem permitir que a segurança seja comprometida, ainda que em casos bastante
especiais.
Geralmente estes problemas ocorrem em códigos que não têm a
preocupação com o tamanho do buffer na escrita dos dados. Por exemplo, se um
vetor guarda espaço para doze bytes e vinte bytes são copiados sobre ele, existe
um estouro de oito bytes escritos em um espaço (teoricamente) não permitido. Este
espaço pode ser usado em algum momento para manipular o registrador de
instrução.
Quando não há a averiguação do tamanho do buffer destino, dizemos que
não há bound checking. Esse espaço alcançado pelo estouro pode, eventualmente,
ser o return address de uma chamada de função; ou um ponteiro para função, etc.
As próximas seções discutem técnicas de exploração de buffer overflows em mais
detalhes.
2.4 - PROCESSAMENTO DE ENTRADAS
Outro tipo de erro muito cometido por programadores é deixar lacunas para acessos
indevidos ao processar entradas. Um exemplo muito comum encontrado em
centenas de aplicações hoje em dia são os sql injections.
O que significa SQL injeção, consideramos que o campo Telefone de um
formulário web insira os dados digitados pelo usuário através da variável “$PHONE”,
no comando de SQL “select * from table1 where phone=$PHONE”. Se o usuário, de
forma maliciosa, digita “2233-2222”; select passwd from table2 where user=Guest”
no campo, e os sistemas são vulneráveis, ele consegue também o resultado da
segunda query. Na prática este tipo de falta quase sempre consente o acesso
21
irrestrito ao banco de dados. Muitas outras vulnerabilidades decorrem do mal
processamento de inputs.
2.5 - BUFFER OVERFLOW
O buffer overflow, ou buffer overrun, incide quando um processo tenta
armazenar dados além dos limites permitidos. O resultado é que essa informação
extra sobrescreve áreas adjacentes de memória. A área sobrescrita pode
compreender buffers ou variáveis que influenciem no fluxo do código.
2.5.1 -STACK OVERFLOW
Pode-se dizer que há um stack overflow quando qualquer espaço do
segmento pilha é sobrescrito. Em algumas situações é possível tirar serventia de um
stack overflow para executar códigos arbitrários no sistema. Por exemplo, no
programa abaixo a variável buff recebe o primeiro argumento passado pela linha de
comando.
void foobar (char * s ) {
char buf [ 2 5 6 ] ;
strcpy (buf , s) ;
}
int main (int argc , char **argv) {
foobar ( argv [ 1 ] ) ;
return 0 ;
}
O espaço reservado para variável é de 256 bytes. O que acontece quando
passamos um argumento muito maior? A função strcpy (dst; src) lê o conteúdo do
src até encontrar um zero (final de string) copiando o conteúdo para dst. No entanto
não é garantido que o destino possa comportar todos os bytes de src.
Top = 0xFF
22
argv[1]
retaddr
%rbp
buf[255]
...
buf[0]
Bottom = 0x00
Conforme o código acima demonstra o estado da stack no momento antes da
chamada de strcpy( ). A cópia dos dados é feita escrevendo o primeiro byte de src
(s) na primeira posição de dst (buf), sucessivamente até o que strcpy encontre um
caractere null em src. A descrição da cópia já sugere que ocorre overflow quando o
tamanho da origem dos dados é maior que o destino.
Quando a função foobar( ) for chamada, a instrução call insere na pilha o
endereço de retorno (retaddr ). Ao término da função a instrução ret restaura o valor
do retaddr para o registrador %rip (ou %eip na arquitetura IA-32), que indica qual a
próxima instrução a ser executada.
Podem-se sobrescrever o valor do retaddr é possível conseguir o controle do
fluxo das instruções. Um argumento de tamanho 272 bytes (+padding) seria grande
o suficiente para sobrescrever o retaddr com seus últimos oito bytes. Bastando então
apontá-lo para um buffer que contenha as instruções que desejamos executar _ eg.,
os shellcodes.
Koziol et al. (2004) mostra como fazer shellcodes para este fim. Para
simplificar, a função lostfunc faz o papel do código arbitrário. Nosso objetivo é
executá-la através da manipulação do return address. O código abaixo é o arquivo
1i:c completo. Veja que a função lostfunc não é referenciada em nenhum momento e
não deve ser executada exceto se o fluxo do programa for desviado.
i.c
#include <s t d i o . h>
#include <s t r i n g . h>
#include <s t d l i b . h>
23
void foobar ( char _ s ) {
char buf [ 2 5 6 ] ;
s t r cpy ( buf , s ) ;
}
int main ( int argc , char __ argv ) {
foobar ( argv [ 1 ] ) ;
11 return 0 ;
12 }
13
14 void l o s t f u n c ( ) {
15 p r i n t f ( " E x p l o i t e d . \ n" ) ;
16 e x i t ( 0 ) ;
17 }
O padding das variáveis locais não é fixo entre arquiteturas e compiladores,
por isso o primeiro passo é traduzir o código da função foobar() para assembly de
forma a saber como o gcc trata a alocação das variáveis.
i.s
foobar :
.LFB5 :
pushq %rbp
. LCFI0 :
movq %rsp , %rbp
. LCFI1 :
subq $272 , %r sp
. LCFI2 :
movq %rdi , �8(%rbp )
movq �8(%rbp ) , %r s i
l e aq �272(%rbp ) , %r d i
c a l l s t r cpy
leave
ret
24
O código acima foi gerado pelo GCC com a flag “ –S”, que o instrui a parar o
processo de geração do binário antes da etapa de compilação. Veja que 7 salva o
valor do registrador %rbp da main, e corresponde a alocação da variável buf de
foobar segundo a representação acima. Nos 64-bits seguintes à %rbp está o retaddr.
Se passamos um argumento de 288 bytes conseguimos atingir a área de memória
que será copiada sobre %rip na saída de foobar. Basta que o conteúdo da última
posição do input seja o endereço de lostfunc. A ferramenta objdump nos ajuda a
localizar lostfunc no binário 1i.
savio@halcyon:src% objdump -d 1i | grep lostfunc
000000000040053f <lostfunc>:
savio@halcyon:src%
Sabendo que o primeiro opcode de lostfunc está no endereço 0x40053f, basta
fazer com que os últimos oito bytes do input malicioso contenham este valor.
Como passar o endereço da função requer o input de caracteres nãoimprimíveis usamos o interpretador da linguagem Perl para fazê-lo. E por fim:
savio@halcyon:tmp% ./1i `perl -e 'print "A"x280,"\x3f\x05\x40","\x00"x5'`
Exploited.
Portanto, usamos um input grande o suficiente para cobrir todo o buffer
alocado para a variável buf e suas vizinhanças. Este input contém o endereço da
função lostfunc em uma posição específica para sobrescrever o return address de
foobar. Este por sua vez é copiado para o registrador %rip quando a função retorna,
i.e., quando a instrução ret é processada.
Como seria então a versão segura deste programa?
s.c
#include <s t d i o . h>
#include <s t r i n g . h>
#include <s t d l i b . h>
void foobar ( char _ s ) {
char buf [ 2 5 6 ] ;
s t rncpy ( buf , s , s izeof ( buf )�1);
buf [ s izeof ( buf )�1] = 0 ;
}
int main ( int argc , char __ argv ) {
25
foobar ( argv [ 1 ] ) ;
return 0 ;
}
A função strncpy(dst; src; n) é como a strcpy porém faz o bound checking
necessário para não permitir um overflow. A diferença é que no máximo n bytes de
src são copiados para dst, como especificado no terceiro argumento.
A linha 7 copia 255 bytes de s para buf guardando a última posição para o
delimitador de final de string (o caractere null ou zero) atribuído em 8. O resultado é
uma função um tanto mais confiável para o software. Por fim, a mesma tentativa de
sobrescrever o return address falha com a nova versão do programa.
savio@halcyon:src% ./1s `perl -e 'print "A"x288'`
savio@halcyon:src% echo $?
0
Existem patches para alguns sistemas operacionais que impedem ou
dificultam a execução dos dados da stack. Desta forma, mesmo que o registrador
%rip aponte para um shellcode na parte da memória referente à pilha, este não
poderá ser executado.
O kernel do sistema operacional Solaris 2.6, por exemplo, oferece a opção
protect_stack. O StackGuard, desenvolvido por Crispin Cowan, também se aplica ao
mesmo _m. O StackGhost é uma proteção baseada em características da
arquitetura SPARC, que dificulta a exploração de buffer overruns. Este último foi
otimizado e integrado ao OpenBSD. Outros tantos softwares foram desenvolvidos
para proteger a stack.
2.5.2 - HEAP OVERFLOW
O senso comum indica que qualquer memória dinamicamente alocada pela
aplica ção é chamada heap. Pela aplicação porque a requisição deste espaço é feita
pelo usuário (user land) ao kernel através de system calls. Uma das implementações
da função malloc() da GNU C Library, por exemplo, faz chamadas à brk() e mmap()
de acordo com o tamanho requisitado.
A seção do formato ELF que contém variáveis não inicializadas do programa
é chamada bss (Block Started by Symbol); o mesmo que o data segment para os
26
compiladores. Como estas variáveis são inicializadas em run-time é comum
utilizarmos os valores deste segmento na exploração dessas vulnerabilidades. Por
isso alguns autores muitas vezes usam o termo heap/bss-based overflow para se
referir a estas falhas.
Na maioria dos sistemas a heap cresce no sentido positivo (ao contrário da
stack).
Top = 0xFF
Bottom = 0x00
Stack
Heap
Stack+Heap
Existem muitas técnicas que exploram buffer overflows. Para cada técnica
teremos abordagens de exploração da heap completamente diferentes.
3. A VULNERABILIDADE NA WEB
A proteção de servidores de aplicações web, permitindo acesso às aplicações
unicamente por pessoas autorizadas, é uma necessidade global. A razão dessa
necessidade é o acréscimo considerável da demanda pelo desenvolvimento de
aplicações web, pois programadores, empresas e corporações têm observado que a
Internet é atualmente um dos meios mais importantes para o comércio e isso
ocasionou o desaparecimento das antigas fronteiras para realização de negócios.
Um dos maiores problemas que empresas que disponibilizam sistemas web
vêm
encarando
é
o
aumento
exponencial
dos
ataques
que
exploram
vulnerabilidades presentes em aplicações web.
Essas vulnerabilidades em questão são oriundas do processo de engenharia
de software, o qual não é conduzido, desde a fase de planejamento, considerando
aspectos relativos à segurança das aplicações para web, e colocam as aplicações e
conseqüentemente as empresas em risco, podendo levar ao vazamento de
informações privilegiadas, o que pode acarretar no comprometimento do modelo de
negócio (McGRAW, 2006).
Apesar das dificuldades no tratamento de falhas de aplicações, devido
aparecimento de novas vulnerabilidades e da diversificação das técnicas de ataques
27
a camada de aplicação (CERT.BR, 2009), algumas empresas têm empregado
possíveis soluções para esse problema como: a utilização de um processo de
software ágeis e confiáveis e baseados em testes de segurança e a utilização de
IDS (Intrusion Detection Systems) (BACE AND MELL, 2001). Entretanto, nenhuma
dessas medidas ataca o problema de forma eficaz ou pelo menos dá ao
desenvolvedor a garantia de proteção da sua aplicação.
As questões apresentada neste trabalho, é implementada pelo meio de um
firewall de aplicações que trabalha absolutamente na camada de aplicação, como
um agente detector de padrões de ataques que encaminha o tráfego suspeito para
honeypots, além de funcionar como ponto único de verificação através de um proxy
reverso e filtrar os possíveis pacotes que possam apresentar ameaças à aplicação,
criando uma camada de filtragem de forma segura e confiável.
3.1 WEB APPLICATION FIREWALL
Segundo WAFEC (2006), Web Application Firewall (WAF) é uma nova
tecnologia de segurança que tem a função de proteger aplicações web de ataques.
As soluções de um WAF são capazes de precaver ou até mesmo neutralizar um
ataque a uma aplicação, conseguindo filtrar de forma eficiente o que um IDS
(Intrusion Detection Systems) e firewalls de rede não conseguem. Isso se deve ao
fato de um WAF agir diretamente na camada de aplicação, filtrando os dados e
principalmente parâmetros utilizados em uma transação HTTP (JONES, BEJTLICH
AND ROSE, 2006).
3.2 - IMPLEMENTAÇÕES DE UM WAF
Os WAFs podem ser implementados de três formas distintas, cada uma
possuindo vantagens e desvantagens. Segundo WAFEC (2006), as formas de
implementação de um WAF são:

No nível da camada de rede.

Através de um proxy reverso.
28

Diretamente no servidor web.
3.3 - TÉCNICAS DE DETECÇÃO DE ATAQUES DE UM WAF
De acordo com WAFEC (2006), os firewalls de aplicações Web podem ser
configurados para detectar ataques de três diferentes formas:

Técnicas de normalização.

Modelo de segurança negativo.

Modelo de segurança positivo.
3.4 - TÉCNICAS DE NORMALIZAÇÃO
Um dos grandes problemas que os desenvolvedores de WAF perceberam,
são as inúmeras maneiras que atacantes fazem uso para burlar o filtro de regras e
assinaturas de ataques do firewall de aplicações (técnicas de evasão). As técnicas
de normalização consistem em reconstruir a assinatura do ataque interpretando as
tentativas de evasão que foram utilizadas para burlar o filtro do WAF.
3.5 - MODELO DE SEGURANÇA NEGATIVO
O modelo de segurança negativo é simples de ser configurado e tem por
alicerce permitir o tráfego de todos os pacotes de solicitação, filtrando simplesmente
aqueles que obedecem a alguma assinatura ou regra do WAF (black list). O sucesso
dessa implementação é determinado pela eficiência com que o firewall de aplicação
Web consegue detectar solicitações nocivas, de acordo com sua base de regras e
assinaturas.
O problema em implementar o modelo de segurança negativo, reside no risco
do banco de dados de regras filtrar um grande número de falso-positivos (quando a
regra filtra pacotes autênticos da aplicação) e por esse modelo ser mais suscetível a
técnicas de evasão.
A vantagem de se usar o modelo de segurança negativo é decorrente da
facilidade de configuração que o mesmo proporciona, pois serão criadas regras e
assinaturas de ataques que serão aplicadas a todas as requisições.
29
3.6 - MODELO DE SEGURANÇA POSITIVO
O modelo de segurança positivo é complexo analisando sua configuração e
implementação. Por padrão ele impede todo e qualquer tráfego e permite somente
os pacotes de solicitação que respeitem a algumas regras que garantem que a
solicitação é segura para a aplicação (white list). Essa forma de configuração é mais
segura e eficiente, pois necessita de menos regras de segurança para filtragem.
O problema em configurar um firewall de aplicação com esse modelo se deve
a enorme necessidade de conhecimento sobre a aplicação e, a partir desse
conhecimento, avaliar o que é nocivo ou não e assim, criar uma regra totalmente
personalizada para proteger a aplicação de ataques.
3. 7 - ATAQUES A APLICAÇÕES WEB
De acordo com Ceron et al. (2008), os ataques contra aplicações web
representam uma parcela estimável dos incidentes de segurança ocorridos nos
últimos anos. Isso vem ocorrendo pela falta da devida preocupação com requisitos
de segurança nessas aplicações. Esse é um dos fundamentais motivos que
explicam o fato da Internet ter se tornado um ambiente repleto de vulnerabilidades e
alvo de freqüentes ataques. O problema se agrava mais ainda com a utilização dos
mecanismos de busca como uma poderosa ferramenta para localizar sites e
sistemas vulneráveis.
Segundo o instituto de pesquisa OWASP (2007) as 10 (dez) vulnerabilidades
mais críticas em aplicações web em ordem são:

Cross Site Scripting (XSS);

Falhas de Injeção (SQL Injection, PHP Injection, etc);

Execução maliciosa de arquivos (RFI, LFI);

Referência Insegura Direta a Objetos;

Cross Site Request Forgery (CSRF);

Vazamento de Informações e Tratamento de Erros Inapropriado;

Autenticação falha e Gerenciamento de Sessão;

Armazenamento Criptográfico Inseguro;

Comunicações inseguras;

Falha de Restrição de Acesso à URL.
30
A maioria das vulnerabilidades citadas acima é ocasionada por erros na etapa
de desenvolvimento da aplicação, sendo raras delas ocasionadas por problemas de
má configuração de serviços em um servidor.
Atualmente uma das soluções adotadas para defesa contra esses ataques,
são a revisão de código e a adoção de metodologias e práticas de desenvolvimento
de código seguro como, por exemplo, a centralização da verificação dos dados de
entrada.
O problema dessa solução se encontra no alto custo de manutenção e
treinamento para capacitar a equipe em desenvolvimento de códigos seguros, além
da necessidade do gerenciamento constante da segurança da aplicação. A
ferramenta apresentada neste artigo poderá realizar uma grande variedade de testes
automatizados para detectar falhas na utilização de mecanismos de segurança e,
inclusive, vulnerabilidades presentes no código das aplicações.
3.8 - VULNERABILIDADE DOS SERVIÇOS WEB
Os primeiros ataques rede exploravam vulnerabilidades ligadas à aplicação dos
protocolos
da
sequência
TCP/IP.
Com
a
correcção
progressiva
dessas
vulnerabilidades, os ataques deslocaram-se para as camadas aplicativas e em
especial a web, na medida em que a maior parte das empresas abre o seu sistema
firewall para o tráfego destinado à web.
O protocolo HTTP (ou HTTPS) é o standard que permite veicular as páginas web
através de um mecanismo de pedidos e de respostas. Utilizado essencialmente para
transportar páginas web informativas (páginas web estáticas), o web tornou-se
rapidamente um apoio interactivo que permite fornecer serviços em linha. O termo “
aplicação web” designa, assim, qualquer aplicação cujo interface está acessível
através da web com a ajuda de um simples navegador. Transformado no apoio de
um certo número de tecnologias (SOAP, Javascript, XML RPC, etc.), o protocolo
HTTP possui doravante seguramente um papel estratégico na segurança dos
sistemas de informação.
31
Dado que os servidores web estão cada vez mais protegidos, os ataques
deslocaram-se progressivamente para a exploração das falhas das aplicações web.
Assim, a segurança dos serviços web deve ser um elemento a ter em conta desde a
sua concepção e o seu desenvolvimento.
3.8.1 - TIPOS DE VULNERABILIDADES
As vulnerabilidades das aplicações web podem catalogadas da seguinte forma :
Vulnerabilidades do servidor web. Este tipo de caso é cada vez mais raro
porque progressivamente os principais programadores de servidores web
reforçaram a sua segurança;
Manipulação dos URL, consistindo em alterar manualmente os parâmetros
dos URL a fim de alterar o comportamento esperado do servidor web;
Exploração das fraquezas dos identificadores de sessão e os mecanismos de
autenticação;
Injecção de código HTML e Cross-Site Scripting;
Injecção de comandos SQL.
3.9 - VERIFICAÇÃO DOS DADOS DE ENTRADA
O protocolo HTTP tem como rotina receber dados de entrada e saída . Os dados são
enviados nas seguintes situações: EX:URL, RUBRICAS HTTP e também através de
coockie.
O princípio básico a reter geralmente, quando de qualquer desenvolvimento
informático, é que não deve confiar nos dados enviados pelo cliente.
Assim, a quase totalidade das vulnerabilidades dos serviços web está ligada às
negligências dos criadores, que não fazem verificações sobre o formato dos dados
apreendidos pelos utilizadores.
32
3.10 - IMPACTO DOS ATAQUES WEB
Os ataques contra as aplicações web são sempre prejudiciais porque dão uma má
imagem da empresa. As consequências de um ataque bem sucedido podem
nomeadamente ser uma das seguintes:
Apagamento do web site;
Roubo de informações;
Modificação de dados, nomeadamente modificação de dados pessoais de
utilizadores;
Intrusão no servidor web.
3.11 - INTRODUÇÃO ÀS URL
A URL (Uniforme Recurso Localizador) de uma aplicação web é o vector que permite
indicar o recurso pedido. Tratam-se de caracteres ASCII que se podem imprimir e
que se decompõe em cinco partes:
O nome do protocolo: quer dizer, em certa medida, a linguagem utilizada
para comunicar na rede. O protocolo mais utilizado é o protocolo HTTP
(HyperText Transfer Protocol), o protocolo que permite trocar páginas Web no
formato HTML. Numerosos outros protocolos são contudo utilizáveis (FTP,
News, Mailto, etc.)
Identificador e palavra-passe: permite especificar os parâmetros de acesso
a um servidor protegido. Esta opção é desaconselhada porque a palavrapasse circula de forma clara no URL
O nome do servidor: Trata-se do nome de domínio do computador que aloja
o recurso pedido. Note que é possível utilizar o endereço IP do servidor.
O número de porta: trata-se de um número associado a um serviço que
permite ao servidor saber que tipo de recurso é pedido. A porta associada por
defeito ao protocolo é a porta número 80. Assim, quando o serviço Web do
33
servidor é associado ao número de porta 80, a especificação do número de
porta é facultativa.
O caminho de acesso ao recurso: Esta última parte permite ao servidor
conhecer o lugar onde está situado o recurso, quer dizer, geralmente o lugar
(directório) e o nome do ficheiro pedido.
A URL pode permitir a transmissão de parâmetros ao servidor, fazendo seguir o
nome de ficheiro por um ponto de interrogação, e depois dados em formato ASCII.
Uma URL é assim uma cadeia de caracteres com o seguinte formato:
http://pt.kioskea.net/forum/index.php3?cat=1&page=2</code>
3.11.1 - MANIPULAÇÃO DE URL
Manipulando certas partes de uma URL, um pirata pode levar um servidor web a
emitir páginas web às quais não é suposto ter acesso.
Com efeito, nos sites web dinâmicos os parâmetros são, na sua maioria, passados
através da URL como segue:
http://cible/forum/index.php3?cat=2</code>
Os dados presentes na URL são criados automaticamente pelo site e, aquando de
uma navegação normal, um utilizador apenas clica nas ligações propostas pelo site
web. Assim, se um utilizador alterar manualmente o parâmetro, pode tentar
diferentes valores, como por exemplo:
http://cible/forum/index.php3?cat=6</code>
Se o criador não antecipou esta eventualidade, o pirata pode, eventualmente, ter
acesso a um espaço normalmente protegido.
34
Além disso, o pirata pode levar o site a tratar um caso inesperado, como por
exemplo:
http://cible/forum/index.php3?cat=***********
No caso acima, se o criador do site não tiver previsto a possibilidade de o dado não
ser um número, o site pode entrar num estado não previsto e revelar informações
numa mensagem de erro.
3.12 - TENTATIVAS ÀS CEGAS
Um pirata pode eventualmente testar directórios e extensões de ficheiro às cegas,
para encontrar informações importantes. Eis alguns exemplos clássicos:
Procura de directórios que permitem administrar o site:
http://cible/admin/
http://cible/admin.cgi</code>
Procura de script que permita revelar informações sobre o sistema distante:
http://cible/phpinfo.php3</code>
Procura de cópias de salvaguardas. A extensão .bak é utilizada geralmente
e não é interpretada por defeito pelos servidores, o que pode conduzir à
afixação de um certificado:
http://cible/index.php3.bak</code>
Procura de ficheiros do sistema distante escondidos.
Sob os sistemas
UNIX, quando o directório raiz do site corresponde ao directório de um
utilizador, é possível que ficheiros criados pelo
através da web:
sistema sejam acessíveis
35
http://cible/.bash_history
http://cible/.htaccess</code>
3.13 - CRUZAMENTO DE DIRECTÓRIOS
Os ataques chamados “Cruzamento de directórios” (em inglês directory traversal ou
path traversal) consistem em alterar o caminho da arborescência na URL para forçar
o servidor a aceder a secções não autorizadas do site.
Num caso clássico, o utilizador pode ser levado a subir progressivamente na
arborescência, nomeadamente se o recurso não é acessível, por exemplo:
http://cible/base/test/ascii.php3
http://cible/base/test/
http://cible/base/</code>
Nos servidores vulneráveis, basta subir o caminho com várias cadeias do tipo« ../ » :
http://cible/../../../../repertoire/fichier</code>
Ataques mais evoluídos consistem em codificar certos caracteres:
ou sob a forma de codificação de URL:
http://cible/..%2F..%2F..%2Frepertoire/fichier</code>
ou com uma notação Unicode:
http://cible/..%u2216..%u2216repertoire/fichier</code>
36
Numerosos sites dinâmicos passam o nome das páginas a afixar em parâmetro
sob uma forma próxima da seguinte:
http://cible/cgi-bin/script.cgi?url=index.htm</code>
Por muito pouco que um controlo não seja realizado, é possível que um pirata altere
a URL manualmente a fim de pedir o acesso a um recurso do site ao qual não tem
acesso directamente, por exemplo:
http://cible/cgi-bin/script.cgi?url=script.cgi</code>
3.13.1 - DESFILES
Para proteger um servidor web contra os ataques por manipulação de URL, é
necessário efectuar uma vigilância sobre as vulnerabilidades e aplicar regularmente
as correcções fornecidas pelo editor do servidor web.
Além disso, uma configuração meticulosa do servidor web permite evitar que um
utilizador navegue em páginas às quais não é suposto ter acesso. Assim, o servidor
web deve ser configurado seguindo as instruções seguintes:
Impedir o percurso das páginas situadas debaixo da raiz do site web
(mecanismo de chroot);
Desactivar a afixação dos ficheiros presentes num directório não contendo
ficheiro de índices (“Directory Browsing”);
Suprimir os directórios e ficheiros inúteis (entre os quais os ficheiros
escondidos);
37
Assegurar-se que o servidor protege o acesso aos directórios que contêm
dados sensíveis;
Suprimir as opções de configuração supérfluas;
Assegurar-se que o servidor interpreta correctamente as páginas
dinâmicas, incluindo os ficheiros de salvaguarda (.bak);
Suprimir os intérpretes de scripts supérfluos;
Impedir a consulta em modo HTTP das páginas acessíveis em HTTPS
3.13.2 - ATAQUES POR FALSIFICAÇÃO DE DADOS
A maior parte dos ataques de aplicações web consiste em solicitar o site com dados
introduzidos manualmente a fim de provocar um contexto não previsto.
3.13.3 - PARÂMETROS DAS APLICAÇÕES WEB
O protocolo HTTP, apoio da comunicação na web, permite veicular parâmetros sob
formas de pedidos de várias maneiras:
Cookies ;
Campos de formulários;
URL ;
Rubricas HTTP.
É essencial compreender que todos os meios de transmissão de dados podem ser
manipulados sem problema por um utilizador e que, por conseguinte, os dados
utilizadores não devem ser considerados como fiáveis. Desta maneira, é
impossível basear a segurança em controlos realizado por parte do cliente (valores
propostos por um formulário HTML ou códigos Javascript que verificam a exactidão
dos dados).
Além disso, o estabelecimento de uma conexão SSL não protege em nada contra a
manipulação dos dados transmitidos, apenas certifica a confidencialidade do
transporte da informação entre o utilizador final e o site web.
Assim, qualquer projectista de aplicação web deve necessariamente efectuar um
controlo dos dados, tanto sobre o seu valor (mínimo e máximo para um dado
numérico, controlo dos caracteres), como sobre o seu tipo e o seu comprimento.
38
CONCLUSÃO
Foi abordado ao longo do texto que segurança da informação compreende um
conjunto de medidas que visam proteger e preservar informações e sistemas de
informações,
assegurando-lhes
integridade,
disponibilidade,
não
repúdio,
autenticidade e confidencialidade. Esses elementos constituem pilares da segurança
da informação e, portanto, são essenciais para assegurar a integridade e
confiabilidade em sistemas de informações. Nesse sentido, esses pilares,
juntamente com mecanismos de proteção têm por objetivo prover suporte a
restauração de sistemas informações, adicionando-lhes capacidades detecção,
reação e proteção.
Os
componentes
criptográficos
da
segurança
da
informação
tratam
da
confidencialidade, integridade, não repúdio e autenticidade. Vale, no entanto,
ressaltar que o uso dos pilares é feito em conformidade com as necessidades
específicas de cada organização. Assim, o uso desses pilares pode ser determinado
pela suscetibilidade das informações ou sistemas de informações, pelo nível de
ameaças ou por quaisquer outras decisões de gestão de riscos. Perceba que esses
pilares são essenciais no mundo atual, onde se tem ambientes de natureza pública e
privada conectados a nível global.
39
REFERÊNCIAS BIBLIOGRÁFICAS
CERT.BR Estatísticas dos Incidentes Reportados ao CERT.br. Disponível em:
http://www.cert.br/stats/incidentes/index.html, Acesso em ago. de 2010.
CHESWICK, W et al. Firewalls e segurança na internet. 2.ed. Porto Alegre:
Bookman, 2005.
FITZGERALD, J. Comunicação de dados empresarias e redes. Rio de Janeiro:
LTC, 2005.
JONES, K. J., BEJTLICH, R., ROSE, C. W. Real Digital Forensics – Computer
Security and Incident Response. São Paulo: Addison-Wesley, 2006.
KUROSE, J F; ROSS, K W. Redes de computadores e a internet. São Paulo:
Addison Wesley, 2003.
McGRAW, G. Software Security – Building Security In. São Paulo: Addison-Wesley,
2006.
STALLINGS, W. Cryptografhy and network security: principles and pratice.
3.ed. New York: Prentice-Hall, 2003.
TANENBAUM, A S. Redes de computadores. 4.ed. Rio de Janeiro: Campus, 2003.
OWASP (2007). The ten most critical web application security vulnerabilities. Open
Web
Application
Security
ProjectOWASP.
Disponível
em:
http://www.owasp.org/images/e/e8/OWASP_Top_10_2007.pdf. Acesso em ago. de
2010
WAFEC (2006). Web Application Firewall Evaluation Criteria. Web Application
Security
Consortium.
Disponível
em:
http://www.webappsec.org/projects/wafec/v1/wasc-wafec- v1.0.pdf. Acesso em ago.
de 2010.
pt.kioskea(2010)http://pt.kioskea.net/contents/attaques/falsification-donnees.php3.
Acesso em 10 nov. de 2010 ás 13:00 hs.
MENDES, Romeu - Administrador de Empresas, com especialização em Gestão
da Tecnologia da Informação. – Disponível em: www.administradores.com.br/artigos
DOBKOWSKI, Gustavo - Diretor de Suporte e Hardware da empresa Firewalls,
sendo conhecedor de Linux há dois anos e especialista em cabeamento estruturado,
sendo integrador oficial dos produtos 3M (VIP – Volition Integrator Professional).