Centro de Documentação da PJ
Monografia

CD336
MARTINS, Jorge Mota
Code privacy in detection of web vulnerabilities [Recurso eletrónico] / Jorge Mota Martins.- Lisboa : [s.n.], 2023.- 1 CD-ROM ; 12 cm
Tese de mestrado em Engenharia Informática, apresentada à Faculdade de Ciências da Universidade de Lisboa, tendo como orientadores Ibéria Vitória de Sousa Medeiros e Bernardo Luís da Silva Ferreira. Ficheiro de 1,26 MB em formato PDF (82 p.).


INTERNET, SEGURANÇA INFORMÁTICA, PROTECÇÃO E SEGURANÇA DE DADOS, PROTECÇÃO DE SOFTWARE, CRIPTOGRAFIA, CÓDIGO, CONFIDENCIALIDADE, TESE

Cada vez mais a Internet esta presente na nossa vida e cada vez mais estamos dependentes das aplicações web acessíveis através dela. Estas aplicações são usadas para realizar inúmeras tarefas no nosso dia-a-dia, seja para assuntos pessoais, como troca de mensagens, encomendar artigos online, ou mesmo para assuntos profissionais, como sistemas usados para o funcionamento de certa empresas. Não obstante a estas tarefas, também as infraestruturas críticas, tais como instituições bancárias, utilizam aplicações web na execução das suas tarefas, muitas delas críticas quanto a integridade e confidencialidade (ou privacidade) dos dados que manuseiam. Por tal, é visível a importância deste tipo de aplicações. Em grande parte dos casos, durante o desenvolvimento destas aplicações, as empresas e os programadores responsáveis pela sua criação focam-se maioritariamente na implementação das funcionalidades que estas devem oferecer, e, devido a isto, muito aspectos de segurança podem passar despercebidos e ser descurados, deixando o código destas aplicações com possíveis vulnerabilidades. Estas vulnerabilidades podem então ser exploradas por um atacante, levando a acessos indevidos, fuga de informação sensível, negação de serviço, entre outros. Apesar destes riscos, as empresas que desenvolvem software não têm como foco a implementação de mecanismos de segurança, porque adicionar mecanismos que evitam estas vulnerabilidades no normal processo de desenvolvimento de software tem um custo acrescido, e, portanto, é necessário fazer um balanceamento entre mais funcionalidades (algo que melhora a experiência do utilizador da aplicação) ou melhorias na segurança (algo que o utilizador não nota, mas que evita um maior descontentamento no futuro, caso uma vulnerabilidade seja explorada). Para que seja mais apetecível a estas empresas melhorar os aspetos de segurança das aplicações que desenvolvem, estas devem empregar mecanismos de segurança que não tenham elevado custo monetário e não sejam difíceis de utilizar pelos indivíduos envolvidos no desenvolvimento, mas, por outro lado, serem fáceis de integrar nos ciclos de desenvolvimento de software normalmente usados neste tipo de empresas. Caso os mecanismos, tais como as ferramentas de deteção de vulnerabilidades, cumpram estes requisitos, e muito provável que as empresas de desenvolvimento de aplicações web as usem, o que leva a uma diminuição de vulnerabilidades presentes no produto final. Uma das linguagens de programação mais comuns no desenvolvimento de aplicações web e o PHP, que segundo o W3techs e usada em cerca de 78.2% das aplicações web existentes na Internet. O PHP é uma linguagem insegura, significando que caso os programadores não utilizem mecanismos capazes de tratar e/ou validar dados recebidos de um utilizador, estes dados podem ser usados de forma maliciosa e se utilizados como argumento numa função sensível do PHP (i.e., uma função suscetível de ter um comportamento erróneo) podem despoletar uma vulnerabilidade. Devido a isto, a classe de vulnerabilidades mais comuns em aplicações escritas em PHP são vulnerabilidades de validação de input, tais como cross-site scripting (XSS) e injeção de SQL (SQLi). Para mitigar estas vulnerabilidades, quaisquer dados recebidos de um utilizador devem ser tratados de modo a invalidar meta caracteres maliciosos que podem, por exemplo, alterar o significado final de uma consulta de SQL ou levar a que esse input seja tratado como um script. Devido a isto, é importante encontrar locais onde os dados provenientes de um utilizador não são sanitizados, e se dados não sanitizados chegam a uma função vulnerável. Ferramentas de análise estática são bastante comuns para detetar vulnerabilidades, sendo que verificam o código fonte ou código binário da aplicação sem o executarem. Um subtipo de análise estática e análise de comprometimento (taint analysis), e baseia-se em seguir o percurso feito por dados recebidos de uma fonte não confiável e caso estes dados atinjam uma função sensível antes de serem sanitizados para esse efeito, é lançado o alerta de que foi encontrada uma vulnerabilidade. Estas ferramentas irão procurar vulnerabilidades sobre todo o código e gerar um relatório para os desenvolvedores, que devem, então, verificar manualmente as partes do código que geraram o alerta e, se realmente existir uma vulnerabilidade, (i.e., a ferramenta não relatou um falso positivo) corrigi-la. No entanto, da mesma forma que o desenvolvedor da aplicação consegue fazer esta análise, também um atacante que ganhe acesso ao código fonte consegue fazê-la, descobrindo vulnerabilidades, não para as corrigir, mas sim para as explorar. Isto demonstra a necessidade de proteger o código com criptografia, evitando que seja possível a entidades não autorizadas fazer a análise do código. Apesar disto, cifrar o código torna impossível a ferramentas tradicionais de análise estática procurar vulnerabilidades, visto que estas não são capazes de analisar código cifrado. Esta dissertação tem como objetivos cifrar o código fonte de aplicações web escritas em PHP de modo a protegê-lo de atacantes, desenvolver uma estrutura de dados capaz de guardar este código cifrado mantendo todo o contexto necessário para a descoberta de vulnerabilidades e, finalmente, fazer a procura de vulnerabilidades nesse código cifrado. Para atingir estes objetivos, foi desenvolvida uma solução que combina análise de comprometimento e criptografia simétrica pesquisável para cifrar código e descobrir vulnerabilidades XSS e SQLi sobre esse código cifrado. A solução implementada está dividida em vários módulos. Inicialmente recorremos a um Lexer que processa o código fonte e o divide em LexToken. O Lexer comunica com uma base de dados que contém informação relacionada com vulnerabilidades, i.e., entry points, funções sensíveis e funções de sanitização de input, de modo a gerar tokens específicos para estas partes do código facilitando a procura de vulnerabilidades. Após a execução do Lexer, estes LexTokens serão enviados para o Translator que irá remover toda a informação desnecessária para a procura de vulnerabilidades e adicionar certos dados que irão facilitar essa procura. Este Translator irá gerar a partir disto uma ITL (intermediate token language) que será recebida pelo Relationship Finder. O Relationship Finder é responsável, após receber a ITL, de descobrir as relações entre dados aí presentes e de guardar os tokens na estrutura de dados que desenhamos para guardar o código, de forma a manter essas relações para que não se perca o data flow do programa. Antes dos tokens serem guardados pelo Relationship Finder na estrutura de dados, estes serão primeiro cifrados pelo Encryptor, para manter a privacidade do código. Depois dos tokens estarem cifrados e guardados na estrutura de dados, o código está pronto para a descoberta de vulnerabilidades. A estrutura de dados é relativamente simples. E uma coleção de pares <chave, valor> onde a chave e um token e o valor e outro token com o qual o primeiro está relacionado. Deste modo sabemos que existiu fluxo de dados (data flow) entre este dois tokens, o que nos irá permitir propagar a taintedness dos dados durante a procura. O último módulo do sistema é o Vulnerability Detector. Este módulo recebe uma query de um desenvolvedor que quer procurar vulnerabilidades, que indica o tipo de vulnerabilidade que este pretende procurar, bem como certo tokens cifrados necessário para iniciar e terminar a procura. Depois da query ser recebida, o Vulnerability Detector irá, através de searchable symmetric encryption fazer queries a estrutura de dados e receber respostas que serão então usadas como a nova query a base de dados, simulando o fluxo de dados path do programa. Desta forma conseguimos seguir dados provenientes de um input de um utilizador e verificar se este atinge uma função sensível sem ser tratado pelo caminho, gerando então uma vulnerabilidade, ou se é tornado seguro pelo caminho, sendo completamente seguro a partir desse momento. A solução foi validada através de testes realizados sobre sete aplicações web. Os resultados não só demonstram que a solução é capaz de encontrar vulnerabilidades XSS e SQLi em código PHP mas também que o faz com maior precisão que outras ferramentas e que o tempo gasto a fazer a procura sobre código cifrado não é muito superior a quando a procura é feita sobre código fonte. Além disso os resultados também mostram que o código cifrado ocupa menos espaço em disco do que o código fonte.