¿Cómo enviar de forma segura una contraseña de una aplicación a otra?

1

Vea esta pregunta / respuesta primero: Al llamar a un proceso desde otro proceso, ¿es más seguro enviar la contraseña estándar que enviar una variable ENV?

Soy un desarrollador de Java que está creando una aplicación donde debe llamar a un proceso de C # desde dentro. En mi situación, la aplicación Java está llamando a este programa de C # enlace .

Hemos establecido que esto no es seguro para enviar la contraseña a través de variables de entorno ni con stdin.

¿Cuál es la mejor práctica para proporcionar la contraseña a esta aplicación?

    
pregunta Nicholas DiPiazza 23.02.2018 - 18:23
fuente

2 respuestas

3

Según tengo entendido, este es su modelo de amenaza: tiene dos programas, uno ejecutará el otro. El primer programa debe pasar algún secreto al segundo programa. Un adversario no debe poder registrar, interceptar o modificar este secreto. Ambos procesos confían entre sí y se ejecutan en el mismo sistema.

La respuesta depende de si el ejecutable puede escribirlo un adversario o no. Si se mantiene en una ruta de acceso privilegiada del sistema o tiene al menos el mismo nivel de integridad que el ejecutable principal, puede estar seguro de que puede confiar en que no haya sido manipulado. Cuando ambos procesos son de confianza, la forma más sencilla de enviar datos entre dos procesos es una canalización, como stdin . También sería posible utilizar la memoria compartida, que es una región de la memoria que un proceso primario puede crear y que será compartida por su hijo, permitiendo una comunicación más eficiente que a través de una tubería. Las partes no autorizadas no podrán interceptar ni modificar el contenido de la comunicación, a menos que puedan:

  • Modificar directamente los ejecutables principal o secundario.
  • Engaña a tu programa para que ejecute el ejecutable incorrecto, por ejemplo. abusando de PATH .
  • Ejecute como el mismo usuario que su programa, haciendo posible que se comprometan.
  • Modifique el entorno (por ejemplo, LD_PRELOAD ) del padre o del hijo.

Yo sugeriría no usar una variable ambiental. El entorno no debe ser secreto y, con frecuencia, otros usuarios pueden ver el entorno de varios procesos en el sistema. En Linux, por ejemplo, el entorno de cualquier proceso se puede obtener leyendo el archivo /proc/<pid>/environ .

    
respondido por el forest 24.02.2018 - 05:22
fuente
1

Si bien la respuesta del bosque es globalmente correcta, no mencionó una forma importante en la que puedes mejorar el nivel de protección entre tus instancias.

Bajo Windows, puede usar CryptProtectMemory (y CryptProtectData) para cifrar nuestros datos con una clave que está vinculada al usuario actual (y, en el caso de CryptProtectMemory, la clave se cambia cada vez que se reinicia su máquina).

Esto le permite agregar una capa de protección a su sistema: puede usar CryptProtectMemory (especificando el indicador CRYPTPROTECTMEMORY_SAME_LOGON) para restringir el acceso a la clave de descifrado para procesar la ejecución en la misma máquina y el mismo usuario que usted.

No lo protegerá de los códigos que se ejecutan en el mismo contexto que el suyo, pero, en última instancia, no hay nada que lo proteja contra eso.

Editar : quiero enfatizar el hecho de que debes usar CryptProtectMemory, no CryptProtectData. CryptProtectData está destinado a los datos que se transmitirán al almacenamiento (y, por lo tanto, deberán recuperarse y descifrarse de otra sesión de Windows en conjunto).

    
respondido por el Stephane 27.02.2018 - 09:06
fuente

Lea otras preguntas en las etiquetas