Hay muchos servicios financieros que pueden verificar la cuenta bancaria de un usuario solicitando su nombre de usuario y contraseña e iniciando sesión en su nombre. Algunos ejemplos son Coinbase y TransferWise .
Se me ha ocurrido una forma para que un usuario verifique los detalles de su cuenta bancaria sin proporcionar su nombre de usuario y contraseña a un tercero. Me gustaría saber si hay fallas de seguridad con el siguiente protocolo:
- El servicio de terceros inicia un servidor proxy que registra todo el tráfico.
- El usuario establece una conexión TLS a través del proxy y verifica el certificado SSL del banco.
- El usuario inicia sesión con su nombre de usuario y contraseña, y guarda su cookie de sesión.
- El usuario inicia una nueva conexión TLS a través del proxy, que utiliza un secreto maestro diferente.
- El usuario utiliza su cookie de sesión actual para obtener los detalles de su cuenta a través del proxy.
- El usuario cierra la sesión e invalida la cookie de sesión.
- El usuario envía el secreto principal de la conexión TLS final al servicio de terceros.
- El servicio de terceros ahora puede descifrar el HTML y verificar los detalles del usuario, como su nombre completo, número de teléfono y saldos de cuenta.
Notas:
- Si un banco permite que se use una cookie de sesión desde múltiples direcciones IP, el usuario podría simplemente iniciar y cerrar sesión en su propia máquina.
- El usuario estaría viendo las páginas con proxy en su propia máquina, por lo que esto también funcionaría con la autenticación de dos factores.
- Es posible que algunos sitios web de banca en línea no invaliden correctamente las cookies de sesión cuando un usuario cierra la sesión. Sin embargo, la mayoría (si no todos) los bancos expiran una sesión después de 10-15 minutos de inactividad, por lo que el usuario puede esperar a que la sesión expire antes de revelar la clave privada.
- La página HTML podría filtrar más datos de los necesarios. Habría varias maneras de resolver esto para diferentes bancos. Muchos bancos proporcionan una API para sus aplicaciones móviles, por lo que solo podría presentar algunas solicitudes específicas de API para revelar solo la información necesaria.
- En lugar de enviar la clave privada y permitir que un tercero descifre todo el HTML y las cookies, podría ser posible crear un circuito booleano encriptado que proporcione una prueba de conocimiento cero para la sesión TLS grabada. El tercero podría ejecutar un cálculo que verifique el protocolo de enlace y el certificado TLS, descifre la URL y el HTML, y luego verifique la presencia de ciertas cadenas para verificar los detalles de la cuenta del usuario. El resultado del circuito es
true
ofalse
, y el tercero no podrá descubrir ninguna otra información sobre la sesión cifrada. Alternativamente, las salidas del circuito podrían ser incluso las cadenas de su nombre completo, número de teléfono y saldo de la cuenta de cheques. Voy a intentar investigar este enfoque con la biblioteca libsnark , ¡porque es una idea tan fascinante!
Una forma de implementar esto podría ser crear una aplicación de navegador basada en WebKit que los usuarios puedan descargar e instalar. La aplicación podría configurar un controlador de protocolo en su navegador, de modo que se abra cada vez que el usuario haga clic en una URL como <verification scheme>://domain/path
. La aplicación funcionaría con cualquier sitio web, pero también podría usar recetas preconfiguradas para diferentes bancos.
Esto también podría implementarse directamente en Firefox y Chrome, pero eso no es muy probable. También hay maneras mucho mejores de hacer esto. Algunos bancos modernos pueden proporcionar un token OAuth con permisos de solo lectura limitados. Un banco podría incluso usar la criptografía de clave pública para simplemente firmar los detalles de su cuenta usando su clave privada (tal vez la clave privada para su certificado SSL actual).
Creo que la técnica descrita anteriormente podría ser útil, ya que puede funcionar para cualquier sitio web (no solo para la banca). Pero hágame saber si puede detectar algún problema de seguridad aquí. Estoy seguro de que he entendido mal algo acerca de TLS, o tal vez haya una forma aún más fácil de hacer esto.