Questões de Segurança em Engenharia de Software (QSES), 2018/19
Mestrado em Segurança Informática
Departamento de Ciência de Computadores
Faculdade de Ciências da Universidade do Porto
Exame de época normal – 15/01/2019
Duração: 2:30


Grupo A

Considere o Fragmento 1 de código Java abaixo, adaptado da aplicação Java Vulnerable Lab. O código relaciona-se com a apresentação do conteúdo de uma entrada na tabela de mensagens POSTS em correspondência ao “post” identificado pelo parâmetro post_id. Deve assumir que o valor do parâmetro post_id pode ser malicioso e que o conteúdo da tabela POSTS poderá também não ser seguro.

Fragmento de código 1:

String post_id = request.getParameter("post_id"); out.println("Post ID: " + post_id + "<br/>"); try { Connection db = ... ; Statement stmt = db.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM POSTS WHERE ID=" + post_id); out.println("Title: " + rs.getString("title") + "<br/>"); out.println("Posted by: " + rs.getString("user") + "<br/>"); out.println("Content: " + rs.getString("content") + "<br/>"); } catch (SQLException e) { out.println("Database error!<br/>"); e.printStackTrace(out); }

Questões:

1. [5.5 valores] Identifique as vulnerabilidades no fragmento de código, explicando para cada uma:

2. [2 valores] Explique em que consistem ataques do tipo “session hi-jacking” relacionados com o uso de “cookies” e 3 medidas no manuseamento de “cookies” que mitiguem este tipo de ataques.

Grupo B

Considere o Fragmento 2 de código em C abaixo. A função processData lê um identificador de dados id e usa-o para processar um ficheiro de dados id.txt na pasta PATH_FOR_FILES. Assuma que PATH_FOR_FILES é uma string constante definida que pode ter um tamanho arbitrário.

Fragmento de código 2:

void processData(void) { char id[32]; // id char* path; // path de um ficheiro FILE* file; // ficheiro gets(id); // lê identificador path = (char*) malloc(128); // aloca memória para path do ficheiro sprintf(path, "%s/%s.txt", PATH_FOR_FILES, id); // define path do ficheiro if (access(path, R_OK) == 0) { // testa se ficheiro pode ser lido FILE* file = fopen(path, "r"); // abre ficheiro para leitura ... // processa ficheiro de alguma forma fclose(file); // fecha ficheiro } else { printf(path); // imprime path do ficheiro printf(": file cannot be read!\n"); // imprime causa de erro } free(path); // liberta memória alocada printf("Done processing %s\n", path); // imprime mensagem final }

Questões:

1. [5.5 valores] Identifique as vulnerabilidades no fragmento de código, explicando para cada uma:

2. [2 valores] Explique os princípio básicos para materializar um “stack-smashing attack” no código e respectivas assunções. Indique e explique sucintamente também três mecanismos de protecção contra um ataque deste tipo.

Grupo C

Dê respostas claras e sucintas às seguintes perguntas.

1. [2 valores] Em relação ao uso de “fuzz testing”:

2. [1 valores] Indique uma vantagem e uma desvantagem do uso de ferramentas de análise estática face a ferramentas de “pen-testing” para validação da segurança de uma aplicação.

3. [1 valores] Em que consistem vulnerabilidades baseadas em “race conditions”?

4. [1 valores] Quais são as ideias e objectivos gerais do “security touchpoint model”?


This document was translated from LATEX by HEVEA.