Cabeçalho penumbroso

Decodificação de assinatura web json: Da análise de Base64Url às falhas de verificação do JWS no mundo real (RFC 7515 + CVE-2022-21449)

Por que a decodificação do JWS é apenas o ponto de entrada

Na arquitetura de identidade moderna, especialmente no OAuth 2.0 e no OpenID Connect, os tokens assinados são frequentemente tratados como "contêineres confiáveis" que podem ser transmitidos entre serviços. Mas para engenheiros de segurança, equipes vermelhas e pesquisadores de segurança de IA, um JWS é mais bem compreendido como uma entrada compacta e controlada por invasores que fica na interseção da criptografia e da lógica comercial. A capacidade de executar um decodificação de assinatura web json não é o objetivo; é a instrumentação que permite que você raciocine sobre o que o verificador pensa ele está validando, o que o aplicativo de fato depende para autorização e quais partes do token estão sendo tratadas como configuração em vez de dados não confiáveis.

Essa distinção é importante porque a "segurança do token" não é uma propriedade do formato do token. Ela é uma propriedade do pipeline de verificação e validação de reclamações-seleção de algoritmo, seleção de chave, verificações de emissor/audiência, declarações baseadas em tempo e, criticamente, como o código downstream usa as declarações depois de tê-las. No momento em que um sistema trata as declarações decodificadas como "verdade" antes que a verificação seja concluída (ou mesmo executada), o token deixa de ser um limite de segurança e se torna um parâmetro controlado pelo usuário.

Decodificação de assinatura web json: Da análise de Base64Url às falhas de verificação do JWS no mundo real (RFC 7515 + CVE-2022-21449)

A engenharia por trás da string: Base64url sem preenchimento

Quando as pessoas dizem "decodificar um JWS", o que elas geralmente estão fazendo é reverter uma etapa de codificação base64url. Na serialização compacta do JWS, cada um dos três segmentos é codificado em base64url, usando o alfabeto seguro para URL e, normalmente, omitindo = preenchimento. A RFC 7515 define o formato compacto e usa explicitamente BASE64URL(...) para a construção do cabeçalho e da carga útil e, em seguida, concatena com . separadores. (Editor de RFC)

A convenção "sem preenchimento" parece insignificante até que você crie ferramentas ou analise o tráfego capturado em escala. Muitas rotinas genéricas de base64 presumem que o preenchimento está presente e geram erros ou produzem resultados ambíguos quando o preenchimento está ausente. Um decodificador robusto deve readicionar o preenchimento de forma determinística e usar uma rotina de decodificação com reconhecimento de base64, caso contrário, sua análise não poderá ser reproduzida, especialmente quando estiver lidando com tokens malformados ou intencionalmente corrompidos durante o fuzzing.

JWS vs. JWT: o que cada ponto realmente significa

Um token do JWS Compact é sempre:

BASE64URL(cabeçalho) . BASE64URL(carga útil) . BASE64URL(assinatura)

Esse terceiro segmento não é "hexadecimal". É a base64url dos bytes de assinatura (ou MAC). Trate-o como opaco, a menos que esteja verificando ou fazendo triagem criptográfica.

O JWT (RFC 7519) é uma convenção de conjunto de reivindicações que é comumente transportada dentro da carga útil do JWS, e é por isso que as pessoas casualmente confundem "JWT" com "JWS". A RFC 7519 define reivindicações registradas como iss, submarino, aud, expe nbfe descreve como essas declarações são representadas como um objeto JSON. (Rastreador de dados da IETF)

Na prática, isso significa que uma etapa somente de decodificação pode lhe dizer qual é o token reivindicaçõesmas não pode lhe dizer se essas alegações são verdadeiro. A verdade só chega depois que a verificação da assinatura e a validação da reivindicação são bem-sucedidas.

decodificação de assinatura web json

O cabeçalho é a superfície de ataque: alg, garoto, jku como entradas não confiáveis

Em sistemas bem projetados, o cabeçalho do token é um metadado que ajuda o verificador a selecionar uma estratégia de verificação reconhecidamente boa. Em sistemas mal projetados, o cabeçalho se torna um canal de configuração controlado pelo invasor. É por isso que, durante uma decodificação de assinatura web jsonNo entanto, muitos profissionais se concentram primeiro no cabeçalho.

O alg é especialmente sensível porque pode influenciar o método de verificação a ser invocado. A confusão de algoritmos (também chamada de confusão de chaves) ocorre quando um invasor pode forçar o servidor a verificar um JWT usando um algoritmo diferente do pretendido pelo desenvolvedor, o que pode permitir tokens forjados sem conhecer a chave de assinatura do servidor. A Web Security Academy da PortSwigger descreve essa classe com clareza e a vincula à configuração incorreta ou ao manuseio incorreto das opções de algoritmo. (PortSwigger)

O garoto não é criptografia; é recuperação de chave. Se garoto influencia caminhos de arquivos, consultas a bancos de dados, chaves de cache ou resolvedores dinâmicos sem uma lista de permissões rigorosa, ele se torna uma superfície de injeção geral dentro do limite do gerenciamento de chaves.

O jku é ainda mais perigoso quando mal utilizado. Se um servidor buscar um JWKS de um URL especificado pelo cabeçalho do token (ou de uma variante com restrições insuficientes), o invasor poderá tentar substituir a âncora de confiança apontando o verificador para chaves controladas pelo invasor. Mesmo quando um sistema "só busca em HTTPS", a ausência de listas de permissão rigorosas, vinculação de emissor, política de cache e trilhas de auditoria transforma a recuperação de chaves em um problema de cadeia de suprimentos, e não em um problema de criptografia.

Um decodificador off-line de nível de produção em Python (somente decodificação, com segurança de preenchimento)

Os depuradores de tokens baseados na Web são convenientes, mas geralmente são uma má ideia no trabalho de segurança profissional. Os tokens podem conter identificadores confidenciais, e-mails, IDs de locatários internos ou até mesmo PII incorporadas. Você deseja ferramentas off-line e com script que sejam determinísticas e seguras em relação a entradas malformadas. A implementação abaixo intencionalmente não "verifica" nada; ela apenas decodifica o que está presente e torna observáveis os modos de falha.

importar base64
importar json
from typing import Any, Dict, Tuple, Optional

def _b64url_decode(data: str) -> bytes:
    # RFC 7515 base64url geralmente omite o preenchimento "="; restaure-o de forma determinística.
    pad = (-len(data)) % 4
    return base64.urlsafe_b64decode((data + "=" * pad).encode("ascii"))

def _parse_json(b: bytes) -> Tuple[Optional[Dict[str, Any]], Optional[str]]:
    try:
        return json.loads(b.decode("utf-8")), None
    except Exception as e:
        return None, f"{type(e).__name__}: {e}"

def jws_decode(token: str) -> Dict[str, Any]:
    parts = token.split(".")
    if len(parts) != 3:
        return {"error": "Formato compacto JWS inválido (esperava-se 3 partes).", "partes": len(partes)}

    header_b = _b64url_decode(parts[0])
    payload_b = _b64url_decode(parts[1])

    header, he = _parse_json(header_b)
    payload, pe = _parse_json(payload_b)

    out: Dict[str, Any] = {
        "header_raw": header_b.decode("utf-8", errors="replace"),
        "payload_raw": payload_b.decode("utf-8", errors="replace"),
        "signature_b64url_sample": parts[2][:16] + "..."
    }
    se o cabeçalho não for None:
        out["header"] = header
    else:
        out["header_error"] = he
    se payload não for None:
        out["payload"] = payload
    else:
        out["payload_error"] = pe
    retornar

Isso se alinha com o uso de base64url da RFC 7515 (e com o fato de que o JWS compacto foi projetado para contextos de cabeçalho de URL/HTTP), ao mesmo tempo em que oferece um comportamento estável quando o token é malformado, truncado ou intencionalmente falsificado.Editor de RFC)

A lacuna crítica: decodificação versus verificação (e o verdadeiro padrão de bug)

A falácia de segurança mais persistente em torno do JWS/JWT é confundir decodificação com verificação. A decodificação é a formatação reversível; a verificação é a validação criptográfica mais a aplicação de políticas.

Em incidentes reais, o padrão de falha comum é "use-before-verify" em vez de uma corrida literal. Um aplicativo decodifica o token, lê função, user_id, inquilinoou escopoe toma decisões de autorização antes que a verificação da assinatura e a validação da reivindicação sejam aplicadas de forma conclusiva. A orientação da OWASP sobre testes de JWT destaca como o manuseio incorreto das expectativas do algoritmo e da lógica de verificação possibilita ataques de alto impacto, incluindo a confusão entre fluxos de verificação assimétricos e simétricos. (Fundação OWASP)

Mesmo que a assinatura seja válida, um token ainda precisa de validação de reivindicação. A RFC 7519 define aud como a reivindicação de público e observa que, se o comitente que está processando o token não se identificar como um público-alvo, o token deverá ser rejeitado quando aud estiver presente. (Rastreador de dados da IETF) Isso é um lembrete de que a validade criptográfica não é equivalente à validade contextual.

Exploração avançada: além de "alg: none"

A narrativa "alg: none" é historicamente importante, mas a maioria das bibliotecas modernas a bloqueia por padrão. As falhas mais interessantes atualmente tendem a se dividir em dois grupos: falhas de implementação em provedores de criptografia e desvios lógicos complexos causados por pipelines de verificação flexíveis.

Assinaturas psíquicas (CVE-2022-21449): quando a verificação ECDSA é falsa

O CVE-2022-21449, popularizado como "Psychic Signatures", é uma grave vulnerabilidade de criptografia do Java em que a verificação de assinatura ECDSA pode ser contornada sob determinadas condições nas versões afetadas do Java (notavelmente introduzida no Java 15 e corrigida na CPU de abril de 2022). As análises enfatizam como isso enfraquece drasticamente os sistemas que dependem de assinaturas ECDSA, incluindo cenários que envolvem JWTs assinados por ECDSA ou mecanismos WebAuthn. (Neil Madden)

A lição mais importante para a segurança de tokens não é a inteligência do desvio; é a realidade operacional de que "eu escolhi o ES256" não é uma garantia. Sua versão de tempo de execução, a implementação do provedor de segurança e o estado do patch fazem parte do seu modelo de ameaças. As equipes de segurança devem tratar as "regressões do provedor de criptografia" como riscos de primeira classe, com SLAs explícitos de patches e testes de regressão que exercitam a verificação de assinaturas malformadas.

Confusão de algoritmo/confusão de chave: quando o servidor permite que o token escolha as regras

Os ataques de confusão de algoritmo ocorrem quando o verificador permite que o token influencie qual algoritmo é usado para verificação, e o manuseio da chave não é separado de forma clara entre os modos assimétrico e simétrico. O PortSwigger observa que, se esse caso não for tratado adequadamente, os invasores poderão forjar JWTs válidos contendo valores arbitrários sem conhecer a chave de assinatura secreta do servidor. (PortSwigger)

Na prática, a defesa é conceitualmente simples, mas frequentemente perdida: nunca permita a "agilidade do algoritmo" no limite em que as decisões de autenticação são tomadas. Se o seu serviço espera RS256, você aplica RS256. Você não "aceita qualquer algoritmo que esteja no cabeçalho e vê se ele é validado".

decodificação de assinatura web json

Recuperação de chaves orientada por cabeçalho: garoto/jku como cadeia de suprimentos de verificação

Quando você aceita que o cabeçalho é a entrada do invasor, também aceita que a seleção de chaves faz parte da sua superfície de ataque. A garoto deve ser mapeado para uma lista de permissões de chaves predefinida, e não para um material de chaves arbitrário obtido, carregado ou construído em tempo de execução. A jku nunca deve permitir que um token redefina de onde vêm as âncoras de confiança. Se você der suporte à obtenção de JWKS para OIDC, ela deverá ser vinculada a uma configuração de emissor confiável e reforçada com listas de permissão, armazenamento em cache e monitoramento.

Estratégias de proteção que sobrevivem ao desvio de produção

Uma abordagem de defesa em profundidade para a validação do JWS tende a parecer enfadonha no papel, mas é exatamente o que impede a maioria das falhas de token.

Você define explicitamente os algoritmos aceitos e exige que o verificador imponha que o algoritmo esperado foi usado. A orientação da OWASP sobre JWT para Java faz essa observação diretamente como uma medida preventiva. (Série OWASP Cheat Sheet)

Você valida o emissor e o público de forma consistente. As definições da RFC 7519 para reivindicações registradas não são acadêmicas; elas existem porque "assinatura válida, contexto errado" é uma classe comum de falhas. Em particular, as incompatibilidades de público são uma das maneiras mais fáceis de aceitar acidentalmente um token cunhado para um serviço diferente. (Rastreador de dados da IETF)

Você trata os IDs de chave como dados, não como uma consulta de pesquisa. A garoto deve ser resolvido por meio de um mapeamento limitado - alias de KMS, registro de chave estática ou armazenamento de chave rigidamente controlado - e não por um caminho de sistema de arquivos ou uma consulta de banco de dados criada a partir de entrada não confiável.

Você corrige os tempos de execução de criptografia de forma agressiva e testa contra classes catastróficas conhecidas. O CVE-2022-21449 existe como um lembrete de que a "escolha correta do algoritmo" não pode compensar implementações de verificação falhas. (Neil Madden)

Você monitora anomalias que indicam sondagem ativa. Grandes volumes de erros de preenchimento de base64url, tokens inválidos repetidos ou alta rotatividade em garoto podem indicar tentativas contínuas de fuzzing ou confusão. O monitoramento não corrigirá o bug, mas pode reduzir o tempo de detecção e ajudá-lo a correlacionar a atividade suspeita com endpoints e verificadores específicos.

Automatizando a auditoria da lógica de verificação: onde a Penligent pode se encaixar

Em ambientes reais, a parte difícil não é decodificar um token uma vez. É descobrir onde os tokens são aceitos, identificar quais serviços aplicam quais regras de verificação e provar se a autorização downstream depende de declarações decodificadas prematuramente. Esse ciclo "decodificar → interpretar → mutar → validar o impacto" é repetitivo e é exatamente o tipo de trabalho que as modernas plataformas de segurança assistidas por IA podem ajudar a industrializar.

Uma plataforma como a Penligent pode ser posicionada de forma confiável como uma camada de automação para testes centrados em tokens: ela pode executar decodificação off-line para classificar tokens e extrair campos de alto sinal (emissor, público, escopos, funções), inferir pilhas de verificação prováveis a partir do comportamento de resposta e das impressões digitais do serviço e, em seguida, testar sistematicamente falhas na lista de permissão de algoritmos de desvio de política, aplicação inconsistente de emissor/audiência em microsserviços e padrões de seleção de chave inseguros. O valor não são os "tokens mágicos de quebra", mas a geração repetível de evidências e as verificações contínuas de regressão que detectam regressões sutis de verificação antes de serem lançadas.

Se você tratar a verificação do JWS como um limite de API crítico para a segurança, um fluxo de trabalho orientado por IA será mais eficiente quando ajudar a garantir que esse limite permaneça consistente entre versões, ambientes e proprietários de serviços.

Da análise de Base64Url às falhas de verificação do JWS no mundo real (RFC 7515 + CVE-2022-21449)

Conclusão

O comando para decodificação de assinatura web json é a linha de partida, não a linha de chegada. A decodificação proporciona observabilidade, mas a segurança vem da verificação rigorosa e da validação de declarações, do gerenciamento disciplinado de chaves e da higiene resiliente do tempo de execução.

De falhas catastróficas de provedores de criptografia, como "Psychic Signatures" (CVE-2022-21449), à confusão de algoritmos e aos riscos da cadeia de suprimentos de chaves orientadas por cabeçalho, a segurança do JWS é uma propriedade do sistema. As equipes que combinam análise manual cuidadosa com automação que detecta desvios de verificação podem manter suas camadas de autenticação robustas, mesmo com a evolução dos ecossistemas e o surgimento de novos modos de falha.

Recursos confiáveis e leitura adicional

RFC 7515: Assinatura da Web JSON (JWS). (Editor de RFC)
RFC 7519: JSON Web Token (JWT). (Rastreador de dados da IETF)
PortSwigger: Ataques de confusão de algoritmos. (PortSwigger)
OWASP WSTG: testando tokens da Web JSON (Fundação OWASP)
Folha de dicas da OWASP: JSON Web Token para Java. (Série OWASP Cheat Sheet)
Neil Madden: Psychic Signatures in Java (Assinaturas psíquicas em Java). (Neil Madden)
Análise do JFrog do CVE-2022-21449. (JFrog)
Explicação criptomática do CVE-2022-21449. (Criptomatismo)

Compartilhe a postagem:
Publicações relacionadas