flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation
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.
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
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.
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.
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.
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
/* 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;
}
/* 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
- ✓Consulta el rastreador CVE de Ubuntu para la versión, variante del kernel y paquete exactos; el problema depende de una combinación concreta de cambios Ubuntu y upstream.
- ✓Instala el paquete de kernel corregido para la versión y variante Ubuntu afectadas; reinicia y comprueba qué kernel está activo.
- ✓Si debes retrasar la actualización y la carga lo permite, evalúa la mitigación temporal documentada por Ubuntu para restringir la creación de user namespaces sin privilegios; prueba el impacto en aplicaciones y contenedores.
- ✓En los wrappers xattr de OverlayFS, usa APIs VFS con comprobación de permisos y el user namespace correcto del montaje para atributos controlados por el usuario; reserva helpers sin comprobación para metadatos internos estrictamente justificados.