Symfony 8.2 prepara provas de método para reautenticação

Uma sessão válida diz que o usuário passou por algum processo de autenticação. Ela não explica se isso aconteceu há trinta segundos ou há três semanas, nem se a pessoa usou senha, código temporário ou uma chave protegida por hardware.

O Symfony 8.2, ainda em desenvolvimento, prepara uma API para guardar essas duas informações. Os tokens de segurança poderão registrar qual método foi comprovado e quando ele foi usado pela última vez. A aplicação passa a ter dados para exigir uma autenticação mais recente ou mais forte antes de uma operação sensível.

A sessão passa a carregar provas de autenticação

Os nomes dos métodos seguem o vocabulário do RFC 8176. Entre os valores padronizados estão pwd para senha, otp para código de uso único e hwk para prova de posse de uma chave protegida por hardware.

Os autenticadores nativos de formulário, JSON e HTTP Basic registram o método de senha. No autenticador OpenID Connect, o Symfony aproveita o claim amr recebido no ID Token. Autenticadores próprios podem adicionar um AuthenticationMethodBadge ao Passport para informar o método que realmente verificaram.

new AuthenticationMethodBadge(
    AuthenticationMethod::HARDWARE_KEY,
)

Se a mesma pessoa comprovar métodos diferentes ao longo da sessão, o token mantém as provas anteriores. O método getAuthenticationProofs() devolve um mapa em que cada método aponta para o instante de sua última utilização.

[
    'pwd' => 1789140200,
    'hwk' => 1789140260,
]

Isso permite distinguir duas perguntas que costumavam aparecer misturadas: “essa sessão ainda vale?” e “essa sessão possui uma prova adequada para esta ação?”. Ler uma fatura pode aceitar a sessão atual. Alterar a chave de recuperação ou autorizar uma transferência pode exigir uma chave de segurança usada nos últimos minutos.

Negar o acesso pode iniciar uma reautenticação

A nova integração trabalha com o modo sudo apresentado no Symfony 8.2. Em vez de simplesmente devolver um erro 403 quando falta uma prova, um voter pode chamar requestReAuthentication(). O fluxo de segurança recebe a informação de que o usuário precisa comprovar novamente sua identidade.

A política continua sendo responsabilidade da aplicação. O framework fornece os registros e o mecanismo de reautenticação, mas não decide sozinho quais operações são críticas, quanto tempo uma prova deve valer ou quais métodos atendem a cada risco.

OpenID Connect separa o método pedido do método entregue

Quando a autenticação acontece em um provedor OpenID Connect, a aplicação pode usar acr_values para pedir um contexto mais forte. O exemplo divulgado pelo Symfony solicita phrh, valor definido pelo perfil EAP do OpenID Connect para autenticação resistente a phishing com chave protegida por hardware.

Esse parâmetro é um pedido, não uma prova. O provedor pode responder com outro contexto. Por isso, o Symfony também guarda o claim acr realmente recebido no atributo oidc_acr. O voter precisa conferir o resultado antes de liberar a operação.

O recurso organiza uma decisão que já existia

Reautenticar antes de trocar senha, e-mail, meios de pagamento ou dispositivos confiáveis não é uma ideia nova. A OWASP recomenda uma nova verificação para recursos sensíveis e depois de eventos de risco, como recuperação de conta ou atividade suspeita.

A contribuição do Symfony 8.2 é colocar método e tempo dentro do modelo de segurança do framework, permitindo que voters, autenticadores e provedores externos participem do mesmo fluxo. Como a versão ainda não havia sido lançada quando o recurso foi apresentado, nomes e detalhes devem ser confirmados novamente antes de uma adoção em produção.

Fontes