¿Cómo se asegura el llavero del sistema en OS X?

22

Estoy buscando algo como este documento técnico de seguridad para iOS, excepto OS X o incluso mejor, algún tipo de informe de auditoría de seguridad de un experto independiente. Después de leer documentación como la Guía de programación de servicios de llavero , estoy aún más confundido acerca de lo que es vulnerable a un ataque adverso en una copia de seguridad sin cifrar de un sistema OS X.

La última vez que lo verifiqué, el llavero de inicio de sesión del usuario en OS X era casi tan seguro como la contraseña. Recuerdo un problema que redujo el secreto real de la clave a algo así como 111 bits (memoria borrosa, no dude en corregirme) debido a algún problema con la forma en que la contraseña se convierte en una clave, pero eso fue hace mucho tiempo y con suerte eso ha sido arreglado.

Por otro lado, me han dicho que el llavero del sistema es inherentemente menos seguro porque cualquier administrador puede acceder a él y un intruso tiene muchas opciones para convertirse en administrador además de adivinar la contraseña de un solo usuario.

En particular, me preocupa almacenar las contraseñas utilizadas en los scripts automatizados en el Llavero del sistema, ya que los archivos del sistema se respaldan y almacenan fuera del sitio sin más cifrado. Los documentos y otros datos del usuario se cifran antes de ser llevados fuera del sitio, pero tengo una sospecha persistente de que hay un camino que estoy pasando por alto que recupera esas claves una vez que se compromete el Llavero del sistema (debido a nuestros procedimientos, no necesariamente cualquier falla criptográfica) . Por lo tanto, quiero tener una comprensión profunda de cómo el llavero del sistema está asegurado simultáneamente pero accesible para cualquier administrador.

  1. ¿Cómo se diseñan las claves para que cualquier usuario administrativo pueda desbloquear el llavero del sistema?

  2. ¿Existen restricciones criptográficas que limitan de alguna manera lo que un usuario administrativo puede hacer con la información en el Llavero del sistema?

  3. Dada una copia de seguridad del sistema sin cifrar sin/Users , ¿cómo obtendría acceso a las claves en el llavero del sistema?

Estoy interesado en OS X 10.5 Leopard y versiones posteriores.

Viejo pro
fuente
No tengo una respuesta, sino una anécdota: como usuario estándar sin privilegios de administrador, una vez pude extraer contraseñas del llavero del sistema con relativa facilidad. No recuerdo los pasos exactos, pero ciertamente fue posible. En una nota al margen, ¿podría ser mejor en security.stackexchange.com ?
alexwlchan
@Alex, probé Security.SE primero, pero no obtuve respuestas allí.
Old Pro
1
¿Por qué no usar un llavero por separado para lo que estás haciendo? ¿Hay una buena razón por la cual su script necesita acceso al llavero del sistema?
Jay Thompson
@eyemyth, sí, los scripts deben ser ejecutados por el sistema para que puedan acceder a todos los archivos en el disco independientemente de los permisos del usuario.
Old Pro

Respuestas:

11

El llavero del sistema se almacena en /Library/Keychains/System.keychainy la clave para desbloquearlo se almacena /var/db/SystemKey(sus permisos de archivo predeterminados son legibles solo por root). Se hace referencia a la ubicación de estos archivos en el script de seguridad-sistema de verificación (de la fuente security_systemkeychain ). Incluso es posible probar el bloqueo / desbloqueo automático del llavero del sistema utilizando

systemkeychain -vt

El marco de seguridad de llavero permite que los programas sin privilegios realicen solicitudes de información siempre que estén en la ACL almacenada dentro de la entrada del llavero. Obviamente, si un usuario tiene root, puede acceder directamente tanto al archivo que almacena el llavero del sistema como a la clave para desbloquearlo, por lo tanto, no tiene que realizar solicitudes a través del marco de seguridad y no está sujeto a las ACL almacenadas dentro del llavero sí mismo.

(En realidad no respondí las preguntas originales, así que vamos a darle otra oportunidad)

¿Cómo se diseñan las claves para que cualquier usuario administrativo pueda desbloquear el llavero del sistema?

El marco de llavero libsecurity permite que los procesos regulares interactúen con el llavero del sistema de manera autenticada utilizando el marco de comunicación entre procesos XPC (IPC) de Apple.

El programa A envía una solicitud para acceder a la información del llavero del sistema mediante IPC. Se realiza una comprobación de que el usuario solicitante ya está en el grupo de rueda y también conoce la contraseña de un usuario en el grupo de rueda. Una vez que se confirma la autorización, el kcproxydemonio privilegiado se puede utilizar para acceder al material /var/db/SystemKey, desbloquear el llavero del sistema y devolver la información solicitada.

¿Existen restricciones criptográficas que limitan de alguna manera lo que un usuario administrativo puede hacer con la información en el Llavero del sistema?

No: un usuario administrativo puede acceder / cambiar cualquier cosa en el llavero del sistema. Incluso si no pudieran, podrían copiar los archivos subyacentes a otra máquina en la que tienen control completo y simplemente desbloquear / acceder allí.

Dada una copia de seguridad del sistema sin cifrar sin / Usuarios, ¿cómo obtendría acceso a las claves en el Llavero del sistema?

Si la copia de seguridad contuviera copias de /Library/Keychains/System.keychainy /var/db/SystemKeyluego las copiaría en sus respectivas ubicaciones en un nuevo sistema OS X y las usaría systemkeychainpara desbloquear la primera y volcar la base de datos de llavero usando security dump-keychain.

Luego
fuente
1
Hay una utilidad llamada dumpkeychain de GuidanceSoftware / EnCase, que permite un volcado directo de un llavero del sistema (con SystemKey) en Windows (puede ser más fácil que configurar una nueva instalación de OS X para volcarlo).
drfrogsplat
1
@Anon, ¿cómo puedo usar la información anterior para acceder / desbloquear / volcar un System.keychain desde una copia de seguridad de Time Machine de otra computadora? Es decir, tengo el System.keychain y SystemKey almacenados en un disco externo, así que supongo que debo especificar las rutas a ambos archivos respectivamente para evitar que use los archivos en la ubicación predeterminada.
Db
Esta publicación está relacionada (cómo usar SystemKey para descifrar System.keychain de un sistema antiguo). apple.stackexchange.com/questions/307189/… Tengo curiosidad por saber si hay alguna forma con Keychain Access o systemkeychain cli para desbloquear un System.keychain recuperado (es decir, de un disco duro dañado) con la correspondiente SystemKey de esa misma instalación. Mi objetivo es desbloquear y migrar inicios de sesión al nuevo llavero del sistema en la nueva instalación.
mattpr
5

Llavero del sistema

El llavero del sistema tiene algunas capacidades únicas. Estos están documentados en la página del manual systemkeychain . Es probable que las menciones de la contraseña maestra sean su enfoque. El código fuente específico del llavero del sistema es pequeño y está disponible.

El llavero del sistema /System/Library/Keychains/System.keychaines un llavero especial para Apple y demonios para usar. En general, debe evitar usarlo para scripts de nivel de usuario.

Revisión de Código: Llavero

Apple publicó el código fuente del Keychain y el marco de seguridad para Mac OS X 10.5; Puede revisar este código para descubrir cómo funciona.

Enfoque alternativo: llavero separado

Puede crear un llavero separado para almacenar las credenciales de su script. Recomendamos esta práctica a nuestros clientes. Puede usar la seguridad de la herramienta de línea de comandos para acceder, extraer y administrar sus llaveros sin recurrir a una interfaz gráfica.

Considere almacenar las contraseñas para sus scripts automatizados en un llavero separado, y excluya este llavero de su copia de seguridad fuera del sitio.

Aprecio que eliminar el llavero de su copia de seguridad no sea ideal, pero abordaría sus inquietudes. Al restaurar la Mac, necesitaría recuperar el Llavero de una fuente diferente; puede ser más confiable fuente o canal lateral.

Siempre puede almacenar la contraseña del llavero por separado en el llavero del sistema. Luego puede desbloquear el llavero separado de un script. Si se ataca la copia de seguridad, solo expondría la contraseña al llavero separado y no al llavero en sí, ya que este archivo no está con la copia de seguridad fuera del sitio.

Graham Miln
fuente
Gracias, pero es demasiado difícil para mí descubrir de todo ese código cómo se asegura el llavero del sistema y qué lo mantiene seguro. Tenemos que utilizar el llavero del sistema porque necesitamos los scripts que se ejecutan automáticamente en el fondo con privilegios de root, independientemente de quién está conectado.
Viejo favorable
1
Recomiendo preguntar ya sea en la lista de correo Apple CDSA ( lists.apple.com/mailman/listinfo/apple-cdsa ) o usar un Incidente de Soporte Técnico de Apple. Solo a través de estos medios puede asegurarse de llegar a los ingenieros de Apple apropiados.
Graham Miln
Hacer que los scripts se ejecuten en segundo plano como root es el trabajo de launchd. ¿Qué estás tratando de hacer exactamente?
Jay Thompson
1
Error tipográfico menor en "/System/Library/Keychains/System.keychain" (Olvidó "Biblioteca"). En realidad, puede obtener una lista de las ubicaciones de llaveros en Keychain Access seleccionando "Editar> Lista de llaveros"
nombre de usuario
1
@OldPro Dadas sus preocupaciones de seguridad, ¿por qué no utilizar el cifrado de disco completo?
Graham Miln
2

Apple publicó recientemente un documento que describe sus prácticas de seguridad , puede encontrar algunas respuestas allí. El documento es específico para iOS, pero muchas de las características de seguridad tienen mucho en común con OS X.

demianturner
fuente
Esto está en el camino correcto, y es un buen ejemplo del tipo de documentación que me sería útil, pero iOS no tiene el concepto del llavero del sistema, por lo que no responde a mi pregunta.
Old Pro
Estoy feliz de aceptar tu recompensa si esto te lleva en la dirección correcta ;-)
demianturner
0

No tengo un conocimiento específico de Keychain *, pero esta es una práctica bastante estandarizada.

  1. Desea proteger el archivo de texto plano "foo". Foo puede ser de tamaño arbitrario.
  2. Crea una clave simétrica para encriptar foo.
  3. Cifre la clave simétrica con una clave derivada de una frase de contraseña.

Una vez hecho esto, puede cambiar la "contraseña" ingresando la frase de contraseña actual, descifrando la clave simétrica y luego cifrándola con la nueva frase de contraseña. Esto evita largos procesos de descifrado / cifrado en el caso de que "foo" sea muy grande.

Entonces, ¿cómo funciona esto para múltiples usuarios que necesitan acceder al texto sin formato de foo? Bastante fácil, simplemente crea una copia encriptada de la clave simétrica una vez para cada usuario. En otras palabras, realice el paso tres para cada usuario.

En la práctica, todo esto se abstrae de la vista y el usuario final solo necesita lidiar con su propia contraseña.

Con respecto a la parte 3 de sus preguntas, las claves de los usuarios no se almacenan en su hogar. Lo más probable es que estén almacenados en /private/varalgún lugar. Entonces, incluso sin /Usersalguien que anteriormente tenía acceso, podría desbloquear el sistema.


* Es posible que Keychain funcione de manera diferente.

bahamat
fuente
Lo que es diferente sobre el llavero del sistema es que el sistema puede acceder a lo que está en el llavero independientemente de quién haya iniciado sesión. Por ejemplo, Time Machine puede acceder al llavero del sistema para montar un recurso compartido de archivos remoto, incluso si el único usuario registrado no es un usuario administrativo y, por lo tanto, no puede acceder al llavero del sistema. Entonces está sucediendo algo más, y me gustaría saber exactamente qué es eso.
Old Pro
De nuevo, solo puedo suponer, pero en mi opinión, en realidad no es tan diferente. El sistema en sí, obviamente, puede llegar a la clave, eso está garantizado. Supongo que hay una clave del sistema tratada de manera similar a las claves de usuario. Pero ahora estamos en el centro de su pregunta ... ¿qué proporciona el primer acceso?
bahamat