Skip to content

Commit

Permalink
Merge pull request #34 from DInacio02/PR/UC5-UC15
Browse files Browse the repository at this point in the history
Pr/uc5 uc15
  • Loading branch information
BrunoCunha-19 authored Jun 9, 2024
2 parents e429928 + bac9558 commit 6b0aa27
Show file tree
Hide file tree
Showing 46 changed files with 474 additions and 31 deletions.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,88 @@ So that I can easily search for the product I want to buy

- **Injeção de Código Malicioso:**

1. ASVS 5.3.3: Verificar se a saída é corretamente codificada para prevenir ataques de XSS refletidos, armazenados e baseados em DOM.
ASVS 5.3.3: Verificar se a saída é corretamente codificada para prevenir ataques de XSS refletidos, armazenados e baseados em DOM.

- **Ataques de Sobrecarga:**

1. ASVS 8.1.4: Verificar se a aplicação pode detetar e alertar sobre números anormais de solicitações, como por IP, utilizador, total por hora ou dia, ou o que faz sentido para o aplicativo.
ASVS 8.1.4: Verificar se a aplicação pode detetar e alertar sobre números anormais de solicitações, como por IP, utilizador, total por hora ou dia, ou o que faz sentido para o aplicativo.

**Nota:** Para cada caso de abuso foi analisado qual o ASVS que melhor se relaciona com o caso de abuso, tendo em conta que com a implementação deste, outros ASVS são também abordados.
Este estudo foi feito no Excel a entregar.

## Implementação da UC

Esta UC já se encontra desenvolvida. Apenas a aplicação dos ASVS foram necessários.

## Implementação dos ASVS
## Implementação dos ASVS

### ASVS 5.3.3

O ASVS 5.3.3 exige que a saída seja corretamente codificada para prevenir ataques de XSS refletidos, armazenados e baseados em DOM.
Assim, existe dois pontos importantes a considerar para garantir o ASVS 5.3.3:

#### 1. Validação de Entrada:

Quando o utilizador filtra a lista de produtos utilizando a barra de pesquisa, a informação escrita na barra de pesquisa é enviada para
o endpoint "api/public/product/search" do "resource_server".

![searchbar.png](img%2Fsearchbar.png)

![endpointcall.png](img%2Fendpointcall.png)

O "resource_server" é responsável por encontrar os produtos que contenham o texto pesquisado e enviar de volta para o frontend (client).

Para garantir a validação de entrada, a informação enviada do frontend para o backend deve ser sanitizada no momento de recebimento para garantir que não contenha caracteres maliciosos:

![validacao.png](img%2Fvalidacao.png)

Ao adicionar esta validação realizada pelo Encoder, da biblioteca OWASP Java Encoder, garantimos a sanitização da entrada fornecida pelo utilizador.
</br>
</br>
#### 2. Codificação de Saída:

Como é possível observar ao utilizar a aplicação, toda a pesquisa feita na barra de pesquisa é envaida no url para o backend,
o que pode constituir um perigo de ataques XSS.

No entanto, o front-end tem implementado no processo de envio de pedidos https uma verificação para este tipo de ataques, bloqueando a pesquisa,
e reencaminhando o pedido para uma página de erro default definida na aplicação:

![pagDeErro.png](img%2FpagDeErro.png)

Para além disso, todas as respostas do backend que devolvam um objeto de Produto a ser mostrado na UI (ProductResponse) são corretamente codificadas antes de serem renderizada no front-end.

O código Angular já está estruturado para prevenir XSS, pois limpa automaticamente os caracteres perigosos ao usar interpolação ( {{}} ).

Ex:
![exDeInterpolacao.png](img%2FexDeInterpolacao.png)
</br>
</br>
</br>

### ASVS 8.1.4

Para implementar o ASVS 8.1.4 na aplicação, foi criado o componente RateLimiterInterceptor, responsável por controlar a quantidade de solicitações recebidas por IP.

![interceptor.png](img%2Finterceptor.png)

Este componente verifica cada pedido recebido do frontend e analisa quantas vezes este foi feito pelo
IP que o está a executar. Caso esse pedido exceda um número predefinido de vezes que foi executado por tempo,
o IP é bloqueado de executar esse pedido por um tempo também predefinido, prevenindo assim ataques de sobrecarga (DoS).

Para efeitos demonstrativos, o intercetor foi configurado para bloquear um IP de fazer pedidos durante 1 minuto após
executar 10x o mesmo pedido. No entanto, este número deve ser ajustado conforme o endpoint e a quantidade de pedidos
espectáveis para a aplicação.

![interceptorConfigs.png](img%2FinterceptorConfigs.png)

Junto com o componente RateLimiterInterceptor foi adicionado ao sistema um compoennte de configuração WebMvcConfig, que define
quais os endpoints que o intercetor deve monitorar.

![config.png](img%2Fconfig.png)

Assim, caso o utilizador execute mais de dez pesquisas por produtos na barra de pesquisa no perioido de 1 minuto, ele ficará bloquado durante 1 minuto de utilizar a aplicação:

![tooManyReq.png](img%2FtooManyReq.png)

Com estas implementações (configurando adequandamente os tresholds de número máximo de pedidos por tempo),
a aplicação é capaz de detectar e alertar sobre números anormais de solicitações, atendendo ao requisito do ASVS 8.1.4 e protegendo a aplicação contra ataques de sobrecarga (DoS).
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,28 @@ So that I can easily change it if needed

## ASVS Associados

1. ASVS 4.3.1: Verificar se as interfaces administrativas utilizam a autenticação multifactor adequada para evitar a utilização não autorizada.
ASVS 4.3.1: Verificar se as interfaces administrativas utilizam a autenticação multifactor adequada para evitar a utilização não autorizada.

**Nota:** Para cada caso de abuso foi analisado qual o ASVS que melhor se relaciona com o caso de abuso, tendo em conta que com a implementação deste, outros ASVS são também abordados.
Este estudo foi feito no Excel a entregar.


## Implementação da UC

Esta UC já se encontra desenvolvida. Apenas a aplicação dos ASVS foram necessários.

## Implementação dos ASVS


### 4.3.1
Para a implementação desta ASVS o grupo pensou em implementar uma funcionalidade extra no processo de update das informações, que fornecesse uma
autenticação de dois fatores através do envio de um email para o utilizador.

O objetivo seria a aplicação emviar um código por email, no momento em que o utilziador clicasse no butão "Update", para ele introduzir na aplicação,
e validar a sua identidade.

![popup.png](img%2Fpopup.png)

Esta validação, que constitui uma validação multifator, iria implementar com sucesso o ASVS 4.3.1.
No entanto, apesar dos esforços, a equipa não conseguiu terminar esta implementação.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Implementação - Caso de Uso "Criar uma conta com os meus credenciais"
# Implementação - Caso de Uso "Criar uma conta com as minhas credenciais"

## Descrição do Caso de Uso

Expand All @@ -17,25 +17,88 @@ vulnerabilidades de XSS, para comprometer a segurança do sistema ou obter acess
de criação de conta (POST) de forma maliciosa, causando uma negação de serviço/aumento do tempo de resposta temporária
para os utilizadores legítimos.

- **Interceção de pedidos:** Um atacante pode intercetar pedidos de criação de conta e guardar os credenciais do utilizador,
- **Interceção de pedidos:** Um atacante pode intercetar pedidos de criação de conta e guardar as credenciais do utilizador,
podendo aceder a informação sensível.

## ASVS Associados

- **Injeção de Código Malicioso:**

1. ASVS 5.3.3: Verificar que a aplicação, de preferência de forma automática ou, em último caso, manual, efetua a escape adequada de saída para proteger contra XSS refletido, armazenado e baseado em DOM.
ASVS 5.3.3: Verificar que a aplicação, de preferência de forma automática ou, em último caso, manual, efetua a escape adequada de saída para proteger contra XSS refletido, armazenado e baseado em DOM.

- **Ataques de Sobrecarga:**

1. ASVS 8.1.4: Verify the application can detect and alert on abnormal numbers of requests, such as by IP, user, total per hour or day, or whatever makes sense for the application.
ASVS 8.1.4: Verificar se a aplicação pode detetar e alertar para números anormais de pedidos, como por IP, utilizador, total por hora ou dia, ou o que fizer sentido para a aplicação.

- **Interceção de pedidos:**

1. ASVS 5.3.8: Verify that the application protects against OS command injection and that operating system calls use parameterized OS queries or use contextual command line output encoding.
ASVS 9.1.1: Verificar se todas as credenciais, tokens de autenticação e informações sensíveis são transportadas apenas através de um canal criptografado (TLS).

**Nota:** Para cada caso de abuso foi analisado qual o ASVS que melhor se relaciona com o caso de abuso, tendo em conta que com a implementação deste, outros ASVS são também abordados.
Este estudo foi feito no Excel a entregar.

## Implementação da UC

Esta UC já se encontra desenvolvida. Apenas a aplicação dos ASVS foram necessários.

## Implementação dos ASVS
## Implementação dos ASVS

### ASVS 5.3.3

No momento em que o utilizador introduz um e-mail é feito primeiro uma validação desse texto introduzido
utilizando uma gramática que valida se o texto tem o formato de um e-mail:

![passwordGrammar.png](img%2FpasswordGrammar.png)

Caso o texto introduzido não tenha o formato de e-mails, não lhe é permitida a sumbissão, e uma mensagem de erro é mostrada.

![error.png](img%2Ferror.png)

Quanto à Pasword, está não é validada no front-end, mas sim no back-end, através da utilização
do Encoder, da biblioteca OWASP Java Encoder, que faz a sanitização tanto do email como a password.

![ecoder.png](img%2Fecoder.png)

Assim, mesmo que utilizador tente inserir código malicioso na Password, este é validado.

![error2.png](img%2Ferror2.png)

Além disso, todos os e-mails e senhas são apenas armazenados na base de dados e nunca são exibidos na UI, o que ajuda a proteger a aplicação.
No entanto, a proteção contra XSS refletido, armazenado e baseado em DOM é garantida principalmente pelas medidas de sanitização e validação implementadas tanto no front-end quanto no back-end, estando assim de acordo com o ASVS 5.3.3.
</br>
</br>
### ASVS 8.1.4

Tal como já foi descrito no [Use Case 3 - Implementação.md](..%2FUse%20Case%203%2FUse%20Case%203%20-%20Implementa%E7%E3o.md),
para implementar o ASVS 8.1.4 na aplicação, foi criado o componente RateLimiterInterceptor, responsável por controlar a quantidade de solicitações recebidas por IP.

Para permitir que aplicacão seja capaz de detectar e alertar sobre números anormais de solicitações, basta
adicionar o endpoint que é chamado no momento do registo ("/account/registration"), ao ficheiro de configuração
que define quais os endpoints que deve ser monitorados pelo interceptor:

![interceptor.png](img%2Finterceptor.png)

Assim, se um utilizador tentar enviar demasiados pedidos o seu IP irá ficar bloqueado durante o periodo de tempo configurado.

![tooManyRequests.png](img%2FtooManyRequests.png)
</br>
</br>
### ASVS 9.1.1

Embora a implementação de um canal criptografado (TLS) para transportar informações sensíveis não previna a interceção
de pedidos, é capaz de proteger as mensagens de maneira que, mesmo que um atacante consiga interceptar essas mensagens, ele não consiga lê-las ou desencriptá-las.

Assim, se todas as comunicações realizadas entre cliente e servidor forem comunicações via HTTPS com certificado TLS, podemos garantir que este caso de abuso, assim
como qualquer caso de abuso associado a interceção de mensgaens, está mitigado.

Posto isto, a equipa implementou a comunicação baseada em HTTPS com certificado TLS para todas as
comunicações entre cliente e servidor.

![https.png](img%2Fhttps.png)

Deste modo, toda a informação sensível enviada para o endpoint de criação de conta ("api/public/account/registration") está protegida.

![httpsRegister.png](img%2FhttpsRegister.png)



Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,30 @@ So that I can use the application

- **Forçar entrada por tentativa e erro:**

1. ASVS 2.2.1: Verificar se a aplicação bloqueia uma conta de utilizador após um número especificado de tentativas de autenticação malsucedidas dentro de um período de tempo especificado.
ASVS 2.2.1: Verificar se a aplicação bloqueia uma conta de utilizador após um número especificado de tentativas de autenticação malsucedidas dentro de um período de tempo especificado.

**Nota:** Para cada caso de abuso foi analisado qual o ASVS que melhor se relaciona com o caso de abuso, tendo em conta que com a implementação deste, outros ASVS são também abordados.
Este estudo foi feito no Excel a entregar.

## Implementação da UC

Esta UC já se encontra desenvolvida. Apenas a aplicação dos ASVS foram necessários.

## Implementação dos ASVS
## Implementação dos ASVS

### ASVS 2.2.1

Para a implemtação desta ASVS na aplicação, podemos reutilizar o componente RateLimiterInterceptor, introduzido no [Use Case 3 - Implementação.md](..%2FUse%20Case%203%2FUse%20Case%203%20-%20Implementa%E7%E3o.md),
responsável por controlar a quantidade de solicitações recebidas por IP para o "resource_serever".

Embora este componente tenha sido desenvolvido com a finalidade de assegurar o ASVS 8.1.4, ele é
também capaz de assegurar o ASVS 2.2.1 pois consegue bloquear o IP de um utilizador
após um número especificado de tentativas de autenticação malsucedidas num período de tempo especificado.

Posto isto, o RateLimiterInterceptor foi implementado no componente de autenticação da aplicação
"authorization_server".

Assim, basta configuarar o intercetor com o número de pedidos/tempo desejado para permitir mitigar
tentativas de login por bruteforce.

![bruteforce.png](img%2Fbruteforce.png)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,73 @@ possa ser confundido com o de recuperação de palavra-passe para um ataque de p

- **Ataques de Sobrecarga:**

1. ASVS 8.1.4: Verificar se a aplicação pode detetar e alertar sobre um número anormal de pedidos, como por IP, utilizador, total por hora ou dia, ou qualquer que seja sensato para a aplicação.
ASVS 8.1.4: Verificar se a aplicação pode detetar e alertar sobre um número anormal de pedidos, como por IP, utilizador, total por hora ou dia, ou qualquer que seja sensato para a aplicação.

- **Injeção de Código Malicioso:**

1. ASVS 5.3.3: Verificar que a aplicação, de preferência de forma automática ou, em último caso, manual, efetua a escape adequada de saída para proteger contra XSS refletido, armazenado e baseado em DOM.
ASVS 5.3.3: Verificar que a aplicação, de preferência de forma automática ou, em último caso, manual, efetua a escape adequada de saída para proteger contra XSS refletido, armazenado e baseado em DOM.

- **Interceção de pedidos:**

1. ASVS 9.1.1: Verificar se todas as credenciais, tokens de autenticação e informações sensíveis são transportadas apenas através de um canal criptografado (TLS).
ASVS 9.1.1: Verificar se todas as credenciais, tokens de autenticação e informações sensíveis são transportadas apenas através de um canal criptografado (TLS).

**Nota:** Para cada caso de abuso foi analisado qual o ASVS que melhor se relaciona com o caso de abuso, tendo em conta que com a implementação deste, outros ASVS são também abordados.
Este estudo foi feito no Excel a entregar.


## Implementação da UC

Esta UC já se encontra desenvolvida. Apenas a aplicação dos ASVS foram necessários.

## Implementação dos ASVS
## Implementação dos ASVS

### ASVS 8.1.4

Tal como já foi descrito no [Use Case 3 - Implementação.md](..%2FUse%20Case%203%2FUse%20Case%203%20-%20Implementa%E7%E3o.md) e [Use Case 7 - Implementação.md](..%2FUse%20Case%207%2FUse%20Case%207%20-%20Implementa%E7%E3o.md),
para implementar o ASVS 8.1.4 na aplicação, foi criado o componente RateLimiterInterceptor, responsável por controlar a quantidade de solicitações recebidas por IP.

Para permitir que aplicacão seja capaz de detectar e alertar sobre números anormais de solicitações, basta
adicionar o endpoint que é chamado no momento em que é feito o pedido de recuperação de password ("/account/password/forgot"), ao ficheiro de configuração
que define quais os endpoints que deve ser monitorados pelo interceptor:

![interceptor.png](img%2Finterceptor.png)

Desta forma, se um utilizador tentar enviar demasiados pedidos o seu IP irá ficar bloqueado durante o periodo de tempo configurado.

![tooMany.png](img%2FtooMany.png)
</br>
</br>

### ASVS 5.3.3

Tal como na implementação feita no [Use Case 7 - Implementação.md](..%2FUse%20Case%207%2FUse%20Case%207%20-%20Implementa%E7%E3o.md), no momento em que o utilizador introduz um e-mail
é feito primeiro uma validação do texto introduzido utilizando uma gramática que valida se o texto tem o formato de um e-mail:

![passwordGrammar.png](img%2FpasswordGrammar.png)

Caso o texto introduzido não tenha o formato de e-mail, não lhe é permitida a sumbissão, e uma mensagem de erro é mostrada.

![error.png](img%2Ferror.png)


Além disso, todos os e-mails e senhas são apenas armazenados na base de dados e nunca são exibidos na UI, o que ajuda a proteger a aplicação.
No entanto, a proteção contra XSS refletido, armazenado e baseado em DOM é garantida principalmente pelas medidas de sanitização e validação implementadas tanto no front-end quanto no back-end, estando assim de acordo com o ASVS 5.3.3.
</br>
</br>

### ASVS 9.1.1

Embora a implementação de um canal criptografado (TLS) para transportar informações sensíveis não previna a interceção
de pedidos, é capaz de proteger as mensagens de maneira que, mesmo que um atacante consiga interceptar essas mensagens, ele não consiga lê-las ou desencriptá-las.

Assim, se todas as comunicações realizadas entre cliente e servidor forem comunicações via HTTPS com certificado TLS, podemos garantir que este caso de abuso, assim
como qualquer caso de abuso associado a interceção de mensgaens, está mitigado.

Posto isto, a equipa implementou a comunicação baseada em HTTPS com certificado TLS para todas as
comunicações entre cliente e servidor.

![https.png](img%2Fhttps.png)

Deste modo, toda a informação sensível enviada para o endpoint de esquecimento de password (/api/public/password/forgot") está protegida.

![httpsCall.png](img%2FhttpsCall.png)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.commerce.oauth.config;

import com.commerce.oauth.filter.RateLimitFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
Expand All @@ -14,6 +15,9 @@
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import javax.servlet.Filter;

@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER)
Expand All @@ -26,6 +30,9 @@ public class ServerSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PasswordEncoder userPasswordEncoder;

@Autowired
private RateLimitFilter rateLimitFilter;

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
Expand All @@ -39,11 +46,11 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception {

@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.POST, "/ouath/token").permitAll()
http.addFilterBefore(rateLimitFilter, UsernamePasswordAuthenticationFilter.class) // Adiciona o filtro antes do filtro de autenticação
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/oauth/token").permitAll()
.anyRequest().authenticated()
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler())
.and().csrf().disable();
}

}
}
Loading

0 comments on commit 6b0aa27

Please sign in to comment.