CENTRO UNIVERSITÁRIO VILA VELHA CURSO DE CIÊNCIA DA COMPUTAÇÃO Maycon Maia Vitali Halysson Freitas Alves da Silva Sistema Inteligente de Detecção de Intrusão VILA VELHA Maycon Maia Vitali Halysson Freitas Alves da Silva Sistema Inteligente de Detecção de Intrusão Trabalho de Conclusão de Curso apresentado ao Centro Univertário Vila Velha como requisito parcial para a obtenção do grau de Bacharel em Ciência da Computação. Orientador: Erlon Pinheiro VILA VELHA Maycon Maia Vitali Halysson Freitas Alves da Silva Sistema Inteligente de Detecção de Intrusão BANCA EXAMINADORA Prof. Msc. Erlon Pinheiro Centro Universitário Vila Velha Orientador Prof. Msc. Otacílio Pereira Centro Universitário Vila Velha Banca Examinadora Prof. Msc. Leonardo Muniz de Lima Centro Universitário Vila Velha Banca Examinadora Trabalho de Conclusão de Curso aprovado em 14/10/2008. A Deus e a nossas familias ... AGRADECIMENTOS Agradecemos a nosso orientador Erlon por ter nos guiados durante nossa jornada para a conclusão deste trabalho. “Adoraria mudar o mundo, mas não me deram o código-fonte...” Autor Desconhecido LISTA DE FIGURAS 1 Arquitetura de um HIDS . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2 Arquitetura de uma rede com NIDS . . . . . . . . . . . . . . . . . . . . . 17 3 Exemplo de código vulnerável a XSS . . . . . . . . . . . . . . . . . . . . 22 4 Exemplo de código vulnerável . . . . . . . . . . . . . . . . . . . . . . . . 23 5 Exemplo de código maléfico utilizado em ataques . . . . . . . . . . . . 23 6 Exemplo de código vulnerável a ataques de SQL Injection . . . . . . . . 24 7 Ataque de SQL Injection (formulário) . . . . . . . . . . . . . . . . . . . . 24 8 Ataque de SQL Injection (url) . . . . . . . . . . . . . . . . . . . . . . . . 25 9 Método HTTP-GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 10 Método HTTP-POST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 11 Exemplos de tipos de técnicas de evasão . . . . . . . . . . . . . . . . . 26 12 Função Booleana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 13 Gráfico Booleano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 14 Função Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 15 Representação gráfica de um conjunto fuzzy . . . . . . . . . . . . . . . 31 16 Diagrama de Hassi-Euler do conjunto fuzzy B no universo real [-5,5] . . 31 17 Funções de Pertinência . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 18 Gráfico representativo das funções de pertinência . . . . . . . . . . . . 32 19 Função de pertinência da negação . . . . . . . . . . . . . . . . . . . . . 32 20 Representação da função de pertinência de negação de S . . . . . . . 32 21 Função de pertinência da união . . . . . . . . . . . . . . . . . . . . . . . 33 22 Representação da função de pertinência de união ente L e T . . . . . . 33 23 Função de pertinência da intercessão . . . . . . . . . . . . . . . . . . . 33 24 Representação da função de pertinência de interseção entre S e T . . . 34 25 Definição da variável lingüísticas ’temperatura’ . . . . . . . . . . . . . . 35 26 Modelo de Mandani . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 27 Arquitetura do SIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 28 Exemplo de Base de Conhecimento . . . . . . . . . . . . . . . . . . . . 40 29 Exemplo de Funções de Inferência . . . . . . . . . . . . . . . . . . . . . 41 30 Gráfico do ’select’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 31 Gráfico do ’union’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 32 Funções BAIXO, MÉDIO e ALTO . . . . . . . . . . . . . . . . . . . . . . 42 33 Regras fuzzy para o exemplo . . . . . . . . . . . . . . . . . . . . . . . . 43 34 Bibliotecas do Snort para o SIDI . . . . . . . . . . . . . . . . . . . . . . 45 35 Biblioteca principal do SIDI . . . . . . . . . . . . . . . . . . . . . . . . . 46 36 Bibliotecas de SPP em plugbase . . . . . . . . . . . . . . . . . . . . . . 46 37 Chamadas de SPP em plugbase . . . . . . . . . . . . . . . . . . . . . . 46 38 Primeira modificação do Makefile . . . . . . . . . . . . . . . . . . . . . . 47 39 Segunda modificação do Makefile . . . . . . . . . . . . . . . . . . . . . 47 40 Makefile SIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 41 Base de Conhecimento para Testes . . . . . . . . . . . . . . . . . . . . 49 42 Funções de Pertinência para Testes . . . . . . . . . . . . . . . . . . . . 50 43 Regras Fuzzy para Testes . . . . . . . . . . . . . . . . . . . . . . . . . . 51 44 Resultado de Requisição Normal . . . . . . . . . . . . . . . . . . . . . . 52 45 Resultado de Ataque com SELECT . . . . . . . . . . . . . . . . . . . . 53 46 Resultado de Ataque com execução de comandos . . . . . . . . . . . . 54 SUMÁRIO RESUMO 1 Introdução 12 2 Objetivo 14 3 Sistemas de Detecção de Intrusão 15 3.1 Tipos de SDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2 SDI Baseado em Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3 SDI Baseado em Rede . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.3.1 NIDS Ativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3.2 NIDS Passivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.4 IDSs Baseado em Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.5 Exemplo de SDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.5.1 Snort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4 Vulnerabilidades Web 21 4.1 Cross-Site-Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.2 File Include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.3 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5 Técnicas de Evasão 26 6 Sistema Especialista 27 6.1 Arquitetura de um SE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6.1.1 Base de Conhecimento . . . . . . . . . . . . . . . . . . . . . . . 28 6.1.2 Motor de Inferência 28 . . . . . . . . . . . . . . . . . . . . . . . . . 7 Lógica Fuzzy 30 7.1 Teoria de Conjuntos Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.2 Operações Fuzzy Básicas . . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.2.1 Complemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.2.2 União . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 7.2.3 Intercessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 7.3 Representação Fuzzy do Conhecimento . . . . . . . . . . . . . . . . . . 34 7.3.1 Variáveis Lingüísticas . . . . . . . . . . . . . . . . . . . . . . . . 34 7.3.2 Regras de Produção Fuzzy . . . . . . . . . . . . . . . . . . . . . 35 7.4 Modelos de Inferência Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . 35 7.4.1 Modelo de Mandani . . . . . . . . . . . . . . . . . . . . . . . . . 36 8 Sistema Inteligente de Detecção Intrusão 37 8.1 Motivação e Justificativas . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8.2 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.3 Módulo Especialista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.3.1 Linguagem de Representação do Conhecimento . . . . . . . . . 38 8.4 Módulo Fuzzy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8.4.1 Processo de Fuzificação . . . . . . . . . . . . . . . . . . . . . . . 40 8.5 Construção de um Pré-Processador . . . . . . . . . . . . . . . . . . . . 45 8.6 Testes e Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 9 Trabalhos Futuros 56 10 Conclusão 57 REFERÊNCIAS 59 RESUMO Com a expansão da Internet, diversas empresas têm migrado suas aplicações de ambiente Desktop para Web. Com essas mudanças, a informação, o bem mais precioso de uma empresa, fica exposta e mais sujeita a violações. Este tipo de incidente geralmente é causado por ex-funcionários, funcionários insatisfeitos ou mesmo por espionagem industrial. De outro lado, especialistas em segurança vêm criando mecanismos e regras para diminuir esses ataques ou simplesmente detectá-los para, posteriormente, analisar e fazer previsões seguindo suas tendências evolutivas. Porém, com o crescimento da Internet e, conseqüentemente, a facilidade de acesso à informação, o nível de planejamento de ataques vem aumentando gradativamente, o que dificulta o trabalho dos analistas de segurança. Este trabalho visa construir um sistema inteligente híbrido que, através da utilização de lógica fuzzy e sistemas especialistas, objetivará diminuir as ocorrências de falsos-positivos e falsos-negativos comumente encontrados em Sistemas de Detecção de Intrusão baseado em regras. Palavras-chave: Inteligência Artificial.Lógica Nebulosa.Sistema de Detecção de Intruso.Sistema Especialistas 12 1 Introdução Diariamente são constatadas diversas novas vulnerabilidades em portais e aplicações Web, o que confirma a necessidade de uma camada específica para segurança. Porém, existem diversas técnicas de se evadir um ataque, para que o mesmo passe despercebido por esta camada extra de segurança, tornando a utilização de Sistemas de Detecção de Intrusão (IDS1 ) baseado em regras ineficazes. A grande maioria dos IDSs são baseados em regras e assinaturas. As assinaturas normalmente são utilizadas para fazer comparação de texto, ou seja, se uma determinado texto estiver contida dentro do pacote é gerado um alerta. Já uma regra consiste em uma assinatura seguida de algumas características como portas e endereços de origem e de destino, estado da conexão TCP, etc. O problema está no fato de ataques planejados utilizarem de técnicas de evasão, que podem ser trabalhada pelo atacante ou mesmo gerada pela aplicação. Um exemplo de uma técnica de evasão não criada pelo atacante está no ataque a aplicações WEB que trafegam sob HTTPS (HyperText Transference Protocol Secure), que trabalha com criptografia de dados entre as pontas. Neste caso, a detecção deveria estar embutida na aplicação, já que em qualquer outro ponto intermediário da comunicação impediria a análise da informação por estar criptografada. Dentre os vários IDS’s disponíveis nos mercado, foi escolhido o Snort2 para a implementação deste projeto. O Snort é um sistema livre e de código aberto bastante famoso e mais utilizado [1] , sua arquitetura modular permite que se adicione funcionalidades de maneira a expandir seus métodos de detecção. Durante as sessões seqüentes, será descrito diversas técnicas de ataque utilizadas atualmente na Internet, além do funcionamento e das categorias de IDSs. Será explicando como funcionam as técnicas de evasão e como através delas é possível 1 Do inglês Intrusion Detection System de Detecção de Intrusão mantido pela Sourcefire 2 Sistema 13 burlar IDSs baseados em regras. Existe uma sessão exclusiva para explicar como trabalhar com a lógica Fuzzy e será descrito o modelo de Mandani (selecionado para este trabalho). Outra sessão descreve como funcionam os Sistemas Especialista e como essa classe de ferramenta pode auxiliar na identificação de padrões de ataques. Com toda a base teórica formada, as ultimas sessões descrevem o protótipo de um Sistema Inteligente de Detecção de Intrusão, ou seja, uma ferramente que auxilia na tomada de decisão frente a um ataque real. 14 2 Objetivo O trabalho consiste em estudar conteúdos de Inteligência Artificial como Lógica Fuzzy e Sistemas Especialista, afim de criar um protótipo de um sistema híbrido que auxilie na detecção de intrusões. Esse protótipo foi construído como um préprocessador para o Snort, o IDS mais utilizado no mundo, com código-fonte aberto e com arquitetura de fácil expansão. Com essa implementação, foi possível realizar alguns testes e concluir situações em que o módulo trabalharia melhor que o motor de regras padrão do Snort. 15 3 Sistemas de Detecção de Intrusão Defini-se IDS de acordo com o [2] como “o processo de monitoramento de eventos e análise dos sinais/anomalias, de intrusões que ocorrem em um ambiente computacional”, cuja função é detectar estas atividades maliciosas ou anômalas e alertar ao administrador do sistema de que estes eventos estão ocorrendo. Estas anomalias/intrusões são os resultados de ataques provenientes de diversas fontes como acesso não autorizados, acesso a arquivos não permitidos, e ainda os diversos softwares maléficos comumente encontrados como: vírus, cavalos de tróia e “vermes”1 . 3.1 Tipos de SDI Apresenta-se nas próximas subseções os principais tipos de IDS: • Sistemas de Detecção de Intrusão Baseados em Servidor • Sistemas de Detecção de Intrusão Baseados em Rede – IDS Passivo – IDS Ativo • Sistemas de Detecção de Intrusão Baseados em Kernel 2 1 Do 2O inglês worms termo técnico Kernel representa o núcleo de um Sistema Operacional 16 3.2 SDI Baseado em Host Os Sistemas de Detecção de Intrusão baseados em servidor (HIDS3 ) tem como objetivos principais alertar e identificar ataques e tentativas de acesso indevido a própria máquina sendo geralmente empregados quando a segurança está focada nas informações contidas no servidor e os usuários não precisam ser monitorados. Figura 1: Arquitetura de um HIDS Os HIDS podem monitorar diversas variáveis no ambiente do servidor como por exemplo alterações de registros, adição de usuários, instalação e ocultação de rootkits4 , acesso a arquivos e verificação de integridade como binários falsos incluídos no sistema por usuários mal intencionados. Não há necessidade de outro equipamento para que o ambiente tenha um HIDS em funcionamento, o mesmo pode ser instalado no próprio servidor, vide Figura 1. 3.3 SDI Baseado em Rede Os Sistemas de Detecção de Intrusão Baseados em Rede (NIDS5 ), utilizam de um modo especial de funcionamento da interface de rede denominado de “modo promíscuo” onde a interface passa a capturar o tráfego em tempo real e com isso permite analisar os pacotes que estão trafegando no segmento de rede em questão. Ao ser 3 Do inglês Host Intrusion Detection System rootkit é uma classe de software que busca se esconder do sistema de segurança e do usuário utilizando diversas técnicas avançadas de programação 5 Do inglês Network Intrusion Detection System 4 Um 17 detectada alguma anomalia, o NIDS envia alertas para o administrador do sistema ou para o especialista em segurança. O diferencial entre estes dois primeiros tipos de IDS é que o HIDS possui um problema quanto aos registros, pois como ele está instalado no próprio servidor o atacante ao conseguir acesso poderá apagar, ou ainda pior, modificar as evidências de sua entrada no sistema podendo fazer do alvo um “zumbi” para uma próxima ação criminosa. Figura 2: Arquitetura de uma rede com NIDS Um NIDS pode detectar desde um número excessivo de mensagem, ataques de negação de serviço (DoS6 ) e ataques que usam pacotes fragmentados. A Figura 2 demonstra a necessidade de outro equipamento para a instalação do IDS, este encontrase em modo promíscuo escutando o tráfego da rede em que está conectado. A forma com que estes IDS trabalham podem variar mas, geralmente os IDS são encontrados em duas categorias: • IDS Baseados em Assinatura: Detectam ataques conhecidos que estão em sua base de assinaturas; • IDS Baseados em Anomalias: Registra a atividade normal da rede em um momento chamado de “aprendizagem”, e em seguida alerta quando ocorre um desvio no tráfego da rede do que é considerado como atividade normal. Os Sistema de Detecção de Intrusão Baseados em Rede podem ser divididos em duas categorias diferentes: IDS Ativo e IDS Passivo. 6 Do inglês Denial of Service 18 3.3.1 NIDS Ativo NIDSs Ativos são aqueles que ao detectarem anomalias ou ataques a um determinado seguimento de rede, tomam ações como finalizar a conexão e/ou trabalhar em conjunto com o firewall 7 para bloquear o tráfego proveniente de uma fonte suspeita. NIDSs Ativos tem por característica sua localização lógica na rede, ficando entre o acesso externo e o servidor interno. Sua principal vantagem está no fato de todos os pacotes que chegarem a rede precisarem passar pela análise do NIDS. Por outro lado, sua principal desvantagem está no problema do “gargalo” gerado na rede, perdendo em desempenho. 3.3.2 NIDS Passivo NIDSs Passivos são aqueles que ao detectarem uma possível violação da segurança registram o feito em logs8 e enviam alertas para o administrador do sistema ou o responsável pela segurança da rede. NIDSs Passivos ficam localizados em paralelo ao tráfego da rede, evitando perda de desempenho. Por outro lado, existe a possibilidade de ataques em massa terem sucesso, visto que os NIDSs Passivos não conseguiriam analisar todos os pacotes enviados ao servidor interno. 3.4 IDSs Baseado em Kernel IDSs baseados em Kernel(KIDS9 ) são relativamente novos, onde os mesmos cabem a prevenir buffer overflows10 , abuso de funções com permissões administrativas, além de aumentar a proteção no sistema de arquivos, melhorar o modelo de controle de acesso, dentre outros. 7 Ferramenta de gerenciamento de rede através políticas de segurançã comumente utilizado para representar registros 9 Do inglês Kernel Intrusion Detection System 10 Classe de vulnerabilidade provinda do mal gerenciamento de memoria de aplicativos 8 Termo 19 3.5 Exemplo de SDI 3.5.1 Snort Snort[3] é um sistema de NIDS de código-aberto, multiplataforma e multi-arquitetura. Desenvolvido a principio por Martin Roesch e agora sendo mantido pela comunidade, trabalha em rede e pode ser executado em modo passivo ou ativo. Capaz de realizar análise de tráfego em tempo real e registro de pacotes em redes IP, o Snort executa análise de protocolos, busca e associa padrões de conteúdo e pode ser usado para detectar inúmeros ataques como por exemplo buffer overflows. O Snort pode ser usado como um sniffer 11 de pacotes, assim como Wireshark12 ou tcpdump13 por exemplo, como um registrador de pacotes, onde o Snort passa a registrar os pacotes capturados guardando os registros em disco, ou como um NIDS. Espelhamento de portas compreende em uma interface do switch14 que recebe todo o tráfego da rede em forma de espelho, ou seja, mesmo que determinados pacotes não sejam para aquela máquina em questão. Esta função só é recomendável para análise dos pacotes que estão trafegando pela rede, pois o equipamento que receberá o tráfego espelhado deverá ter uma alta taxa de transferência. A principal característica do Snort é a inspeção do conteúdo do pacote no camada 7 do modelo OSI15 (ou camada de aplicação na arquitetura TCP/IP16 ), onde para a realização da detecção de anomalias a mensagem é decodifica e, através das regras, pode-se detectar uma tentativa de ataque. A saída decodificada do Snort é compreensível aos usuários, porém determinadas informações como portas e nomes de hosts não estão inclusas nestas informações, para o não comprometimento do processamento realizado pelo motor do Snort. A arquitetura padrão do Snort baseia-se em uma arquitetura modular, por plugins, e de quatro componentes básicos: • Sniffer • Pré-processador 11 Classe de ferramenta responsável por analisar os pacotes que trafegam pela rede de sniffer 13 Exemplo de sniffer 14 Hardware responsável pela comutação de pacotes na rede 15 Do inglês OpenSource Interconection 16 Padrão da Internet 12 Exemplo 20 • Motor de Detecção • Saída O sniffer é o “farejador” de pacotes, ou seja, captura os pacotes da rede por intermédio de uma interface de rede em modo promíscuo. Os pré-processadores são responsáveis por determinadas tarefas onde a arquitetura de regras atual não consiga manipular, como por exemplo scanning de portas. O Motor de Detecção é responsável pela verificação dos pacotes junto às regras. Caso a resposta do seja afirmativa, é enviado um alerta para a saída do IDS, e esta saída pode ir para um arquivo de log ou para um Banco de Dados. 21 4 Vulnerabilidades Web Nesta sessão serão descritos algumas das principais ameaças em ataques ocorridos na web. Ela tem por objetivo determinar o motivo pelo qual foi escolhido a classe de vulnerabilidade de SQL Injection para nosso objetivo e, quais são as outras ameaças no qual a ferramenta poderia ser adaptada. Todas as falhas descritas nessa sessão se caracterizam pela má filtragem das informações fornecidas pelo usuário. Estas informações podem vir de quaisquer dados manipuláveis pelo usuário como cookies, campos de formulários, variáveis da URL, entre outras. Por não passarem por um filtro de caracteres especiais, os dados enviados durante um ataque são interpretados de maneira errônea pela aplicação, alterando a lógica e induzindo na geração de condições não previstas pelas regras de negócio da corporação. 4.1 Cross-Site-Script A vulnerabilidade de Cross-Site-Script (XSS1 ), se classifica como uma falha de ataque em clientes, ou seja, tem como alvo os navegadores web, sem comprometer o servidor em questão. A exploração de XSS ocorre quando um atacante insere códigos (geralmente javascript) de maneira a executa-los (no caso da vítima). O código pode ser planejado de modo a alterar informações na página visitada pela vítima, redirecionar a página para outro endereço falso ou fazer o chamado sequestro de sessão2 , fornecendo ao atacante as informações que indicam que a vítima está autenticada e, se as mesmas forem copiadas e não houver nenhum outro mecanismo de segurança, é possível 1A abreviação não é CSS pois esta é utilizada para definir a linguagem de estilização de páginas Hijacking em inglês 2 Session 22 obter os privilégios da vítima no sistema em questão. Figura 3: Exemplo de código vulnerável a XSS Como na Figura 3 não existe nenhum filtros de caracteres especiais antes de enviar o valor da variável nome de volta ao navegador, um atacante poderia forjar uma URL que contenha algum código javascript maléfico. Poderia ser passado na variável nome algo como <script>alert(document.cookie)</script>. Dessa maneira, ao acessar o endereço, a vítima visualizaria seu cookie em uma mensagem do navegador. Um ataque planejado consiste em, usando alguns artifícios de programação para Internet, capturar o valor dessa variável (document.cookie) e enviá-la ao atacante. Em posse desta, o atacante simula uma requisição ao servidor passando esta variável, de maneira à executá-la com os privilégios da vítima. 4.2 File Include A classe de vulnerabilidades denominada File Include3 , se caracteriza por, na maioria dos casos, comprometer o servidor que hospeda a aplicação. Desta maneira, o atacante pode interferir facilmente em todas as vertentes da segurança da informação4 . Encontrada em diversas linguagens de programação, a vulnerabilidade de File Include consiste em utilizar de características de divisão de código em diversos arquivos (como modularização) onde, através da manipulação de variáveis que auxiliam na escolha do módulo a ser adicionado no código, um atacante modifica o resultado dessa geração, fazendo com que a aplicação execute um código maléfico arbitrário. Como analisado no código PHP da Figura 4, a variável pagina, passada como parâmetro pelo método HTTP-GET, pode ser facilmente manipulada por um atacante diretamente pela URL. De acordo com a documentação5 , a função include() pode 3 Do inglês inclusão de arquivo vertentes são disponibilidade, integridade e confidencialidade 5 http://br2.php.net/include/ 4 Essas 23 Figura 4: Exemplo de código vulnerável buscar o arquivo solicitado de uma máquina remota e, se o arquivo remoto possuir algum código PHP, o mesmo será executado no servidor local. Como a variável não passa por filtros, um atacante poderia induzir o programa a buscar um código maléfico em um servidor, de maneira a fazer esse código ser executado no servidor local. Um código maléfico que poderia ser utilizado em um ataque pode ser visto na Figura 5. Figura 5: Exemplo de código maléfico utilizado em ataques Com isto, um atacante poderia invadir o servidor vulnerável simplesmente acessando o arquivo /index.php?pagina=http://www.hack.com/b4d_c0de.txt?&cmd=id. Desta maneira, o código no servidor irá incluir o código maléfico em seu ambiente e executálo. Nota-se que na URL existe também uma variável cmd que não existe para o programa do servidor, porém é interpretada pelo código injetado pelo atacante que, através da função passthru(), executa um texto passado como parâmetro como comando interno do servidor e retorna o resultado para o navegador web. 4.3 SQL Injection O ataque de SQL Injection consiste em injetar código de SQL (Structure Query Language) em informações que podem ser manipuladas pelo usuário. Estas informações podem ser campos de formulários, variáveis de URL ou até mesmo valores de 24 controle de sessão dos navegadores. O objetivo é alterar a lógica do comando SQL para executar comandos arbitrário. Um exemplo de código vulnerável a SQL Injection está em uma não filtragem dos parâmetros passados no formulário HTML para um código da linguagem de programação PHP . Figura 6: Exemplo de código vulnerável a ataques de SQL Injection Observa-se na Figura 6 que as variáveis “usuario” e “senha” são passadas para o comando SQL com nenhuma filtragem de caracteres especias. Assim, um atacante poderia burlar facilmente esse método de validação simplesmente “injetando” código SQL no formulário de autenticação (onde o campo “Senha” possui o mesmo valor do campo “Usuário”) como visto na Figura 7. Figura 7: Ataque de SQL Injection (formulário) Como visto na Figura 7, a lógica do comando SQL foi alterada, fazendo com que ele retorne os registros cujo usuário esteja vazio ou vazio seja igual a vazio, e cujo campo senha esteja vazia ou vazio seja igual a vazio. O comando SQL final retornará 25 todos os registros da tabela de usuários. O ataque também pode ser efetuado acessando diretamente a URL do código vulnerável preenchendo os parâmetros necessários como na Figura 8. Isto ocorre porque os parâmetros são passados e verificados através do método HTTP-GET, onde as variáveis e seus valores ficam acessível pela URL. Figura 8: Ataque de SQL Injection (url) Ao acessar este endereço da Figura 8, o navegador envia basicamente a requisição HTTP indicada na Figura 9 para o servidor, onde os parâmetros são codificados convertendo seus caracteres especiais em seus respectivos valores ASCII em hexadecimal precedido de um sinal de percentil (%). O cabeçalho HTTP termina com duas quebras de linha. Figura 9: Método HTTP-GET Porém, por convenção não é recomendado passar informações sigilosas como senhas pelo método GET, visto que a mesma seria facilmente visualizada na URL por outros usuários. Para evitar isto, pode-se utilizar o método HTTP POST, que envia as informações no final do cabeçalho HTTP e não na URL. Para isto, será necessário modificar o formulário inicial, alterando a propriedade method do formulário de get para post, e modificar a forma com que as variáveis são obtidas no código PHP, trocando $_GET por $_POST. Com isto, ao submeter o formulário, o cabeçalho enviado será semelhante ao apresentado na Figura 10. Neste caso, o método HTTP enviado foi o POST seguido do caminho no servidor do arquivo que processará a requisição e no final do cabeçalho é enviado os dados fornecidos pelo usuário. Figura 10: Método HTTP-POST 26 5 Técnicas de Evasão Como visto anteriormente, existem diversas classes de vulnerabilidades em ambientes Web. Para essas vulnerabilidades, existem uma vasta base de assinaturas (regras) que dificultam seu sucesso em ataques padronizados ou por ferramentas automatizas. Porém, em ataques bem definidos utiliza-se de técnicas de evasão, onde o atacante modifica o ataque de maneira que não se encaixe nas regras previstas. Isto pode ser feito com a manipulação de espaços, inserindo comentário (sintaxe C), encoding (hexadecimal, base64, decimal, etc), entre ontros. Uma comparação entre os modos de ataques de SQL Injection comum e a utilização de técnicas evasivas pode ser visto na Figura 11. Figura 11: Exemplos de tipos de técnicas de evasão Quando o atacante obtém sucesso, ocorre o chamado falso-negativo, pois o IDS marca a entrada como negativa (não consiste em um ataque) quando, na verdade, consistia em um ataque. Por outro lado, tem-se os chamados falso-positivo, que ocorre quando o IDS marca uma entrada como tentativa de ataque, quando na verdade não é. 27 6 Sistema Especialista Os Sistemas Especialistas(SE) consistem em uma subclasse dos chamados Sistemas Baseados em Conhecimento (SBC), com o objetivo de solucionar problemas de um domínio específico. Seu funcionamento básico consiste na emulação do raciocínio de um especialista onde, através de uma seqüência de condições, pode-se obter uma conclusão para um dado problema. Uma das áreas que mais demonstra interesse pela implantação de Sistemas Especialista é a área médica, haja visto que em uma consulta médica, através de um conjunto de perguntas feitas pelo médico, é possível obter um pré-diagnóstico do paciente. Com isto, o SE seria o responsável por transmitir as perguntas e, a partir das respostas dada pelo paciente, determinar um conjunto de possíveis diagnósticos. Um exemplo de Sistema Especialista para diagnóstico médico pode ser visto em [6]. Sempre que um problema não puder ser modelado em forma de algoritmo ou, se possível, for inviável por ter uma grande quantidade de regras específicas, os SEs podem ser utilizados como mecanismo de solução pois, além de trabalharem com uma base de conhecimento, possui seu mecanismo baseado em processos heurísticos. 6.1 Arquitetura de um SE Segundo [19], os SEs são responsáveis por, através de um conjunto de dados de entrada, determinar um possível conjuntos de soluções. Desta maneira, necessita-se de transformar o conhecimento tácito de um especialista em um conhecimento explícito. O conhecimento tácito é aquele que se forma pela experiência pessoal, de maneira que não consiga ser estruturada facilmente pela linguagem, enquanto o conhecimento explícito é facilmente representado em forma de imagem ou texto de forma que se seja possível armazená-lo e retê-lo. Desta forma, para uma boa modelagem de um SE, é necessário representar o conhecimento de um especialista de tal forma 28 que uma máquina possa armazená-lo. Com isto, a arquitetura de um SE geralmente é dividida em uma parte específica para armazenar o conhecimento e um motor de inferência que é responsável pela busca e avaliação dessas informações. 6.1.1 Base de Conhecimento A Base de Conhecimento de um SE tem por objetivo armazenar a informação do especialista de maneira explícita. Este processo geralmente é feito pelo especialista em conjunto com o chamado Engenheiro de Conhecimento que tem como finalidade analisar e representar o conhecimento. A Base de Conhecimento consiste no elemento dinâmico de um SE, ou seja, ele pode ser variado de acordo com sua utilização de maneira que, quanto maior a Base de Conhecimento, melhor será os resultados propostos pelo sistema. O preenchimento da base de conhecimento pode ser feito tanto manualmente pelo engenheiro de conhecimento quanto automaticamente através de um módulo de aprendizagem que, através das decisões tomadas, se algumas delas não forem compatíveis com o real, será informado um parâmetro de diferenciação fazendo com que, na ocorrência do mesmo caso, o SE retorne um resultado mais satisfatório. Geralmente uma base de conhecimento é formada por um conjunto de regras que, de acordo com suas execuções, preenche diversos parâmetros que influenciam na tomada de decisão do SE. 6.1.2 Motor de Inferência O Motor de Inferência (ou Mecanismo de Inferência) consiste em um elemento permanente do sistema, ou seja, não precisa ser modificado constantemente e além disto, pode ser reutilizado em outros SEs. Este elemento da arquitetura dos SEs é responsável pela leitura dos conjuntos de entradas, análise das entradas com a Base de Conhecimento e do fornecimento da conclusão. Basicamente o Motor de Inferência é dividido em tarefas simples que são: Selecionar, buscar e avaliar. Um exemplo de inferência seria para determinar o grau de parentesco entre duas pessoas. Seja uma Base de Conhecimento com a seguinte informação: • SE (mãe(pessoa1) = mãe(pessoa2) E pai(pessoa1) = pai(pessoa2)) ENTAO irmãos(pessoa1, pessoa2) 29 Suponto que o sistema tenha como entrada o seguinte: • O pai de Pedro é João • A mãe de Pedro é Maria • O pai de Carlos é João • A mãe de Carlos é Maria Como se tem o conhecimento da regra de parentes dada, as informações fornecidas pelo sistema inferem diretamente com a regra, logo pode-se concluir que Pedro e Carlos são irmãos. 30 7 Lógica Fuzzy A computação convencional baseia-se em operações lógicas, comumente lógica booleana, onde atribuem-se os estados verdadeiros ou falsos para as condições existentes. A lógica nebulosa1, é usada para tratar estados parciais de verdade, onde o complemento dessa é um estado parcial de falsidade. De acordo com [5], a teoria clássica de conjuntos tolera o tratamento de classes de objetos e suas relações internas em um universo delimitado. Este universo de discurso pode ser discreto ou contínuo, dependendo da natureza dos objetos que o constituem. Por exemplo, pode-se definir um universo U discreto que armazena números entre -5 e 5 do conjunto Z e assim definir um conjunto A:1,2,3,4,5, onde sua função característica é definida por XA : U → {0, 1} onde cada elemento de U recebe um valor binário para determinar o conjunto A. Esta função é representada na Figura 12 e seu gráfico na Figura 13. XA (x) = 0 se 1 se x 6∈ A x∈A Figura 12: Função Booleana Figura 13: Gráfico Booleano Já em conjuntos fuzzy podemos ter um conjunto B = A, mas sua função característica é definida por µB : U → [0, 1] onde cada elemento de U recebe um valor no intervalo fechado [0,1]. Esta função está representada na Figura 14 e seu gráfico na Figura 15. 31 µB (x) = 0 2x 10 se X ≤ 0 se 0 < x ≤ 5 Figura 14: Função Fuzzy Figura 15: Representação gráfica de um conjunto fuzzy 7.1 Teoria de Conjuntos Fuzzy O conjunto B pertence a um universo discreto U e sua função característica é chamada também de função de pertinência. O suporte de B é um subconjunto de U que possui µB maior do que zero. Para representar um conjunto contínuo usa-se um gráfico de pertinência, chamado de diagrama de Hassi-Euler (H-E). Veja a Figura 16. Figura 16: Diagrama de Hassi-Euler do conjunto fuzzy B no universo real [-5,5] 7.2 Operações Fuzzy Básicas Considere três conjuntos fuzzy chamados “sólido”, “transição” e “liquido”, cuja suas funções de pertinência são definidas na Figura 17 e na Figura 18 está a representação em forma de gráfico. 7.2.1 Complemento Pode-se denotar por ∼A, a operação de complemento de um conjunto fuzzy A do universo de discurso U, definida com uma função de pertinência na Figura 19, como 32 µS : U = se x ≤ −2 se − 2 < x < 0 0 se x ≥ 0 1 x −2 2−|x| 2 µT : U = µL : U = 1 se 0 se |x| ≤ 2 |x| > 2 se x ≥ 2 se 0 < x < 2 0 se x ≤ 0 x 2 Figura 17: Funções de Pertinência Figura 18: Gráfico representativo das funções de pertinência no gráfico da Figura 20. µ¬A (xi ) = 1 − µA (xi ) Figura 19: Função de pertinência da negação Figura 20: Representação da função de pertinência de negação de S 7.2.2 União A representação pode ser A U B ou A + B e sua função de pertinência pode ser vista na Figura 21. Esta é uma definição particular da operação de união proposta por [8] na década de 1960. Na verdade, uma forma mais geral de definir a operação de união entre 33 µA∪B (xi ) = max[µA (xi ), µB (xi )] Figura 21: Função de pertinência da união conjuntos fuzzy é por meio das normas S, ou seja, de uma família de funções com as seguintes propriedades: • Comutatividade: S(a,b) = S(b,a); • Associatividade: S(a,S(b,c)) = S(S(a,b),c); • Monotonicidade: se a <= b e c <= d, então S(a,c) <= S(b,d); • Coerência nos contornos: S(a,1) = 1 e S(a,0) = a Veja um exemplo na Figura 22, de µL∪T : Figura 22: Representação da função de pertinência de união ente L e T 7.2.3 Intercessão A representação pode ser A ∩ B ou A.B e sua função de pertinência pode ser vista na Figura 23. µA∩B (xi ) = min[µA (xi ), µB (xi )] Figura 23: Função de pertinência da intercessão Similarmente ao caso da união, a operação de interseção entre conjuntos fuzzy pode ser generalizada por meio de famílias específicas de funções, chamadas de normas T, com as seguintes propriedades: • Comutatividade: T(a,b) = T(b,a); • Associatividade: T(a,T(b,c)) = T(T(a,b),c); 34 • Monotonicidade: se a <= b e c <= d, então T(a,c) <= T(b,d); • Coerência nos contornos: S(a,1) = a e S(a,0) = 0. Veja um exemplo na Figura 24, de µS∩T : Figura 24: Representação da função de pertinência de interseção entre S e T 7.3 Representação Fuzzy do Conhecimento Como nos processos de engenharia de software a representação fuzzy de um determinado problema é feito de forma top-down, ou seja, primeiro faz-se um levantamento geral e superficial do que se deseja resolver, para depois determinar um algoritmo e modelos matemáticos. Desta maneira podemos classificar nossos problemas com valores qualitativos em vez dos quantitativos, essa maneira imprecisa de pensar nos leva ao conceito de variáveis lingüísticas. O processo de representação fuzzy de conhecimento depende desse conceito. 7.3.1 Variáveis Lingüísticas O conceito de variáveis lingüísticas está relacionado diretamente com um modelo em sua forma bruta, ou seja, ao natural da visão humana e seus valores possíveis são qualitativos, gerando assim uma imprecisão. Uma forma muito usada é a variável lingüística temperatura onde podemos ter valores qualitativos como muito baixa, baixa, agradável, alta e muito alta. Defini-se temperatura no universo de discurso determinado pelo intervalo [0,50] e seus valores qualitativos são subconjuntos dentro deste, e cada um dos números reais neste intervalo tem um grau de pertinência dentro de cada subconjunto, como mostra a Figura 25. Nota-se, por exemplo, que em a temperatura igual a 20 no universo de discurso de temperatura, existe um grau de pertinência para cada valor qualitativo, onde Muito 35 Figura 25: Definição da variável lingüísticas ’temperatura’ Baixa = 0, Baixa = 0.5, Agradável = 0.5, Alta = 0 e Muito Alta = 0. 7.3.2 Regras de Produção Fuzzy As regras de produção fuzzy são formadas por duas partes, um antecedente e um conseqüente, no seguinte formato: se <antecedente> então <conseqüente> Um exemplo de regra seguindo as variáveis descritas anteriormente poderia ser: se (temperatura = muito alta) então (beba_liquido ← muito) 7.4 Modelos de Inferência Fuzzy Os modelos de inferência fuzzy caracterizam-se sobre a semântica do mecanismo, modelando como será a avaliação dos antecedentes e como se aplicará os conseqüentes. Para se fazer isso são utilizados modelos de inferência fuzzy específicos, com propriedades sintáticas definidas, ou seja, o modelo de processamento definido para o sistema de conhecimento vai depender basicamente da forma de armazenamento de informações escolhida. 36 7.4.1 Modelo de Mandani De acordo com [5], o método de inferência de mamdani tem como característica possuir relações fuzzy nos antecedentes e também nos conseqüentes. Normalmente o conjunto de dados são variáveis quantitativas, para isso, o modelo de mamdani utiliza duas interfaces, uma de entrada e outra de saída. Elas são responsáveis pela comunicação do sistema, fazendo uma conversão de quantitativo (variável numérica) para qualitativo (variável lingüística). Os processos de conversão são chamados de fuzificação e defuzificação respectivamente para entrada e saída de dados. A Figura 26 exemplifica um modelo de processamento fuzzy de inferência de Mamdani. Figura 26: Modelo de Mandani 37 8 Sistema Inteligente de Detecção Intrusão 8.1 Motivação e Justificativas Várias são as maneiras de evadir um ataque de maneira que os IDSs baseados em regras não os detectem. Visando o aumento da segurança e a diminuição dos falso-positivos e falsos-negativos, planejou-se a construção de um Sistema Inteligente de Detecção de Intrusão (SIDI). Para vulnerabilidade, foi escolhido a detecção de ataques de SQL Injection, pois comparado com as demais falhas vistas, possui a maior proporção de ocorrência por impacto na aplicação. As vulnerabilidades de XSS são encontradas vastamente pela Internet, porém sem um bom planejamento e utilização de mecanismos avançados de ataque, fica praticamente inviável a exploração. As vulnerabilidades de File Include possuem um impacto extremamente forte em sua exploração, porém dificilmente se encontra esse tipo de falha, pois essa classe de vulnerabilidade já é bastante difundida e existe mecanismos e configurações adicionais para inibi-las. Já as vulnerabilidades de SQL Injection possúem impacto significante (não tanto quanto File Include) e tem um alto grau de ocorrência nas diversas aplicações web (não tanto quanto XSS). Como ferramenta de apoio foi escolhido o NIDS Snort, por possuir código-fonte aberto, suporte a expansão através de pré-processadores e plugins, possuir mais de 3 milhões de downloads e mais de 100.000 usuários ativos(Referência em [4]). 38 8.2 Arquitetura Para uma melhor manipulação das informações, foi desenvolvido um arquitetura híbrida para o SIDI utilizando um módulo especialista para o reconhecimento de características de ataque e um módulo fuzzy para a tomada de decisão. Uma breve explanação da arquitetura projetada pode ser vista na Figura 27. Figura 27: Arquitetura do SIDI 8.3 Módulo Especialista De uma maneira geral, inicialmente, o pacote de rede será transmitido para o SIDI. Com isto, através de um módulo especialista, será feito o processo de taxonomia, ou seja, a transformação das informações de entrada em variáveis quantitativas. Cada uma dessas variáveis representará um grau de ocorrência de um determinado termo comumente utilizado em ataques tais como comentários, palavras reservadas, divisão de comandos, etc. Esta transformação é feita pelo motor de inferência do módulo especialista que, através da base de conhecimento, reconhece tais padrões. 8.3.1 Linguagem de Representação do Conhecimento Com o objetivo de organizar as informações de maneira aberta e de fácil manipulação, foi planejado representar a base de conhecimento através de arquivos do tipo XML. Para isto, utilizou-se a biblioteca libxml 1 que está presente em quase todas as distribuições Linux. 1 http://www.xmlsoft.org 39 A base de conhecimento inicializa com um nó único base_conhecimento. A partir dela, existem diversos nós filhos onde cada filho representa uma variável de conhecimento específica. Cada nó de variável possui duas propriedades: nome e tipo. O nome representa o nome da variável. O tipo representa se o objetivo da variável é a minimização(MIN) ou a maximização(MAX). Esta característica foi implantada visando melhorar a performance do sistema, já que se uma variável for do tipo maximização e no decorrer da análise de um pacote ela atingir o valor máximo, não será mais necessário verificar os demais casos. O mesmo vale para variável do tipo minimização. No exemplo da Figura 28, ao processar a variável SELECT, se o caso com identificação 1 coincidir com o pacote, o peso de ocorrência da variável irá para o valor 5, o que inviabiliza a necessidade de verificar os demais casos, visto que 5 é o valor máximo permitido para as variáveis do módulo especialista. Cada variável possui um conjunto de filhos que representam os casos em que pode ocorrer a variável seguido de um peso de ocorrência. Cada um dos casos possui os atributos id, valor e expressão O campo id representa um identificador único de cada caso da variável. Ele é utilizado em conjunto com a análise de registros de maneira a identificar o que levou o módulo especialista a tomar determinada decisão. O atributo expressão contém uma expressão regular que será a representação do padrão de reconhecimento da variável, a mesma utiliza o formato PCRE2 , amplamente utilizada e conhecida. O atributo “valor” representa qual o valor deve ser associado a respectiva variável caso o padrão especificado no atributo “expressao” coincida com o valor passado para o módulo especialista. A base de conhecimento vista na Figura 28 consiste em um exemplo simples com três variáveis. Entretanto, em um sistema de produção, são necessárias dezenas de variáveis com diversos casos cada uma, de maneira a representar uma amplitude maior do conhecimento. 8.4 Módulo Fuzzy O módulo fuzzy é o responsável pela tomada de decisão, ou seja, ele é o módulo que sabe distinguir se as informações retiradas de um determinado pacote, pelo módulo Especialista, consistem em um ataque ou se era apenas um pacote inofencivo a rede. A arquitetura deste módulo é baseada no modelo da Máquina de Inferencia de 2 Do inglês Perl Compatible Regular Expression 40 Figura 28: Exemplo de Base de Conhecimento Mandani, mas tem somente uma alteração, no lugar de um defuzzificador (dados qualitativos para quantitativos) tem-se um Gerador de Registro (dados qualitativos para logs). 8.4.1 Processo de Fuzificação O fuzzificador tem por principal e única finalidade, transformar dados de variáveis quantitativas para os correspondentes dados em forma qualitativa, dentro do conjunto de valores lingüísticos com o grau de pertinência de cada uma variável de tipos iguais. Para melhor entender, defina uma variável quantitativa do tipo ’union’, cujo seu valor é ’4.5’, quando essa chegar no fuzzificador, ele deverá identificá-la e relacionala com uma variável qualitativa do mesmo tipo ’union’, essa terá o seu conjunto de valores lingüísticos, que será baixo, medio, alto, cada um desses valores lingüísticos tem uma função relacionada, que recebe como parâmetro o valor quantitativo e retorna um grau de pertinência do mesmo termo dentro da variável. Como exemplificação, a função e o retorno do grau de pertinência para baixo(4.5)=0, medio(4.5)=0.1 e alto(4.5)=0.7. Para que o conjunto de variáveis provindas do SE seja identificado e transformado em um novo conjunto, é preciso uma base de informações que determinem como esse processo deve ser executado, esta deve conter uma variável qualitativa de tipo 41 correspondente, seus valores lingüísticos e as funções para cada um. Como padrão do projeto, toda base de dados necessária deve estar contida em arquivos XML, como o visto na Figura 29: Figura 29: Exemplo de Funções de Inferência Passado pelo fuzzificador, agora as informações são entregues a máquina de inferência fuzzy. Esta por sua vez recebe as variáveis qualitativas de entrada com seu conjunto de valores lingüísticos e os respectivos graus de pertinência. Aplicando-as na base de regras, serão gerados os graus de pertinência para cada elemento do conjunto dos valores lingüísticos da variável de saída. Para se calcular a persistência, dado uma regra, é aplicada uma função MIN nos valores lingüísticos usados pelo conjunto de variáveis da própria regra. Depois de gerado as persistência dos valores lingüísticos da variável de saída, é aplicado a função de MAX nelas, para com isso, descobrir qual valor lingüístico possui uma maior pertinência no conjunto de valores da variável de saída. Em alguns casos, existem dois termos lingüísticos que tem o mesmo grau de pertinência e são os maiores, então será escolhido o termo lingüístico mais relevante, para não perder informações que tenham uma influência maior em 42 questão da detecção de um ataque. Para melhor entendimento veja a analise de dois exemplos, a partir das entradas quantitativas vindas do Sistema Especialista até o final do processo na máquina de inferência, as funções são definidas pelo arquivo de base de funções do tipo XML. Figura 30: Gráfico do ’select’ Figura 31: Gráfico do ’union’ Nas Figuras 30 e 31 (com suas funções na Figura 32) e as regras da Figura 33, temos duas situações de exemplo. Obs.: Apesar dos gráficos da Figura 30 e Figura 30 terem as mesmas funções, isso não significa que é um padrão, pois cada valor lingüístico de uma dada variável tem sua função determinada por quem a escreveu na base de funções. Outra questão é que para todo x fora do intervalo determinado, a função retornará “0”. baixo − 21 x + 1 se 0 ≤ x ≤ 2 2 2 se 1 ≤ x ≤ 52 3x − 3 − 32 x − 32 se 25 < x ≤ 4 medio alto 1 3 2x − 2 se 3 ≤ x ≤ 5 Figura 32: Funções BAIXO, MÉDIO e ALTO Situação 1: 43 Figura 33: Regras fuzzy para o exemplo Dados qualitativos: select = 1,2 union = 2,5 Aplica-se os dados qualitativos nas funções de pertinência: select: baixo(1,2) = 0,4 medio(1,2) = 0,2 alto (1,2) = 0 union: baixo(2,5) = 0 medio(2,5) = 1 alto (2,5) = 0 Aplicando os valores lingüístico e os graus de pertinência nas regras 1- nenhum ⇒ min (0.4,0) = 0 2- baixo ⇒ min (0.4,1) = 0.4 3- medio ⇒ min (0.4,0) = 0 4- baixo ⇒ min (0.2,0) = 0 5- medio ⇒ min (0.2,1) = 0.2 6- alto ⇒ min (0.2,0) = 0 7- medio ⇒ min (0,0) = 0 8- alto ⇒ min (0,1) = 0 9- certeza ⇒ min (0,0) = 0 Obs.: Quando um termo for gerado seu grau de pertinência mais de uma vez, é 44 escolhido o maior grau. Termo relevante da variável de saída: MAX (nenhum, baixo, medio, alto, certeza) MAX (0,0.4,0,0,0.2,0,0,0,0) MAX = 0.4 Termo mais relevante é “baixo” com grau de pertinência ’0.4’. Situação 2: Dados qualitativos: select = 5 union = 3,5 Aplicando os dados qualitativos nas funções de pertinência: select: baixo(5,0) = 0 medio(5,0) = 0 alto (5,0) = 1 union: baixo(3,5) = 0 medio(3,5) = 0.33 alto (3,5) = 0.25 Aplicando-se os valores lingüístico e os graus de pertinência nas regras 1- nenhum ⇒ min (0,0) = 0 2- baixo ⇒ min (0,0.33) = 0 3- medio ⇒ min (0,0.25) = 0 4- baixo ⇒ min (0,0) = 0 5- medio ⇒ min (0,0.33) = 0 6- alto ⇒ min (0,0.25) = 0 7- medio ⇒ min (1,0) = 0 8- alto ⇒ min (1,0.33) = 0.33 9- certeza ⇒ min (1,0.25) = 0.25 Termo relevante da variável de saída: MAX (nenhum, baixo, medio, alto, certeza) MAX (0,0,0,0,0,0,0,0.33,0.25) 45 MAX = 0.33 Termo mais relevante é ’alto’ com grau de pertinência ’0.33’. 8.5 Construção de um Pré-Processador Basicamente, para a integração inicial com o sistema, o SPP3 precisar configurar um ambiente com uma função exportada em uma biblioteca. Esta, por sua vez, será incluída no sistema base de plugins do Snort e a função adicionada na rotina de inicialização dos SPPs. Para isto, é necessário fazer a inclusão das bibliotecas fornecedidas pelo Snort, vistas na Figura 34. Figura 34: Bibliotecas do Snort para o SIDI Cada uma das bibliotecas possuem suas funcionalidades. As bibliotecas generators.h e event_wrapper.h são responsáveis pela geração de alertas para o Snort, as bibliotecas util.h e plugbase.h possuem as principais rotinas que todo SPP deve possuir e a biblioteca debug.h fornece rotinas de controle, para que se possa fazer análises do SPP. Após a inserção das bibliotecas padrões, é necessário criar a própria biblioteca do SPP. Esta biblioteca necessita ter basicamente uma única função que será chamada na inicialização do Snort. O exemplo de biblioteca inicial pode ser visto na Figura 35. Nota-se que na Figura 35 existe apenas uma função chamada SetupSIDI(). Esta função é a responsável pelo carregamento do SPP do SIDI e, para seu funcionamento, é necessário efetuar duas pequenas modificações no Snort, ambas no arquivo plugbase.c encontrado no diretório src do código-fonte do Snort. A primeira modificação deve ser a inserção da biblioteca do novo SPP como biblioteca do arquivo plugbase.h(veja a Figura 36) e a segunda modificação consiste na inserção da chamada a função de carregamento do SPP. Isso é feito simplesmente chamando a função criada(no caso SetupSIDI()) dentro da função InitPreprocessors() como pode-se ver na Figura 37. 3 Do inglês Snort Pre-Processor 46 Figura 35: Biblioteca principal do SIDI Figura 36: Bibliotecas de SPP em plugbase Figura 37: Chamadas de SPP em plugbase 47 Feito isto, o SPP estará pronto para ser carregado com o Snort. Para isto é necessário compilá-lo juntamente com o Snort e isto é possível através de duas modificações no arquivo de definição de compilação(Makefile) do diretório /src/preprocessors/ do Snort. Figura 38: Primeira modificação do Makefile Figura 39: Segunda modificação do Makefile A primeira modificação da Figura 38 indica ao Snort que o novo SPP está em um diretório a parte e que durante a recompilação do sistema deve-se executar um Makefile existente neste diretório. A segunda modificação da Figura 39 indica o arquivo objeto gerado pelo novo pré-processador compilado, de maneira a liga-lo ao Snort durante a compilação final. Para finalizar, a Figura 40 contém o Makefile necessário para se compilar o SIDI. A Figura 40 representa um arquivo básico para compilação do sistema, entretanto, com o crescimento do mesmo e a necessidade de divisão em diversos arquivos e módulos distintos, foi necessário modificar este arquivo de maneira a adequar-se ao sistema em questão. A função SetupSIDI() é unicamente responsável pelo registro do SPP na estrutura interna do Snort. Desta forma, ele simplesmente faz uma chamada a função RegisterPreprocessor() que possui dois parâmetros. O primeiro consiste em uma palavrachave de identificação do SPP e o segundo consiste em um ponteiro para uma função de inicialização. É importante ressaltar que todos os SPPs são registrados, porém a função de inicialização só é executada para aqueles que estão ativos segundo o arquivo de configuração do Snort. No caso do SIDI, a função de inicialização é a responsável pelo carregamento da base de conhecimento, carregamento das funções de inferências e pelo carregamento 48 Figura 40: Makefile SIDI da base de regras fuzzy, todos armazenados em arquivos XMLs. Feito isto, a função de inicialização se encarrega de definir para o Snort quais são as funções de controle do SPP. Estas funções são a de recebimento de pacote (para análise), a de finalização (para liberação de memória) e de reinicialização (para se necessário recarregar os arquivos de inicialização). O Snort reconhece qualquer SPP pela palavra-chave definida em seu registro, portanto, para se inicializar o SIDI (definir com palavra-chave sidi) foi-se necessário adicionar a seguinte linha no arquivos de configuração: preprocessor sidi: /etc/sidi A primeira palavra indica que a configuração a seguir é de um SPP. Em seguida tem-se a palavra-chave de identificação do SPP e após o dois-pontos um texto que é passado como parâmetros para o SIDI na sua função de inicialização. Para este projeto definiu-se que este parâmetro único seria o diretório onde encontram-se os arquivos XMLs do SIDI. 49 8.6 Testes e Resultados Após a implementação foram feitos diversos testes para se adequar uma boa base de conhecimento, conjuntos de funções de inferência e base de regras Fuzzy. Para os testes foram utilizados a Base de Conhecimento descrita na Figura 41, as funções de pertinências descrita na Figura 42 e a Base de Regras Fuzzy descrita na Figura 43. Figura 41: Base de Conhecimento para Testes Na Figura 44 é possível observar pelo cabeçalho de chegada que o mesmo não representa um ataque. Ao passar pelo módulo especialista, somente em algumas variáveis foi definido um peso e, mesmo assim, estes estão presentes apenas nos conjuntos baixos com pertinências de 0.33 para ambos, SELECT e UNION. Como resultado, as variáveis (com seus graus de pertinência) não inferiram em nenhumas das regras, resultado em possibilidade 0.00% para todas os valores lingüísticos de saída. É importante ressaltar que até mesmo o valor lingüístico NENHUM está com pertinência 0 (zero). Isto porque nenhuma das regras fuzzy inferira sobre esse valor. Ele deve ser muito utilizado quando, em alguma condição, muitas regras preencherem os 50 Figura 42: Funções de Pertinência para Testes 51 Figura 43: Regras Fuzzy para Testes 52 Figura 44: Resultado de Requisição Normal 53 demais valores lingüístico portanto sem ser um ataque. Desta maneira, deve-se criar regras que inferem no valor lingüístico NENHUM, de maneira que ele tenha maior grau de pertinência sobre os demais valores. Figura 45: Resultado de Ataque com SELECT Na Figura 45 é possível observar uma tentativa de ataque através dos comandos SQL SELECT e UNION. Com isto, o módulo especialista definiu as variáveis SELECT e UNION com os valores lingüísticos ALTO com pertinência de 0.50, ou seja, certeza absoluta de ocorrência no pacote de chegada. Com estas informações, esses valores coincidem com a ultima das regras, o que faz o valor lingüístico CERTO ter probabilidade de 50%. Na Figura 46, é possível observar no pacote uma tentativa de ataque através de execução de comandos. Com isto, o módulo especialista identificou as palavras chaves para tal ataque e definir o grau de ocorrência para as variáveis SHELL e CMD_DOS gerando, através das funções de pertinência grau máximo para os va- 54 Figura 46: Resultado de Ataque com execução de comandos 55 lores lingüístico ALTO. Com isto, através da primeira regra fuzzy, definiu-se o valor lingüístico CERTO de posibilidade de ataque como 100%. 56 9 Trabalhos Futuros Para trabalhos futuros, propõe-se a criação de um método de aprendizagem onde, através de outros conceitos de I.A. não descritos neste documento, a ferramenta será capaz de entrar em um modo de aprendizagem, gerando seus próprios padrões e preenchendo as bases de dados com informações obtidas, de maneira a inibir a atualização constante da base de conhecimento para uma melhor adequação do sistema a um ambiente de produção. Juntamente com isto, pode-se implementar um melhor identificador dos parâmetros do protocolo HTTP, fazendo com que a ferramenta trate as variáveis HTTP de maneira distintas. Um caso em que a aplicação não é viável seria como mecanismo de proteção de um servidor web que tem como aplicação um fórum de SQL. Outra modificação interessante seria planejar um método que consiga definir as regras também seguindo a ordem de precedência das variáveis, de maneira a definir e tratar diferentemente quanto a sequência em que as mesmas aparecem no cabeçalho. Como o sistema consiste em um protótipo, inúmeras modificações e melhorias podem ser feitas. Uma dessas melhorias seria o trabalho com estrutura de dados em tabela hash para organização das variáveis, visto que como trabalhamos com busca sequêncial das variáveis perdemos em desempenho. 57 10 Conclusão Esta monografia foi desenvolvida em cima do objetivo de criar protótipo de um pré-processador para o SDI Snort. Este pré-processador tem por finalidade aumentar a inteligência deste sistema de segurança que é muito utilizado mundialmente para proteger informações, servidores, host e todos os outros componentes que possam estar ligados ao sistema de uma rede de computadores. O projeto tem como proposta, uma abordagem de analise dentro do cabeçalho da camada de Aplicação do TCP/IP, verificando possíveis ataques do tipo SQL Injection. Com esta melhor analise, podemos diminuir a incidência de falsos-positivos - que acarretam a exclusão de pacotes que não representavam perigo - e falsos-negativos - pacotes que passam como inofensivos, mas que consistem em um ataque. Ataques de SQL Injection, são muito comuns quando se fala de páginas Web. Esse problema acarreta na perda, inconsistência e roubo de informações de uma determinada organização, gerando desde problemas administrativos internos até grandes prejuízos financeiros, que podem até levar à falência. Para desenvolvimento desta estrutura inteligente de análise, foi preciso à utilização de duas vertentes da Inteligência Artificial, consistindo então em um sistema híbrido. A primeira é o Sistema Especialista e a segunda é Lógica Fuzzy. O Sistema Especialista ficou responsável por um módulo de análise, ou seja, um perito em segurança que faz um levantamento do que potencializa um ataque, e se há ocorrências explícitas ou implícitas desses pontecializadores, fazendo um relatório geral. Em segundo passo fica a Lógica Fuzzy. Nesta etapa é onde o sistema toma a decisão, ou seja, decide em declarar se um pacote é inofensivo ou um ataque e qual o grau de periculosidade. Essa decisão se dá atravez de sua base de regras. Com este Pré-Processador, tem-se uma nova ferramenta para auxiliar o Snort na identificação de SQL Injection, garantindo assim a confiabilidade da informação e a garantia de que os dados tenham um grau maior de segurança. 58 Com este trabalho, obtivemos a capacidade de modelar e implementar sistemas inteligente híbridos. Além disto, tiver a oportunidade de experimentar na prática como Engenheiros de Conhecimento atuam de maneira a fazer o processo de conversão de conhecimento tácito provindo de um especialista em conhecimento explícito para que seja possível armazená-lo e consultá-lo quando necessário para auxílio na tomada de decisão. 59 REFERÊNCIAS [1] Snort Zine 1.0. Snort Zine 1.0. 2008. URL: http://snort.org.br/index.php?option=com_content&task=view&id=38&Itemid=43. Last Visited: 22/06/2008. [2] NIST. National Institute of Standards and Technology Wikipédia, a enciclopédia livre. 2008. URL: http://pt.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology. Last Visited: 24/06/2008. [3] Equipe Snort-BR. Comunidade Snort Brasil. 2008. URL:http://snort.org.br/index.php?option=com_content&task=view&id=38&Itemid=Last Visited: 26/05/2008. [4] Snort. Snort Oficial Page. 2008. URL:http://www.snort.org/community/. Last Visited: 27/11/2008. [5] SISTEMAS Inteligentes - Fundamentos e Aplicações. [S.l.: s.n.], 2005. Manole. [6] Sistema Especialista Nebuloso Para Diagnóstico Médico. 1994. [7] NETWORK Intrusion Detection.1994. [8] L. A. Zadeh. Fuzzy Sets.1965. [9] QUALIDADE de Serviço em Rede IP Utilizando Lógica Fuzzy. 2006. São Paulo. [10] SISTEMA Especialista Nebuloso Para Diagnóstico Médico. 1997. Santa Catarina. [11] Wikipedia. Sistema de Detecção de Intrusos - Wikipédia. 2008. URL: http://pt.wikipedia.org/wiki/Sistema_de_detecção_de_intrusos. Last Visited: 26/05/2008. [12] Wikipedia. Intrusion Detection System - Wikipédia. 2008. URL: http://en.wikipedia.org/wiki/Intrusion-detection_system. Last Visited: 26/05/2008. [13] Glossário. Cartilha de Segurança ? Glossário. http://cartilha.cert.br/glossario/#i. Last Visited: 26/05/2008. 2008. URL: [14] MULTI-AGENT Framework for Intrusion Detection Systems. 2006. Penambuco. [15] Marcelo Almeida. Microsoft Invadida por SQL Injection. 2008. URL: http://br.zoneh.org/content/view/489/11/. Last Visited: 04/06/2008. [16] SecurityFocus. Últimas Vulnerabilidade de SQL Injection. 2008. URL: http://search.securityfocus.com/swsearch?query=sql+injection&sbm=bid&metaname=alldoc&s Last Visited: 23/05/2008. 60 [17] HONEYPOTS - A arte de iludir hackers. [S.l.: s.n.], 2003. Brasport. [18] Port Scan. Port Scan. 2008. URL: http://wapedia.mobi/pt/Port_scan. Last Visited: 05/06/2008. [19] Sistemas Especialistas. Sistemas Especialistas. http://www.din.uem.br/ia/especialistas/. Last Visited: 27/11/2008. 2008. URL: [21] FireWalls.com.br. Técnicas de Evasão. 2008. http://www.firewalls.com.br/files/Evasao_ITA.pdf. Last Visited: 20/05/2008. URL: [20] F. Bica R. Verdin e R. M. Vicari. Tutores inteligentes. 2006.