Padrões · FIDO CTAP 2.2 híbrido (QR de passkey)

Devo escanear este QR de login com passkey?

Somente se VOCÊ acabou de iniciar um login com passkey no dispositivo que exibe o QR. Se qualquer outra pessoa gerou o QR — um estranho, um agente de "suporte técnico", uma chamada de assistência remota — escanear com o seu celular autentica a sessão deles, não a sua. O padrão aberto do protocolo (FIDO CTAP 2.2 híbrido) é sólido; a ameaça é a engenharia social em torno de quem pressionou o botão "Entrar com uma passkey" primeiro.

Verificar um QR de passkey → Todos os padrões →

Como funciona o login com passkey entre dispositivos

Uma passkey é uma credencial — um par de chaves pública/privada — vinculada a um dos seus dispositivos. Se você cadastrou uma passkey para exemplo.com no seu celular, somente seu celular pode assinar o desafio de login para exemplo.com.

Isso funciona bem quando você está autenticando NO celular. Mas e quando você está no notebook que não tem uma passkey para aquele site? Você pode:

  1. Digitar sua senha — invalida o propósito das passkeys.
  2. Cadastrar uma nova passkey no notebook — válido, mas somente se você confiar nesse notebook a longo prazo.
  3. Usar a passkey do celular via transporte entre dispositivos — o notebook exibe um QR, seu celular o escaneia, o celular assina o desafio, o navegador do notebook recebe o resultado e você está autenticado.

A opção 3 é o que o FIDO CTAP 2.2 "híbrido" define. O QR é a inicialização — carrega informações suficientes para que o celular encontre o notebook via Bluetooth Low Energy, estabeleça um túnel seguro de uso único e faça a proxy da cerimônia WebAuthn.

O que há dentro do QR

O URI tem o seguinte aspecto:

FIDO:/0123456789012345678901234567890123456789...

Os dígitos decimais são uma codificação base10 de um mapa CBOR. Após decodificação base10 + análise CBOR, o mapa tem chaves inteiras:

Chave 0, chave pública do par

Bytes de chave pública X9.62 não comprimida (33 bytes para P-256). O celular usa isso para estabelecer o túnel criptografado.

Chave 1, segredo do QR / nonce do túnel

10 bytes de dados aleatórios. Identifica este QR específico; o anúncio BLE transmite um hash dele para que o celular encontre o notebook correto.

Chave 2, dica de operação

0 = make-credential (cadastrando nova passkey), 1 = get-assertion (login), 2 = discoverable-credential.

Chave 3, domínio do servidor de túnel

O host HTTPS que faz proxy do túnel entre os dois dispositivos quando o BLE direto não está disponível (ex.: por trás de NAT). Geralmente um servidor operado por um fornecedor como cable.ua5v.com (Google) ou cable.auth.com (Apple/MS).

Chave 4, timestamp

Segundos desde a época Unix em que o QR foi gerado. Usado para proteção contra replay — o celular recusa QRs com mais de alguns minutos.

Chave 5, flag de assistência de estado

Booleano. Indica se o notebook quer que o celular participe de manutenção passiva de estado (relevante principalmente para fluxos de enumeração de credenciais).

O modelo de ameaça: quem pressionou "Entrar com uma passkey" primeiro?

O protocolo é criptograficamente sólido. A verificação de proximidade via Bluetooth é real e limita o ataque a quem está fisicamente próximo. Então como isso dá errado?

Por engenharia social na iniciação. O atacante inicia um login com passkey na SUA conta no NOTEBOOK DELE. O notebook dele exibe um QR FIDO. Ele coloca esse QR na sua frente de alguma forma:

Se você escanear, seu celular envia a assinatura da sua passkey de volta para o navegador do notebook do atacante. O site para o qual você tem uma passkey pensa que você entrou. O atacante está agora logado na sua conta.

A verificação de proximidade não ajuda — o atacante está fisicamente presente. O conteúdo do QR não ajuda — é criptograficamente válido. O destino do login não ajuda — é o site correto para o qual você tem uma passkey. A única coisa que ajuda é reconhecer a situação: você nunca deve escanear um QR FIDO que não gerou você mesmo clicando em "Entrar" no seu próprio dispositivo.

O que nosso scanner exibe

Quando você envia um QR FIDO para o nosso scanner, o resultado mostra:

A classe de ameaça é sempre suspeito — não porque o protocolo seja falho, mas porque a avaliação de segurança é contextual e o scanner não pode saber quem pressionou "Entrar". O aviso do resultado diz exatamente isso: "escanear completa um login que ALGUÉM INICIOU EM OUTRO DISPOSITIVO. Se você mesmo não acabou de iniciar um login, recuse."

Quando é seguro (e quando não é)

Seguro: você se sentou no notebook, abriu o site do banco ou e-mail, clicou em "Entrar com uma passkey" e o notebook exibiu o QR. Você pega o celular, escaneia o QR e aprova o prompt de proximidade. Pronto.

Não seguro: qualquer pessoa que não seja você iniciou o login. Isso inclui qualquer pessoa ao telefone, em uma chamada de suporte remoto, que enviou um QR por e-mail, que mostrou um "QR para verificar sua identidade" e qualquer QR em lugar que não seja o seu próprio dispositivo recém-exibido.

Se não tiver certeza se um QR veio de um login QUE VOCÊ iniciou, cancele o login no dispositivo original (feche a aba do navegador) e recomece do zero no dispositivo que pretendia usar. QRs FIDO reais são válidos por apenas ~10 minutos — reiniciar descarta qualquer sessão em andamento e torna a ameaça impossível.

Relacionados

Inspecionar um QR FIDO

Envie a imagem ou cole o URI FIDO:. O resultado mostra a operação, o servidor de túnel, o timestamp e um aviso claro para recusar caso você não tenha iniciado o login.

Abrir scanner →