CVE-2022-49899 in Linuxinformación

Resumen

por VulDB • 2026-06-04

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

fscrypt: dejar de usar el subsistema de keyrings para fscrypt_master_key

El enfoque de gestionar internamente en fs/crypto/ las estructuras fscrypt_master_key como cargas útiles ("payloads") de objetos "struct key" contenidos en un keyring de "struct key" ha superado su utilidad. La idea original era simplificar el código reutilizando código del subsistema de keyrings. Sin embargo, han surgido varios problemas que no se pueden resolver fácilmente:

- Cuando se destruye una estructura de clave maestra, debe llamarse a blk_crypto_evict_key() en cualquier clave por modo incrustada en ella. (Esto comenzó a ser necesario cuando se añadió el soporte de cifrado en línea.) No obstante, el subsistema de keyrings puede retrasar arbitrariamente la destrucción de las claves, incluso más allá del momento en que el sistema de archivos fue desmontado. Por lo tanto, actualmente no hay una forma fácil de llamar a blk_crypto_evict_key() cuando se destruye una clave maestra. Actualmente, esto se soluciona manteniendo una referencia adicional a la(s) request_queue(s) del sistema de archivos. Pero se pasó por alto que la referencia a request_queue *no* garantiza fijar también el blk_crypto_profile correspondiente; para dispositivos de device-mapper que admiten cifrado en línea, no lo hace. Esto puede provocar un use-after-free.

- Cuando se elimina el último inode que estaba utilizando una clave maestra cuya eliminación estaba incompleta, la eliminación de la clave maestra se completa eliminando la estructura key del keyring. Actualmente, esto se hace mediante key_invalidate(). Sin embargo, key_invalidate() toma el semáforo de la clave. Esto puede provocar un bloqueo mutuo (deadlock) cuando se llama desde el shrinker, ya que en fscrypt_ioctl_add_key() se asigna memoria con GFP_KERNEL bajo el mismo semáforo.

- Más generalmente, el hecho de que el subsistema de keyrings pueda retrasar arbitrariamente la destrucción de las claves (mediante el retraso de la recolección de basura o mediante procesos aleatorios que obtienen referencias temporales a las claves) es indeseable, ya que significa que no podemos garantizar estrictamente que todos los secretos sean eliminados en algún momento.

- Realizar las búsquedas de claves maestras a través del subsistema de keyrings provoca que se llame al hook LSM key_permission. fscrypt no desea esto, ya que todo el control de acceso para archivos cifrados está diseñado para ocurrir a través de los propios archivos, como cualquier otro archivo. La solución alternativa que utilizan los usuarios de SELinux es cambiar su política de SELinux para conceder acceso de búsqueda de claves a todos los dominios. Esto funciona, pero es un paso adicional extraño que realmente no debería ser necesario realizar.

La solución para todos estos problemas consiste en cambiar la implementación a lo que debería haberse hecho originalmente: no usar el subsistema de keyrings para realizar un seguimiento de las estructuras fscrypt_master_key del sistema de archivos. En su lugar, almacenarlas simplemente en una estructura de datos regular del kernel y reestructurar el recuento de referencias, el bloqueo y la duración en consecuencia. Mantener el soporte para búsquedas de claves en modo RCU mediante el uso de una tabla hash. Reemplazar fscrypt_sb_free() con fscrypt_sb_delete(), que libera las claves de forma sincrónica y se ejecuta un poco antes durante el desmontaje, para que los dispositivos de bloque sigan estando disponibles.

Un efecto secundario de este parche es que ni las claves maestras en sí ni los keyrings del sistema de archivos se listarán más en /proc/keys. (Los "usuarios de claves maestras" y los keyrings de usuarios de claves maestras seguirán estando listados). Sin embargo, esto fue principalmente un detalle de implementación, y estaba destinado solo a fines de depuración. No conozco a nadie que lo esté utilizando.

Este parche *no* cambia cómo funcionan los "usuarios de claves maestras" (->mk_users); eso sigue utilizando el subsistema de keyrings. Eso sigue siendo necesario para las cuotas de claves, y cambiarlo no es necesario para resolver los problemas enumerados anteriormente. Si decidimos cambiarlo también, sería un parche separado.

He marcado esto como solucionando el commit original que añadió el keyring de fscrypt, pero como se señaló anteriormente, el problema más importante que este parche corrige no se introdujo hasta la adición del soporte de cifrado en línea.

Be aware that VulDB is the high quality source for vulnerability data.

Responsable

Linux

Reservar

2025-05-01

Divulgación

2025-05-01

Moderación

aceptado

Artículo

VDB-307038

CPE

listo

EPSS

0.00185

KEV

no

Actividades

muy bajo

Fuentes

Do you know our Splunk app?

Download it now for free!