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.