Nuevas herramientas, viejos métodos. Realizamos ingeniería inversa y encontramos el defecto fatal de 1Password.Todos aman los administradores de contraseñas. Son geniales por muchas razones. Personalmente, tengo más de 200 entradas en el administrador. Con tantos datos confidenciales en un solo lugar, es importante comprender el alcance del daño si su registro se ve comprometido, ya sea malware, exploits o simplemente una computadora que no se atiende durante varios minutos.
El Washington Post publicó recientemente un artículo basado en nuestro
estudio . Este artículo ayuda a las personas a darse cuenta de que no todos los administradores de contraseñas son iguales.
Creía firmemente que un administrador de contraseñas bloqueadas estaba bien protegido. Si alguien tiene acceso a mi computadora, entonces el máximo puede contar con un montón de bytes aleatorios, ya que la información se borra de forma confiable de la memoria.
Esto es cierto para 1Password 4 (Tenga en cuenta que la última versión es la séptima hoy). Antes de cambiarlo hace unos años, verifiqué que realmente no hay contraseñas claras cuando el administrador está en un estado bloqueado. Entonces, en caso de compromiso, el atacante tendrá que lidiar con el almacenamiento encriptado.
¡La bóveda está cerrada!En este estado, no hay entradas de contraseña o una contraseña maestra. Muy razonable y correcto, y 1Password 4 pasó esta prueba. O no?
Para deshacerme de los detalles aburridos, diré de inmediato: pudimos restaurar la contraseña maestra de una instancia bloqueada en 1Password 4, como se muestra a continuación.
Desbloquee 1Password 4 y recupere su contraseña maestraLa animación muestra que 1Password 4 se desbloquea primero de la manera normal y luego se bloquea. Después de eso, ejecutamos nuestra utilidad
multipass , que recupera con éxito la contraseña. La utilidad explota el procesamiento incorrecto del campo de entrada de contraseña en 1Password 4 para restaurar el búfer de contraseña maestra ofuscado, desobuscarlo, desbloquear automáticamente 1Password 4 y finalmente mostrar la contraseña maestra en la consola.
Detalles aburridos
El primer paso para evaluar un administrador de contraseñas es verificar si hay una contraseña maestra clara en la memoria. Esto es posible en cualquier editor hexadecimal que pueda interactuar con el espacio de memoria del proceso. Por ejemplo, el editor gratuito de
HxD . Úselo para abrir el espacio de memoria 1Password 4.
Inmediatamente caemos en el primer área legible del espacio de memoria 1Password 4.
Ejemplo de representación de memoria HxDNada especial todavía. Pero puedes hacer una búsqueda. Por ejemplo, cómo se ve la situación si escribe la contraseña en la ventana de desbloqueo de 1Password 4, pero no hace clic en el botón "Desbloquear":
Bóveda bloqueada 1 Contraseña 4 con la contraseña maestra ingresada en el campo¿Seguramente la contraseña está en algún lugar de la memoria?
Abrimos HxD, pero la búsqueda de una línea con nuestra contraseña maestra ("Z3Superpass #") no produce resultados.
Parece que 1Password de alguna manera cifra u ofusca el formulario a medida que se ingresa. Si el procedimiento funciona correctamente, entonces todo está bien.
Bucear más profundo
Para averiguar por qué la contraseña maestra no se puede encontrar en la memoria cuando está claramente presente en el cuadro de diálogo de desbloqueo, debe encontrar el código que interactúa con ella. Hay varias formas Puede rastrear el procesamiento de eventos de teclado y mouse localizando 'GetMessage', 'PeekMessage', 'GetWindowText' u otras API de Windows que generalmente manejan la entrada del usuario. Entonces encontramos el búfer donde se graban las pulsaciones de teclas, y a través de ellas salimos a la rutina de cifrado / ofuscación. Pero este es un proceso largo y propenso a errores, especialmente con marcos grandes que a veces manejan la memoria de manera muy extraña, por lo que debe hacer muchas copias y conversiones para rastrear el búfer.
En cambio, utilizamos nuestra propia herramienta Thread Imager, diseñada para realizar ingeniería inversa de protocolos propietarios "extraños" a nivel de aplicación. Le ayudará a determinar dónde en la memoria 1Password 4 interactúa con nuestra contraseña maestra. La herramienta "automáticamente" identifica áreas de código en 1Password 4 que interactúan con una contraseña ofuscada (simplemente resalta las instrucciones que interactúan con los datos de interés para su posterior análisis). El resultado se parece a esto:
Thread Imager encuentra el código 1Password 4 que interactúa con una contraseña maestra desenfocadaDado que la contraseña maestra se almacena en la memoria en forma ofuscada, la herramienta primero debe mostrar dónde ocurre la ofuscación.
Un fragmento del primer resultado muestra que la primera aparición de la contraseña maestra se acompaña de una transición de código desde la dirección 0x7707A75D a 0x701CFA10.
Una entrada detallada en Thread Imager resalta la transición del código de 0x7707A75D a 0x701CFA10, mientras que los registros EAX y ECX se refieren al búfer con la contraseña maestraExaminar este lugar 0x7707A75D en el depurador (x64dbg) confirma nuestra teoría. De hecho, por primera vez, la cadena 'Z3superpass #' ocurre cuando finaliza la función de decodificación 'RtlRunDecodeUnicodeString' de la biblioteca ntdll.dll.

Después de un pequeño análisis, está claro que estas dos funciones se utilizan para ofuscar la contraseña: 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString'. Entonces, la contraseña maestra está oculta de la copia primitiva de la memoria, por lo que anteriormente no pudimos encontrarla en el editor hexadecimal.
Si estudia el búfer codificado al final de la función RtlRunEncodeUnicodeString, la línea cifrada con la contraseña maestra se ve así:
Contraseña maestra cifradaDespués de RtlRunDecodeUnicodeString 'se decodifica:
Contraseña maestra descifradaCuriosamente, esta área se guarda en la misma dirección 0x00DFA790 y podemos observar literalmente su cambio al ingresar una contraseña en la ventana de desbloqueo de 1Password 4:
Vulnerabilidad
'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString' son funciones simples que modifican una cadena con una operación XOR simple. Esto no es tan malo: parece ser el método estándar para enmascarar todos los controles de edición nativos de Windows con el conjunto de indicadores 'ES_PASSWORD'.
El problema es que después de desbloquear 1Password 4, la contraseña maestra cifrada no se borra de la memoria.
Peor aún, permanece en la memoria incluso después de que 1Password 4. está bloqueado, es decir, tenemos un almacén de contraseñas bloqueadas, pero con una contraseña maestra cifrada en la memoria.
Y lo que es peor, dado que interactuamos con el cuadro de diálogo de entrada de contraseña maestra, la misma área de memoria se reutiliza con el mismo valor XOR, lo que nos da fácil acceso al búfer codificado para crear un exploit.
Desafío
Para crear un exploit confiable para 1Password 4, debe obtener una imagen más clara de cómo los flujos de trabajo del programa procesan la contraseña maestra. Usando las herramientas antes mencionadas, creamos un diagrama de datos de salida (ver figura a continuación).

Este diagrama facilita la comprensión de dónde y qué bibliotecas están involucradas para identificar de manera confiable las áreas en la memoria donde puede recuperar la contraseña maestra.
Explotar
¿Qué tenemos en este momento? Tenemos un almacenamiento bloqueado, y en algún lugar de la memoria se almacena una contraseña ofuscada, porque el programa no limpió la memoria correctamente.
Para recuperarlo, debe llamar al procedimiento en 1Password 4, que inicia 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString'. Por lo tanto, mostrará la ubicación del búfer de memoria con la contraseña maestra codificada.
Área de memoria con una contraseña maestra ofuscadaSin este búfer, habría que sumergirse en el abismo de los procedimientos internos y los controles de Windows y los mecanismos de gestión de memoria relacionados. Tal vez este análisis facilita la búsqueda de un búfer, pero no fuimos por este camino.
Parece que la única forma de llamar a 'RtlRunEncodeUnicodeString' y 'RtlRunDecodeUnicodeString' es ingresar la contraseña maestra en el carácter en el cuadro de diálogo. Entonces obtenemos el búfer deseado. Pero no sabemos la longitud de la contraseña.
Resolvimos este problema interceptando código que accede al primer carácter de nuestro búfer, bloqueando un intento de cambio. Esta rutina está en el bucle de mensajes de control en comctl32, que maneja el control del búfer de los elementos correspondientes. Llamar a 'memmove' con desplazamiento 0x70191731 sobrescribe el búfer con el carácter ingresado:
(Efecto secundario: la línea resaltada (amarilla) actualiza la línea de contraseña completa)Ahora finalmente tenemos todo lo que necesitamos para crear un exploit. Los siguientes pasos nos permitirán extraer la contraseña maestra:
- Enganche 'memmove' para evitar sobrescribir el primer byte de la contraseña maestra.
- Enganche 'RtlRunEncodeUnicodeString' para obtener la ubicación del búfer de contraseña maestra ofuscado.
- Enganche 'RtlRunDecodeUnicodeString' para acceder al búfer ofuscado obtenido en el paso anterior.
- Ingresando un carácter en el campo de ingreso de contraseña y rechazando el paso 1 (guardar la contraseña maestra completa), redirigiendo el paso 2 al paso 3 para decodificar la contraseña maestra ofuscada.
Para realizar todas estas acciones, cree una DLL con el código del controlador para todos estos enlaces. La biblioteca está incrustada en el proceso 1Password 4, envía un carácter al cuadro de diálogo de contraseña maestra, iniciando los pasos memmove, RtlRunEncodeUnicodeString y RtlRunDecodeUnicodeString que podemos interceptar, y haciendo nuestra magia para recuperar la contraseña maestra ofuscada. La mayor parte de la magia ocurre en DetourRtlRunEncodeUnicodeString, este es el gancho para la función 'RtlRunEncodeUnicodeString', que se muestra a continuación:
Lo que nos lleva al resultado final: desbloquear el repositorio bloqueado 1Password 4 de cualquier versión utilizando el procedimiento con errores utilizado por la API de Windows:

Resumen
Cuando profundizamos en el interior de 1Password 4, esperábamos encontrar algún tipo de sistema de seguridad complejo y que toda la información confidencial se borre de la memoria, como sucede en los procedimientos PBKDF2 y otras áreas donde se usa la contraseña maestra. Las entradas correspondientes también se borran. Sin embargo, debido a la supervisión, el campo de entrada de contraseña se considera un control estándar de la API de Windows con una contraseña oculta, lo que socava la seguridad de 1Password 4.