
Introdução
JSON Web Tokens (JWT) são uma forma compacta, segura e independente de transmitir informações entre partes como um objeto JSON. Eles são comumente utilizados para autenticação e autorização em aplicações web e APIs (1). Este artigo irá discutir problemas de segurança associados ao uso de JWT, formas de utilização, melhores práticas e fontes relevantes, incluindo artigos científicos.
Problemas de segurança
Embora JWT seja uma solução eficiente e popular para autenticação e autorização, existem problemas de segurança que devem ser considerados. Os principais problemas incluem:
- Roubo de tokens: Se um atacante obtiver acesso a um JWT, ele pode se passar pelo usuário legítimo e ter acesso não autorizado aos recursos protegidos (2).
- Ataques de força bruta: Atacantes podem tentar adivinhar segredos usados para assinar tokens JWT, comprometendo a integridade e a confidencialidade dos dados (3).
- Vulnerabilidades de implementação: Implementações incorretas de JWT podem levar a vulnerabilidades, como a falha em verificar a assinatura do token ou o uso de algoritmos fracos para assinar tokens (4).
Formas de utilização
JWT pode ser utilizado de várias formas em aplicações web e APIs:
- Autenticação: JWT permite que servidores verifiquem a identidade dos usuários sem a necessidade de armazenar informações de sessão no lado do servidor (1). Os tokens podem ser armazenados no lado do cliente, como em cookies ou localStorage.
- Autorização: Após autenticar um usuário, JWT pode ser usado para conceder acesso a recursos específicos com base nas reivindicações (claims) contidas no token (5).
- Integração entre sistemas: JWT pode ser utilizado para transmitir informações de maneira segura entre sistemas distintos, garantindo a integridade e a autenticidade dos dados transmitidos (6).
Melhores práticas
Algumas melhores práticas para lidar com JWT incluem:
- Utilizar HTTPS: Para proteger a comunicação entre cliente e servidor e evitar o roubo de tokens, é essencial usar HTTPS (7).
- Validar a assinatura: Sempre verifique a assinatura dos tokens JWT recebidos para garantir que não foram manipulados (8).
- Evitar informações sensíveis: Não inclua informações sensíveis, como senhas, nos tokens JWT, pois eles podem ser decodificados e lidos por qualquer pessoa (9).
- Limitar a duração do token: Tokens JWT devem ter uma duração limitada para minimizar o impacto caso sejam roubados (10).
- Atualizar segredos e algoritmos regularmente: Use algoritmos fortes para assinar tokens e atualize os segredos periodicamente para reduzir o risco de ataques de força bruta (3).
O que são JWT attacks?
JWT attacks são ataques direcionados à segurança e integridade de tokens JWT (JSON Web Tokens) usados em sistemas de autenticação e autorização. Existem várias formas de ataque, e a seguir estão alguns exemplos e referências de vulnerabilidades publicadas:
- Ataque de “None” Algorithm: Nesse ataque, o invasor manipula o JWT, alterando o algoritmo de assinatura para “none”, fazendo com que o servidor aceite o token sem verificar a assinatura. Essa vulnerabilidade foi identificada e corrigida em várias bibliotecas JWT (1).
- Ataque de chave pública como segredo compartilhado: Em alguns casos, a implementação JWT pode permitir que um atacante utilize a chave pública do servidor como segredo compartilhado para assinar um token forjado. O servidor, então, aceita o token como válido, permitindo que o atacante acesse recursos protegidos. Essa vulnerabilidade foi descoberta e documentada em várias bibliotecas JWT (2).
- Roubo de tokens JWT: Se um invasor obtiver acesso a um token JWT, poderá se passar pelo usuário legítimo e ter acesso não autorizado aos recursos protegidos. Isso pode ocorrer devido a vulnerabilidades na aplicação, como Cross-Site Scripting (XSS) (3) ou exposição indevida de tokens em logs ou URLs (4).
- Ataque de força bruta: Nesse ataque, o invasor tenta adivinhar o segredo usado para assinar tokens JWT por meio de tentativa e erro. Se o segredo for descoberto, o invasor pode forjar tokens válidos e ter acesso aos recursos protegidos (5).
Referências:
- (1) Auth0. (2015). Critical vulnerabilities in JSON Web Token libraries. Auth0 Blog. https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries
- (2) Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., & Mortimore, C. (2017). JSON Web Signature (JWS). RFC 7515. https://tools.ietf.org/html/rfc7515
- (3) OWASP. (2021). Cross-site Scripting (XSS). OWASP Top Ten Project. https://owasp.org/www-project-top-ten/2017/A7_2017-Cross-Site_Scripting_(XSS)
- (4) Barth, A., Jackson, C., & Mitchell, J. C. (2008). Robust Defenses for Cross-Site Request Forgery. ACM CCS ’08. https://doi.org/10.1145/1455770.1455782
- (5) Weichselbaum, L., Spagnuolo, M., Lekies, S., & Janc, A. (2016). Protecting Users by Confining JavaScript with COWL. Proceedings of the 11th USENIX Conference on Operating Systems Design and Implementation. https://www.usenix.org/conference/osdi14/technical-sessions/presentation/weichselbaum
Fontes e artigos científicos
(1) Jones, M., Bradley, J., & Sakimura, N. (2015). JSON Web Token (JWT). RFC 7519. https://tools.ietf.org/html/rfc7519
(2) Gondree, M., & Peterson, Z. N. (2014).