¿Cuál es la forma más segura de transferir un secreto entre 2 procesos que se ejecutan en el mismo sistema?

3

Como parte de mi sistema, tengo muchos procesos, cada uno de ellos creado a través de un script. Uno de los procesos se puede considerar como un "Proceso Maestro" en el sentido de que este proceso se comunica con el Servidor y obtiene toda la información relacionada con la configuración y la clave.

Ahora, tengo el requisito de pasar la configuración y la información clave del "Proceso Maestro" a otros procesos. Actualmente, estoy tratando de escribir la información de configuración en un archivo (un archivo para cada uno de los otros procesos) y los otros procesos leídos de ese archivo designado para sí mismo.

El problema ahora surge ya que también tengo una clave y no quiero que se escriba en el archivo.

¿Cuál es la forma más segura de pasar la clave del "Proceso maestro" a otros procesos?

He pensado en lo siguiente hasta ahora:

  • Tener una comunicación de socket protegida por SSL / TLS (TCP) entre otras Procesos y proceso maestro. El problema con este enfoque es que, SSL / TLS es pesado y no puedo abrir un conector de escucha en el Master Proceso.
  • Utilice tuberías. Pero, no estoy claro cómo puedo asegurar tuberías y también Asegurar que los procesos que no están destinados a conectarse a Master Procese y obtenga la clave, no la obtenga.
  • Memoria compartida: el mismo problema que el anterior.

Tenga en cuenta que estos procesos no comparten una relación de proceso entre padres e hijos.

¡Cualquier puntero será de gran ayuda!

    
pregunta Jay 29.12.2017 - 12:45
fuente

4 respuestas

6

Si su modelo de amenaza incluye "procesos maliciosos que se ejecutan como el mismo usuario que el proceso legítimo que necesita la clave", debe volver al tablero de dibujo y volver a diseñar. No es posible protegerse contra eso. Los procesos dentro de una única sesión de usuario no son, y no se debe esperar que estén seguros entre sí.

La preocupación que expresa sobre las tuberías, por ejemplo, se extiende a cualquier otro tipo de mecanismo de IPC. TLS sockets con autenticación mutua? Cualquier proceso que pueda conectarse al socket también puede ser suplantado por otro proceso en el mismo contexto del usuario, leyendo los mismos datos clave y falsificando el proceso legítimo. Incluso si pudiera establecer el IPC de forma segura, eso no es garantía de que los datos estén seguros. Por ejemplo, algunos sistemas operativos (Windows notablemente, pero creo que también algunos Me gusta de Unix) permiten que cualquier proceso que se ejecute bajo un uso dado pueda depurar cualquier otro proceso bajo el mismo usuario, por lo que el proceso malintencionado podría simplemente leer el secreto de inmediato. Espacio de direcciones del proceso legítimo.

Bien, hablemos de escenarios en los que no asuma que otro proceso en el mismo contexto de usuario es malicioso. Tal vez sea porque usted (re) diseñó todo para que se ejecute en un contexto de usuario especial utilizado solo para el propósito específico de su software. Tal vez sea porque estás trabajando en un dispositivo integrado donde controlas todo el código que se ejecuta. Tal vez solo porque aceptaste que tratar de defenderse contra el código malicioso con los mismos privilegios que tienes es inútil e inútil (si los malos están ejecutando código en tu contexto de usuario, ya se acabó el juego, hombre).

No ha especificado el sistema operativo en el que debe ejecutarse su software. Sin embargo, en general, hay algunas opciones decentes aquí para el secreto que nunca querrás comprometer con el almacenamiento persistente.

En sistemas similares a Unix:

  • sockets de dominio (local) Unix. Rápido y bastante sencillo. Apoyar la comunicación bidireccional, si eso importa. Para estar seguro, solo tiene que crearlos en una ubicación que no sea legible ni escribible por ningún otro usuario (algo bajo el perfil de usuario es una opción popular). Por otro lado, dijiste que no puedes alojar una toma de escucha en el Master (¿por qué no?), Por lo que es posible que esto no funcione.
  • Una tubería con nombre, también llamada FIFO. Rápido y directo, pero solo unidireccional (si desea bidireccional, necesita crear un par de canalizaciones). Al igual que con el socket local, asegúrese de que se cree FIFO donde ningún otro usuario pueda acceder.

En Windows:

  • Una tubería con nombre. A diferencia de las canalizaciones con nombre de Unix, las tuberías de Windows no entran en el sistema de archivos estándar; hay un "sistema de archivos de tuberías con nombre" especial para ellos. Esto significa que debe asegurarse de crear la tubería con la lista de control de acceso (ACL) correcta. Una vez creado, sin embargo, el uso de la tubería es rápido y simple.
  • Una asignación de memoria con nombre. La API CreateFileMapping se puede utilizar para cree una asignación de memoria que no esté respaldada por ningún archivo normal, sino por el archivo de paginación del sistema. Si bien el archivo de paginación está respaldado por datos persistentes y, por lo tanto, podría hacer que el secreto se almacene en el disco, eso es un riesgo en cualquier proceso; no puede garantizar que el secreto nunca se pagará de la memoria de trabajo a menos que su plataforma ofrezca (y usted use) algún tipo de búfer protegido por el núcleo. Mientras tanto, un atacante no sabría dónde buscar el secreto en el archivo de paginación, por lo que probablemente esté seguro. Las asignaciones de memoria con nombre, como las tuberías con nombre, deben ser seguras utilizando una ACL que impide que los procesos que se ejecutan bajo otros usuarios abran la asignación. Una vez que ambas partes han abierto el mapeo, sin embargo, es muy rápido.
  • Acceso directo a la memoria (lectura, más probable) entre procesos. El proceso del cliente simplemente lee el secreto del espacio de direcciones virtuales del padre. Esto requiere una forma de pasar la dirección relevante al otro proceso, pero está bien si esa dirección está expuesta; otros usuarios no pueden acceder a la memoria del proceso incluso si saben dónde buscar, porque los procesos siempre tienen una ACL que impide que otros usuarios lean su memoria.
respondido por el CBHacking 29.12.2017 - 14:48
fuente
2

¿Dónde se almacenan los ejecutables para ambos procesos? Porque si ambos se almacenan en la máquina y no desea tener que ingresar manualmente los secretos en el inicio del proceso, cualquier persona que pueda leer el archivo ejecutable podría falsificar cualquier método de autenticación. También puede mantener su sistema actual, pero almacenar el archivo de configuración en el mismo lugar con los mismos permisos (/ quizás bloquearlo para que solo sea legible por el usuario que ejecuta los procesos).

Si los archivos ejecutables no están almacenados en la máquina, simplemente podría cifrar el archivo de configuración con una clave codificada dentro de los archivos ejecutables (o leer un archivo que no esté almacenado en la máquina en el momento del lanzamiento).

Con SLS / TLS, ¿cómo sabe que está hablando con el servidor real y no con otro proceso escuchando en ese puerto? Por lo general, usaría un certificado para autenticarse, pero como se indica anteriormente, si está almacenado en la máquina, cualquiera que pueda leerlo puede hacerse pasar por el servidor real.

Y ya mencionaste que las tuberías y la memoria compartida tienen el mismo problema.

    
respondido por el Hector 29.12.2017 - 14:30
fuente
2

Extrañas Un * x sockets :

  • El Proceso Maestro simplemente crea uno (o más) un * x socket , ubicado en directorios protegidos, con el correcto 'srw-rw- --- ' atributos (todos los procesos se ejecutan bajo un usuario diferente, pero son miembros del mismo grupo).

  • El Proceso maestro permanece escuchando en este socket (servidor)

  • Todos los procesos, ejecutándose en el mismo host, con derecho de acceso suficiente (miembro del grupo objetivo) podrían comunicarse con Proceso maestro mediante el uso del socket ya creado (cliente ).

  • Por supuesto, Proceso maestro quienes crean el socket deben usar su propio protocolo y desinfectar correctamente las entradas de los sockets.

Nota: Proceso maestro podría ser miembro de muchos grupos y abrir tantos sockets, uno para cada grupo, luego considerar la diferencia con respecto a qué socket se usa para cualquier solicitud ...

Desde allí, ya que no hay conexión de red, solo necesita organizar correctamente la configuración de los usuarios / grupos y los permisos de atención en el socket (y su ruta).

El uso de cifrado en un * x socket es posible, pero parece excesivo ...

Pero, por favor, eche un vistazo a Respuesta de CBHacking : Es posible que tenga que volver a la Tablero de dibujo y rediseño ...

De todos modos, mi significado es:

  

Esa es la forma correcta de comunicarse entre dos procesos ... y si esto no funciona en Windows, ¡use BSD o Linux!

    
respondido por el F. Hauri 29.12.2017 - 14:44
fuente
1

Creo que puedes ejecutar el "proceso maestro" como un depurador y usarlo para crear otros procesos como depurador. Luego puedes enviar mensajes entre ellos con el evento de depuración. Así puedes asegurarte de que ningún otro proceso robe tu secreto.

    
respondido por el VictorV 11.06.2018 - 05:44
fuente

Lea otras preguntas en las etiquetas