Upload Seguro de Arquivos em Aplicação Backend com Spring Boot, ClamAV e JWT

Neste artigo, veremos como criar uma aplicação backend utilizando Spring Boot, ClamAV e JWT, que visa reforçar a segurança de upload de arquivos. Para tanto, serão descritos conceitos importantes, discussão sobre alguns tipos de ataque a sessões de upload de arquivo e demonstração didática da aplicação com segurança reforçada.

[ Hits: 8.344 ]

Por: André em 16/12/2020


Tipos de ataque / Testes



Alguns tipos de ataque

Existem muitos ataques que podem ser efetuados à sessões de upload de arquivo. Abaixo, segue um levantamento com alguns incidentes de segurança que podem ocorrer, baseado nos artigos File Upload Cheat Sheet - OWASP* e Unrestricted File Upload - OWASP*:
A seguir, veremos os passos para dar build na aplicação de experimentação.

Experimentação: preparação da aplicação

Através de uma aplicação didática backend rodando com Spring Boot (Java 11) e ClamAV, serão demonstrados abaixo alguns casos de teste de uploads não confiáveis de arquivo.

Bibliotecas adicionais utilizadas:
Requisitos para build:
Passo a passo para build:

1. Clone o projeto através do link:
2. Inicie ClamAV através do comando:

# docker run -d --net=host -p 3310:3310 mkodockx/docker-clamav

3. Na raiz do projeto, execute:

# mvn spring-boot:run

Experimentação: casos de teste

A seguir, veremos os passos para executar os casos de teste.

Autenticação: passo necessário

Visando que autorização e autenticação de usuários são importantes para manter o sistema mais seguro durante sessões de upload de arquivo, o sistema didático também conta com essas funcionalidades. Portanto, é necessário que seja feita inicialmente uma autenticação. Caso contrário, a rota de upload retornará erro HTTP 401[https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status/401].

Como o sistema não conta com banco de dados, o usuário padrão é "user" e a senha é "password", tal que quaisquer outras combinações de usuário/senha resultarão em erro. Para obter o token JWT, que possui 5 horas de validade, execute:

curl -X GET http://localhost:8082/authenticate --header "Content-Type: application/json" --data '{"username":"user", "password":"password"}'

De modo que a resposta será:

{"token":"<BEARER_JWT_TOKEN>"}

Upload de arquivos grandes: desperdício de recursos

Ao submeter um arquivo pdf, cujo tamanho excede o limite suportado pelo servidor, através da seguinte requisição:

curl -i -X POST http://localhost:8082/upload --header "Authorization: <BEARER_JWT_TOKEN>" -F file=@large-pdf-file.pdf http://localhost:8082/upload

A resposta do servidor é:

{"message": "Tamanho do arquivo excede o limite definido (3MB)"}

Upload de arquivos maliciosos

Ao submeter um arquivo pdf* com um arquivo malicioso embutido (EICAR.doc*https://www.eicar.org/?page_id=3950]), através da seguinte requisição:

curl -i -X POST http://localhost:8082/upload --header "Authorization: <BEARER_JWT_TOKEN>" -F file=@42.zip http://localhost:8082/upload

A resposta do servidor é:

{"message": "Arquivo malicioso encontrado"}

Resultado do scan no VirusTotal.

Arquivo com dupla extensão

Com a requisição:

curl -i -X POST http://localhost:8082/upload --header "Authorization: <BEARER_JWT_TOKEN>" -F file=@teste.pdf.txt http://localhost:8082/upload

A resposta do servidor é:

{"message": "Arquivo com formato inválido"}

Arquivo com extensão não permitida

Ao submeter um arquivo com formato ".exe", de modo que o servidor aceita somente os formatos {.txt, .pdf}:

curl -i -X POST http://localhost:8082/upload --header "Authorization: <BEARER_JWT_TOKEN>" -F file=@teste.exe http://localhost:8082/upload

A resposta do servidor é:

{"message": "Arquivo com formato inválido"}

Limitações

A solução com ClamAV tem algumas limitações, como por exemplo, o upload do famoso Zip Bomb chamado 42.zip*. ClamAV não foi capaz de identificar o código malicioso.

Requisição:

curl -i -X POST http://localhost:8082/upload --header "Authorization: <BEARER_JWT_TOKEN>" -F file=@42.zip http://localhost:8082/upload

Resposta:

{"message":"OK"}

Conclusão

Os motores que detectaram o código malicioso podem ser verificados no VirusTotal.

Neste caso, sugere-se que antivírus mais potentes ou soluções de segurança de endpoint sejam utilizadas, a fim de reduzir a probabilidade de incidentes de segurança.

Página anterior    

Páginas do artigo
   1. Introdução
   2. Tipos de ataque / Testes
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Gerando Números Aleatórios

Manipulando erros com try catch finally

Gerando logs em Java

JABACO => Java + Visual Basic 6

JSP acessando MySQL usando JSTL e EL

  
Comentários
[1] Comentário enviado por maurixnovatrento em 16/12/2020 - 19:13h


Muito Bom.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts