ctt-gob-es / clienteafirma

Cliente @firma
http://administracionelectronica.gob.es/ctt/clienteafirma
256 stars 120 forks source link

Autofirma no muestra qué documento se está firmando. #97

Open miguelmarco opened 5 years ago

miguelmarco commented 5 years ago

Cuando se lanza autofirma desde el navegador para firmar un documento proporcionado por un servidor web, no se le muestra al usuario información alguna sobre el documento que se está firmando. Este modelo es inseguro puesto que el servidor podría usarlo para que el usuario firmara un documento cuando cree que está firmando otro.

El diálogo que se muestra para que el usuario elija qué certificado usar debería, por lo menos, mostrar el hash del archivo que se va a firmar.

Gamuci commented 5 years ago

En modo interfaz de escritorio AutoFirma permite abrir el documento seleccionado para firmar, pero en la invocación por web esta responsabilidad recae en la propia aplicación que solicita la firma, ya que es ella la que conoce el documento y sabe como presentárselo al usuario. Por ejemplo, una factura electrónica no debería mostrarse como un simple XML, sino que debe presentarse toda la información relevante de la factura de forma clara para el usuario. Esto sólo puede hacerlo quien conoce el tipo de documento que se va a firmar.

En sus inicios, el Cliente @firma mostraba al usuario el hash de los datos a firmar pero se comprobó que esta información carece de utilidad ya que no le sirve al usuario para determinar si esta firmando lo que quiere o si es cualquier otro cosa.

Estamos de acuerdo en que es necesario securizar el proceso de firma todo lo posible, pero este requisito recae sobre todo el entorno que rodea a la firma y no únicamente sobre el componente que la compone. Firmar electrónicamente es un proceso crítico con implicaciones legales. Igual que un usuario no debe introducir sus datos personales o los datos de su tarjeta bancaria en una web que no sea de su confianza, no debe realizar firmas electrónicas en ese tipo de webs.

miguelmarco commented 5 years ago

Perdón, pero no le veo mucho sentido a la explicación.

Precisamente porque la firma tiene validez legal, es fundamental que el firmante pueda comprobar qué es lo que está firmando (por ejemplo, comparando el hash con el del documento que podría haberse descargado previamente, aunque lo ideal sería poder ver el documento en sí). Si se considera un modelo de amenaza en el que hay confianza completa en el servidor, no tiene sentido usar autofirma para nada. Si se usa autofirma es precisamente para dar al usuario la autoridad de firma en exclusiva (en caso contrario, se podría realizar la firma directamente en el servidor). Y para ello es necesario que pueda verificar qué documento está firmando.

Gamuci commented 5 years ago

No debe verse AutoFirma como una solución integral de firma, sino como una pieza más en el proceso. Por ejemplo, un usuario puede utilizar AutoFirma y firmar algo con un certificado revocado, resultando en una firma sin validez alguna. El encargado de verificar que la firma es válida es otra pieza en el proceso de firma.

Teniendo en cuenta lo anterior, hay que entender por qué AutoFirma no es la "pieza" apropiada para mostrar el contenido que el usuario va a firmar. Para empezar, estaría la cuestión de que hay tipos de documentos que pueden no tener una representación predefinida, como la factura electrónica que ya comenté, que es un XML pero que no es de poca utilidad visualizado de esa manera. Incluso un simple texto plano puede mostrarse de distintas maneras según el juego de caracteres que se utilice (UTF-8, ISO LATIN 9, etc), lo que podría hacer creer a un usuario sin conocimientos informáticos que un texto contiene erratas. Hay documentos que ni siquiera tienen representación (como un zip o un almacén de claves, por ejemplo). Otras muchas veces, no hay un documento propiamente dicho pues lo que se firma puede ser, por ejemplo, los valores de los campos de un formulario web. Tampoco puede AutoFirma visualizar cualquier tipo de documento, ni sabe si el usuario tiene forma de visualizarlo por su cuenta ni si la visualización cambiará según se use una aplicación u otra. AutoFirma puede incluso realizar firmas trifásicas, en las que el formato se compone en servidor y la aplicación sólo recibe la cadena de bytes que debe cifrar con la clave privada del certificado. En esos casos, el propio AutoFirma no sabe nada del documento, ni siquiera su hash.

Si se tiene, mostrar el hash del "documento" es fácil a nivel técnico, pero reporta un valor mínimo al ciudadano, que probablemente no sepa comprobarlo.

La justificación de AutoFirma como herramienta de escritorio es la de permitir al usuario la firma con sus certificados locales. Existen soluciones de firma en servidor que utilizan certificados custodiados por terceros de confianza (como Cl@ve Firma). Estas soluciones no son menos válidas y también reportan al ciudadano control completo sobre sus certificados.

miguelmarco commented 5 years ago

Si se tiene, mostrar el hash del "documento" es fácil a nivel técnico, pero reporta un valor mínimo al ciudadano, que probablemente no sepa comprobarlo.

Precisamente estoy diciendo que sí aporta valor al ciudadano. No sólo aporta valor: aporta todo el valor que puede dar sentido al uso de autofirma: la posibilidad de comprobar qué se está firmando sin necesidad de confiar en un servidor que no tiene forma de saber si es confiable o ha sido comprometido.

Concretamente en este caso, "el ciudadano", soy yo, que necesito usar autofirma para mi trabajo. Y me encuentro con que estoy forzado a firmar ciegamente con validez legal un documento que no tengo forma de saber cual es exactamente.

Más aún porque sé que es fácil técnicamente, les ruego, como usuario y ciudadano, que incluyan la opción de ver el hash del documento a firmar, aunque no sea la opción por defecto.

ssaavedra commented 5 years ago

A ver, yo le veo sentido a lo que dice miguelmarco: en la actualidad, nos estamos fiando en muchos casos de que aquellas aplicaciones que utilizan AutoFirma están generadas por terceros de confianza para las Administraciones Públicas. Pero podría darse el distópico caso de que al presentar un documento a través de las AAPP, mismamente si el servicio web de una de ellas ha resultado comprometido como resultado de un ciberataque, pudiese por ejemplo, estar firmando un contrato en el que dono todo mi patrimonio a un tercero. Si además esta firma la realizo con el DNIe, legalmente me va a ser complicado repudiar la firma de ese documento.

Establecer una cadena de confianza entre la aplicación que está solicitando firmas y aquella que es capaz de mostrar al usuario lo que está firmando (si no puede ser la propia AutoFirma) parece importante de cara a la seguridad pública a medio plazo y, en mi opinión, como ciudadano y como tecnólogo, sería una neglicencia grave dejar de hablar de ello.

iblanes commented 4 years ago

y la aplicación sólo recibe la cadena de bytes que debe cifrar con la clave privada del certificado. En esos casos, el propio AutoFirma no sabe nada del documento, ni siquiera su hash.

¡Pero a ver! Todo el tinglado del autofirma... y resulta que es lo mismo que un botón bien grande que ponga 'firmar'. Con el usuario autenticado con certificado, la administración se lleva las mismas garantías. Y con el botón, como mínimo no se obliga al ciudadano a firmar papeles a ciegas. Repito: firmar papeles a ciegas.

Y no solo esto, sinó que se añade un único punto crítico en el sistema. Si el servidor de la firma trifásica acaba comprometido, suponiendo que tenga algo de uso entre la población, se cae todo el esquema de confianza. Para que quiere un adversario la clave privada de alguien si la puede usar para firmar igualmente cuando quiera...

En fin... como bien comentan @miguelmarco y @ssaavedra, esto no tiene ni pies ni cabeza.

Claramente, la solución es que solo se deben firmar documentos representables por la aplicación de confianza. No es imposible: si alguien tiene un XML que quiere que se le firme, pues que proporcione un rasterizador para ese documento, se firma el raster, y se demuestra que el XML equivale a la firma rasterizando el XML otra vez y comparando la firma en el raster.

P.S.: El ejemplo de que cualquiera puede firmar algo a la hora que le parezca se puede solucionar con trusted timestamping.

EchedelleLR commented 4 years ago

No debe verse AutoFirma como una solución integral de firma, sino como una pieza más en el proceso. Por ejemplo, un usuario puede utilizar AutoFirma y firmar algo con un certificado revocado, resultando en una firma sin validez alguna. El encargado de verificar que la firma es válida es otra pieza en el proceso de firma.

Teniendo en cuenta lo anterior, hay que entender por qué AutoFirma no es la "pieza" apropiada para mostrar el contenido que el usuario va a firmar. Para empezar, estaría la cuestión de que hay tipos de documentos que pueden no tener una representación predefinida, como la factura electrónica que ya comenté, que es un XML pero que no es de poca utilidad visualizado de esa manera. Incluso un simple texto plano puede mostrarse de distintas maneras según el juego de caracteres que se utilice (UTF-8, ISO LATIN 9, etc), lo que podría hacer creer a un usuario sin conocimientos informáticos que un texto contiene erratas. Hay documentos que ni siquiera tienen representación (como un zip o un almacén de claves, por ejemplo). Otras muchas veces, no hay un documento propiamente dicho pues lo que se firma puede ser, por ejemplo, los valores de los campos de un formulario web. Tampoco puede AutoFirma visualizar cualquier tipo de documento, ni sabe si el usuario tiene forma de visualizarlo por su cuenta ni si la visualización cambiará según se use una aplicación u otra. AutoFirma puede incluso realizar firmas trifásicas, en las que el formato se compone en servidor y la aplicación sólo recibe la cadena de bytes que debe cifrar con la clave privada del certificado. En esos casos, el propio AutoFirma no sabe nada del documento, ni siquiera su hash.

Si se tiene, mostrar el hash del "documento" es fácil a nivel técnico, pero reporta un valor mínimo al ciudadano, que probablemente no sepa comprobarlo.

La justificación de AutoFirma como herramienta de escritorio es la de permitir al usuario la firma con sus certificados locales. Existen soluciones de firma en servidor que utilizan certificados custodiados por terceros de confianza (como Cl@ve Firma). Estas soluciones no son menos válidas y también reportan al ciudadano control completo sobre sus certificados.

Entiendo su postura en el caso expuesto de mostrar en sí mismo el documento, pero estoy de acuerdo con las posturas del resto hasta este mensaje que demuestran ser flexibles al no centrarse en sí en el punto de "ver" el documento sino reconocer qué se está firmando aunque alguno cometiese el error de anunciarlo centrado en "ver".