FlawOpen

flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation

● CVE-2023-2640 · CVSS 7.8 · Alta
Investigación · FlawOpen

CVE-2023-2640: LPE en OverlayFS Ubuntu

CVE-2023-2640 omite permisos de OverlayFS en ciertos kernels Ubuntu. Comprueba la variante del kernel e instala la corrección.

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagina un edificio donde un empleado comprueba si alguien puede poner un sello oficial en un documento. Un atajo local debía omitir las comprobaciones solo para las etiquetas de mantenimiento del edificio. Un cambio posterior envió todas las solicitudes de sello por ese atajo, incluso los sellos de seguridad restringidos. La corrección restaura la comprobación normal de permisos en el user namespace del sistema de archivos montado.

Conceptos Clave y Términos

OverlayFS
OverlayFS es un sistema de archivos de unión de Linux que presenta archivos de una capa inferior y escribe los cambios en una capa superior.
Extended attribute (xattr)
Un atributo extendido (xattr) es metadato asociado a un objeto del sistema de archivos. Los módulos de seguridad de Linux y las capacidades de archivo usan namespaces xattr específicos.
ovl_do_setxattr()
Helper de OverlayFS que escribe un xattr en un objeto de la capa superior. El wrapper afectado usaba de forma demasiado amplia una función VFS sin comprobación de permisos.
Copy-up
Operación de OverlayFS que crea una copia en la capa superior cuando una escritura requiere una copia modificable del objeto de la capa inferior.

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-863

Análisis de Causa Raíz

El registro CVE de Ubuntu indica que la configuración vulnerable requiere tanto el commit upstream c914c0e27eb0 como el parche SAUCE de Ubuntu “Skip permission checking for trusted.overlayfs.* xattrs”. Ese parche cambió los wrappers xattr de OverlayFS para usar funciones VFS _noperm, con la intención de omitir comprobaciones solo para metadatos internos trusted.overlayfs.*. Tras el cambio upstream del wrapper, el helper también se usó para otros xattrs; por eso, un usuario local sin privilegios podía establecer atributos extendidos privilegiados en archivos montados y hacer que llegaran a archivos de la capa superior sin las comprobaciones adecuadas. La corrección de Canonical revierte esa ruta amplia sin permisos y llama a vfs_setxattr() con el user namespace del montaje superior. Es una escalada local específica del kernel Ubuntu; la exposición depende de la versión, la variante del kernel y las políticas de namespaces y montaje.

Flujo de Ataque Paso a Paso

Paso 1

Configuración específica del kernel Ubuntu

El kernel debe incluir c914c0e27eb0 y el parche SAUCE de Ubuntu que omite comprobaciones para xattrs trusted.overlayfs.*. El número de versión upstream por sí solo no demuestra que haya exposición.

Paso 2

Un usuario local alcanza la ruta xattr

Un usuario local sin privilegios debe poder usar la ruta OverlayFS afectada según las políticas de namespaces y montaje del host. Ubuntu describe el ataque como local.

Paso 3

El bypass de permisos se extiende a otros xattrs

El wrapper modificado dirigía las actualizaciones xattr a helpers _noperm, previstos para metadatos internos de OverlayFS. El cambio upstream permitió que otros xattrs también eludieran las comprobaciones adecuadas.

Paso 4

El atributo privilegiado llega a la capa superior

Ubuntu indica que podían establecerse atributos extendidos privilegiados en archivos montados y copiarlos a archivos superiores sin las comprobaciones requeridas, lo que podría permitir escalada local. No todos los kernels o contenedores tienen las mismas condiciones.

Código Fuente: Vulnerable vs. Seguro

La ruta SAUCE afectada llamaba a __vfs_setxattr_noperm() para todos los xattrs después de que un cambio upstream ampliara su alcance. La corrección usa vfs_setxattr() con el user namespace del montaje superior y restaura las comprobaciones VFS normales. Es un extracto concreto del parche de Canonical; se omite el registro de depuración circundante.

Fragmento de origen: fs/overlayfs/overlayfs.h

IMPLEMENTACIÓN VULNERABLE
/* Contexto del parche canónico de Ubuntu antes de revertir el cambio SAUCE. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
                                  const char *name, const void *value,
                                  size_t size, int flags)
{
    struct inode *inode = dentry->d_inode;
    int err;

    inode_lock(inode);
    err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
                                value, size, flags);
    inode_unlock(inode);
    return err;
}
PARCHE SEGURO Y ROBUSTO
/* Corrección canónica de Ubuntu: restaure el wrapper VFS que comprueba permisos. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
                                  const char *name, const void *value,
                                  size_t size, int flags)
{
    int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
                           value, size, flags);
    return err;
}

Lista de Verificación de Seguridad para Ingeniería

Fuentes