Resumen

  • remoteClientDataJSON está deshabilitada de forma predeterminada y requiere permiso para cada origen, pero autorizar al llamante local no demuestra que el cliente remoto validara correctamente el origen y el RP ID.
  • La respuesta adecuada es conservar un recibo entre clientes, vinculado al hash de los datos exactos y a la sesión remota, sin obligar al navegador local a repetir toda la validación remota.

La publicación del First Public Working Draft de Web Authentication Level 4, el 15 de septiembre de 2026, introduce una transferencia de responsabilidad que merece más atención que la mera aparición de una nueva extensión.

En el modelo habitual de WebAuthn, el navegador obtiene el origen del contexto que lo invoca. Por regla general, el RP ID debe ser igual al dominio efectivo de ese origen o uno de sus sufijos registrables; las solicitudes desde orígenes relacionados siguen un procedimiento adicional. El navegador construye clientDataJSON, el autenticador firma su hash y el servidor del relying party comprueba el tipo de ceremonia, el reto, el origen esperado y el hash del RP ID.

Un escritorio remoto web rompe esa proximidad. El sitio que solicita la autenticación se ejecuta en el host remoto, mientras el autenticador está conectado al equipo local. Si el navegador local reconstruye los datos según su propio contexto, incorpora el origen del cliente web del escritorio, no el del RP dentro de la sesión. Además, diferencias inocuas en el orden de campos, espacios o propiedades opcionales producen bytes y hashes distintos.

La extensión remoteClientDataJSON permite que un cliente de escritorio remoto autorizado entregue la cadena completa generada en el host remoto. El navegador local la analiza, pero no puede añadir, retirar ni modificar su contenido. En el paso de serialización debe usar la cadena proporcionada, para que el autenticador firme exactamente los bytes que la máquina remota espera verificar.

El borrador no abre esta vía a cualquiera. publickey-credentials-remote-client-data-json es una función potente y controlada por Permissions Policy. Su permiso predeterminado es denied y el texto fija la lista de permisos predeterminada en 'none'. La configuración debe hacerse por origen y no puede existir una opción para autorizar todos los orígenes. El documento apunta a políticas de navegador o dispositivo gestionado, o a una decisión explícita por origen en la configuración del cliente, no a una pregunta improvisada durante la ceremonia.

Esa barrera responde a una pregunta local: ¿puede este origen invocar la extensión? No responde a la pregunta remota: ¿identificó el cliente remoto el origen auténtico del RP y aplicó correctamente la regla que relaciona ese origen con el RP ID?

Los pasos del algoritmo muestran la separación. Si el estado del permiso no es granted, el navegador local rechaza la operación. También exige un RP ID explícito y analiza el JSON recibido. Después omite la comprobación ordinaria que vincula el RP ID con el valor origin de esos datos. El borrador afirma que todas las comprobaciones de origen relacionadas con el RP ID quedan delegadas al cliente remoto. En su apartado de seguridad añade que el user agent debe confiar en que el llamante proporciona el origen remoto de forma honesta y en que el cliente remoto ha validado el RP ID con exactitud.

El resultado booleano de la extensión no amplía esa evidencia. true indica que la extensión actuó. No identifica la sesión, la versión de política, el algoritmo de validación ni las pruebas de orígenes relacionados. La fidelidad byte a byte tampoco afirma más de lo que es: demuestra que el navegador local no reconstruyó los datos, no que el origin contenido en ellos sea veraz, esté vigente o haya sido autorizado.

La firma del autenticador vincula el resultado con el hash de los datos y con la información del autenticador. El RP aún debe verificar tipo, reto y origen, además de comparar rpIdHash con el RP ID esperado. Son controles esenciales. Sin embargo, un resultado aceptado puede no conservar qué cliente remoto tomó la decisión delegada, qué política aplicó o por qué canal autenticado llegó la solicitud a la operación local.

Esto no es una denuncia de vulnerabilidad, explotación o incidente. Level 4 es un primer borrador público, no una Recomendación W3C ni evidencia de implementación, interoperabilidad o despliegue. Su propia sección de estado dice que la publicación no supone respaldo y que el texto puede cambiar o ser sustituido. Un issue abierto del repositorio W3C WebAuthn sigue además una dependencia terminológica: la intención de deshabilitar la función por defecto es inequívoca, pero 'none' aún no era un valor normativo definido en el borrador dependiente de Permissions Policy. El issue no solicita un cambio de comportamiento.

Por tanto, la solución de gobernanza no consiste en deshacer la delegación. El lado remoto puede disponer de la lista de orígenes relacionados o de asociaciones de aplicaciones específicas de la plataforma que el navegador local no conoce. Hacer que el entorno local replique toda esa lógica crearía dos validadores capaces de separarse con el tiempo.

La alternativa más acotada es un recibo de validación del origen entre clientes. Debe vincular el origen llamante local y el permiso —sujeto, fuente, versión y caducidad— con una identidad de sesión remota y su canal autenticado. Debe registrar el origen remoto, el RP ID, el algoritmo y versión, el resultado y las referencias a pruebas de orígenes relacionados o asociaciones de aplicaciones. Un hash de los bytes exactos de remoteClientDataJSON conecta la decisión con lo firmado; el resultado del servidor RP cierra la cadena. Excepciones, revocaciones y correcciones deben añadirse sin borrar el registro original.

Este recibo es una propuesta de control operativo, no un requisito normativo atribuido a WebAuthn. Su valor está en separar hechos: capacidad local autorizada, validación remota ejecutada, bytes preservados, acción del usuario ante el autenticador y decisión final del RP. Un único estado verde de «WebAuthn correcto» no puede demostrar las cinco cosas.

Fuentes