Cabeçalho penumbroso

Decodificação de assinatura da Web JSON: Armadilhas de verificação, confusão de chaves e explorações reais

Assinatura da Web JSON (JWS) A decodificação é o processo de análise e verificação dos componentes de um token JWS - cabeçalho, carga útil e assinatura - para extrair os dados assinados e verificar sua integridade. Em contextos de segurança e testes de penetração, a decodificação de um JWS ajuda os analistas a entender quais reivindicações estão incorporadas, detectar configurações incorretas e identificar práticas de assinatura fracas que podem levar a vulnerabilidades, como desvio de assinatura ou falsificação de token.

Este artigo explica Por que a decodificação do JWS é importanteComo decodificar e verificar assinaturas usando código real, armadilhas comuns, implicações de segurança e estratégias de defesa que você deve conhecer em 2025.

O que é JSON Web Signature (JWS)?

Assinatura da Web JSON (JWS) é um meio compacto e seguro de URL para representar uma mensagem assinada. Ele é definido em RFC 7515 e comumente usado para garantir a autenticidade e a integridade dos dados transferidos por APIs REST, logon único (SSO) e fluxos de autenticação de microsserviços.

Um token JWS típico tem a seguinte aparência:

nginx

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSJ9 . MEUCIQDh...

Cada segmento é Base64URL codificado:

  1. Cabeçalho - descreve o algoritmo e o tipo de token
  2. Carga útil (reclamações) - os dados assinados
  3. Assinatura - prova de integridade

A decodificação de um JWS sem verificar a assinatura revela reivindicações, mas somente a verificação prova que elas vieram de uma fonte confiável.

Padrão de autoridade: RFC 7515 - https://tools.ietf.org/html/rfc7515

Decodificação de assinatura da Web JSON: Armadilhas de verificação, confusão de chaves e explorações reais Penligent

Por que decodificar um JWS? Perspectivas de segurança e teste

A decodificação de um JWS tem várias finalidades:

  • Entenda as reivindicações incorporadas: Quem é o usuário? O que são permissões?
  • Identificar o algoritmo de assinatura: Algoritmos fracos (por exemplo, nenhum ou HS256 com chaves previsíveis)
  • Avaliar a integridade: Detectar tokens adulterados
  • Descobrir vulnerabilidades: Ataques de desvio de assinatura e downgrade de algoritmo

Do ponto de vista da segurança ofensiva, a descoberta de práticas fracas de assinatura do JWS pode levar a explorações em que os invasores forjam tokens e aumentam os privilégios.

Anatomia de um token JWS

Aqui está um detalhamento de um token típico:

SegmentoSignificadoExemplo
CabeçalhoAlgoritmo e metadados{ "alg": "RS256", "typ": "JWT" }
Carga útilReclamações{ "sub": "12345", "role": "admin" }
AssinaturaResumo assinadoBase64URL do cabeçalho criptografado + carga de pagamento

Um JWS decodificado mostra JSON simples para cabeçalho e carga útil:

ini

HeaderJSON = base64url_decode(part1)PayloadJSON = base64url_decode(part2)

A decodificação não prova a autenticidade, apenas a verificação da assinatura.

Decodificação simples do JWS (sem verificação)

Na triagem de segurança, muitas vezes a primeira etapa é ver o que está dentro:

Exemplo de Python (somente decodificação)

python

import base64import json def base64url_decode(input_str): rem = len(input_str) % 4 input_str += "=" * (4 - rem)return base64.urlsafe_b64decode(input_str) token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.SflKxw... "header, payload, signature = token.split('.') header_json = json.loads(base64url_decode(header)) payload_json = json.loads(base64url_decode(payload)) print("Header:", header_json)print("Payload:", payload_json)

Isso gera um JSON legível, mas não valida se a assinatura está correta.

Verificação de uma assinatura JWS (crítica para a segurança)

Para ter certeza de que o token é legítimo, você deve verificar a assinatura usando o algoritmo e a chave esperados. Veja como:

Exemplo de uso de JavaScript (Node.js) jose

javaScript

import { jwtVerify } from "jose"; const token = "eyJ..."; const publicKey = /* carregar a chave pública apropriada, por exemplo, do endpoint JWKS */; async function verifyToken() {try {const { payload } = await jwtVerify(token, publicKey);console.log("Verified payload:", payload); } catch (e) {console.error("Verification failed:", e); } } verifyToken();

Isso garante que o token foi assinado pela chave privada correta correspondente à chave pública.

Exemplo do mundo real: Decodificação de um token OAuth

Muitas APIs emitem tokens JWS para controle de acesso. A decodificação revela informações do usuário e da sessão:

json

{ "iss": "", "sub": "alice", "exp": 1700000000, "scope": "read write" }

As equipes de segurança analisam os tokens decodificados para auditar escopos e tempos de expiração.

Vulnerabilidades comuns nas implementações do JWS

Downgrade de algoritmo

Algumas bibliotecas permitem incorretamente a alteração de alg para nenhumpermitindo que os invasores contornem a verificação.

Exemplo de cabeçalho inseguro:

json

{"alg":"none","typ":"JWT"}

Defesa de ataque: Sempre rejeite tokens com alg: nenhum a menos que explicitamente seguro no contexto.

Chaves simétricas fracas (HS256)

O uso de chaves simétricas fracas ou previsíveis permite que os invasores adivinhem a chave e forjem tokens.

Mitigação:

  • Use chaves secretas fortes (≥ 256 bits)
  • Prefira algoritmos assimétricos (RS256, ES256)

Ferramentas CLI para decodificação rápida de JWS

FerramentaDescriçãoOficial
jwt.io DepuradorDecodificação e verificação baseadas na Webhttps://jwt.io
jose CLIDecodificação/verificação baseada em nóhttps://github.com/panva/jose
jwt-cliCLI multiplataformahttps://github.com/mike-engel/jwt-cli

Exemplo de decodificação da CLI:

bash

jwt decode eyJhbGciOi...

Cenário de vulnerabilidade: Falsificação de um token (prova de conceito)

Se um servidor aceitar incorretamente alg: nenhumum invasor pode forjar:

css

Cabeçalho: {"alg":"none","typ":"JWT"} Carga útil: {"sub":"attacker","role":"admin"} Assinatura: ""

Script de prova de conceito (Python):

python

import base64import json def b64url(x): return base64.urlsafe_b64encode(x).rstrip(b'=').decode() header = {"alg": "none", "typ": "JWT"} payload = {"sub": "attacker", "role": "admin"} token = f"{b64url(json.dumps(header).encode())}.{b64url(json.dumps(payload).encode())}. "print("Forged token:", token)

Defesa:

  • Rejeitar tokens onde alg é nenhum a menos que seja explicitamente seguro
  • Aplicar lista branca de algoritmos
Decodificação de assinatura da Web JSON Penligent

Por que a verificação de assinaturas é importante em 2025

Nos microsserviços modernos e nas APIs distribuídas, os tokens orientam as decisões de acesso. Uma verificação inadequada pode levar a:

  • Aumento de privilégios
  • Acesso não autorizado
  • Sequestro de sessão

Os testadores de penetração e os defensores devem ser capazes de decodificar e validar tokens de forma programática e em escala.

Detecção de verificação interrompida em APIs

Os scanners automatizados podem verificar se uma API tenta aceitar assinaturas JWS inválidas.

Pseudocódigo Python (verificação de segurança)

python

def test_broken_verification(api_url, forged_token): headers = {"Authorization": f "Bearer {forged_token}"} response = requests.get(api_url, headers=headers)return response.status_code bad_api = test_broken_verification("", forged_token)if bad_api == 200:print("Potencialmente vulnerável à falsificação do JWS")

Se a API responder com 200 OKSe o token for aceito, a lógica de aceitação do token pode ser falha.

Práticas recomendadas defensivas

DefesaDescrição
Use chaves assimétricasPrefira RS256, ES256 em vez de chaves simétricas
Aplicar a lista branca de algoritmosRejeitar valores alg inesperados
Vida útil curta do tokenMinimizar o risco de repetição
Rotação de teclasAtualize as chaves de assinatura regularmente
Bibliotecas de tokens de auditoriaMantenha as dependências atualizadas

Integração da decodificação de tokens à segurança de CI/CD

Em 2025, os pipelines de segurança geralmente validam automaticamente as práticas de JWS:

  • Linting automatizado de configurações de JWT
  • Teste de CI que rejeita bibliotecas inseguras
  • Monitoramento de tempo de execução para aceitação de token incorreto

Exemplo de snippet de script de CI (Bash):

bash

#Rejeite se algum código usar "alg: none "grep -R '"alg": *"none"' ./src && exit 1

Conceitos relacionados: JWE vs JWS

PrazoSignificado
JWSAssinatura da Web JSON (somente assinada)
JWECriptografia da Web JSON (criptografada)

O JWE protege a confidencialidade; o JWS protege a integridade e a autenticidade. Muitos sistemas usam os dois juntos.

Ferramentas e bibliotecas (pilha de segurança 2025)

  • Node.js jose - Decodificação e verificação de JWT/JWS
  • Python python-jose - Suporte flexível à criptografia
  • OpenSSL - Verificação de criptografia de baixo nível
  • jwt.io - Decodificador rápido da Web
Compartilhe a postagem:
Publicações relacionadas