Permitir configurar tanto la URL del servidor como la clave pública: ¿agujero de seguridad?

0

Tenemos un sistema de licencias en el que nuestro software, un producto comercial que vendemos a las personas, se pone en contacto con nuestro servidor de licencias cuando comienza a funcionar correctamente.

Se pone en contacto con nuestra URL de licencia y pasa un archivo XML firmado con nuestra clave pública. Verificamos la firma con nuestra clave privada, creamos un archivo XML para enviarlo y lo firmamos con nuestra clave privada. La aplicación luego usa la clave pública para verificar que es nuestra y actúa en la respuesta.

Estamos considerando permitir que la URL y la clave pública se sobrescriban con los valores establecidos en la configuración de la aplicación. La anulación de la URL se usaría para permitir a los clientes probar nuestro nuevo servidor de licencias. Anular la clave pública es manejar el caso donde nuestra clave privada se conoce y tenemos que cambiarla.

Sin embargo, me sorprende que alguien pueda anular ambos para que apunten a su servidor con su clave pública y ahora les ha dado a todos la posibilidad de omitir nuestro cheque.

¿Esto es un agujero en el sistema? Y si es así, ¿es una mala idea permitir que cualquiera de los dos sea anulado? Si podemos anular con seguridad cualquiera de los dos, pero solo uno, creo que la clave pública es la que permite la configuración en el archivo de configuración.

¿O hay otra manera de hacer todo esto?

    
pregunta David Thielen 24.10.2018 - 13:24
fuente

2 respuestas

2

Respuesta corta: sí, si alguien construye su propio servidor de licencias y anula la clave pública, parece que debería poder usar su software sin tener que pagar una licencia. Ni siquiera necesitan la configuración de URL para eso.

La respuesta algo más larga:

Si entiendo correctamente, el cliente valida la firma contra una clave pública que se envía en el software (y luego se permite que se invalide). Parece que el software tiene algún método isAnswerSignatureCorrect() , que podría modificarse fácilmente para devolver siempre el valor verdadero. De esto se trataron los primeros días de descifrado de software.

También se puede ejecutar un servidor web local, redirigir el host del servidor de licencias a localhost y descifrar el software, ni siquiera tendría que anular la URL en la configuración.

Lo que estoy tratando de decir aquí: si su audiencia está dispuesta a ir tan lejos como para construir su propio servidor de licencias que devolvería la estructura XML correcta para descifrar su licencia, entonces el método actual que está utilizando no va a aguantar mucho tiempo.

  

Anular la clave pública es manejar el caso en el que nuestra clave privada se conoce y tenemos que cambiarla.

Si teme que eso suceda, debería pensar en abordar eso primero. Almacene su clave en un HSM, haga que firme la respuesta. Si un HSM "real" es demasiado caro, eche un vistazo a los productos Yubico.

Si teme perder el acceso a la clave privada, considere generar una segunda clave y envíe la clave pública de ambas.

  

La anulación de la URL se usaría para permitir que los clientes prueben nuestro nuevo servidor de licencias.

Considere enviar el software con una lista codificada de servidores permitidos. O agregue una ruta / encabezado / urlparam a la solicitud del host del servidor de licencias actual para permitir que la solicitud sea manejada por un nuevo sistema sin tener que cambiar los hosts.

Puede utilizar la fijación de clave pública para asegurarse de que la aplicación solo se comunica con un servidor que sirve un certificado de propiedad de su organización.

    
respondido por el Securist 24.10.2018 - 14:00
fuente
1

Sí, es un agujero. Yo sugeriría agregar ambas licencias a la aplicación y elegir la adecuada según la URL o usar un sistema de CA, donde se coloca un certificado de su propia CA en la aplicación y luego se firman certificados para ambos servidores. Esto también permite la revocación y la generación de nuevas claves y certificados sin cambiar las configuraciones utilizando el sistema estándar PKI.

Ejemplo muy simplista: coloca una clave pública de su CA (idealmente, la clave privada debería estar en un token de hardware o al menos en un coputer con espacio de aire). Genera un par de claves para cada servidor y firma la clave pública con la clave privada de CA. Luego incluya la clave pública firmada cuando devuelva el XML. Luego, la aplicación primero verifica que la clave pública esté correctamente firmada con la clave pública de CA, y luego verifique el XML con la clave pública incluida.

Por supuesto, utilizar certificados X.509 completos sería incluso mejor, aunque un poco más complicado.

    
respondido por el Peter Harmann 24.10.2018 - 13:57
fuente

Lea otras preguntas en las etiquetas